1、请详细描述CentOS系统的启动流程(详细到每个过程系统做了哪些事情)
简述: 第一阶段:BIOS启动引导阶段; 在该过程中实现硬件的初始化以及查找启动介质; 从MBR中装载启动引导管理器(GRUB)并运行该启动引导管理 第二阶段:GRUB启动引导阶段; 装载stage1 装载stage1.5 装载stage2 读取/boot/grub.conf文件并显示启动菜单; 装载所选的kernel和initrd文件到内存中 第三阶段:内核阶段: 运行内核启动参数; 解压initrd文件并挂载initd文件系统,装载必须的驱动; 挂载根文件系统 第四阶段:Sys V init初始化阶段: 启动/sbin/init程序; 运行rc.sysinit脚本,设置系统环境,启动swap分区,检查和挂载文件系统; 读取/etc/inittab文件,运行在/et/rc.d/rc<#>.d中定义的不同运行级别的服务初始化脚本; 打开字符终端1-6号控制台/打开图形显示管理的7号控制台 详细过程: 第一阶段: 系统上电开机后,主板BIOS(Basic Input / Output System)运行POST(Power on self test)代码,检测系统外围关键设备(如: CPU、内存、显卡、I/O、键盘鼠标等)。硬件配置信息及一些用户配置参数存储在主板的CMOS( Complementary Metal Oxide Semiconductor) 上(一般64字节),实际上就是主板上一块可读写的RAM芯片,由主板上的电池供电,系统掉电后,信息不会丢失。执行POST代码对系统外围 关键设备检测通过后,系统启动自举程序, 根据我们在BIOS中设置的启动顺序搜索启动驱动器(比如的硬盘、光驱、网络服务器等)。选择 合适的启动器,比如通常情况下的硬盘设备,BIOS会读取硬 盘设备的第一个扇区(MBR,512字节),并执行其中的代码。实际上这里BIOS并 不关心启动设备第一个扇区中是什么内容,它只是负责读取该扇区内容、 并执行,BIOS的任务就完成了。此后将系统启动的控制权移交到MBR 部分的代码。注: 在我们的现行系统中,大多关键设备都是连在主板上的。因此主板BIOS提供了一个操作系统(软件)和系统外围关键设备 (硬件)最底级别的接口,在这个阶段,检测系统外围关键设备是否“准备好”,以供操作系统使用。 第二阶段: BIOS通过下面两种方法之一来传递引导记录: 第一, 将控制权传递给initial program loader(IPL),该程序安装在磁盘主引导记录(MBR)中 第二, 将控制权传递给initial program loader(IPL),该程序安装在磁盘分区的启动引导扇区中 无论上面的哪种情况中,IPL都是MBR的一部分并应该存储于一个不大于446字节的磁盘空间中,因为MBR是一个不大于512字节的空间。因此 IPL仅仅是GRUB的第一个部分(stage1),他的作用就是定位和装载GRUB的第二个部分(stage2);stage2对启动系统起关键作 用,该部分提 供了GRUB启动菜单和交互式的GRUB的shell。启动菜单在启动时候通过/boot/grub/grub.conf文件所定义的内容生 成。在启动菜单中选择了 kernel之后,GRUB会负责解压和装载kernel image并且将initrd装载到内存中。最后GRUB初始化kernel启动代码。完成之后后续的引导权被移 交给kernel。 假设Boot Loader为grub (grub-0.97),其引导系统的过程如下: grub分为stage1 (stage1_5) 和stage2两个阶段。stage1可以看成是initial program loaderI(IPL),而stage2则实现了grub的主要 功能,包括对特定文件系统的支持(如ext2,ext3,reiserfs 等),grub自己的shell,以及内部程序(如:kernrl,initrd,root)等。 stage 1:MBR(512 字节,0头0道1扇区),前446字节存放的是 stage1,后面存放硬盘分区表信息,BIOS将stag1载入内存中0x7c00处 并跳转执行。stage1(/stage1/start.S)的任务常单纯,仅仅是将硬盘0头0道2扇区读入内存。0头0道2扇区内容是源代码中的/stage2/start.S, 编译后512字节,它是stage2 或者stage1_5的入口。注:此时stage1是没有能力识别文件系统的,其定位硬盘0头0道2扇区过程如下:BIOS将 stage1载入内存0x7c00处并执行,然后调用BIOS INIT13中断,将硬盘0头0道2扇区内容载入内存0x7000处,然后调用copy_buffer将其转移到内存 0x8000处。定位0头0道2扇区有两种寻址方式:LBA、CHS。 start.S的主要功能是将stage2或stage1_5从硬盘载入内存,如果是stage2,则载入0x820处;如果是 stage1_5,则载入0x2200处。 注:这里的stage2或者stage1_5不是/boot分区/boot/grub目录下的文件,这个时候grub还没有能力识别任何文件系统。分以下两种情况: (1)假如start.S读取的是stage1_5,它存放在硬盘0头0道3扇区向后的位置,stage1_5作为stage1和stage2中间的桥 梁,stage1_5有 识别文件系统的能力,此后grub才有能力去访问/boot分区/boot/grub目录下的 stage2文件,将stage2载入内存并执行。 (2)假如start.S读取的是stage2,同样,这个stage2也不是/boot分区/boot/grub目录下的stage2,这个时候 start.S读取的是存放 在/boot分区Boot Sector的stage2。这种情况下就有一个限制:因为start.S通过BIOS中断方式直接对硬盘寻址(而非通过访问具体的文件系 统),其寻址范 围有限,限制在8GB以内。因此这种情况需要将/boot分区分在硬盘8GB寻址空间之前。 假如是情形(2),我们将/boot/grub目录下的内容清空,依然能成功启动grub;假如是情形(1),将/boot/grub目录下stage2删除后,则 系统启动过程中grub会启动失败。 这个地方经常要进行的操作:是关于grub常用的几个指令对应的函数: grub>root (hd0,0) --root指令为grub指定了一个根分区 grub>kernel /xen.gz-2.6.18-37.el5 --kernel指令将操作系统内核载入内存 grub>module /vmlinuz-2.6.18-37.el5xen ro root=/dev/sda2 --module指令加载指定的模块 grub>module /initrd-2.6.18-37.el5xen.img --指定initrd文件 grub>boot --boot 指令调用相应的启动函数启动OS内核 第三阶段: 如阶段2所述,grub>boot指令后,系统启动的控制权移交给kernel。Kernel会立即初始化系统中各设备并做相关配置工作,其中包括CPU、I/O、 存储设备等。关于设备驱动加载,有两部分: 一部分设备驱动编入Linux Kernel中,Kernel会调用这部分驱动初始化相关设备,同时将日志输出到kernel message buffer,系统启动后 dmesg可以查看到这部分输出信息。另外有一部分设备驱动并没有编入Kernel,而是作为模块形式放在 initrd(ramdisk)中。在2.6内核中,支持 两种格式的initrd,一种是2.4内核的文件系统镜像image-initrd,一种是cpio格式。以 cpio 格式为例,内核判断initrd为cpio的文件格式后, 会将initrd中的内容释放到rootfs中。initrd是一种基于内存的文件系统,启动过程中,系统在访问真正的根文件系统/时,会先访问initrd文件 系统。将initrd中的内容打开来看, 会发现有bindevetc、lib、procsys、sysroot、init等文件(包含目录)。其中包含了一些设备的驱动模块 ,比如scsi ata等设备驱动模块,同时还有几个基本的可执行程序insmod, modprobe, lvm、nash。主要目的是加载一些存储介质的驱动模块,如上 面所说的scsi ideusb等设备驱动模块,初始化LVM,把/根文件系统以只读方式挂载。initrd中的内容释放到rootfs中后, Kernel会执行其中的init 文件,这里的init是一个脚本,由nash解释器执行。这个时候内核的控制权移交给init文件处理,我们查看init文件的内容,主要也是加载各种存储 介质相关的设备驱动。驱动加载后,会创建一个根设备,然后将根文件系统/以只读的方式挂载。这步结束后释放未使用内存并执行switchroot,转 换到真正的根/上面去,同 时运行/sbin/init程序,开启系统的1号进程,此后系统启动的控制权移交给 init 进程。关于switchroot是在nash中 定义的程序。Linux Kernel需要适应多种不同的硬件架构,但是将所有的硬件驱动编入Kernel又是不实际的,而且Kernel也不可能每新出一种硬件 结构,就将该硬件 的设备驱动写入内核。实际上Linux Kernel仅是包含了基本的硬件驱动,在系统安装过程中会检测系统硬件信息,根据安装信息 和系统硬件信息将一部分设备驱动写入 initrd 。这样在以后启动系统时,一部分设备驱动就放在initrd中来加载。 第四阶段: init进程起来后,系统启动的控制权移交给init进程。 /sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作: 1)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,到此系统基本算运行 起来了,后面需要进行运行级别的确定及相应服务的启动; 2)确定启动后进入的运行级别; 3) 执行/etc/rc.d/rc,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态是放在/etc/rc.d/rcn.d(n=0~6)目录下,所有 的文件均链接至/etc/init.d下的相应文件。 4)有关key sequence的设置 5) 有关UPS的脚本定义 6)启动虚拟终端/sbin/mingetty 7)在运行级别5上运行X 这时呈现给用户的就是最终的登录界面。 至此,系统启动过程完毕:) ================================================================================================================================== 说明: 1)/etc/rc.d/rc.sysint -- System Initialization Tasks 它的主要工作有: 配置selinux, 系统时钟, 内核参数(/etc/sysctl.conf), hostname, 启用swap分区, 根文件系统的检查和二次挂载(读写), 激活RAID和LVM设备, 启用磁盘quota 检查并挂载其它文件系统 等等。 GRUB的基本原理以及对GRUB的操作控制方法: GRUB全称为Grand Unified Boot Loader,是Linux操作系统主流的启动引导管理器。主要作用是启动和装载Linux操作系统。系统启动过程中一旦 完成了BIOS自检,GRUB会 被立刻装载。在GRUB里面包含了可以载入操作系统的代码以及将操作系统引导权传递给其他启动引导管理器的代码。 GRUB可以允许用户选择使用不同的 kernel启动系统,或者在启动系统的过程中设置不同的启动参数。 而通常BIOS会以下面两种方法之一来调用启动引导管理器: 将控制权移交给于驱动器主引导记录的initial program loader(IPL); 将控制权移交给其他启动引导管理器,再由他们将控制权移交给安装在分区引导扇区的IPL 通常情况下启动引导管理器GRUB由两部分组成(stage1和stage2): stage1比较小,通常可以驻留在MBR或者各个磁盘分区的启动扇区中,主要作用是装载stage2。 stage2比较大,从磁盘的启动引导分区读取 至于在stage1和stage2之间存在一个stage1.5,是因为starge1.5具有识别文件系统的能力。 在Linux系统中对GRUB的配置有两种方法: 主要引导管理器: 会将启动引导管理器的stage1安装在MBR上,这时启动引导管理器必须被配置为可以传递控制权到其他操作系统; 次要引导管理器: 会将启动引导管理器的stage1安装在一些分区的引导扇区上,而其他的启动引导管理器会被安装在MBR上,由他们来向Linux启动引导管理器传递控制权。 GRUB在启动过程中可以提供命令行交互界面,可以从ext系列,reiserfs,fat等多种文件系统引导系统,并且可以提供密码加密功能,其内容在 /boot 分区下,系统启动过程中由配置文件/boot/grub/grub.conf来定义启动方式,对该配置文件的更改会立即生效。 在配置文件/boot/grub/grub.conf文件中定义的内容包括: grub所在的分区,引导系统所使用的kernel文件位置,硬件初始化使用的initrd文件位置,以及启动参数。 例如: grub>root (hd0,0) --root指令为grub指定了一个根分区 grub>kernel /xen.gz-2.6.18-37.el5 --kernel指令将操作系统内核载入内存 grub>module /vmlinuz-2.6.18-37.el5xen ro root=/dev/sda2 --module指令加载指定的模块 grub>module /initrd-2.6.18-37.el5xen.img --指定initrd文件 grub>boot --boot 指令调用相应的启动函数启动OS内核 可见其指定的内容大多数在/boot分区,如果切换到/boot分区之后会看到这些内容: /boot/vmlinuz-* linux kernel的一个copy; /boot/initrd*.img 初始化的ram disk文件 /boot/grub/device.map linux设备名和grub设备名的映射文件 /boot/grub/grub.conf 主配置文件 通常GRUB出错几率不是很大,但一旦出现问题恐怕采用最多的方式是重装grub到MBR中。 在这种时候需要注意的问题有: 首先,设备映射关系: GRUB里面对设备名称的定义和系统中对设备名称的定义方法不一样: (fd0) /dev/fd0 (hd0) /dev/sda /dev/hda (hd1) /dev/sdb /dev/hdb 如够进入系统或者救援模式,可执行命令/sbin/grub-install /dev/sda(或者hda)进行GRUB重装: # /sbin/grub-install device 处于某种原因MBR中信息出错可以使用上面的命令将其重装到磁盘主引导记录中;但是如果在不能进入系统的情况下就需要通过grub的命令行界面进行 手动设置,这个时候就要注意上面所提到的映射关系。 同时,在grub命令行中对grub进行手动设置的时候需要注意所使用的命令: # root (hd0,0) --指定启动分区 # setup(hd0) --表示将grub安装在主引导记录上 # quit --退出grub shell 下面是一个完整的grub.conf文件内容: [root@dhcp-0-195 ~]# cat /etc/grub.conf # grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You have a /boot partition. This means that # all kernel and initrd paths are relative to /boot/, eg. # root (hd0,0) # kernel /vmlinuz-version ro root=/dev/VolGroup001/LogVol00 # initrd /initrd-version.img #boot=/dev/sda default=0 timeout=30 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu password --md5 $1$apEcJWbA$DTJ8a6mKn/3yrTTSXBtdH0 title Red Hat Enterprise Linux Client (2.6.18-8.1.1.el5) root (hd0,0) kernel /vmlinuz-2.6.18-8.1.1.el5 ro root=/dev/VolGroup001/LogVol00 crashkernel=128M@16M initrd /initrd-2.6.18-8.1.1.el5.img 系统启动运行级别的概念以及服务的定制方法; 当initrd可以正常检测和装载之后,最后的工作就基本上由操作系统来进行了。当系统的init进程起来之后系统启动的控制权移交给init进程。 /sbin/init进程是所有进程的父进程,当init起来之后,它首先会读取配置文件/etc/inittab,进行以下工作: 1)执行系统初始化脚本(/etc/rc.d/rc.sysinit),对系统进行基本的配置,以读写方式挂载根文件系统及其它文件系统,后面需要进行运 行 级别的确定及相应服务的启动,(从这个角度可以看出如果要定义系统的init动作,需要修改/etc/rc.d/rc.sysinit脚本) 2)通过对/etc/inittab文件的读取确定启动后进入的运行级别; 3) 在相应的运行级别中执行/etc/rc.d/rcx.d目录下的脚本名称,该文件定义了服务启动的顺序是先K后S,而具体的每个运行级别的服务状态 是放在 /etc/rc.d/rcn.d(n=0~6)目录下,但这些文件均是到/etc/init.d下的相应文件的链接。系统会按照在该目录下的文件名称和优先级 执行对应运行级别目录下的脚本: 在某个运行级别的对应目录下,K开头的服务被关闭,S开头的服务被开启,K在S开始之前执行,在执行过程中按照数字来定义优先级,数字越低 优先级越高。 4)按照/etc/rc.d/rcX.d目录中的定义,系统会于后台启动相应的服务,如果要对某个运行级别中的服务进行更具体的定制,通过chkconfig命令 来操作,或者通过setup/ntsys/system-config-services来进行定制。 5)在/etc/inittab文件中存在有关key sequence,UPS的脚本定义,启动虚拟终端/sbin/mingetty的设置,这时呈现给用户的就是最终的登录界面。 也就是说后台启动的服务完毕之后,如果系统默认进入字符界面,则运行mgetty进入1-6号终端控制台,如果系统默认进入图形界面,则开启gdm服 务进入7号虚拟图形控制台。 至此,系统启动过程完毕。
2、为运行于虚拟机上的CentOS 6添加一块新硬件,提供两个主分区;
(1) 为硬盘新建两个主分区;并为其安装grub;
(2) 为硬盘的第一个主分区提供内核和ramdisk文件; 为第二个分区提供rootfs;
(3) 为rootfs提供bash、ls、cat程序及所依赖的库文件;
(4) 为grub提供配置文件;
(5) 将新的硬盘设置为第一启动项并能够正常启动目标主机;
[root@www boot]# fdisk /dev/sdb Command (m for help): n Partition number (1-4): 1 First cylinder (1-522, default 1): Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-522, default 522): +200M Command (m for help): n Partition number (1-4): 2 First cylinder (27-522, default 27): Using default value 27 Last cylinder, +cylinders or +size{K,M,G} (27-522, default 522): +3G Command (m for help): p Disk /dev/sdb: 4294 MB, 4294967296 bytes 255 heads, 63 sectors/track, 522 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0xb38f53ee Device Boot Start End Blocks Id System /dev/sdb1 1 26 208813+ 83 Linux /dev/sdb2 27 419 3156772+ 83 Linux Command (m for help): w The partition table has been altered! [root@www boot]# cat /proc/partitions major minor #blocks name 8 0 8388608 sda 8 1 204800 sda1 8 2 6144000 sda2 8 3 614400 sda3 8 16 4194304 sdb 8 17 208813 sdb1 8 18 3156772 sdb2 [root@www ~]# mke2fs -t ext4 /dev/sdb1 [root@www ~]# mke2fs -t ext4 /dev/sdb2 [root@www ~]# mkdir /mnt/boot [root@www ~]# mount /dev/sdb1 /mnt/boot [root@www ~]# grub-install --root-directory=/mnt /dev/sdb Probing devices to guess BIOS drives. This may take a long time. Installation finished. No error reported. This is the contents of the device map /mnt/boot/grub/device.map. Check if this is correct or not. If any of the lines is incorrect, fix it and re-run the script `grub-install'. (fd0) /dev/fd0 (hd0) /dev/sda (hd1) /dev/sdb [root@www ~]# cd /mnt [root@www mnt]# ll 总用量 5 drwxr-xr-x 4 root root 1024 8月 16 22:14 boot drwxr-xr-x. 4 root root 4096 8月 14 19:21 sysroot [root@www mnt]# ll boot 总用量 13 drwxr-xr-x 2 root root 1024 8月 16 22:14 grub drwx------ 2 root root 12288 8月 16 22:08 lost+found [root@www mnt]# cp /boot/vmlinuz-2.6.32-642.el6.i686 /mnt/boot/vmlinuz-2.6.32-l42.el6.i686 [root@www mnt]# cp /boot/initramfs-2.6.32-642.el6.i686.img /mnt/boot/initramfs-2.6.32-642.el6.i686.img [root@www mnt]# vi /mnt/boot/grub/grub.conf 编辑如下: defaut=0 timeout=5 title CenOS root (hd0,0) kernel /vmlinuz-2.6.32-l42.el6.i686 ro root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs-2.6.32-642.el6.i686.img [root@www boot]#[root@www ~]# mount -t ext4 /dev/sdb2 /mnt/sysroot [root@www boot]#[root@www ~]# cd /mnt/sysroot [root@www sysroot]# mkdir -p bin sbin usr tmp root dev proc sys var mnt media lib lib64 home [root@www sysroot]# ll 总用量 56 drwxr-xr-x. 2 root root 4096 8月 14 19:25 bin drwxr-xr-x 2 root root 4096 8月 16 22:32 dev drwxr-xr-x 2 root root 4096 8月 16 22:32 home drwxr-xr-x. 2 root root 4096 8月 14 19:21 lib drwxr-xr-x 2 root root 4096 8月 16 22:32 lib64 drwxr-xr-x 2 root root 4096 8月 16 22:32 media drwxr-xr-x 2 root root 4096 8月 16 22:32 mnt drwxr-xr-x 2 root root 4096 8月 16 22:32 proc drwxr-xr-x 2 root root 4096 8月 16 22:32 root drwxr-xr-x 2 root root 4096 8月 16 22:32 sbin drwxr-xr-x 2 root root 4096 8月 16 22:32 sys drwxr-xr-x 2 root root 4096 8月 16 22:32 tmp drwxr-xr-x 2 root root 4096 8月 16 22:32 usr drwxr-xr-x 2 root root 4096 8月 16 22:32 var 运用题8中的脚本把bash、ls、cat复制到/mnt/sysroot,我这里把它编辑为了脚本shell25.sh [root@www ~]# bash shell25.sh please input a command which you want to cp to /mnt/sysroot,and "quit" is over:bash Another command(quit): ls Another command(quit): cat Another command(quit): quit 然后退出当前虚拟机,新建一个虚拟机,然后在BIOS处设定该硬盘为第一启动项,启动。
3、制作一个kickstart文件以及一个引导镜像。描述其过程。
系统安装完成后,anaconda一般都会在root 家目录生成一个当前系统的kickstart 文件,我参考这个文件制作我自己的kickstart文件。 [root@www ~]# cp anaconda-ks.cfg myks.cfg [root@www ~]# vi myks.cfg 下面是myks.cfg 内容: # Kickstart file automatically generated by anaconda.and I modify it by myself #version=DEVEL install cdrom lang zh_CN.UTF-8 keyboard us network --onboot no --device eth0 --bootproto dhcp --noipv6 rootpw --iscrypted $6$IjI6cJDojRCvIVR6$I59v2xYd8ikloSXoQH6MVZdUv/ikm0yNqBhrO8jXrlHY7iqbnE86sPPJ8sg.yfqs6oYCuG8TvogX.kjGY15nI1 firewall --service=ssh authconfig --enableshadow --passalgo=sha512 selinux --enforcing timezone --utc Asia/Shanghai bootloader --location=mbr --driveorder=sda --append="nomodeset crashkernel=auto rhgb quiet" # The following is the partition information you requested # Note that any partitions you deleted are not expressed # here so unless you clear all partitions first, this is # not guaranteed to work clearpart --all part /boot --fstype=ext4 --size=200 part / --fstype=ext4 --size=6000 part swap --size=600 repo --name="CentOS" --baseurl=cdrom:sr0 --cost=100 %packages --nobase @core %end 制作引导镜像的过程: 1.把安装光盘放入光驱 2. [root@www ~]# mkdir /media/cdrom [root@www ~]# mount /dev/cdrom /media/cdrom mount: block device /dev/sr0 is write-protected, mounting read-only [root@www ~]# ls /media/cdrom CentOS_BuildTag GPL isolinux RELEASE-NOTES-en-US.html RPM-GPG-KEY-CentOS-6 RPM-GPG-KEY-CentOS-Security-6 TRANS.TBL EULA images Packages repodata RPM-GPG-KEY-CentOS-Debug-6 RPM-GPG-KEY-CentOS-Testing-6 [root@www ~]# mkdir /tmp/myiso [root@www myiso]#cd /tmp/myiso [root@www myiso]# cp /media/cdrom/isolinux /tmp/myiso -a -r [root@www myiso]# cp -r -a /root/myks.cfg /tmp/myiso [root@www myiso]# ll 总用量 8 dr-xr-xr-x. 2 root root 4096 5月 22 12:17 isolinux -rw-------. 1 root root 903 8月 17 19:20 myks.cfg [root@www myiso]# mkisofs -R -J -T -v --no-emul-boot --boot-load-size 4 --boot-info-table -V "CentOS 6.6 x86_64 boot" -b isolinux/isolinux.bin -c isolinux/boot.cat -o /root/boot.iso myiso/ 这样我们就在/root目录下创建了名为boot.iso的光盘引导镜像
4、写一个脚本
(1) 能接受四个参数:start, stop, restart, status
start: 输出“starting 脚本名 finished.”
…
(2) 其它任意参数,均报错退出;
#!/bin/bash #the purpose of the program # #08/13/2016 # PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "please input one order:" ordername case $ordername in "start") echo "starting $0 finished" exit 0 ;; "stop") echo "stopping $0 finished" exit 0 ;; "restart") echo "restarting $0 finished" exit 0 ;; "status") echo "statusing $0 finished" exit 0 ;; *) echo "there is wrong" exit 1 ;; esac
5、写一个脚本,判断给定的用户是否登录了当前系统;
(1) 如果登录了,则显示用户登录,脚本终止;
(2) 每3秒钟,查看一次用户是否登录;
#!/bin/bash #the purpose of the program # #08/13/2016 # PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH read -p "Enter a user name: " username until who | grep "^$username" &> /dev/null; do sleep 3 done echo "$username logged on." exit 0
6、写一个脚本,显示用户选定要查看的信息;
cpu) display cpu info
mem) display memory info
disk) display disk info
quit) quit
非此四项选择,则提示错误,并要求用户重新选择,只到其给出正确的选择为止;
#!/bin/bash #the purpose of the program # #08/13/2016 # PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH cat << EOF cpu) display cpu information; mem) display memory information; disk) display disk information; quit) quit ============================ EOF read -p "Enter a option: " option while [ "$option" != 'cpu' -a "$option" != 'mem' -a "$option" != 'disk' -a "$option" != 'quit' ]; do read -p "Wrong option, Enter again: " option done case "$option" in cpu) lscpu ;; mem) cat /proc/meminfo ;; disk) fdisk -l ;; *) echo "Quit..." exit 0 ;; esac
7、写一个脚本
(1) 用函数实现返回一个用户的UID和SHELL;用户名通过参数传递而来;
(2) 提示用户输入一个用户名或输入“quit”退出;
当输入的是用户名,则调用函数显示用户信息;
当用户输入quit,则退出脚本;进一步地:显示键入的用户相关信息后,再次提醒输出用户名或quit:
#!/bin/bash #the purpose of the program # #08/13/2016 # PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH func1() { useruid=$(grep "^$1" /etc/passwd|cut -d: -f3) usershell=$(grep "^$1" /etc/passwd|cut -d: -f7) echo -e -n "user $1 UID is :$useruid\n SHELL is :$usershell\n" } read -p "please input a user name or \"quit\" :" option while [ $option != "quit" ];do id $option &> /dev/null && result=0 || result=1 case $result in 0) func1 $option ;; 1) read -p "please input a username or \"quit\",what you input is not them:" option continue ;; esac read -p "please input a user name or \"quit\" again:" option done echo "you have input \"quit\",now scripts over"
8、写一个脚本,完成如下功能(使用函数)
(1) 提示用户输入一个可执行命令的名字;获取此命令依赖的所有库文件;
(2) 复制命令文件至/mnt/sysroot目录下的对应的rootfs的路径上,例如,如果复制的文件原路径是/usr/bin/useradd,则复制到/mnt/sysroot/usr/bin/目录中;
(3) 复制此命令依赖的各库文件至/mnt/sysroot目录下的对应的rootfs的路径上;规则同上面命令相关的要求;
#!/bin/bash #the purpose of the program # #08/13/2016 # PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH target=/mnt/sysroot [ -d $target ] || mkdir /mnt/sysroot read -p "please input a command which you want to cp to /mnt/sysroot,and \"quit\" is over:" cmdname libcp() { for lib in $(ldd $1 | grep -o "[^[:space:]]*/lib[^[:space:]]*"); do libdir=$(dirname $lib) [ -d $target$libdir ] || mkdir -p $target$libdir [ -f $target$lib ] || cp $lib $target$lib done } while [ "$cmdname" != 'quit' ]; do if ! which $cmdname &> /dev/null; then read -p "No such command, enter again: " cmdname continue fi cmdname=$(which --skip-alias $cmdname) cmnddir=$(dirname $cmdname) [ -d $target$cmnddir ] || mkdir -p $target$cmnddir [ -f $target$cmdname ] || cp $cmdname $target$cmdname libcp $cmdname read -p "Another command(quit): " cmdname done
原创文章,作者:N20-重庆-雪寒,如若转载,请注明出处:http://www.178linux.com/18709
评论列表(2条)
原理部分再配上一些简易图加以说明就更好了
Hei du!SÃ¥ herlig promotering da;)) tuuusen takk:))Nydelige trekk, tror du de passer til ba?gbarneylassb? jeg har mange av de, sÃ¥ tenkte jeg skulle begynne litt julegaveinnkjøp hos deg…;))Klem!