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比較小,通??梢择v留在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.www58058.com/18709
原理部分再配上一些簡易圖加以說明就更好了
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!