RHEL6 Tiny Linux 的制作

###################  RHEL6 Tiny Linux  #################
以Linux的启动流程来制作,预备条件:宿主机,独立硬盘(也可以用镜像文件)
第一步:分区,挂载,以下是分区脚本
#!/bin/bash
# Difined Variable
#
BootPart=500M
RootPart=2G
read -p "Input your disk that need to format: " Disk

# Partitons
(
/sbin/fdisk $Disk <<EOF
n
p
1

+$BootPart
n
p
2

+$RootPart
w
EOF
)&> /dev/null

sleep 3

mkfs.ext4 ${Disk}1 &> /dev/null
mkfs.ext4 ${Disk}2 &> /dev/null

mkdir /mnt/{boot,sysroot} &> /dev/null

mount ${Disk}1 /mnt/boot


第二步:安装GRUB及其配置文件,以下是处理脚本

#!/bin/bash
#
GrubRD=/mnt
read -p "Input your disk for installing grub: " Gbdisk
grub-install --root-directory=$GrubRD $Gbdisk
cd $GrubRD/boot/grub
cat >grub.conf <<EOF
timeout=5
default=0
title Welcome to use tiny linux(2.6.32)
        root(hd0,0)
        kernel /vmlinuz ro root=/dev/sda2 selinux=0
        initrd /initramfs.img
EOF

#copy kernel and initrd from current system
cp /boot/vmlinuz* /$GrubRD/boot/vmlinuz
cp /boot/initramfs* /$GrubRD/boot/initramfs.img

 

第三步: 建立根文件系统下的相关目录以及初始化脚本

#!/bin/bash
#
read -p "input real rootfs's path for tiny linux: " Sysroot
cd ${Sysroot:-/mnt/sysroot}
mkdir -p  proc sys dev etc/{init,rc.d} lib/modules lib64 bin sbin usr/{lib,lib64} var/{log,run,lock}
cat >./etc/init/rcS.conf <<EOF
start on startup

stop on runlevel

task
console output
exec /etc/rc.d/rc.sysinit
EOF

cat >./etc/rc.d/rc.sysinit <<EOF
#!/bin/bash
#
echo -e "\tWelcome to come \033[5;31mTiny Linux\033[0m"
/bin/bash
EOF
chmod +x ./etc/rc.d/rc.sysinit

 

第四步:拷贝要使用的程序命令到根目录
#!/bin/bash
#
DEST=/mnt/sysroot
libcp() {
  LIBPATH=${1%/*}
  [ ! -d $DEST$LIBPATH ] && mkdir -p $DEST$LIBPATH
  [ ! -e $DEST${1} ] && cp -a  $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\}/[^.]\{1,\}"`; do
    if [ "$LIB" = "/lib64/ld-linux-x86-64" ];then
        LIB=`echo $LIB | grep -o "/.*lib\(64\)\{0,1\}/[^-]\{1,\}"`
    fi
    libcp $LIB
  done
}

read -p "Your command: " CMD
until [ $CMD == 'q' ]; do
   ! which $CMD && 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

 

第五步:添加运行级别0 和 6 ,使系统可以正常关机重启
1. cp -a /etc/init/rc.conf .
2. 建立rc脚本 
#!/bin/bash
#
#create rc script
#
Tiny_etc_dir=/mnt/sysroot/etc
[ -d ${Tiny_etc_dir}/rc.d ] || mkdir -p ${Tiny_etc_dir}/rc.d
cat >${Tiny_etc_dir}/rc.d/rc <<EOF 
#!/bin/bash
#
RunLevel_Dir=/etc/rc.d/rc$1
for i in ${RunLevel_Dir}/K*;do
        if [ -x $i ];then
                $i stop
        fi
done

for i in ${RunLevel_Dir}/S*;do
        if [ -x $i ];then
                $i start
        fi
done
EOF
chmod +x ${Tiny_etc_dir}/rc.d/rc

3. 建立init.d目录和rcN.d目录,以及对应的动作脚本和链接。
mkdir -p /mnt/sysroot/etc/{init.d,rc0.d,rc6.d}

4. 编写halt,用作关机和重启
vim /mnt/sysroot/etc/init.d/halt
#!/bin/bash
#
case $0 in
*halt)
        echo "halting the  system......."
        /sbin/halt -p
        ;;
*reboot)
        echo "rebooting the system......"
        /sbin/reboot
        ;;
*)
        ;;
esac
chmod +x /mnt/sysroot/etc/init.d/halt

5. 使用第四部的脚本,来移动halt、reboot命令以及依赖库

6. 将halt脚本分别链接到rc0.d和rc6.d目录下
cd rc0.d
ln -sv ../init.d/halt S01halt
cd rc6.d
ln -sv ../init.d/halt S01reboot

7. 建立/etc/passwd文件,并在其中加入root用户条目:
cat >/mnt/sysroot/etc/passwd <<EOF
root:x:0:0:root:/root:/bin/bash
EOF

8. 拷贝/etc/passwd的依赖库
cp -a /lib64/libnss_files* /mnt/sysroot/lib64/

 

第六步:添加登陆终端
1. 拷贝init程序处理过程中与终端有关的配置文件
 cp -a /etc/init/{tty.conf,start-ttys.conf,prefdm.conf} /mnt/sysroot/etc/init/

2. 建立于登录有关的目录
 mkdir /mnt/sysroot/etc/{pam.d,security,sysconfig}

3. 拷贝与登录有关的配置文件
 cp /etc/pam.d/{login,system-auth} /mnt/sysroot/etc/pam.d 
 cp /etc/security/{limits.conf,namespace.conf} /mnt/sysroot/etc/security/
 cp /etc/sysconfig/init /mnt/sysroot/etc/sysconfig

4. 建立存放与登录pam相关的功能库文件目录
 mkdir /mnt/sysroot/lib64/security

5. 拷贝login中依赖的pam库文件
 for i in `awk 'grep -o 'pam.*so' /etc/pam.d/login`; do cp -a /lib64/security/$i /mnt/sysroot/lib64/security/; done

6. 拷贝system-auth中依赖的pam库文件
 for i in `awk '$3 ~ "so$" {print $3}' /etc/pam.d/system-auth `; do cp -a /lib64/security/$i /mnt/sysroot/lib64/security/; done

7. cp -a /lib64/libnsl* /mnt/sysroot/lib64

8. grep ^root /etc/shadow >> /mnt/sysroot/etc/shadow

9. egrep '^(passwd|shadow)' /etc/nsswitch.conf >>/mnt/sysroot/etc/nsswitch.conf(注:没有nsswitch.conf也可以)

10. 使用第四步脚本,拷贝login命令及其库文件。

11. 修改rc.sysinit文件,如下:
#!/bin/bash
#
# set hostname
. /etc/sysconfig/network

[ -z "$HOSTNAME" -o "$HOSTNAME" == "(none)" ] && HOSTNAME=tiny.linux
/bin/hostname $HOSTNAME

#remount rootfs
mount -n -o remount,rw /
echo -e "\tWelcome to come \033[5;31mTiny Linux\033[0m"
#/bin/bash

12. 使用第四步脚本,拷贝mount和hostname命令及其库文件。
 

第七步:添加单用户模式
1. 建立运行级别"1"的目录
 mkdir /mnt/sysroot/etc/rc.d/rc1.d
2. 拷贝宿主机的/etc/rc.d/init.d/single 
 cp /etc/rc.d/init.d/single /mnt/sysroot/etc/rc.d/init.d
 cp /etc/rc.d/rc1.d/S99single /mnt/sysroot/etc/rc.d/rc1.d

3. cd /mnt/sysroot/etc/rc.d/rc1.d && ln -sv ../init.d/tserver K33tserver

4. 拷贝单用户配置文件(被init程序使用的)
 cp /etc/init/rcS-sulogin.conf /mnt/sysroot/etc/init/
 
5. 使用第四步脚本,拷贝rcS-sulogin.conf文件中出现的命令及其库文件。