前提:
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 > /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,如需轉載請自行聯系原作者