轉自:http://tobeys.blog.51cto.com/10620284/1775531
概述:
本篇博客是一個自制類嵌入式Linux系統的制作手冊,內容涵蓋使用宿主機通過busybox實
現制作類嵌入式Linu系統的詳細過程,一步一步教你如何制作屬於你自己的linux系統,同時
幫助你更加清楚的了解linux系統的組成結構,本篇博客需要讀者對linux系統的啟動流程及ssh
遠程連接有一定的了解,這部分很多博客都有介紹,這里就不說明了,不了解的讀者可以先去
看看這方面的博客。
制作的整個過程比較漫長(主要是編譯源碼需要耗費大量時間,因此,在編譯內核時,記
得另起虛擬終端先完成其它操作),建議初次操作在VMware虛擬機中實現,以免操作過程不小心
造成無法恢復的錯誤,整個操作過程需要耐心,細心的完成,請做好心理准備!
linux系統啟動流程:
POST-->BIOS(Boot Sequence)-->MBR(bootloader(grub))-->Kernel
-->initrd(虛根)-->ROOTFS(真正的根文件系統)-->/sbin/init
目標系統主體構成:
Kernel(linux-2.6.38.5編譯得到) + initrd(busybox制作) + ROOTFS (busybox制作)
目標系統實現的主要功能:
有虛擬終端、有主機名、實現賬戶認證、具有IP地址、能ssh遠程登錄;
實現環境:
本文所有操作均在Xshell5中通過ssh遠程登錄VMware中的宿主機完成
VMware版本:VMware10
宿主機配置(虛擬機分配的資源是2核CPU,512M內存)
准備工作:
1、需要一個作為宿主機的Linux;本文使用的是Redhat Enterprise Linux 5.8;
2、在宿主機上提供一塊額外的硬盤作為新系統的存儲盤,
作者添加的是一塊20G的IDE接口的新硬盤;
3、本文使用到的各源碼版本信息:linux-2.6.38.5內核、busybox-1.20.2和dropbear-2016.72
4、部分文件下載鏈接:
busybox,dropbear,bincopy.sh腳本,編譯2.6.38內核的.conf文件
一、准備磁盤
在虛擬機中添加一塊20G的IDE磁盤(此處為/dev/hda),供目標系統使用。接着打開宿主虛擬機
1、划分分區
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
cd
fdisk
/dev/hda
n
p
1
+100M
n
p
2
+512M
w
partprobe
/dev/hda
sync
sync
|
2、格式化分區並掛載至指定目錄
|
1
2
3
4
5
|
mke2fs -j
/dev/hda1
#/boot分區
mke2fs -j
/dev/hda2
#/分區
mkdir
/mnt/
{boot,sysroot}
mount
/dev/hda1
/mnt/boot
mount
/dev/hda2
/mnt/sysroot
|
二、編譯內核及必要模塊
解壓linux-2.6.38.5.tar.gz至/usr/src/
1、下載較新版本linux內核
|
1
2
3
|
cd
wget
"https://www.kernel.org/pub/linux/kernel/v2.6/linux-2.6.38.5.tar.gz"
tar
xf linux-2.6.38.5.
tar
.gz -C
/usr/src
|
2、編譯需要的模塊及內核核心
說明:make menuconfig # 編譯配置
根據您的實際和規划選擇所需要的功能;本實例計划制作一個具有網絡的功能的微型
linux且不打算使用內核模塊,因此,這里選擇把本機對應的網卡驅動直接編譯進了內
核。作者使用的是vmware Workstation虛擬機,所以,所需的網上驅動是pcnet32的,
其它的均可按需要進行選擇。選擇完成后需要保存至當前目錄下.config文件中。為了
實現后面的功能,請務必將文件系統中的ext3和網卡的驅動程序直接編譯進內核;否則,
就需要手動裝載這些相關文件系統的模塊;
(作者最終使用的.config配置文件為config-2.6.38.5-i686.cfg,見博文頂部下載鏈接)
|
1
2
3
4
5
6
7
8
|
cd
/usr/src
ln
-sv linux-2.6.38.5 linux
cd
linux
# 下載配置文件kernel-2.6.38.1-i686.cfg,復制到當前目錄中,並重命名為.config。
cp
/root/kernel-2
.6.38.1-i686.cfg .config
make
menuconfig
# 編譯配置,根據個人需求進行修改
screen
make
SUB=X86
# 編譯內核核心
|
三、給系統導入內核vmlinuz (編譯完成后,在/arch/x86/boot找到bzImage文件,將該文件作為內核)
提示:由於編譯過程比較慢,本步驟可在其余操作完成后再執行
|
1
2
3
4
5
|
cd
/usr/src/linux/arch/x86/boot
cp
bzImage
/mnt/boot/vmlinuz
sync
sync
|
四、編譯busybox
1、下載busybox-1.20.2.tar.bz2
|
1
|
tar
xf busybox-1.20.2.
tar
.bz2 -C
/root
|
2、配置busybox編譯文件
說明:make menuconfig # 編譯配置
1、此處需要選擇 Busybox Settings --> Build Options --> Build BusyBox as
a static binary (no shared libs),這樣可以把Busybox編譯成一個不使用共享庫的
靜態二進制文件,從而避免了對宿主機的共享庫產生依賴,
2、同時,你還可以修改busybox的安裝位置,方法為:Busybox Settings -->
Installation Options --> (./_install) BusyBox installation prefix,修安裝位置
,本文作者沒有對其進行修改。
|
1
2
|
cd
/root/busybox-1
.20.2
make
menuconfig
# 編譯配置
|
3、進入busybox-1.20.2的include目錄下,創建mtd目錄,並復制ubi-user.h文件
說明:舊版本的內核缺乏編譯busybox-1.20.2所需的頭文件ubi-user.h
|
1
2
3
|
cd
/root/busybox-1
.20.2
/include
mkdir
mtd
cp
/usr/src/linux-2
.6.38.5
/include/mtd/ubi-user
.h .
/mtd/
|
4、編譯busybox
|
1
2
|
cd
/root/busybox-1
.20.2
make
install
|
五、制作initrd.gz
1、復制_install文件至/tmp/busybox,刪除不必要的文件並創建需要的目錄
|
1
2
3
4
5
6
7
|
cd
/root/busybox-1
.20.2
mkdir
-pv
/tmp/busybox
cp
_install/*
/tmp/busybox/
-a
cd
/tmp/busybox/
ls
rm
-f linuxrc
mkdir
proc sys etc dev mnt
/sysroot
lib
/modules
tmp -pv
|
2、手動創建兩個必要的設備文件
|
1
2
3
|
cd
/tmp/busybox/
mknod
dev
/console
c 5 1
mknod
dev
/null
c 1 3
|
3、為initrd制作init程序,實現rootfs的切換
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
cd
/tmp/busybox/
vim init
添加如下內容:
#!/bin/sh
#cd
echo
"mountting proc and sys..."
mount
-t proc proc
/proc
mount
-t sysfs sysfs
/sys
echo
"init the other devices..."
mdev -s
echo
"mount /dev/hda2..."
mount
-t ext3
/dev/hda2
/mnt/sysroot
echo
"switch_root..."
exec
switch_root
/mnt/sysroot
/sbin/init
chmod
+x init
# 添加執行權限
|
4、給系統制作initrd
|
1
2
3
4
|
cd
/tmp/busybox/
find
. | cpio -H newc --quiet -o |
gzip
-9 >
/mnt/boot/initrd
.gz
sync
sync
|
六、安裝grub並編輯grub配置文件(為系統創建所需的引導程序)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
grub-
install
--root-directory=
/mnt
/dev/hda
cd
/mnt/boot
vim grub
/grub
.conf
添加內容形如:
default=0
timeout=3
title mix-busybox-
make
Linux (2.6.38)
root(hd0,0)
kernel
/vmlinuz
ro root=
/dev/hda2
initrd
/initrd
.gz
sync
sync
|
七、制作sysroot(建立真正的根文件系統)
1、復制busybox
|
1
2
3
4
5
6
7
|
cd
/root/busybox-1
.20.2
cp
_install/*
/mnt/sysroot/
-a
cd
/mnt/sysroot/
ls
rm
-f linuxrc
mkdir
proc sys dev
/pts
tmp var/{
local
,lock,run,log} -pv
mkdir
mnt
/sysroot
lib
/modules
etc
/rc
.d
/init
.d root usr
/lib
boot media -pv
|
2、為init進程提供配置文件:(inittab)
|
1
2
3
4
5
6
7
8
9
10
11
12
|
cd
/mnt/sysroot
vim etc
/inittab
添加如下內容:
::sysinit:
/etc/rc
.d
/rc
.sysinit
::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
::ctrlaltdel:
/sbin/reboot
::
shutdown
:
/bin/umount
-a -r
|
3、為系統准備一個“文件系統表”配置文件/etc/fstab
說明:devpts是偽終端文件系統,用於遠程連接
|
1
2
3
4
5
6
7
8
|
cd
/mnt/sysroot
vim etc
/fstab
添加如下內容:
sysfs
/sys
sysfs defaults 0 0
proc
/proc
proc defaults 0 0
devpts
/dev/pts
devpts mode=620 0 0
/dev/hda1
/boot
ext3 defaults 0 0
/dev/hda2
/ ext3 defaults 1 1
|
4、創建設備文件
|
1
2
3
|
cd
/mnt/sysroot
mknod
dev
/console
c 5 1
mknod
dev
/null
c 1 3
|
5、建立系統初始化腳本文件
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
cd
/mnt/sysroot
vim etc
/rc
.d
/rc
.sysinit
添加如下內容:
echo
-e
"\twelcome to \033[31mMix\033[0m Linux"
echo
-e
"Set the hostname"
[ -f
/etc/hostname
] && .
/etc/hostname
[ -z
"$HOSTNAME"
-o
"$HOSTNAME"
==
'(none)'
] && HOSTNAME=
"localhost"
hostname
$HOSTNAME
echo
-e
"Remounting the root filesystem..."
mount
-t proc proc
/proc
mount
-t sysfs sysfs
/sys
mount
-o remount,rw /
echo
-e
"Creating the files of device..."
mdev -s
echo
-e
"Mounting the filesystem..."
mount
-a
echo
-e
"start log service..."
syslogd
klogd
# 網絡IP地址根據個人情況自行設定,例如我的網關是192.168.134.1,
# 設置IP地址為:192.168.134.9/24
# 提示:編輯腳本時將中文注釋刪除,否則可能會出錯
echo
-e
"Configuring loopback interface ..."
ifconfig
lo 127.0.0.1
/24
ifconfig
eth0 192.168.134.9
/24
# 給腳本添加執行權限
chmod
+x etc
/rc
.d
/rc
.sysinit
|
6、rc.sysinit中啟用了日志進程,為避免大量日志顯示於控制台打斷正常工作,
我們為日志進程建立日志配置文件,為其指定將日志發送至/var/log/{messages,secure}文件中
1、在etc下創建配置文件syslog.conf
|
1
2
3
4
|
cd
/mnt/sysroot
vim etc
/syslog
.conf
*.info;auth.none
/var/log/messages
auth.*
/var/log/secure
|
2、手動創建/var/log/secure文件,並指定權限(用戶登錄日志)
|
1
2
|
touch
/var/log/secure
chmod
600
/var/log/secure
|
7、在系統啟動時為系統提供主機名稱
說明:從rc.sysinit文件中可以看出本系統中作者的主機名存儲在etc/hostname文件中,
你也可以自行指定路徑,並修改rc.sysinit中相關內容即可。
|
1
2
3
4
|
cd
/mnt/sysroot
vim etc
/hostname
添加如下內容:
HOSTNAME=MixLinux
|
8、inittab中配置了用戶需要通過賬戶認證才能登錄系統,因此接下來需要添加必要的文件
說明:這里為目標主機提供root用戶的認證信息
1、為目標主機建立passwd帳號文件、group帳號文件、shadow影子口令文件:
|
1
2
3
|
grep
"^(root)\>"
/etc/passwd
>
/mnt/sysroot/etc/passwd
grep
"^(root)\>"
/etc/shadow
>
/mnt/sysroot/etc/shadow
grep
"^(root)\>"
/etc/group
>
/mnt/sysroot/etc/group
|
2、為目標主機移植bash程序(移植二進制程序的腳本見博文頂部下載鏈接)
說明:未移植bash前,作者在在運行目標系統時出現以下錯誤
在掛載/dev/hda2時報錯:cat't find file or directory
|
1
2
3
4
|
/root/bincopy
.sh
鍵入
bash
,最后輸入q退出
sync
sync
|
9、為系統設置輸入提示信息([root@localhost root]#)
|
1
2
3
4
|
cd
/mnt/sysroot/root
vim .bash_profile
PS1=
'[\u@\h \W]\$ '
export
PS1
|
10、執行完第9步后,提示信息可能無法獲取用戶名,並會出現I have no name!的提示信息
原因:這個主要是沒有配置名稱解析服務造成的。
提示:若要為目標主機提供ssh遠程連接服務,則該步驟可跳過
1、為名稱解析服務復制必要的庫文件:
|
1
2
3
|
cd
/mnt/sysroot
cp
-d
/lib/libnss_files
* lib/
cp
-d
/lib/libnss_dns
* lib/
|
2、為目標主機建立名稱解析文件nsswitch.conf
|
1
2
3
4
5
6
|
vim etc
/nsswitch
.conf
添加如下內容:
passwd
: files
group: files
shadow: files
hosts: files dns
|
11、在系統登錄時提供banner信息
提示:issue中的內容可以根據你的需要進行修改。
|
1
2
|
cp
/etc/issue
/mnt/sysroot/etc/
vim
/mnt/sysroot/etc/issue
# 自定義顯示信息
|
八、接下來將此塊硬盤接入一個新的主機(這里使用的是虛擬機),啟動並測試使用。
提示:在測試前,務必在宿主機中多次鍵入sync指令,避免修改后的數據未同步至硬盤中
若在測試時發生分區損壞問題,可參見作者另一篇博文:Linux裁剪系統時硬盤損壞的解決方法
九、通過dropbear為系統提供ssh遠程連接服務
1、下載dropbear
|
1
2
|
cd
/root
wget
"https://matt.ucc.asn.au/dropbear/dropbear-2016.72.tar.bz2"
--no-check-certificate
|
2、解壓編譯dropbear
|
1
2
3
4
5
|
tar
xf dropbear-2016.72.
tar
.bz2
cd
/root/dropbear-2016
.72
.
/configure
make
make
install
|
3、移植dropbear
提示:移植二進制程序及其依賴的庫文件,方能實現其在目標系統上正常運行。建議使用腳本
進行(這里將其保存為bincopy.sh),其會自動移植指定的命令及依賴的庫文件。
腳本參見博文頂部下載鏈接
|
1
2
3
4
5
6
7
|
/root/bincopy
.sh
# 依次輸入dropbear、dropbearkey、dbclient,最后輸入q退出
# 這些命令會被存儲於目標系統的/usr/local/sbin
# 或/usr/local/bin目錄中
sync
sync
|
4、添加需要的配置文件和依賴庫文件
|
1
2
3
4
5
6
7
8
9
10
|
cd
/mnt/sysroot
vim etc
/nsswitch
.conf
# 添加如下內容:
passwd
: files
group: files
shadow: files
hosts: files dns
cp
-d
/lib/libnss_files
*
/mnt/sysroot/lib/
cp
-d
/usr/lib/libnss3
.so
/mnt/sysroot/usr/lib/
cp
-d
/usr/lib/libnss_files
*
/mnt/sysroot/usr/lib/
|
5、創建shells文件、編輯etc/fstab、為遠程登錄的用戶提供偽終端設備文件
提示:在第七步中已經完成部分操作,完成部分可跳過
說明:dropbear默認情況下僅允許默認shell存在於/etc/shells文件中的用戶遠程登錄
|
1
2
3
4
5
6
7
8
9
10
11
|
cd
/mnt/sysroot
vim etc
/shells
添加如下內容:
/bin/sh
/bin/bash
/bin/hush
/bin/ash
vim etc
/fstab
# 第七步驟中已經完成
# 添加如下內容:
devpts
/dev/pts
devpts mode=620 0 0
mkdir
dev
/pts
# 第七步驟中已經完成
|
6、使用dropbear生成主機秘鑰
說明:dropbear中的選項"-t:指定秘鑰編碼類型","-f:秘鑰存路徑","2048:秘鑰長度"
|
1
2
|
mkdir
/mnt/sysroot/etc/dropbear
dropbearkey -t rsa -f
/mnt/sysroot/etc/dropbear/dropbear_rsa_host_key
2048
|
7、測試
啟動目標主機,設定好網絡屬性后(一切正常,則此時應該已經設定完成)
提示:由於目標系統添加了日志功能,目標系統啟動后將向硬盤中寫入數據,此時宿主機
若還掛載着硬盤,將會造成磁盤數據混亂。因此本次測試前,記得將/mnt/sysroot/目錄
下的文件打包備份一份,以備下回恢復分區使用
使用如下命令啟動dropbear服務即可。
|
1
2
|
/usr/local/sbin/dropbear
# 啟用ssh遠程連接服務
/usr/local/bin/dbclient
-l root 192.168.134.2
# 遠程登錄其它主機
|
接下來就可以遠程進行連接測試了。
十、作者測試結果
1、目標系統啟動界面
2、遠程連接測試結果:
VMware端:(tty1輸入賬號密碼登錄需要ctrl+c幾次才能登錄,直接進入tty2測試即可)
Xshell端:測試遠程ssh連接目標主機(以及目標主機遠程連接其它主機)
3、整個操作結束后,目標系統/boot目錄中各文件大小:
可以看到目標系統能夠正常的運行並實現了遠程ssh連接,此時目標系統還未安裝各類工具軟件,可自行配置yum源,yum源配置可參加作者博客Linux Redhat5.8系統配置yum源,接着就可以使用yum下載工具了,學習筆記,還有許多不足之處還望見諒!




