我們本文建構的小型linux,隻有一個kernel,并能使用一些基本的指令,還能提供ssh服務,整個linux系統裝下來大小僅為10M左右。而我們通過源碼編譯來安裝kernel,BusyBox和Dropbear來實作這些功能,這樣會很大程度的節省我們的系統空間,重要的是系統非常的純淨,運作速度異常的快。既然我們的系統這麼小,當然也可以做在U盤中,可以随時的帶在身邊,友善我們使用。
什麼是BusyBox呢?
BusyBox 是一個內建了一百多個最常用linux指令和工具的軟體。BusyBox 包含了一些簡單的工具,例如ls、 cat 和 echo等等,還包含了一些更大、更複雜的工具,例如 grep、find、mount以及telnet等。
什麼是Dropbear呢?
Dropbear是一個相對較小的SSH伺服器和用戶端,它運作在一個基于POSIX的各種平台,并且是一個Dropbear是開源軟體,廣泛應用于嵌入式開發平台。
下面開始我們的制作過程:
前提:
1、一個作為主控端的Linux;本文使用的是Redhat Enterprise Linux 5.4;
2、在主控端上提供一塊額外的硬碟作為新系統的存儲盤,這裡添加使用一塊IDE接口的新硬碟(如果添加的是SCSI的新硬碟,則後邊的配置檔案.config必須進行修改把SCSI驅動編譯進kernel即可)
3、Linux核心源碼,busybox源碼;本文使用的是新版的linux-2.6.34.1.tar.bz2和
busybox-1.16.0.tar.bz2
下載下傳位址:
http://www.kernel.org/pub/linux/kernel/v2.6/
http://busybox.net/
<a href="http://matt.ucc.asn.au/dropbear/">http://matt.ucc.asn.au/dropbear/</a>
找到相應的軟體包,并下載下傳
提示:如果您用的是虛拟機,則當主控端挂起的時候,不能再目标主機上修改檔案,這樣會導緻檔案系統損壞;想要在目标主機上修改的話,可以把主控端關閉!
一、為系統上的新硬碟建立分區,這裡根據需要先建立一個大小為100M的主分區作為建立系統的boot分區和一個512M的分區作為目标系統(即正在建構的新系統,後面将沿用此名稱)的根分區;100M的分區格式化後将其挂載至/mnt/boot目錄下;512M的分區格式化後将挂載至/mnt/sysroot目錄;
先對新添加的磁盤分區:
#fdisk /dev/hda
格式化檔案系統:
#mke2fs -j /dev/hda1
#mke2fs -j /dev/hda2
挂載檔案系統:
#mkdir /mnt/boot (必須是boot目錄)
#mkdri /mnt/sysroot
#mount /dev/hda1 /mnt/boot
#mount /dev/hda2 /mnt/sysroot
說明:
1、此處的boot和sysroot的挂載點目錄名稱盡量不要修改,尤其是boot目錄,否則您必須保證後面的許多步驟都做了相應的改動;
2、建立系統的boot目錄也可以跟根目錄在同一個分區,這種方式比獨立分區還要簡單些,是以這裡将不對此種方法再做出說明;
二、編譯核心源代碼,為新系統提供一個所需的核心(本例中的源代碼包都位
于/usr/src目錄中)
配置好yum源,編譯kernel之前,我們的開發組要裝好:
#yum groupinstall "Development Libraries" "Development Tools"
# cd /usr/src
# tar jxvf linux-2.6.34.1.tar.bz2
# ln -sv linux-2.6.34.1 linux
# cd linux
為了友善選擇性的配置kernel,故您可下載下傳kernel-2.6.30.5-i686.cfg(見附件)至目前目錄中,并重命名為.config。這個檔案是有人以前發行的用于嵌入式的一個小型linux中用于kernel編譯的配置檔案。
#cp kernel-2.6.30.5-i686.cfg /usr/src/linux/.config
配置我們要編譯的kernel:
# make menuconfig
根據您的實際和規劃選擇所需要的功能(這裡僅僅提供幾種支援):
1,把對應網卡的驅動編譯進kernel中:
Device Drivers-->Network device support-->Ethernet (10 or 100Mbit)-->(在這裡選擇對應要使用的網卡驅動,如過你是虛拟機的話對應的pcnet32要選上)
2,如果您使用的SCSI硬碟,則需要選擇對SCSI驅動的支援:(可選)
Device Drivers-->Fusion MPT device support-->(裡面的可以都選上)
Device Drivers-->SCSI device support-->SCSI low-level drivers-->(選擇對應的SCSI的類型的支援)
3,支援動态加載子產品:(可選)
選擇:Enable loadable module support
4,支援檔案系統:
File systems-->(在這裡選擇我們要支援的檔案系統類型,如果你是ext3檔案系統,确定其對應項選上)
5,選擇我們對應的cpu架構,平台要與運作小linux的平台對應:
選擇:Processor type and features-->Processor family-->(選擇對應cpu的類型;如果要用的cpu是intel酷睿系列的選擇Core 2/newer Xeon)
由于我們隻需要kernel,故我們隻編譯kernel所在的arch目錄即可,當用到其他,目錄中的内容時,會自動添加:
# make SUBDIR=arch/
把我們的kernel複制如目标主機的磁盤分區:
# cp arch/x86/boot/bzImage /mnt/boot
三、編譯busybox
# cd /usr/src
# tar -jxvf busybox-1.16.1.tar.bz2
# cd busybox-1.16.1
配置我們要編譯的選項:
1、此處需要選擇 Busybox Settings --> Build Options --> Build BusyBox as a static binary (no shared libs),這樣可以把Busybox編譯成一個不使用共享庫的靜态二進制檔案,進而避免了對主控端的共享庫産生依賴(但你也可以不選擇此項,而完成編譯後把其依賴的共享庫複制至目标系統上的/lib目錄中即可)
2、修改安裝位置為/mnt/root;方法為:Busybox Settings --> Installation Options --> (./_install) BusyBox installation prefix,修改其值為/mnt/sysroot(按住crtl鍵和backspace進行删除)
# make install
安裝後的檔案均位于/mnt/sysroot目錄中;但為了建立initrd,并實作讓其啟動以後将真正的檔案系統切換至目标系統分區上的根檔案系統上,您還需要複制一份剛安裝
在/mnt/sysroot下的busybox至另一個目錄,以實作與真正的根檔案系統分開制作。我們這裡選擇使用/mnt/temp目錄:
# mkdir -pv /mnt/temp
# cp -r /mnt/sysroot/* /mnt/temp
四、制作initrd
# cd /mnt/temp
1、建立rootfs:
# mkdir -pv proc sys etc/init.d tmp dev mnt/sysroot
2、建立兩個必要的裝置檔案:
# mknod dev/console c 5 1
# mknod dev/null c 1 3
3、為initrd制作init程式,此程式的主要用于系統啟動的第一個階段,主要任務是實作根檔案系統的切換。是以,可以以腳本的方式來實作它:
# rm linuxrc
# vim init
添加如下内容:
#!/bin/sh
mount -t proc proc /proc
mount -t sysfs sysfs /sys
mdev -s
mount -t ext3 /dev/hda2 /mnt/sysroot
exec switch_root /mnt/sysroot /init
給此腳本執行權限:
#chmod +x init
4、制作initrd
# find . | cpio --quiet -H newc -o | gzip -9 > /mnt/boot/initrd.gz
五、建立真正的根檔案系統
# cd /mnt/sysroot
# mkdir -pv proc sys etc/init.d tmp dev/pts boot var/log
3、建立系統初始化腳本檔案
# vim etc/init.d/rcS
echo -e " Welcome to \033[31mToyLinux\033[0m "
echo -e "Remounting the root filesystem ..........[ \033[32mOK\033[0m ]"
mount -o remount,rw /
echo -e "Creating the files of device ............[ \033[32mOK\033[0m ]"
mdev -s
echo -e "Mounting the filesystem .................[ \033[32mOK\033[0m ]"
mount -a
swapon -a
echo -e "Starting the log daemon .................[ \033[32mOK\033[0m ]"
syslogd
klogd
echo -e "Configuring loopback interface ..........[ \033[32mOK\033[0m ]"
ifconfig lo 127.0.0.1/24
ifconfig eth0 172.16.100.9/16
# END
而後讓此腳本具有執行權限:
#chmod +x etc/init.d/rcS
4、配置init及其所需要inittab檔案
# mv linuxrc init
# vim etc/inittab
::sysinit:/etc/init.d/rcS
console::respawn:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
5、為系統準備一個“檔案系統表”配置檔案/etc/fstab
# vim etc/fstab
sysfs /sys sysfs defaults 0 0
proc /proc proc defaults 0 0
/dev/hda1 /boot ext3 defaults 0 0
/dev/hda2 / ext3 defaults 1 1
6、由于在rcS檔案中啟動了日志程序,是以系統在運作中會産生大量日志并将其顯示于控制台;這将會經常性的打斷正在進行的工作,為了避免這種情況,我們這裡為日志程序建立配置檔案,為其指定将日志發送至/var/log/messages檔案;
# vim etc/syslog.conf
添加如下一行:
*.info /var/log/messages
六、好了,至此一個簡易的基于記憶體運作的小系統已經建構出來了,我們接下來為此系統建立所需的引導程式
# grub-install --root-directory=/mnt /dev/hda
說明:此處的/dev/hda為目标系統所在的那塊新磁盤;
接下來為grub建立配置檔案:
# vim /mnt/boot/grub/grub.conf
添加類似如下内容:
default=0
timeout=3
color light-green/black light-magenta/black
title ToyLinux (2.6.34.1)
root (hd0,0)
kernel /bzImage ro root=/dev/hda2 quiet
initrd /initrd.gz
接下來将此塊硬碟接入一個新的主機(這裡使用的是虛拟機),啟動一下并測試使用。
提示:如果你用的是虛拟機,則先建立虛拟機之後再把我們的新磁盤添加進去,這樣才能正常啟動。
七、為新建構的ToyLinux啟用虛拟控制台
這個可以通過主控端來實作,也可以直接啟動剛建構成功的小Linux進行配置。我們這裡采用通過主控端的方式(重新啟動主控端):
# cd /mnt/sysroot
将 etc/inittab檔案改為如下内容:
tty1::askfirst:/bin/sh
tty2::askfirst:/bin/sh
tty3::askfirst:/bin/sh
tty4::askfirst:/bin/sh
tty5::askfirst:/bin/sh
tty6::askfirst:/bin/sh
注解:askfirst的意思是:當系統啟動完成後,會給出一個提示資訊:please enter to activate this console,我們直接回車就可以登入
現在就可以測試驗正六個虛拟控制台的使用了。
八、盡管上述第七步已經實作了虛拟控制台,但其仍是直接進入系統,且系統沒有使用者帳号等安全設施,這将不利于系統的安全性。是以,接下來的這步實作為系統添加使用者帳号(這裡仍然基于主控端實作)。
1、為目标主機建立passwd帳号檔案
# vim etc/passwd
root:x:0:0::/root:/bin/sh
而後為root使用者建立“家”目錄:
# mkdir root
2、為目标主機建立group帳号檔案
# vim etc/group
root:x:0:
3、為目标主機建立shadow影子密碼檔案,這裡采用直接複制主控端的shadow檔案中關于root密碼行的行來實作
# grep "^root" /etc/shadow > etc/shadow
注:等目标主機啟動時,root使用者的密碼也是主控端的root使用者的密碼。您可以在目标主機啟動以後再動手更改root使用者的密碼。
4、将 etc/inittab檔案改為如下内容:
::respawn:/sbin/getty 9600 tty1
::respawn:/sbin/getty 9600 tty2
::respawn:/sbin/getty 9600 tty3
::respawn:/sbin/getty 9600 tty4
::respawn:/sbin/getty 9600 tty5
::respawn:/sbin/getty 9600 tty6
5,由于我們要認證使用者的登入,需要名稱解析服務,而我們的busybox不提供這個服務,故我們要将nsswitch依賴的庫檔案移植過來,并編輯/mnt/sysroot/etc/nsswitch.conf這個配置檔案:(此步驟在主控端上完成)
我們要添加名稱解析的庫檔案,複制libnss3.so、libnssckbi.so、libnss_compat.so、libnss_db.so、libnss_dns.so、libnss_files.so這幾個檔案,也要把這幾個檔案所有連接配接檔案檔案也複制過去,用# cp -a ,把連接配接的屬性也複制過去,這樣就不用再手動建立連結了。
#cd /mnt/sysroot
#mkdir usr/lib lib
由于這些庫檔案是一些連結檔案,故我用-a選項,儲存其檔案原來的特征不變:
#cp -a /usr/lib/libnss* usr/lib/
#cp -a /lib/libnss* lib
這裡把它全複制過去,省事
由于login程式登入的時候要用到名稱解析功能,故我們要編譯nsswitch的配置檔案:
#vim etc/nsswitch.conf
添加如下行:
passwd: files
shadow: files
group: files
hosts: files dns
好了,接下來就可以重新啟動目标主機進行驗正了。
九、在系統登入時提供banner資訊(這個可以再目标主機上完成,這裡還以在主控端上完成為例)
# vi /mnt/sysroot/etc/issue
Welcome to ToyLinux...
注:這裡的内容可以根據你的需要進行修改。
十、在系統啟動時為系統提供主機名稱(這個可以再目标主機上完成,這裡還以在主控端上完成為例):
1、建立儲存主機名稱的配置檔案
# mkdir etc/sysconfig
# vi etc/sysconfig/network
NETWORKING=yes
HOSTNAME=www.jia.com
2、編輯系統初始化腳本,實作開機過程中設定主機名稱
# vi etc/init.d/rcS
在檔案尾部添加如下行:
HOSTNAME=`/bin/hostname`
[ -e /etc/sysconfig/network && -r /etc/sysconfig/network ] && source
/etc/sysconfig/network
[ -z ${HOSTNAME} ] && HOSTNAME="localhost"
/bin/hostname ${HOSTNAME}
十一,安裝dripbear提供ssh功能;
1、在主控端上下載下傳編譯dropbear:
# tar xf dropbear-2012.55.tar.bz2
# cd dropbear-2012.55
# ./configure
#make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp"
說明:如果你想将dropbear進行靜态編譯,則可以使用如下指令,此時dropbear将不再依賴于别的庫檔案運作:# make STATIC=1
# make install
2、根據bcp.sh腳本移植剛安裝生成的二進制檔案dropbear、dropbearkey,這個腳本會自動移植指令所依賴的庫檔案:
#vim bcp.sh
#!/bin/bash
#
function BCP {
TARGET=/mnt/sysroot
COMMAND=`which $1 | grep -o "/.*"`
CMDPATH=${COMMAND%/*}
[ -d $TARGET$CMDPATH ] || mkdir -p $TARGET$CMDPATH
[ -e $TARGET$COMMAND ] || cp $COMMAND $TARGET$CMDPATH
for LIBFILE in `ldd $COMMAND | grep -o "/.*lib[^[:space:]]*"`; do
LIBPATH=${LIBFILE%/*}
[ -d $TARGET$LIBPATH ] || mkdir -p $TARGET$LIBPATH
[ -e $TARGET$LIBFILE ] || cp $LIBFILE $TARGET$LIBPATH
done
}
while true; do
read -p "A Command: " MYCMD
case $MYCMD in
q|Q)
echo "Quit..."
exit 0
;;
*)
! which $MYCMD &> /dev/null && echo "Wrong command..." && continue
BCP $MYCMD
;;
esac
done
移植指令及所依賴的庫檔案:
#bash bcp.sh
輸入指令完成後,輸入q退出:
A Command:dropbear
A Command:dropbearkey
A Command:q
3、為系統添加devpts檔案系統,以實作按需打開pty裝置:
編輯目标主機的fstab檔案,添加如下行:
devpts /dev/pts devpts mode=620 0 0
4、為目标主機提供/etc/shells檔案,dropbear在使用者登入時為以之驗正使用者的shell是否為可信任shell,故:
#vim /mnt/sysroot/etc/shells
/bin/ash
/bin/sh
/sbin/nologin
以下操作在目标主機上進行:
5、啟動目标主機後,在目标主機上為dropbear提供主機密鑰(如果是虛拟機確定主控端已經關閉):
1) 生成rsa格式的密鑰:
# mkdir /etc/dropbear
# /usr/local/bin/dropbearkey -t rsa -s 2048 -f
/etc/dropbear/dropbear_rsa_host_key
2)生成dss格式的密鑰:
# /usr/local/bin/dropbearkey -t rsa -f /etc/dropbear/dropbear_dss_host_key
6、啟動dropbear服務:
當我們用ssh登入的時候,會顯示着個檔案中的資訊:
# echo "Welcome magedu.com linux" > /etc/issue.net
# touch /var/log/lastlog
啟動服務:
# /usr/local/sbin/dropbear -b /etc/issue.net
注意:
1,當輸入使用者名,密碼已成功,但是登入不進系統時:
重新挂載虛拟檔案系統即可:
#mount -t devpts devpts /dev/pts
OK!我們的小linux就制作完成了!啟用的很多功能,如提供web服務等都可以再添加進去,一起做吧!
<a href="http://down.51cto.com/data/2360122" target="_blank">附件:http://down.51cto.com/data/2360122</a>
本文轉自 leejia1989 51CTO部落格,原文連結:http://blog.51cto.com/leejia/815466,如需轉載請自行聯系原作者