Busybox構建根文件系統和製做Ramdisk

  

    定製根文件系統的方法不少,最經常使用的是使用BusyBox來構建定製根文件系統。它集成壓縮了Linux的許多工具和命令,能夠使用戶迅速方便地創建一套相對完整、功能豐富的文件系統,其中包括大量經常使用的應用程序。下面詳細介紹有關Busybox定製根文件系統。html

 

1、系統環境:

1、操做系統:Ubuntu140.4

2、交叉編譯工具:gcc version 6.1.1 20160711 (Linaro GCC 6.1-2016.08)

3busybox源碼包:busybox-1.26.2

 

2、構建rootfs

    1、創建rootfs目錄

    /home/xxx/xxx目錄下創建rootfs目錄,linux

        $  mkdir rootfsgit

                $  cd  rootfsgithub

                $  mkdir  root  bin  sbin  etc  dev  usr  lib  tmp  mnt  sys  proc  var  //創建經常使用目錄shell

                $  mkdir  usr/lib  usr/bin  usr/sbinbash

 

    2、解壓源碼包:

        $ tar -jxvf busybox-1.26.2.tar.bz2ide

 

    3、配置BusyBox

       $ make distclean函數

              $ make defconfig工具

              $ make menuconfig ARCH=armui

    3.1選擇Busybox Settings --->

              Installation Options --->

                                   BusyBox installation prefix(在裏面輸入BusyBox的安裝目錄,我是保存在/home/xxx/xxx/rootfs下)

 

   3.2選擇Busybox Settings --->  

                     選中[*] Don't use /usr

 

 

    3.3 Busybox Settings---->

             Build Options---->

               選中 [*]Build BusyBox as a static binary(靜態連接)

               Cross Compiler prefix配置爲arm-linux-gnueabi-(指定交叉編譯器)

 

配置好後,保存相關配置信息。

    4、編譯安裝Busybox

        $ make

                $ make install

    5、添加/home/xxx/xxx/rootfs/dev目錄下的設備文件。

    

    dev目錄下必須有console和null這兩個設備文件,使用mknod來建立這兩個設備文件。

            $ cd dev/

                  $ sudo mknod -m 666 console c 5 1

                 $ sudo mknod -m 666 null c 1 3

   

    6、把busybox源碼目錄下的examples/bootfloppy/etc的內容拷貝到rootfs目錄下的etc

        $ cd /home/xxx/xxx/rootfs/etc

                $ cp  /home/ xxx/xxx/Downloads/busybox-1.26.2/examples/bootfloppy/etc/* ./ -raf

 

   七、修改配置文件

  7.一、修改fstab配置文件爲:

 

  1 proc        /proc   proc    defaults    0   0
  2 tmpfs       /tmp    tmpfs   defaults    0   0
  3 sysfs       /sys    sysfs   defaults    0   0
  4 tmpfs       /dev    tmpfs   defaults    0   0   
  5 var         /dev    tmpfs   defaults    0   0
  6 ramfs       /dev    ramfs   defaults    0   0
  7 

 

 

 


      7.2修改profile文件爲:

 

# /etc/profile: system-wide .profile file for the Bourne shells

USER="id -un"
LOGNAME=$USER
HOSTNAME='/bin/hostname'
export PS1='[\u@\h:\w]\#'

PATH=/bin:/sbin:/usr/bin:/usr/sbin
LD_LIBRARY_PATH=/lib:/usr/lib:$LD_LIBRARY_PATH
export PATH LD_LIBRARY_PATH

 

PS1含義

  1. \d :表明日期,格式爲weekday month date,例如:"Mon Aug 1"
  2. \H :完整的主機名稱。例如:個人機器名稱爲:fc4.linux,則這個名稱就是fc4.linux
  3. \h :僅取主機的第一個名字,如上例,則爲fc4,.linux則被省略
  4. \t :顯示時間爲24小時格式,如:HH:MM:SS
  5. \T :顯示時間爲12小時格式
  6. \A :顯示時間爲24小時格式:HH:MM
  7. \u :當前用戶的帳號名稱
  8. \v :BASH的版本信息
  9. \w :完整的工做目錄名稱。家目錄會以 ~代替
  10. \W :利用basename取得工做目錄名稱,因此只會列出最後一個目錄
  11. \# :下達的第幾個命令
  12. \$ :提示字符,若是是root時,提示符爲:# ,普通用戶則爲:$

 

   7.3修改inittab文件爲:

# /etc/inittab

::sysinit:/etc/init.d/rcS
::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r
::restart:/sbin/init

 

在啓動過程當中bootloader會傳遞參數init=/linuxrc給內核的main( )函數,因此在文件系統被掛載後,運行的第一個程序是linuxrc,而linuxrc是一個指向/bin/busybox的連接文件,也就是說文件系統被掛在後運行的第一個程序是busybox。Busybox首先會解析文件/etc/inittab,這個文件中存放的是系統的配置信息,這些配置信息指明瞭接下來將要啓動那些程序。

 

 /etc/inittab 文件中每一個條目用來定義一個子進程,並肯定它的啓動方法,格式以下 

     <id>:<runlevels>:<action>:<process>

<id>:表示這個進程要使用的控制檯(即標準輸入、標準輸出、標準錯誤設備)。若是省 略,則使用與init進程同樣的控制檯。
<runlevels>:對於Busybox init程序,這個字段滑意義,能夠省略。
<action>:表示init程序如何控制這個子進程,
<process>: 要執行的程序,它能夠是可執行程序,也能夠是腳本


  文件etc/inittab配置條目說明以下:

  ::sysinit:/etc/init.d/rcS    啓動系統初始化文件/etc/init.d/rcS。字段sysinit代表文件/etc/init.d/rcS在系統啓動後最早執行,而且只執行一次,init進程等待它結束才繼續執行其它動做。(腳本文件名通常爲rc,後綴S表明單用戶運行級別腳本)

 ::askfirst:-/bin/sh   啓動askfirst動做的shell。askfirst代表init進程先輸出「Please press Enter to actvie this console」,等用戶輸入回車鍵以後才啓動-/bin/sh。

  ::ctrlaltdel:/sbin/reboot  當按下Ctrl+Alt+Delete組合鍵時,init重啓執行程序。字段ctrlaltdel代表當按下Ctrl+Alt+Delete組合鍵時,執行相應的進程。

  ::shutdown:/bin/umount -a -r   告訴init在關機時運行umount命令卸載全部的文件系統,若是卸載失敗,試圖以只讀方式從新掛載。字段shutdown代表在重啓關閉系統命令時執行相應進程。

  7.4 配置系統的hostname。在etc目錄下執行以下命令:

    $ mkdir  sysconfig

        $ cd sysconfig

        $ touch  HOSTNAME

        $ echo  tiny4412 > HOSTNAME

 

     7.5 配置init.d/rcS文件爲:

#! /bin/sh

PATH=/sbin:/bin:/usr/bin:/usr/sbin
runlevel=S
prevlevel=N
umask 022
export PATH runlevel prevlevel

mount -a
mkdir -p /dev/pts
mount -t devpts devpts /dev/pts
#mount -n -t usbfs none /proc/bus/usb
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s
mkdir -p /var/lock

ifconfig lo 127.0.0.1
/bin/hostname -F /etc/sysconfig/HOSTNAME

 修改init.d/rcS文件權限爲:

    $ chmod 777 init.d/rcS

 

詳解:

#!/bin/sh    #用busybox的shell

PATH=/sbin:/bin:/usr/sbin:/usr/bin  #shell命令的搜索路徑

runlevel=S   #運行在單用戶模式

prevlevel=N  #前一個級別,爲N則表示沒有前一個級別

umask 022   #權限位掩碼

export PATH runlevel prevlevel   #將環境的變量導出到環境中

mount -a   #將文件 /etc/fstab 中指明的文件掛載到對應的掛載點上

echo /sbin/mdev>/proc/sys/kernel/hotplug  #當有熱插拔事件產生時, 內核就會調用位於/sbin目錄的 mdev。 這時 mdev經過環境變量中的 ACTION 和 DEVPATH,(這兩個變量是系統自帶的)來肯定這次熱插拔事件的動做以及影響了/sys 中的那個目錄。接着會看看這個目錄中是否有「dev」的屬性文件,若是有就利用這些信息爲 這個設備在/dev 下建立設備節點文件。
mdev -s   #創建dev目錄。以‘-s’爲參數調用位於/sbin 目錄寫的 mdev(實際上是個連接,做用是傳遞參數給/bin目錄下的busybox 程序並調用它) ,mdev掃描 /sys/class和/sys/block中全部的類設備目錄,若是在目錄中含有名爲「dev」的文件,且文件中包含的是設備號,則 mdev 就利用這些信息爲這個設備在/dev下建立設備節點文件。通常只在啓動時才執行一次  「mdev -s」 。

  7.6設置ROOT用戶(在etc下)

添加passwd文件: 

root:x:0:0:root:/root:/bin/bash

 

添加group文件

root:x:0:

添加shadow文件

root:$6$whiml8Gm$IuKrjGatftq.i6i3OYiu9EP3Rou.RtC2gKC0neyDgM/D5gGBzZwfCUiVoLAj.rWjEmSIwkIe2sKI0DpUusTDn1:17260:0:99999:7:::

 

 

 

 

3、製做Ramdisk文件系統

 

#!/bin/bash

 
rm -rf ramdisk*

sudo dd if=/dev/zero of=ramdisk bs=1k count=8192

sudo mkfs.ext4 -F ramdisk

sudo mkdir -p ./initrd

sudo mount -t ext4 ramdisk ./initrd
sudo cp rootfs
/* ./initrd -raf sudo mknod initrd/dev/console c 5 1 sudo mknod initrd/dev/null c 1 3 sudo umount ./initrd sudo gzip --best -c ramdisk > ramdisk.gz sudo mkimage -n "ramdisk" -A arm -O linux -T ramdisk -C gzip -d ramdisk.gz ramdisk.img rm ramdisk ramdisk.gz initrd -rf

 

 

 

  把該腳本拷貝到rootfs同一目錄下,執行該腳本製做Ramdisk文件系統。生成的ramdisk.img就是咱們須要的Ramdisk文件系統。

 

github:https://github.com/xiaozhao777/busybox-1.26.2

參考:

https://www.cnblogs.com/AP0904225/p/7020418.html

https://blog.csdn.net/sinat_20006769/article/details/79059317

相關文章
相關標籤/搜索