1. 精簡initrd文件
[root@localhost ~]# file /boot/initrd-2.6.18-164.el5.img
/boot/initrd-2.6.18-164.el5.img: gzip compressed data, from Unix, last modified: Thu Jul 23 18:46:14 2015, max compression
cp /boot/initrd-2.6.18-164.el5.img /boot/initrd-2.6.18-164.el5.img.gz
gzip -d initrd-2.6.18-164.el5.img.gz
[root@localhost ~]# file initrd-2.6.18-164.el5.img
initrd-2.6.18-164.el5.img: ASCII cpio archive (SVR4 with no CRC)
cd /root
mkdir tmp
cd tmp
cpio -id < ../initrd-2.6.18-164.el5.img
cd /root
mkdir tmp
cd tmp
zcat /root/initrd-2.6.18-*.img.gz | cpio -id
vi init
註釋掉一些用不到的行:
#!/bin/nash
mount -t proc /proc /proc
setquiet
echo Mounting proc filesystem
echo Mounting sysfs filesystem
mount -t sysfs /sys /sys
echo Creating /dev
mount -o mode=0755 -t tmpfs /dev /dev
mkdir /dev/pts
mount -t devpts -o gid=5,mode=620 /dev/pts /dev/pts
mkdir /dev/shm
mkdir /dev/mapper
echo Creating initial device nodes
mknod /dev/null c 1 3
mknod /dev/zero c 1 5
mknod /dev/urandom c 1 9
mknod /dev/systty c 4 0
mknod /dev/tty c 5 0
mknod /dev/console c 5 1
mknod /dev/ptmx c 5 2
mknod /dev/rtc c 10 135
mknod /dev/tty0 c 4 0
mknod /dev/tty1 c 4 1
mknod /dev/tty2 c 4 2
mknod /dev/tty3 c 4 3
mknod /dev/tty4 c 4 4
mknod /dev/tty5 c 4 5
mknod /dev/tty6 c 4 6
mknod /dev/tty7 c 4 7
mknod /dev/tty8 c 4 8
mknod /dev/tty9 c 4 9
mknod /dev/tty10 c 4 10
mknod /dev/tty11 c 4 11
mknod /dev/tty12 c 4 12
mknod /dev/ttyS0 c 4 64
mknod /dev/ttyS1 c 4 65
mknod /dev/ttyS2 c 4 66
mknod /dev/ttyS3 c 4 67
echo Setting up hotplug.
hotplug
echo Creating block device nodes.
mkblkdevs
##echo "Loading ehci-hcd.ko module"
#insmod /lib/ehci-hcd.ko
#echo "Loading ohci-hcd.ko module"
#insmod /lib/ohci-hcd.ko
#echo "Loading uhci-hcd.ko module"
#insmod /lib/uhci-hcd.ko
#mount -t usbfs /proc/bus/usb /proc/bus/usb
echo "Loading jbd.ko module"
insmod /lib/jbd.ko
echo "Loading ext3.ko module"
insmod /lib/ext3.ko
#echo "Loading scsi_mod.ko module"
#insmod /lib/scsi_mod.ko
#echo "Loading sd_mod.ko module"
#insmod /lib/sd_mod.ko
#echo "Loading scsi_transport_spi.ko module"
#insmod /lib/scsi_transport_spi.ko
#echo "Loading mptbase.ko module"
#insmod /lib/mptbase.ko
#echo "Loading mptscsih.ko module"
#insmod /lib/mptscsih.ko
#echo "Loading mptspi.ko module"
#insmod /lib/mptspi.ko
#echo "Loading libata.ko module"
#insmod /lib/libata.ko
#echo "Loading ata_piix.ko module"
#insmod /lib/ata_piix.ko
#echo "Loading dm-mod.ko module"
#insmod /lib/dm-mod.ko
#echo "Loading dm-log.ko module"
#insmod /lib/dm-log.ko
#echo "Loading dm-mirror.ko module"
#insmod /lib/dm-mirror.ko
#echo "Loading dm-zero.ko module"
#insmod /lib/dm-zero.ko
#echo "Loading dm-snapshot.ko module"
#insmod /lib/dm-snapshot.ko
#echo "Loading dm-mem-cache.ko module"
#insmod /lib/dm-mem-cache.ko
#echo "Loading dm-region_hash.ko module"
#insmod /lib/dm-region_hash.ko
#echo "Loading dm-message.ko module"
#insmod /lib/dm-message.ko
#echo "Loading dm-raid45.ko module"
#insmod /lib/dm-raid45.ko
#echo Waiting for driver initialization.
#stabilized --hash --interval 1000 /proc/scsi/scsi
mkblkdevs
#echo Scanning and configuring dmraid supported devices
#echo Scanning logical volumes
#lvm vgscan --ignorelockingfailure
#echo Activating logical volumes
#lvm vgchange -ay --ignorelockingfailure VolGroup00
#resume /dev/VolGroup00/LogVol01
echo Creating root device.
mkrootdev -t ext3 -o defaults,ro /dev/VolGroup00/LogVol00
echo Mounting root filesystem.
mount /sysroot
echo Setting up other filesystems.
setuproot
echo Switching to new root and running init.
switchroot
rm /mnt/boot/initrd.img
find . | cpio -H newc --quiet -o | gzip -9 > /mnt/boot/initrd.img
2. 拷貝命令腳本
#!/bin/bash
#
DEST=/mnt/sysroot
libcp() {
LIBPATH=${1%/*}
[ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
[ ! -e $DEST${1} ] && cp $1 $DEST$LIBPATH && echo "copy lib $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 "/.*lib\(64\)\{0,1\}/[^[:space:]]\{1,\}"`; do
libcp $LIB
done
}
read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
! which $CMD &> /dev/null && echo "Wrong command" && read -p "Input again:" CMD && continue
COMMAND=` which $CMD | grep -v "^alias" | grep -o "[^[:space:]]\{1,\}"`
bincp $COMMAND
echo "copy $COMMAND finished."
read -p "Continue: " CMD
done
有了這個腳本我們就可以輕鬆的拷貝命令呢,把一些常用的命令拷貝過去吧。
使用bincp.sh拷貝:ls, cd, cat, pwd
3. 添加rc腳本
運行級別的原理:
1). 在目錄/etc/rc.d/init.d下有許多服務器腳本程序
2). 在/etc/rc.d下有7個名爲rcN.d的目錄,對應系統的7個運行級別
3). rcN.d目錄下都是一些符號鏈接文件,這些鏈接文件都指向init.d目錄下的service腳本文件,命名規則爲K+nn+服務名或S+nn+服務名,其中nn爲兩位數字
4). 系統會根據指定的運行級別進入對應的rcN.d目錄,並按照文件名順序檢索目錄下的鏈接文件
對於以K開頭的文件,系統將終止對應的服務
對於以S開頭的文件,系統將啓動對應的服務
rc腳本所負責的正是原理4) 中服務的終止和啓動。下面與一個簡化版的rc腳本
vi /mnt/sysroot/etc/rc.d/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
加上可執行權限:
chmod +x rc
修改inittab,指定在0和6運行級別時調用rc腳本,並且將運行級別作爲參數。
vi etc/inittab
添加如下兩行:
l0:0:wait:/etc/rc.d/rc 0
l6:6:wait:/etc/rc.d/rc 6
4. 添加關機重啓功能
shutdown命令被調用後會向所有運行中的程序發送SIGTEAM信號,告訴它們系統即將關閉。這個非常有用,比如vi在接收到SIGTEAM信號後可以及時保存正在編輯的文件。然後shutdown會發送信號給init進程,請求切換運行級別,0級別用來關閉系統,使用-h參數指定。6級別用來重啓系統,使用-r參數指定。
根據運行級別的原理,0級別會在/etc/rc.d/rc0.d下檢索並執行服務腳本文件,6級別對應的是/etc/rc.d/rc6.d。
rc0.d下的S01halt和rd6.d下的S01reboot鏈接同時指向/etc/rc.d/init.d/halt文件。
然後在halt文件中會調用halt或reboot命令,才能做到真正的關機和重啓操作。
那麼常用的關機重啓命令還有halt, reboot,這三個命令有什麼關係呢?
原來halt和reboot命令在運行級別不爲0或6時執行,會被替換爲shutdown -h或shutdown -r。運行級別爲0或6時則不會被替換。
也就是說正常運行級別下,reboot和halt都要藉助shutdown命令。
利用上面的bincp.sh複製這3個命令
shutdown,halt,reboot
完成halt
mkdir /mnt/sysroot/etc/rc.d/init.d/
vi /mnt/sysroot/etc/rc.d/init.d/halt
內容:
#!/bin/bash
case $0 in
*halt)
COMMAND="/sbin/halt -p"
;;
*reboot)
COMMAND="/sbin/reboot"
;;
*)
echo echo "$0: call me as 'halt' or 'reboot' please!"
;;
esac
exec $COMMAND
增加可執行權限:
chmod +x /mnt/sysroot/etc/rc.d/init.d/halt
創建0和6級別對應的rcN.d目錄,並且創建halt文件的鏈接
cd /mnt/sysroot/etc/rc.d/
mkdir rc0.d rc6.d
cd rc0.d
ln -s ../init.d/halt S01halt
cd rc6.d
ln -s ../init.d/halt S01reboot
5. 添加用戶登陸驗證功能
[root@localhost bin]# ldd login
linux-gate.so.1 => (0xffffe000)
libcrypt.so.1 => /lib/libcrypt.so.1 (0x0040d000)
libm.so.6 => /lib/libm.so.6 (0xf7edf000)
libc.so.6 => /lib/libc.so.6 (0x002b1000)
/lib/ld-linux.so.2 (0x00293000)
cp /lib/libcrypt.so.1 /mnt/sysroot/lib/libcrypt.so.1
cp /lib/ /lib/libm.so.6 /mnt/sysroot/lib/libm.so.6
cp /lib/ /lib/libc.so.6 /mnt/sysroot/lib/libc.so.6
cp -d /lib/libnss_files* /mnt/sysroot/lib/
cp -d /usr/lib/libnss3.so /usr/lib/libnssckbi.so /usr/lib/libnssutil3.so /mnt/sysroot/usr/lib/
拷貝並編輯nsswitch.conf文件
cp /etc/nsswitch.conf /mnt/sysroot/etc/
vi /mnt/sysroot/etc/nsswitch.conf
保留下面這4行即可
33 passwd: files
34 shadow: files
35 group: files
38 hosts: files dns</span>
添加passwd, shadow, gourp這3個文件
grep "^root\>" /etc/passwd > /mnt/sysroot/etc/passwd
grep "^root\>" /etc/shadow> /mnt/sysroot/etc/shadow
grep "^root\>" /etc/group> /mnt/sysroot/etc/group
修改inittab文件,
vi /mnt/sysroot/etc/inittab
指定2345運行級別時啓動mingetty,mingetty會調用/bin/login驗證用戶:
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
移植命令:mingetty
去掉/mnt/sysroot/etc/rc.d/rc.sysinit中的/bin/bash,僅保留:
#!/bin/bash
echo -e "\tWelcome to \033[31mMy MiniLinux\033[0m."
vi /mnt/sysroot/root/.bash_profile
添加內容
export PS1='[\u@\h \W]\\$ '
其中\u等符號會分別被替換6. 測試
掛起正在使用的工作機,切換到虛擬機中MiniLinux,並開機,過幾秒後出現login提示符,使用root賬戶登錄(密碼同工作機中root密碼)後如圖所示,說明前面的幾步都是沒有問題的:
7. 總結
本章爲MiniLinux添加了關機重啓功能,終於可以使用命令進行關機和重啓,而不是點擊vmware中的按鈕。用戶登錄驗證的添加,只有拿到用戶密碼纔可以使用MiniLinux,增強了系統的安全性。一些常用命令的添加增加了它的實用性。但是,現在的系統只能看,不能動,因爲文件系統是以只讀方式掛載的,一切對文件系統的寫操作都是不允許的,下一章將要解決的就是這個問題。