從 CentOS 5.5 中精簡出屬於本身的專屬Linux(二)

前言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 重啓效果:

重啓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)、測試

tty1

最後你們會發現 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

你們看到了吧, 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]#

再測試一下

tty2

測試成功!如今咱們的小Linux 已經有了, 開關機功能,也能在 3 級別下運行腳本(服務)!下一篇博客中咱們將增長網絡功能 ^_^ ……

相關文章
相關標籤/搜索