前言vim
在上一篇博客中(http://freeloda.blog.51cto.com/2033581/1220803),咱們說明了怎樣快速創建一個本身的專屬Linux,可是這個小型Linux仍是不特別和完善,只有簡單的開機界面和bash功能,在這一篇博客中咱們將完善它,咱們將增長開關機功能,登陸功能,網絡功能 ……bash
1. 寫一個腳本,實現對二進制命令及相應庫文件的複製網絡
(1). 目的:ide
在上一篇博客中,咱們複製二進制命令及對應的庫文件複製時,都是一個一個複製,先是用 which 命令查找路徑,後用 ldd 命令查找相關的庫文件,非常不方便!下面咱們就寫個腳本,實現自動複製二進制命令及相應庫文件! ^_^ ……函數
(2). 具體要求以下:oop
1)、寫一個函數,接受兩個參數(參數1,爲要複製的命令,參數2,爲複製命令對應的目標位置,如/mnt/sysroot),完成如下功能:
a. 判斷「參數1」 所對應的命令是否存在,若是存在:取得其目錄路徑,及命令對應的文件的名字,然後將此命令複製到「參數2」 對應的路徑下,跟此命令原來的目錄路徑相同的子目錄中;好比,若是「參數2」 爲/mnt/sysroot,而命令路徑爲/bin/ls,則須要將ls複製到/mnt/sysroot/bin目錄;若是命令路徑爲/usr/bin/man,則須要將man複製至/mnt/sysroot/usr/bin/中去。測試
b. 複製命令的同時,斷定此命令所依賴的庫文件,然後對每個庫文件作以下操做,取得其目錄路徑,及命令對應的文件的名字,然後將此命令複製到「參數2」 對應的路徑下,跟此命令原來的目錄路徑相同的子目錄中;但若是此庫文件已經複製過,則不須要再次複製。
2)、執行此函數 。this
(3). 具體腳本以下:spa
vim addcom.sh #!/bin/bash # DEST=/mnt/sysroot DIRE() { if [ -d $DEST/$CMD ]; then echo "this direstory is inxted" else mkdir -p $DEST/$CMD &> /dev/null echo "$CMD is a directory,mkdir finished" fi } libcp() { LIBPATH=${1%/*} [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH [ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib64 $1 finished." } bincp() { CMDPATH=${1%/*} [ ! -d $DEST$CMDPATH ] && mkdir -p $DEST$CMDPATH [ ! -e $DEST${1} ] && cp $1 $DEST$CMDPATH for LIB in `ldd $1 | grep -o "/.*lib64/[^[:space:]]\{1,\}"`; do libcp $LIB done } read -p "Your command: " CMD until [ $CMD == 'q' ]; do which $CMD &>/dev/null MM=`echo $?` if [ $MM -eq 0 ]; then ! which $CMD && echo "Wrong command" && read -p "Input againe: " CMD && continue COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"` bincp $COMMAND echo "copy $COMMAND finished." read -p "Continue: " CMD else DIRE read -p "Continue: " CMD fi done :wq
注意:我這邊的操做系統是CentOS 5.5 64位操做系統,全部的lib文件都在/mnt/sysroot/lib64中,若你是32位系統,請修改16與22行,將lib64目錄改成lib目錄!操作系統
(4). 效果以下:
[root@localhost ~]# sh addcom.sh Your command: ifconfig /sbin/ifconfig copy /sbin/ifconfig finished. Continue: [root@localhost ~]# [root@localhost ~]# [root@localhost ~]# /mnt/sysroot/sbin/ifconfig eth0 Link encap:Ethernet HWaddr 00:0C:29:16:63:C0 inet addr:192.168.1.116 Bcast:255.255.255.255 Mask:255.255.255.0 inet6 addr: fe80::20c:29ff:fe16:63c0/64 Scope:Link UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1 RX packets:19633 errors:0 dropped:0 overruns:0 frame:0 TX packets:13649 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:1000 RX bytes:4932356 (4.7 MiB) TX bytes:2409236 (2.2 MiB) lo Link encap:Local Loopback inet addr:127.0.0.1 Mask:255.0.0.0 inet6 addr: ::1/128 Scope:Host UP LOOPBACK RUNNING MTU:16436 Metric:1 RX packets:32 errors:0 dropped:0 overruns:0 frame:0 TX packets:32 errors:0 dropped:0 overruns:0 carrier:0 collisions:0 txqueuelen:0 RX bytes:6138 (5.9 KiB) TX bytes:6138 (5.9 KiB)
2. 實現關機與重啓功能
1)、修改inittab文件
[root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit #新增兩行 l0:0:wait:/etc/rc.d/rc 0 l6:6:wait:/etc/rc.d/rc 6 : wq
2)、複製兩個命令reboot和halt
[root@localhost ~]# sh addcom.sh Your command: reboot /sbin/reboot copy /sbin/reboot finished. Continue: halt /sbin/halt copy /sbin/halt finished. Continue: sync /bin/sync copy /bin/sync finished. [root@localhost ~]# cd /mnt/sysroot/sbin/ [root@localhost sbin]# ls halt ifconfig init reboot [root@localhost sbin]# cd /mnt/sysroot/bin [root@localhost bin]# ls bash ls mount sync [root@localhost bin]#
3)、新增開關機腳本
[root@localhost init.d]# pwd /mnt/sysroot/etc/rc.d/init.d [root@localhost init.d]# vim halt #!/bin/bash # case $0 in *reboot) COMMAND='/sbin/reboot' ;; *halt) COMMAND='/sbin/halt –p' ;; *) echo "only call thsi script *reboot *halt" ;; esac exec $COMMAND :wq [root@localhost rc.d]#
4)、新增 rc 腳本
[root@localhost rc.d]# pwd /mnt/sysroot/etc/rc.d [root@localhost rc.d]# ls init.d rc rc0.d rc6.d rc.sysinit [root@localhost rc.d]# vim rc #!/bin/bash # RUNLEVEL=$1 for I in /etc/rc.d/rc$RUNLEVEL.d/K*; do $I stop done for I in /etc/rc.d/rc$RUNLEVEL.d/S*; do $I start done :wq [root@localhost rc.d]#
5)、測試效果
init 0 關機效果:
init 6 重啓效果:
3. 增長 rc3.d 級別的運行腳本
在上面的測試中,咱們實現了關機與重啓功能,同時你們也看到了,咱們實現了 rc0.d,rc6.d 級別腳本的運行,下面咱們看一下怎麼實現 rc3.d 級別下實現腳本運行!
1)、修改 inittab 文件
[root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l3:3:wait:/etc/rc.d/rc 3 #新增一行 l6:6:wait:/etc/rc.d/rc 6
2)、增長一個測試腳本 tserver 來測試第三級別的運行狀況
#!/bin/bash # # chkconfig: 35 55 44 # description: test service script # FILE=/var/lock/subsys/`basename $0` start() { echo "starting `basename $0`..." touch $FILE } stop() { echo "stopping `basename $0`..." rm -rf $FILE } status() { if [ -e $FILE ]; then echo "Running.." else echo "stopping..." fi } usage() { echo "please insernt like start|stop|restart|status" } case $1 in start) start ;; stop) stop ;; restart) stop start ;; status) status ;; *) usage exit 1 ;; esac
3)、移植相關命令
[root@localhost ~]# sh addcom.sh Your command: chkconfig /sbin/chkconfig copy /sbin/chkconfig finished. Continue: basename /bin/basename copy /bin/basename finished. Continue: [root@localhost ~]#
通過上面的是三個步驟,應該是能夠執行的,可是仍是不能執行的!咱們還得進行下面的步驟!
4)、增長 rc3.d 目錄和相關的軟連接
[root@localhost ~]# cd /mnt/sysroot/etc/rc.d/ [root@localhost rc.d]# mkdir rc3.d [root@localhost rc.d]# ls init.d rc rc0.d rc3.d rc6.d rc.sysinit [root@localhost rc.d]# cd rc3.d [root@localhost rc3.d]# ln -sv ../init.d/tserver S55tserver [root@localhost rc.d]#cd rc0.d [root@localhost rc0.d]# ln -sv ../init.d/tserver K44tserver [root@localhost rc.d]#cd rc6.d [root@localhost rc6.d]# ln -sv ../init.d/tserver K44tserver
5)、修改inittab文件
[root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l3:3:wait:/etc/rc.d/rc 3 l6:6:wait:/etc/rc.d/rc 6 #新增下面兩行 1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1 2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2 #loginprog運行依賴/bin/sh.把bin下的bash鏈接爲sh便可實現
6)、移植 mingetty 命令
[root@localhost ~]# sh addcom.sh Your command: mingetty /sbin/mingetty copy /sbin/mingetty finished.
7)、loginprog運行依賴/bin/sh,把bin下的bash鏈接爲sh便可實現
[root@localhost ~]# cd /mnt/sysroot/bin/ [root@localhost bin]# ls basename bash df ls mkdir mount sync tar touch umount [root@localhost bin]# ln -sv bash sh create symbolic link `sh' to `bash' [root@localhost bin]# ll total 1384 -rwxr-xr-x 1 root root 20984 Jun 13 04:02 basename -rwxr-xr-x 1 root root 801512 Jan 22 2009 bash -rwxr-xr-x 1 root root 43192 Jun 13 03:11 df -rwxr-xr-x 1 root root 91240 Mar 1 2010 ls -rwxr-xr-x 1 root root 31664 Jun 13 03:10 mkdir -rwsr-xr-x 1 root root 60432 Jan 20 2010 mount lrwxrwxrwx 1 root root 4 Jun 13 04:32 sh -> bash -rwxr-xr-x 1 root root 20216 Jun 13 01:18 sync -rwxr-xr-x 1 root root 230464 Jun 13 03:11 tar -rwxr-xr-x 1 root root 42696 Jun 13 03:10 touch -rwsr-xr-x 1 root root 40208 Jun 13 03:11 umount [root@localhost bin]#
8)、修改 rc.sysinit 文件
[root@localhost ~]# vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/bash # echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux" mount -n -o remount.rw / mount -n –a /bin/bash # 刪除這一行 :wq
9)、測試
最後你們會發現 mingetty 只能啓動兩個終端,但仍是不能啓動 3 級別的腳本!並且尚未主機名只顯示 (none),你們別急,下面咱們再來完善它!
4. 增長主機名
從上圖中咱們能夠看出沒有主機名,下面咱們不先添加主機名!
1)、修改 rc.sysinit 文件
[root@localhost sysconfig]# vim /mnt/sysroot/etc/rc.d/rc.sysinit #!/bin/bash # #顯示開機提示符 echo -e "\t\tWelcome to \033[31mLittle\033[0m Linux" #從新掛載垠文件系統 echo "mount /" mount -n -o remount,rw / #掛載全部文件系統 echo "mount all partitions" mount -n -a #增長主機名 echo "set the hsotname" [ -f /etc/sysconfig/network ] && . /etc/sysconfig/network [ -z $HOSTNAME -o "$HSOTNAME" == '(none)' ] && HOSTNAME=localhost /bin/hostname $HOSTNAME
2)、移植 hostname 命令
[root@localhost ~]# sh addcom.sh Your command: hostname /bin/hostname copy /bin/hostname finished.
3)、測試
主機名增長完成 !
5. 開啓虛擬終端
因爲mingetty須要用戶登錄,且沒法啓動三級別的腳本,下面利用agetty來進行登錄驗證
1)、移植 agetty 命令
[root@localhost ~]# sh addcom.sh Your command: agetty /sbin/agetty copy /sbin/agetty finished.
2)、修改 inittab 文件
[root@localhost ~]# vim /mnt/sysroot/etc/inittab id:3:initdefault: si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l3:3:wait:/etc/rc.d/rc 3 l6:6:wait:/etc/rc.d/rc 6 #下面兩行刪除 1:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty1 2:2345:respawn:/sbin/mingetty --loginprog=/bin/bash tty2 #新增下面兩行 1:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty1 2:2345:respawn:/sbin/agetty -n -l /bin/bash 38400 tty2
3)、測試
你們看到了吧, Tserver 啓動了,並且還進入了終端!可是touch時不能新建文件是由於咱們這裏沒有subsys目錄!修改以下
4)、修正
新建subsys目錄
[root@localhost ~]# cd /mnt/sysroot/var/lock/ [root@localhost lock]# ls [root@localhost lock]# mkdir subsys [root@localhost lock]# ls subsys [root@localhost lock]#
再測試一下
測試成功!如今咱們的小Linux 已經有了, 開關機功能,也能在 3 級別下運行腳本(服務)!下一篇博客中咱們將增長網絡功能 ^_^ ……