[轉]從開始到結束,手把手教你使用busybox構建類嵌入式Linux系統


轉自: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、目標系統啟動界面

wKioL1c_EgDzfndNAAP5RgG_Ydg694.jpg

 

2、遠程連接測試結果:

    VMware端:(tty1輸入賬號密碼登錄需要ctrl+c幾次才能登錄,直接進入tty2測試即可)

wKioL1c--QrS_hyvAAInbDIAKGI212.jpg

 

Xshell端:測試遠程ssh連接目標主機(以及目標主機遠程連接其它主機)

wKiom1c--DuzZCR9AATBYsO7mh0664.jpg

 

3、整個操作結束后,目標系統/boot目錄中各文件大小:

wKiom1c-7eTSZy6-AADN_u3gyH4538.jpg  

 

可以看到目標系統能夠正常的運行並實現了遠程ssh連接,此時目標系統還未安裝各類工具軟件,可自行配置yum源,yum源配置可參加作者博客Linux Redhat5.8系統配置yum源,接着就可以使用yum下載工具了,學習筆記,還有許多不足之處還望見諒!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM