我們這次講述一下Linux啟動的啟動流程以及制作一個附帶網絡功能的mini linux
一、敘述
在制作一個小型的Linux之前,首先你得明白Linux系統的啟動過程,我們用一張圖來進行說明
二、為什么要制作這么一個小型的系統?
答案很簡單,就是為了更好的了解Linux,當然這個沒有必要了解的太深,或許你看到這個并不影響你使用并且操作一個Linux,這個也是一個興趣。
我們的操作系統的組成無非就是以硬件作為支撐,然后由內核來調度從而對應用程序實現系統調用,但是這個系統調用接口畢竟還是很難銜接的,也沒有其它的功能,就有了公用庫,程序所需要的功能都可以由他來實現,不過直接在系統調用接口上寫一個程序也是可以的,說到內核,那我們就要說一內核都有什么功能,內核的功能分別是:內存管理、進程管理、網絡協議管理、驅動程序、安全管理、文件系統等。
三、怎么制作
我們是用CentOS 6
為基礎來制作一個Linux,我們首先在虛擬機上添加一塊虛擬磁盤,添加完成其實就完成了一半,我們在系統的/mnt
目錄上建立兩個目錄,一個是boot
,另一個是;sysroot
。
[root@CentOS6 ~]# mkdir /mnt/{boot,sysroot}
1、制作步驟
由于磁盤是新添加的,我們使用fdisk分為兩個分區,分別掛載到剛才/mnt/boot和/mnt/sysroot中。
[root@CentOS6 ~]# fdisk /dev/sdb
使用fdisk建立磁盤分區完成之后,我們把磁盤進行格式化為ext4的分區,掛載到boot和sysroot目錄中。
# mkfs.ext4 /dev/sdb1 # mkfs.ext4 /dev/sdb2 # mount /dev/sdb1 /mnt/boot # mount /dev/sdb2 /mnt/sysroot
之后我們在新磁盤上安裝grub
[root@CentOS6 ~]# grub-install --root-directory=/mnt/ /dev/sdb
從/boot分區中復制 vmlinuz-VERSION
和initramfs-VERSION
兩個文件,一個是內核文件,另一個是內核所加載的驅動程序(里面含有模擬的根),復制完成后重新命令為vmlinuz和initramfs.img
[root@CentOS6 ~]# cp /boot/vmlinuz-2.6.32-358.el6.x86_64 /mnt/boot/vmlinuz [root@CentOS6 ~]# cp /boot/initramfs-2.6.32-358.el6.x86_64.img /mnt/boot/initramfs.img
之后我們在/mnt/boot/grub的目錄中新建一個文件叫grub.conf,內容格式如下:
[root@CentOS6 ~]# vim /mnt/boot/grub/grub.conf default=0 timeout=5 title CentOS 6.4 root (hd0,0) kernel /vmlinuz ro requiet root=/dev/sda2 selinux=0 init=/bin/bash initrd /initramfs.img chroot /mnt/sysroot
之后創建目錄在/mnt/sysroot上(必須有,不然啟動不了)
[root@CentOS6 ~]# mkdir -pv /mnt/sysroot/{etc,lib,lib64,bin,sbin,tmp,var,usr,sys,proc,opt,home,root,boot,dev,mnt,media}
用腳本復制相關的命令和庫文件,復制完成之后啟動看看,如果出錯,請更改,以上的步驟如果你成功,可以添加網絡功能了。復制命令腳本如下:
#!/bin/bash # Author:liu 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 "Please input command: " cmd [[ "$cmd" == "quit" ]] && echo "quit" && exit 0 clearCmd $cmd [ $? -eq 5 ] && continue cmdCopy $cmdPath libCopy $cmdPath done
將宿主機暫停,然后創建新的虛擬機將虛擬磁盤添加進新的虛擬機中。
以上步驟成功,開始添加我們的網絡功能吧!
2、將虛擬機添加網絡功能
首先我們先更改一下grub.conf(注意:是在/mnt/boot目錄下),將原來的init=/bin/bash更改為init=/sbin/init
default=0 timeout=5 title CentOS 6.4 root (hd0,0) kernel /vmlinuz ro requiet root=/dev/sda2 selinux=0 init=/sbin/init initrd /initramfs.img chroot /mnt/sysroot
然后我們在/mnt/sysroot/sbin目錄寫一個腳本,名字叫做init,寫作格式如下:
[root@CentOS6 ~]# vim /mnt/sysroot/sbin/init #!/bin/bash # mount -n -t proc proc /proc mount -n -t sysfs sysfs /sys mount -n -o remount,rw /dev/sda2 [[ $? -eq 0 ]] && echo "The / is success" insmod /lib64/e1000.ko ifconfig eth0 172.16.42.29/16 ifconfig lo 127.0.0.1/8 /bin/bash
找到宿主機網絡模塊e1000.ko所在的位置并拷貝到/mnt/sysroot/lib64目錄下(注意:在虛擬機中網卡的模塊叫做e1000可以用dmsg命令查看你的網卡的模塊名稱是什么)。
[root@CentOS6 ~]# dmesg | grep -i eth0 [root@CentOS6 ~]# modinfo -n e1000 /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko [root@CentOS6 ~]# cp /lib/modules/2.6.32-358.el6.x86_64/kernel/drivers/net/e1000/e1000.ko /mnt/sysroot/lib64/
保存并退出之后我們繼續利用復制命令腳本把相關命令復制進去(例如:ifconfig,nsmod,rmmod,reboot,ping等) 之后我們再一次啟動。
如果成功了,那我恭喜你。
原創文章,作者:劉 祥宇,如若轉載,請注明出處:http://www.www58058.com/64359