共計(jì) 7819 個(gè)字符,預(yù)計(jì)需要花費(fèi) 20 分鐘才能閱讀完成。
如何打造私人 Linux 小系統(tǒng),針對(duì)這個(gè)問(wèn)題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問(wèn)題的小伙伴找到更簡(jiǎn)單易行的方法。
一、前言
Linux 操作系統(tǒng)至 1991.10.5 號(hào)誕生以來(lái),就源其開(kāi)源性和自由性得到了很多技術(shù)大牛的青睞,每個(gè) Linux 愛(ài)好者都為其貢獻(xiàn)了自己的一份力,不管是在 Linux 內(nèi)核還是開(kāi)源軟件等方面,都為我們后來(lái)人提供了一個(gè)良好的學(xué)習(xí)和研究環(huán)境。做為一個(gè) Linuxer,感謝各位前輩們?yōu)槲覀兲峁┮粋€(gè)自由的空間,讓我們也能夠在學(xué)習(xí)的同時(shí)去研究 Linux。
下面主要通過(guò)裁剪現(xiàn)有 Linux 系統(tǒng),打造一個(gè)屬于自己的 Linux 小系統(tǒng),讓其能夠裝載網(wǎng)卡驅(qū)動(dòng),并配置 IP 地址,實(shí)現(xiàn)網(wǎng)絡(luò)功能。
二、原理
啟動(dòng)流程介紹:
制作 Linux 小系統(tǒng)之前,我們有必要再了解一下 Linux 的啟動(dòng)流程:
1、首先 Linux 要通過(guò) POST 自檢,檢查硬件設(shè)備有沒(méi)有故障
2、如果有多塊啟動(dòng)盤(pán)的話(huà),需要在 BIOS 中選擇啟動(dòng)磁盤(pán)
3、啟動(dòng) MBR 中的 bootloader 引導(dǎo)程序
4、加載內(nèi)核文件
5、執(zhí)行所有進(jìn)程的父進(jìn)程、老祖宗 init
6、打印歡迎界面
在 Linux 的啟動(dòng)流程中,加載內(nèi)核文件時(shí)還需要借助別外兩個(gè)文件:
1)initrd,是 CentOS5 上用內(nèi)存模擬的磁盤(pán)設(shè)備
2)initramfs,是 CentOS6 上用內(nèi)存模擬的文件系統(tǒng)
在啟程的流程中,init 主要是用來(lái)做哪些操作的呢?
init 通過(guò)調(diào)用 /etc/inittab 這個(gè)配置文件,然后再去執(zhí)行 /etc/rc.d/rc.sysinit 的系統(tǒng)初始化腳本
啟發(fā)
到 Linux 打印歡迎界面后,就說(shuō)明系統(tǒng)已經(jīng)啟動(dòng)成功,如果我們要制作一個(gè) Linux 小系統(tǒng),我們只需要把它在開(kāi)機(jī)流程中用到的各文件都裝載到一起,就可以點(diǎn)亮屬于我們自己的系統(tǒng)了,而 Linux 是一個(gè)模塊化的操作系統(tǒng),好多功能組件都是通過(guò)模塊化的工具來(lái)實(shí)現(xiàn)的,而且支持動(dòng)態(tài)裝載和卸載,我們要是想實(shí)現(xiàn)某種功能,只需加載相應(yīng)的模塊即可,就可以實(shí)現(xiàn)我們的 Linux 操作系統(tǒng)大瘦身了。
三、操作步驟
1、目標(biāo)磁盤(pán)分區(qū)
在宿主機(jī)上掛一塊新磁盤(pán),命名為 soft-Linux,此塊磁盤(pán)是宿主機(jī)上的第二塊磁盤(pán),所以這里是 /dev/sdb,而到時(shí)候掛載到目標(biāo)主機(jī)的時(shí)候,因?yàn)槟抢镏挥羞@一塊磁盤(pán),所以在目標(biāo)主機(jī)上的名稱(chēng)應(yīng)該是 /dev/sda,這個(gè)不能搞混了。首先,我們要在目標(biāo)磁盤(pán)上分兩個(gè)區(qū),并進(jìn)行格式化。*** 個(gè)分區(qū) 500M,用來(lái)裝引導(dǎo)程序;第二個(gè)分區(qū) 10G,用來(lái)裝根文件系統(tǒng)。然后再進(jìn)行掛載操作,將 /dev/sdb1 掛載到 /mnt/boot 下,將 /dev/sdb2 掛載到 /mnt/sysroot 下。
[root@nmshuishui ~]# mount /dev/sdb1 /mnt/boot mount: mount point /mnt/boot does not exist [root@nmshuishui ~]# mkdir -p /mnt/boot /mnt/sysroot [root@nmshuishui ~]# mount /dev/sdb1 /mnt/boot [root@nmshuishui ~]# mount /dev/sdb2 /mnt/sysroot/ [root@nmshuishui ~]#
2、安裝 grub 至目標(biāo)磁盤(pán)
一個(gè)系統(tǒng)能啟動(dòng),就需要引導(dǎo),所以我們首先要安裝一個(gè) grub 引導(dǎo)程序到我們的新磁盤(pán)上,安裝 grub 引導(dǎo)程序主要有兩個(gè)命令,一個(gè)是 grub-install,另一個(gè)是 setup,這里 *** 使用 grub-install 來(lái)安裝。因?yàn)椋?/p>
①grub-install 會(huì)安裝 grub 引導(dǎo)第二階段的文件 ②setup 不會(huì)安裝第二階段的引導(dǎo)程序,是安裝引導(dǎo)信息到 MBR 第二個(gè)需要注意的地方就是 --root-directory= 后面接的路徑應(yīng)該是 boot 目錄所在的地方,而不是 /mnt/boot,因?yàn)?boot 目錄在 mnt 下;目標(biāo)磁盤(pán)是 /dev/sdb [root@nmshuishui ~]# 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@nmshuishui ~]# cd /mnt/boot/ [root@nmshuishui boot]# ls grub lost+found [root@nmshuishui boot]# cd grub/ [root@nmshuishui grub]# ls device.map e2fs_stage1_5 fat_stage1_5 ffs_stage1_5 iso9660_stage1_5 jfs_stage1_5 minix_stage1_5 reiserfs_stage1_5 stage1 stage2 ufs2_stage1_5 vstafs_stage1_5 xfs_stage1_5 [root@nmshuishui grub]#
安裝完 grub 后,進(jìn)入 grub 目錄,會(huì)發(fā)現(xiàn)沒(méi)有 grub.conf 配置文件,這樣就導(dǎo)致我們的引導(dǎo)程序是不健全的,所以我們需要手動(dòng)寫(xiě)一個(gè)配置文件在里邊,不過(guò)這得需要知道內(nèi)核的版本,等移植完內(nèi)核版本,再回過(guò)頭來(lái)補(bǔ)充此步。
3、復(fù)制內(nèi)核文件和 initrd 文件
init 是系統(tǒng)中用來(lái)產(chǎn)生其它所有進(jìn)程的程序。它以守護(hù)進(jìn)程的方式存在,其進(jìn)程號(hào)為 1,init 是所有進(jìn)程的父進(jìn)程,老祖宗,所以不移植是不行的。它通過(guò)調(diào)用 /etc/inittab 這個(gè)配置文件,然后再去執(zhí)行 /etc/rc.d/rc.sysinit 的系統(tǒng)初始化腳本。
將內(nèi)核文件和 initrd 文件復(fù)制到 /dev/sdb 下的 boot 目錄中。
[root@nmshuishui grub]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz-soft [root@nmshuishui grub]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs-soft.img [root@nmshuishui grub]#
4、創(chuàng)建目標(biāo)主機(jī)根文件系統(tǒng)
①使用命令行展開(kāi)創(chuàng)建文件系統(tǒng)
[root@nmshuishui sysroot]# mkdir -pv /mnt/sysroot/{etc/rc.d,usr,var,proc,sys,dev,lib,lib64,bin,sbin,boot,srv,mnt,media,home,root} mkdir: created directory `/mnt/sysroot/etc mkdir: created directory `/mnt/sysroot/etc/rc.d mkdir: created directory `/mnt/sysroot/usr mkdir: created directory `/mnt/sysroot/var mkdir: created directory `/mnt/sysroot/proc mkdir: created directory `/mnt/sysroot/sys mkdir: created directory `/mnt/sysroot/dev mkdir: created directory `/mnt/sysroot/lib mkdir: created directory `/mnt/sysroot/lib64 mkdir: created directory `/mnt/sysroot/bin mkdir: created directory `/mnt/sysroot/sbin mkdir: created directory `/mnt/sysroot/boot mkdir: created directory `/mnt/sysroot/srv mkdir: created directory `/mnt/sysroot/mnt mkdir: created directory `/mnt/sysroot/media mkdir: created directory `/mnt/sysroot/home mkdir: created directory `/mnt/sysroot/root [root@nmshuishui sysroot]# ls bin boot dev etc home lib lib64 lost+found media mnt proc root sbin srv sys usr var [root@nmshuishui sysroot]#
②移植 bash 命令和其庫(kù)文件到根文件系統(tǒng)
[root@nmshuishui mnt]# sh ~/scripts/cporder.sh Enter a command: bash Enter a command: shutdown Enter a command: reboot Enter a command: vim Enter a command: touch Enter a command: mkdir Enter a command: rm Enter a command: ls Enter a command: cat Enter a command: less Enter a command: ifconfig Enter a command: ip Enter a command: route Enter a command: quit quit [root@nmshuishui mnt]# sync [root@nmshuishui mnt]# sync [root@nmshuishui mnt]# ls boot sysroot [root@nmshuishui mnt]# cd sysroot/ [root@nmshuishui sysroot]# ls bin lib64 sbin usr [root@nmshuishui sysroot]# cd bin/ [root@nmshuishui bin]# ls bash cat ls mkdir rm touch [root@nmshuishui bin]# ln -sv bash sh `sh - `bash [root@nmshuishui bin]# sync [root@nmshuishui bin]#
附:命令移植腳本
#!/bin/bash # target=/mnt/sysroot clearCmd() { if which $cmd /dev/null; then cmdPath=`which --skip-alias $cmd` else echo No such command return 5 fi } cmdCopy() { cmdDir=`dirname $1` [ -d ${target}${cmdDir} ] || mkdir -p ${target}${cmdDir} [ -f ${target}${1} ] || cp $1 ${target}${cmdDir} } libCopy() { for lib in `ldd $1 | grep -o /[^[:space:]]\{1,\} do libDir=`dirname $lib` [ -d ${target}${libDir} ] || mkdir -p ${target}${libDir} [ -f ${target}${lib} ] || cp $lib ${target}${libDir} done } while true; do read -p Enter a command: cmd if [ $cmd == quit ] ;then echo quit exit 0 fi clearCmd $cmd [ $? -eq 5 ] continue cmdCopy $cmdPath libCopy $cmdPath done
5、為 grub 提供配置文件
上面移植了內(nèi)核和 initrd 文件,我們就可以根據(jù)內(nèi)核版本和 initrd 版本來(lái)編寫(xiě) grub.conf 配置文件了:
[root@nmshuishui grub]# vim grub.conf default=0 timeout=5 title nmshuishui soft-Linux root (hd0,0) kernel /vmlinuz-soft ro root=/dev/sda2 quiet selinux=0 init=/bin/bash initrd /initramfs-soft.img ~
quiet 是靜默安裝,不再顯示安裝時(shí)的一大堆信息。后面要把 selinux 關(guān)掉,而且 init 要使用 /bin/bash,告訴內(nèi)核不要再去找 init 程序了。如果不指定這一步,在啟動(dòng)過(guò)程中就會(huì)報(bào) kernel panic(內(nèi)核恐慌),以為系統(tǒng)就它一個(gè)了,沒(méi)有 init 進(jìn)程,恐慌的不行。
6、啟動(dòng)測(cè)試
7、特別提醒
如果在 vmvare 上做此實(shí)驗(yàn),在新建虛擬機(jī)創(chuàng)建新磁盤(pán)的時(shí)候,一定要選“Store virtual disk as a single file”,否則,也會(huì)出現(xiàn)內(nèi)核恐慌 kennel panic。
四、裝載模塊,實(shí)現(xiàn)網(wǎng)絡(luò)功能
1、查看宿主機(jī)的網(wǎng)卡模塊信息
[root@nmshuishui net]# lsmod | grep e1000 e1000 170646 0 [root@nmshuishui net]#
2、查看網(wǎng)卡的詳細(xì)信息
[root@nmshuishui net]# modinfo e1000 filename: /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko version: 7.3.21-k8-NAPI license: GPL description: Intel(R) PRO/1000 Network Driver author: Intel Corporation, Linux.nics@intel.com srcversion: 1D4F1E82BB99EA36D320B1B alias: pci:v00008086d00002E6Esv*sd*bc*sc*i* alias: pci:v00008086d000010B5sv*sd*bc*sc*i* alias: pci:v00008086d00001099sv*sd*bc*sc*i* alias: pci:v00008086d0000108Asv*sd*bc*sc*i* alias: pci:v00008086d0000107Csv*sd*bc*sc*i*
這里查詢(xún)到了網(wǎng)卡模塊的路徑,把它復(fù)制到 /dev/sdb 的庫(kù)文件下:
[root@nmshuishui net]# mkdir -pv /mnt/sysroot/lib64/modules mkdir: created directory `/mnt/sysroot/lib64/modules [root@nmshuishui net]# cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/modules/e1000.ko
3、init 程序
現(xiàn)在雖然是模塊復(fù)制過(guò)去了,但是還不能用,而且現(xiàn)在也不滿(mǎn)足我們的流程需要,因?yàn)檫B最起碼的 init 程序都沒(méi)有,如果我們想要這個(gè) init,有兩個(gè)選擇,***,移植宿主系統(tǒng)的,但是格式會(huì)復(fù)雜一些;所以我們還是先自己動(dòng)手寫(xiě)腳本吧,把腳本當(dāng)作 init 來(lái)用,能夠讓小系統(tǒng)跑起來(lái)。init 一般在 sbin 目錄下,所以我們要在 /dev/sdb2 這個(gè)分區(qū)上編寫(xiě)一個(gè) init 腳本。
[root@nmshuishui ~]# cd /mnt/sysroot/sbin/ [root@nmshuishui sbin]# vim init #!/bin/bash #print Welcome info echo -e Welcome to \033[34m nmshuishui soft-Linux\033[0m #mount wei wenjian system when the system is running. mount -n -t proc proc /proc mount -n -t sysfs sysfs /sys #mount ethernet driver autl when the system is start. insmod /lib64/modules/e1000.ko [ $? -eq 0 ] echo -e Load e1000 module succeeded [\033[32m0K\033[0m] ifconfig lo 172.0.0.1/8 ifconfig eth0 172.16.251.235/16 #mount the /dev/sda2 to make it can be write and read. mount -n -o remount,rw /dev/sda2 / #run /bin/bash /bin/bash
寫(xiě)完這個(gè) init 腳本后,我們要把我們要給其一個(gè)執(zhí)行權(quán)限,讓其能夠被執(zhí)行;此腳本中還用到 mount,insmod 這些命令,所以要用上一個(gè)腳本把這些命令移植過(guò)去。*** 還需要把 /mnt/boot/grub/grub.conf 中的 init=/bin/bash 換成 init=/sbin/init,因?yàn)槲椰F(xiàn)在要用這個(gè) init 腳本來(lái)執(zhí)行系統(tǒng)啟動(dòng)了,再也不需讓 /bin/bash 來(lái)替換了。
4、實(shí)現(xiàn)網(wǎng)絡(luò)功能的 Linux 小系統(tǒng)
上面的步驟完成后,就可以把 /dev/sdb 掛到另一臺(tái)主機(jī)上體驗(yàn)我們的私人訂制小系統(tǒng)了。
關(guān)于如何打造私人 Linux 小系統(tǒng)問(wèn)題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒(méi)有解開(kāi),可以關(guān)注丸趣 TV 行業(yè)資訊頻道了解更多相關(guān)知識(shí)。