本節我們將通過編譯內核源碼來搭建一個自定製的微型Linux系統,並且配上一個busybox來實現一些最基本的內容,最後我們在這基礎上加上一個遠程登錄的功能。好了廢話不多說,下面我們就來開始介紹吧。
準備工作
1、在宿主機中安裝開發環境
[root@localhost ~]# yum -y groupinstall "Development tools" "Server Platform Development" [root@localhost ~]# yum -y install "ncurses-devel"
2、在宿主服務器添加一塊磁盤,作爲微型Linux系統的主磁盤。
這裏我添加了一塊10G的磁盤/dev/sdb
首先創建2個分區(具體的操作過程這裏就不給了,講的實在太多了)
創建好之後對分區進行格式化
[root@localhost ~]# mke2fs -t ext4 /dev/sdb1 [root@localhost ~]# mke2fs -t ext4 /dev/sdb2
並創建掛載點進行掛載:在/mnt下創建boot和sysroot目錄
[root@localhost ~]# mount /dev/sdb1 /mnt/boot [root@localhost ~]# mount /dev/sdb2 /mnt/sysroot
創建grub
[root@localhost ~]# grub-install --root-directory=/mnt /dev/sdb
創建grub配置文件
[root@localhost ~]# vim /mnt/boot/grub/grub.conf timeout=5 default=0 title Linux 8 root (hd0,0) kernel /bzImage ro root=/dev/sda2 init=/sbin/init
OK,環境就先準備這些。
編譯內核
首先要到網絡去下載內核源碼,這裏我用的是linux-3.13.6的版本進行編譯的
解壓內核源碼
[root@localhost ~]# tar xf linux-3.13.6.tar.xz -C /usr/src/
創建軟連接
[root@localhost src]# ln -sv linux-3.13.6/ linux [root@localhost src]# cd linux/
配置內核模塊參數
[root@localhost linux]# make allnoconfig [root@localhost linux]# make menuconfig
編譯內核模塊參數
先來一張整體的截圖
1、選擇64位內核
2、General setup --> Local Version - append to kernel release --> 自定義版本號
刪除字符需要使用Ctrl+Backspace
General setup --> System V IPC 進程間通信的
3、支持動態裝卸載模塊
Enable loadable module support --> Module unloading
4、支持使用塊層
Enable the block layer --> Block layer SG support v4
5、Processor類型和特性
Processor type and features
--> Processor family (Core2/newer Xeno) 處理器
--> Symetric muliti-processing support 對稱多處理器
--> Muliti-core scheduler support 多核調度支持
6、總線
Bus options(PCI etc.)
-->PCI support
7、可支持文件類型和格式
Exectuable file formats /Emulations
--> Kernel support for ELF binaries 支持ELF格式
--> Kernel support for scripts starting with #! 支持以#!開頭的腳本格式
8、網絡
Networking support
-->Networking options
-->TCP/IP networking
9、驅動
Device Drivers
支持臨時掛載文件系統
Device Driver Options
-->Maintain a devtmpfs filesystem to mount at /dev
--> Automount devtmpfs at /dev,after the kernel mount... 並自動掛載
硬盤相關
-->SCSI device support
-->SCSI device support
-->SCSI disk support
MTP相關
-->Fusion MPT device support
-->Fusion MPT ScsiHost drivers for SPI
-->Fusion MPT logging facility
USB接口配置
-->Input device support 鍵盤鼠標
-->USB support
-->xHCI HCD (USB3.0) support
-->EHCI HCD (USB2.0) support
-->OHCI HCD (USB1.1) support
-->UHCI HCD (most Intel and VIA) support
-->Mouse interface 鼠標接口
-->Keyboards 鍵盤
-->Mice-->PS/2 mouse ps2的鼠標
網卡驅動 (注意這裏一定要與自己的主機的環境一致,不然網卡無法驅動)
Device Drivers
-->Network device support
-->Network core driver support 網絡核心驅動支持
-->Ethernet driver support 以太網驅動支持
10.文件系統
File systems
-->The Extended 4 (ext4) filesystem 支持ext4文件系統
好了可以進行編譯了
[root@localhost linux]#make –j 4
編譯好之後
[root@localhost linux]#cp arch/x86_64/boot/bzImage /mnt/boot
編譯安裝busybox
BusyBox 是將許多具有共性的小版本的UNIX工具結合到一個單一的可執行文件。這樣的集合可以替代大部分常用工具比如的GNU fileutils , shellutils等工具,BusyBox提供了一個比較完善的環境,可以適用於任何小的嵌入式系統。
下面我們進行編譯安裝
[root@localhost ~]# tar xf busybox-1.22.1.tar.bz2
使用靜態編譯的模式,將依賴於glibc-static
[root@localhost ~]# yum -y install glibc-static,libcrypt [root@localhost ~]# cd busybox-1.22.1 [root@localhost busybox-1.22.1]# make menuconfig
只需要修改一項
BusyBox Settings
Build BusyBox as a static binary (no shared libs) 編譯成爲一個靜態
[root@localhost busybox-1.22.1]# make && make install
會生成一個_install目錄
將此目錄中的所有複製到/mnt/sysroot目錄中
cp -a * /mnt/sysroot
在/mnt/sysroot中創建根文件系統需要的一些目錄
[root@localhost sysroot]# mkdir /mnt/sysroot/{proc,sys,dev,home,boot,root,tmp,var,lib64,mnt,media,etc}
提供相應的配置文件
/mnt/sysroot/etc/fstab 開機自動掛載文件
/dev/sda2 / ext4 defaults 0 0 /dev/sda1 /boot ext4 defaults 0 0 proc /proc proc defaults 0 0 sysfs /sys sysfs defaults 0 0 devpts /dev/pts devpts defaults 0 0
/mnt/sysroot/etc/inittab 提供初始化腳本的指定,開啓僞終端的指定,定義ctrl+alt+del
::sysinit:/etc/rc.d/rc.sysinit ::respawn:/sbin/getty 19200 tty1 ::respawn:/sbin/getty 19200 tty2 ::respawn:/sbin/getty 19200 tty3 ::ctrlaltdel:/sbin/reboot ::shutdown:/bin/umount -a -r
/mnt/sysroot/etc/shells 提供安全的shell環境
/bin/sh /bin/ash /bin/tcsh /bin/bash /sbin/nologin
/mnt/sysroot/etc/rc.d/rc.sysinit 系統進一步初始化腳本
#!/bin/sh # echo -e "Welcome to MiniLinux" echo "Remouting root filesystem" mount -n -o remount,rw /dev/sda2 / #創建遠程連接虛擬終端需要的pts文件夾 mkdir /dev/pts #掛載fstab文件中的所有設備文件 mount -a #創建設備文件 mdev -s [ -r /etc/sysconfig/network ] && source /etc/sysconfig/network [ -z "$HOSTNAME" -o "$HOSTNAME" == '(none)' ] && hostname localhost || hostname $HOSTNAME 主機名相關 ifconfig eth0 172.16.106.254 配置網卡信息 ifconfig lo 127.0.0.1 for i in /etc/rc.start/* do $i start done
/mnt/sysroot/etc/passwd提供賬號
root:x:0:0::/root:/bin/sh
/mnt/sysroot/etc/shadow 提供密碼
openssl passwd -1 -salt `openssl rand -hex 4` 生成密碼
root:密碼:..........
/mnt/sysroot/etc/profile 環境變量
export PS1='[\u@\h \W]\$' export PATH='/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin'
以上步驟完成之後一個簡單的可以基於tty登錄的微型系統就OK了。
我們可以驗證一下:
提供遠程連接服務
在安裝之前提供相應的名稱解析庫
其中基於文件的名稱解析,所依賴的共享庫文件有
/lib64/libnss_files-2.12.so
/lib64/libnss_files.so.2
/usr/lib64/libnss3.so
/usr/lib64/libnsspem.so
/usr/lib64/libnsssysinit.so
/usr/lib64/libnssutil3.so
創建目錄並複製程序
# cp -a -d /lib64/libnss_files* /mnt/sysroot/lib64 # mkdir /mnt/sysroot/usr/lib64 # cp -a -d /usr/lib64/libnss3.so /mnt/sysroot/usr/lib64 # cp -a -d /usr/lib64/libnsspem.so /usr/lib64/libnsssysinit.so /usr/lib64/libnssutil3.so /mnt/sysroot/usr/lib64
提供nsswitch.conf配置文件
# cp /etc/nsswitch.conf /mnt/sysroot/etc/ passwd: files shadow: files group: files #hosts: db files nisplus nis dns hosts: files dns
編譯安裝dropbear
安裝dropbear可以查看幫助文檔
less INSTALL
安裝步驟:
[root@localhost ~]# tar xf dropbear-2013.58.tar.bz2
[root@localhost ~]# cd dropbear-2013.58/
直接裝在MiniLinux
./configure
注:
默認安裝在/usr/local,可以自定義指定安裝後的目錄
如果需要配置在編譯之前可以修改安裝目錄下的options.h
make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" make PROGRAMS="dropbear dbclient dropbearkey dropbearconvert scp" install
使用bincp.sh將dropbear相關命令移植到MiniLinux中
先提供bincp.sh的腳本
#!/bin/bash
#
target=/mnt/sysroot/
[ -d $target ] || mkdir $target
preCommand() {
if which $1 &> /dev/null; then
commandPath=`which --skip-alias $1`
return 0
else
echo "No such command."
return 1
fi
}
commandCopy() {
commandDir=`dirname $1`
[ -d ${target}${commandDir} ] || mkdir -p ${target}${commandDir}
[ -f ${target}${commandPath} ] || cp $1 ${target}${commandDir}
}
libCopy() {
for lib in `ldd $1 | egrep -o "/[^[:space:]]+"`; do
libDir=`dirname $lib`
[ -d ${target}${libDir} ] || mkdir -p ${target}${libDir}
[ -f ${target}${lib} ] || cp $lib ${target}${libDir}
done
}
read -p "Plz enter a command: " command
until [ "$command" == 'quit' ]; do
if preCommand $command ; then
commandCopy $commandPath
libCopy $commandPath
fi
read -p "Plz enter a command: " command
done
dropbear的使用:啓動dropbear
選項:
-d dsskeyfile
-r rsakeyfile
-F 在前臺運行
-E 指定錯誤輸出位置爲標準錯誤輸出
-s 禁止基於密碼的認證,只能基於密鑰的認證
-P 指定pid文件位置,默認/var/run/dropbear.pid
-p 指定家庭的地址和端口 [address:]port
-h 查看幫助
dropbearkey命令:創建dropbear所需的密鑰文件
選項:
-t 加密算法 dss、rsa
-s 密碼長度
-f 密鑰位置
-h 查看幫助
注:密鑰權限默認爲600
創建目錄
# mkdir -p /mnt/sysroot/etc/dropbear #dropbear的密鑰文件存放位置 # mkdir -p /mnt/sysroot/var/run #pid文件所在的目錄
創建dss形式的密鑰文件
# dropbearkey -t dss -f /mnt/sysroot/etc/dropbear/dropbear_dss_host_key
創建rsa形式的密鑰文件,指定密鑰長度爲2048
# dropbearkey -t rsa -s 2048 -f /mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
好了這些完成之後我們的遠程接入功能也應該可以實現了。可以測試一下
本節的內容就講到這裏,歡迎大家批評指正!