天天看點

RHEL5.8系統裁減:具有使用者登入等功能

前提:

 1、一個作為主控端的Linux;這裡使用的是Redhat Enterprise Linux 5.8;

 2、在主控端上提供一塊額外的硬碟作為新系統的存儲盤,為了降低複雜度,這裡添加使用一塊IDE接口的新硬碟;要記住其存儲的位子

 3、本文使用的是vmlinux-2.6.18-308.el5。

一、為系統上的新硬碟建立分區,這裡根據需要先建立一個大小為100M的主分區作為建立系統的boot分區和一個512M的分區作為目标系統(即正在建構的新系統,後面将沿用此名稱)的根分區;100M的分區格式化後将其挂載至/mnt/boot目錄下;512M的分區格式化後将挂載至/mnt/sysroot目錄;

#mkdir /mnt/{boot,sysroot}          //建立檔案目錄  

    #mount /dev/hda1 /mnt/boot            

    #mount /dev/hda2 /mnt/sysroot       //挂載  

    #mount -a                           //重讀系統挂載  

    #mount                              //檢視下是否挂載上如圖1  

    #tree /mnt                          //圖2 

二、編譯核心源代碼,為新系統提供一個所需的核心

#cp /boot/vmlinux-2.6.18-308.el5 /mnt/boot/vmlinuz  

    #mkdir text  

    #cd text  

    #zcat /boot/initrd-2.6.18-308.el5.img | cpio -id 

   然後編輯下init程式,找到mkrootdev将其改成/dev/hda2

  注:在這裡需要說明,這裡的init中定義裝載了很多子產品并且是累贅的不必要的,是以可以将其用#引用,隻需要留下jbd.ko 與ext3.ko這兩個子產品,如圖3因為這2個子產品是為了核心可以加載根ext3檔案系統而存在的。

 而後 cd到lib/目錄下,将dm子產品都删掉

#rm -f dm-*  

        #cd .. 

然後開始制作init

#find . | cpio -H newc --quiet -o | gzip -g >/mnt/boot/initrd.gz 

這個時候可以ls -lh檢視下boot目錄中是否存在這個檔案。如圖4

可以看出來核心,init都已經有了,那麼就可以安裝grub了

#grub-install --root-directory=/mnt /dev/hda  

#ls             //檢視下grub檔案是否存在  

#vim /mnt/boot/grub/grub.conf         //編輯grub的配置檔案  

    default=0 

    timeout=3 

    title  MageEdu chenyanzong's Linux  

        root(hd0,0) ro root=/dev/hda2 quiet  

        kernel /vlinuz   

        initrd / 

安裝完grub然後到sysroot下建立根檔案系統的所需要的目錄

#mkdir etc/{rc.d/init.d} bin sbin proc sys dev lib root mnt medir var/{log,run,lock/subsys,tmp} usr/{bin,sbin,local} tmp home opt boot -pv        //其中init.d是連結指向rc.d/init.d 

于是,去etc下為其建立inittab

#vim etc/inittab  

    id:3:initdefault:  

    si::sysinit:/etc/rc.d  

    l0:0:wait:/etc/rc.d/rc 0  

l1:1:wait:/etc/rc.d/rc 1

    l3:3:wait:/etc/rc.d/rc 3  

    l6:6:wait:/etc/rc.d/rc 6  

    1:2345:respawn:/sbin/mingetty tty1  

    2:2345:respawn:/sbin/mingetty tty2 

然後去建立sysinit檔案

#!/bin/bash  

#  

. /etc/rc.d/init.d/fuctions  

echo -e "\tWelcome to \033[34mMageEdu\033[0m Linux"  

echo "Remount rootfs..."  

mount -n -o remount,rw /  

[ $? -eq 0 ] && success "remount rootfs " || failure "Remount rootfs"  

mount -a  

[ $? -eq 0 ] && success "Mount others filesystem " || failure "Mount others filesystem"  

echo "Set the hostname..."  

[ -f /etc/sysconfig/network ] && . /etc/sysconfig/network  

[ -z $HOSTNAME -o "$HOSTNAME" == '(none)' ] && HOSTNAME=localhost 

/bin/hostname $HOSTNAME  

[ $? -eq 0 ] && success " Set the hostname" || failure "Set the hostname"  

echo "Initializing network device..."  

/sbin/insmod /lib/modules/mii.ko  

/sbin/insmod /lib/modules/pcnet32.ko  

[ $? -eq 0 ] && success " Initializing network device" || failure "Initializing network device"  

ifconfig lo 127.0.0.1/8  

[ $? -eq 0 ] && success " Activating loopback network device" || failure "Activating loopback network device" sysctl -p &>/dev/null

[ $? -eq 0 ] && success " Setting kernel parameter" || failure "Setting kernel parameter"

/etc/rc.d/rc腳本示例:

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   

這個時候,可以傳回原目錄,為這個小系統添加指令,關于這個指令的腳本本人已經編輯好了,直接貼圖

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 && 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指令進行指令的複制,指令大緻如下:

init,bash,ls,touch,mkdir,rm,mv,cp,cat,mount,umount,vi,vim,chmod,ping,insmod,modprobe,sysctl,rmmod,ifconfig,route,halt,reboot,shutdown,hostname,basename,seq,stty,

然後cd到/mnt/sysroot/etc/rc.d/init.d下建立關機重新開機腳本halt 服務測試腳本tserver

#vim halt  

case $0 in  

*reboot)  

    COMMAND='/sbin/reboot';;  

*halt)  

    COMMAND='/sbin/halt -p ;;  

*)  

    echo "Only call this csrip by *reboot OR *halt;"  

    ;;  

esac  

case $1 in  

start)  

stop)  

    echo "Usage:`basename $0` {start|stop}"  

exec $COMMAND 

#vim tserver  

# chkconfig: 35 66 33  

# description: test service script  

. /etc/rc.d/init.d/functions  

prog=tserver 

lockfile=/var/lock/subsys/$prog  

start() {  

  touch $lockfile  

  [ $? -eq 0 ] && success "Starting $prog" || failure "Staring $prog"  

stop() {  

  rm -f $lockfile  

  [ $? -eq 0 ] && success "Stopping $prog" || failure "Stopping $prog"  

status() {  

  if [ -f $lockfile ]; then  

    echo "Running..."  

  else  

    echo "Stopped..."  

  fi  

usage() {  

  echo "Usage: $prog {start|stop|status|restart}"  

  start ;;  

  stop ;;  

restart)  

  stop   

  start  

  ;;  

status)  

  status  

  usage  

  exit 1  

#chmod +x init.d/tserver

   然後測試下這個腳本,

然後cd到/mnt/sysroot/etc/rc.d下建立rc0.d rc1.d rc6.d rc3.d

   然後依次cd到各個目錄下為其建立連接配接檔案

#cd ../rc0.d/  

    #ln -sv ../init.d/halt   S99halt     

    #cd ../rc6.d/  

    #ln -sv ../init.d/halt   S99reboot  

    #cd rc3.d/  

    #ln -sv ../init.d/tserver S66tserver  

    #cd ../rc0.d/  

    #ln -sv ../init.d/tserver K33tserver     

    #ln -sv ../init.d/tserver K33tserver  

設定開機挂載項

/dev/hda2   /       ext3    defaults    0   0  

/dev/hda1   /boot   ext3    defaults    0   0  

proc        /proc   proc    defaults    0   0  

sysfs       /sys    sysfs   defaults    0   0 

注:此處完成後需要到sysinit中添加開機讀寫挂載根檔案系統

設定主機名:

#mkdir etc/sysconfig/network  

    HOSTNAME=minilinux.magedu.com 

注:此處完成後需要到sysinit中添加設定主機名

 開機啟動服務時,顯示綠色ok或者紅色fauled時的操作.可用于控制服務腳本的資訊顯示

  #cd /mnt/sysroot/

  #vim etc/rc.d/init.d/functions

SCREEN=`stty -F /dev/console size 2>/dev/null`  

COLUMNS=${SCREEN#* }  

[ -z $COLUMNS ] && COLUMNS=80 

SPA_COL=$[$COLUMNS-14]  

RED='\033[31m' 

GREEN='\033[32m' 

YELLOW='\033[33m' 

BLUE='\033\34m' 

NORMAL='\033[0m' 

success() {  

  string=$1  

  RT_SPA=$[$SPA_COL-${#string}]  

  echo -n "$string"  

  for I in `seq 1 $RT_SPA`;do  

    echo -n " "  

  echo -e "[   ${GREEN}OK${NORMAL}   ]"  

failure() {  

  echo -e "[ ${RED}FAILED${NORMAL} ]"  

}            

         注:建立完成後需要在etc/rc.d/init.d/tservrt中用   . /etc/rc.d/init.d/functions 調用此腳本

裝載網卡驅動,設定IP位址:

#mkdir lib/modules  

        #modinfo pcnet32      檢視其目錄與其依賴子產品(可發現mii與其依賴)如圖yilai  

        ...省略  

        #cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/  

        #modinfo mii  

        #cp /lib/modules/2.6.18-308.el5/kernel/drivers/net/pcnet32.ko /mnt/sysroot/lib/modules/ 

       注:完成後在sysinit中裝載此子產品

然後配置檔案network

#mkdir -pv etc/sysconfig/network-scripts  

            #vim etc/sysconfig/network-scripts/ifcfg-th0  

                DEVICE=eth0 

                BOOTPROTO=static 

                PDADDR=172.16.100.5  

                NETMASK=255.255.0.0  

                GATEWAY=172.16.0.1  

                ONBOOT=yes 

            #vim etc/rc.d/init.d/network  

                #!/bin/bash  

                #  

                # chkconfig: 35 09 90   

                # description: network service  

                $prog=network     

                . /etc/rc.d/init.d/functions  

                CONF=/etc/sysconfig/network-scripts/ifcfg-th0  

                .$CONF  

                NETMASK=16 

                start(){  

                    ifconfig eht0 $IPAPPR/$NETMASK    up  

                    [-z #GATEWAY ] && route add default gw $GATEWAY  

                }  

                stop(){  

                    ifconfig eth0down  

                status(){  

                    ifconfig eth0  

                usage(){  

                    echo "$prog :{start|stop|status}"  

                    }  

                case $1 in  

                start   

                    success "Config network eth0"  

                    ;;  

                stop)  

                    stop  

                    success "Stop network eth0"  

                restart)  

                    start   

                    success "Restart network eth0"  

                *)  

                    usage   

                    exit 1  

                    ;; 

  #chmod +x etc/rc.d/init.d/network

  然後依次cd到各個目錄下為其建立連接配接檔案

#cd rc3.d/  

#ln -sv ../init.d/network S09network  

#ln -sv ../init.d/network K90network     

#cd ../rc6.d/  

#ln -sv ../init.d/network K90network 

 使用者

   由于使用者依賴于PAM,但是PAM太過麻煩,此處略過PAM

    事先準備了1個login檔案,隻通過複制簡單的檔案來實行使用者登入

            /etc/passwd,/etc/shadow,/etc/group  

#cp -d /usr/lib/libnss_files.so /mnt/sysroot/usr/lib  

#cp -d /usr/lib/libnss3.so /mnt/sysroot/usr/lib  

#cp -d /usr/lib/libnssckbi.so /mnt/sysroot/usr/lib  

#cp -d /usr/lib/libnssutil3.so /mnt/sysroot/usr/lib 

vim /mnt/sysroot/etc/nsswitch.conf    (此檔案為login與使用者資料存放檔案的中間層,起橋接作用,本檔案可适應多種存儲檔案,此處用于files檔案)

   可将其裡面的内容隻保留四行

passwd:     files  

shadouw:    files  

group:      files  

hosts:      files dns 

然後複制使用者過去

grep -E "^(root|hadoop)\>" /etc/passwd >/mnt/sysroot/etc/passwd  

grep -E "^(root|hadoop)\>" /etc/shadow>/mnt/sysroot/etc/shadow  

grep -E "^(root|hadoop)\>" /etc/group>/mnt/sysroot/etc/group 

  然後lftp 172.16.0.1 

   cd pub/

    get login

    ...

    bye

   chmod +x login

然後cd /root

#vim .bash_profile  

    PA1=`[\u@\h \W]\$`   

    export PS1 

然後設定到此,登入時便會提示這樣

<a target="_blank" href="http://blog.51cto.com/attachment/201303/233443981.jpg"></a>

單使用者模式(因為其為1級别啟動)

  首先,cd /mnt/sysroot中去。

   vim etc/inittab中去定義1級别

    加入l1:1:wait:/etc/rc.d/rc

然後 cd到rc.d/

#mkdir rc1.d  

#cd rc1.d/  

#ln -sv ../init.d/network K90network  

#ln -sv ../init.d/tserver K33network 

 然後設定單使用者模式

#vim rc.d/init.d/single  

                # chkconfig:  

                # description:  

                case  $1 in  

                start)  

                *)  

                 echo "usage :single start"  

                esac  

                exec /sbin/init S 

#chmod +x rc.d/init.d/single  

#cd rc.d/rc1.d/  

#ln -sv ../init.d/single S99single 

 使用者清單按e e 然後添加 S 然後 b引導

由于操作IDE磁盤是在别的主控端上完成,是以可能導緻在建立虛拟機裝載系統時出現磁盤未寫好的情況導緻系統崩潰,具體解決可參考下面步驟。

#cd /mnt/sysroot  

#find . | cpio -H newc --quiet -o | gzip &gt; /root/sysroot.gz  

#fuser -km /dev/hda2  

#umount /dev/hda2  

#mke2fs -j /dev/hda2  

#mount /dev/hda2 /mnt/sysroot  

#cd /mnt/sysroot/  

#zcat /root/sysroot.gz | cpio  

#ls 

本文轉自 陳延宗 51CTO部落格,原文連結:http://blog.51cto.com/407711169/1167656,如需轉載請自行聯系原作者

繼續閱讀