日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

基于busybox构建rootfs

發(fā)布時(shí)間:2023/12/15 编程问答 43 豆豆
生活随笔 收集整理的這篇文章主要介紹了 基于busybox构建rootfs 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

它整合了許多Linux上常用的工具和命令(utilities), 如rm, ls, gzip, tftp等。對于這些工具和命令,busybox中的實(shí)現(xiàn)可能不是最全的,但卻是最常用的,因此它的特點(diǎn)就是短小精悍,特別適合對尺寸很敏感的嵌入式系統(tǒng)。

?

官網(wǎng):https://busybox.net/

參考: http://www.tldp.org/HOWTO/Bootdisk-HOWTO/buildroot.html

?

busybox有兩個(gè)作用:

  • 基于busybox構(gòu)建rootfs

  • 編譯生成Linux上常用的工具和命令

?

toolchain:gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu

?

?

1.?下載busybox

進(jìn)官網(wǎng),選擇 BusyBox 1.31.1下載

解壓:tar -vxjf busybox-1.31.1.tar.bz2

?

?

2.?配置

2.1?使用默認(rèn)配置

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- defconfig

  • defconfig,缺省配置,也就是默認(rèn)配置選項(xiàng)。

  • allyesconfig,全選配置,也就是選中 busybox 的所有功能。

  • allnoconfig,最小配置。

?

2.2?定制

執(zhí)行:make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu-?menuconfig

默認(rèn)配置即可

?

?

3.?build

3.1?創(chuàng)建一個(gè)文件夾用來存放roofs

cd ~/tools

mkdir rootfs

?

3.2 make

make ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- install CONFIG_PREFIX=/home/wangbaoli/tools/rootfs

CONFIG_PREFIX=/home/wangbaoli/tools/rootfs用來指定安裝文件夾

編譯完成后,工具和命令被安裝到~/tools/rootfs

?

?

4.?添加lib庫

4.1?lib

lib文件夾中包含*.so *.a庫,理論上我們應(yīng)該copy?gcc-toolchain下的lib庫,并且根據(jù)需要做一定的刪減,否者的話rootfs體積會太大。

gcc-toolchain下的lib庫:/usr/local/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/lib/

但是,這里為了節(jié)省做裁剪的時(shí)間,我直接復(fù)制已有rootfs的lib庫。

1)mkdir?lib

2)cp ~/repo/rootfs/buildroot-2019.02.5/output/target/lib/* ./lib

注:~/repo/rootfs/buildroot-2019.02.5/output/target?是buildroot默認(rèn)的rootfs存放路徑

3)創(chuàng)建lib64到lib的軟連接

ln -s lib lib64

?

4.2?usr/lib

usr/lib文件夾中包含*.so *.a庫,理論上我們應(yīng)該copy?gcc-toolchain下的usr/lib庫,并且根據(jù)需要做一定的刪減,否者的話rootfs體積會太大。

gcc-toolchain下的usr/lib庫:/usr/local/gcc-linaro-5.4.1-2017.01-x86_64_aarch64-linux-gnu/aarch64-linux-gnu/libc/usr/lib

但是,這里為了節(jié)省做裁剪的時(shí)間,我直接復(fù)制已有rootfs的usr/lib庫。

1)cd usr && mkdir lib

2)cp ~/repo/rootfs/buildroot-2019.02.5/output/target/usr/lib/* ./lib

3)ln -s lib lib64

?

?

5.?添加init和其他文件夾

5.1 執(zhí)行:mkdir dev proc mnt sys tmp root

?

5.2?添加init

如果通過bootloader傳入命令行參數(shù)init=xxx(通常是init=linuxrc),那么系統(tǒng)掛載文件系統(tǒng)后運(yùn)行l(wèi)inuxrc。

如果存在文件/init,那么系統(tǒng)掛載文件系統(tǒng)后運(yùn)行/init,即內(nèi)核啟動時(shí)會將/init作為第一個(gè)用戶進(jìn)程啟動。

在rootfs下,新建init,添加:

#!/bin/sh

# devtmpfs does not get automounted for initramfs

/bin/mount -t devtmpfs devtmpfs /dev

exec 0</dev/console

exec 1>/dev/console

exec 2>/dev/console

exec /sbin/init "$@"

然后執(zhí)行:chmod +x init

?

?

6.?完善

首先:mkdir etc && mkdir etc/init.d

在kernel掛載根文件系統(tǒng)后,運(yùn)行的第一個(gè)程序是根目錄下的linuxrc或init(?如果bootargs 設(shè)置 init=/linuxrc則運(yùn)行l(wèi)inuxrc),實(shí)際是一個(gè)指向/bin/busybox的鏈接, 也就是說系統(tǒng)起來后運(yùn)行的第一個(gè)程序是busybox本身。

linux先執(zhí)行 /etc/inittab, 然后調(diào)用/etc/init.d/rcS, 最后是執(zhí)行/etc/profile。

?

6.1?創(chuàng)建 /etc/init.d/rcS

開機(jī)啟動腳本

#!/bin/sh

PATH=/sbin:/bin:/usr/sbin:/usr/bin

LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/lib:/usr/lib

export PATH LD_LIBRARY_PATH runlevel

/bin/hostname?megvii

mount -a

mkdir /dev/pts

mount -t devpts devpts /dev/pts

echo /sbin/mdev > /proc/sys/kernel/hotplug

mdev -s

然后:chmod +x etc/init.d/rcS

?

6.2?創(chuàng)建 /etc/fstab

proc????/proc???proc????defaults 0 0

tmpfs???/tmp????tmpfs???defaults 0 0

sysfs???/sys????sysfs???defaults 0 0

tmpfs???/dev????tmpfs???defaults 0 0

fstab 在 Linux 開機(jī)以后自動配置哪些需要自動掛載的分區(qū)。

?

6.3?創(chuàng)建 /etc/inittab

#etc/inittab

::sysinit:/etc/init.d/rcS

console::askfirst:-/bin/sh

::restart:/sbin/init

::ctrlaltdel:/sbin/reboot

::shutdown:/bin/umount -a -r

::shutdown:/sbin/swapoff -a

?

6.4?創(chuàng)建/etc/profile

USER="`id -un`"????????????????????????????????????????????????????????????????

LOGNAME=$USER

HOSTNAME=`/bin/hostname`

HOME=/root

PS1="[$USER@$HOSTNAME \W]\# "

PATH=$PATH

export USER LOGNAME HOSTNAME HOME PS1 PATH PATH LD_LIBRARY_PATH

此文件涉及系統(tǒng)的環(huán)境,即環(huán)境變量相關(guān)。這里修改會對所有用戶起作用。

用戶登錄或切換(即Login shell 啟動)時(shí)都有一個(gè)專用的運(yùn)行環(huán)境,但首先執(zhí)行 /etc/profile 。

在 /etc/profile 文件中設(shè)置的變量是全局變量。而 .bashrc文件(在用戶的家目錄下)則只對當(dāng)前用戶有用。

?

6.5最終目錄

?

?

7.?打包

可以將rootfs打包壓縮成各種格式,我打包成rootfs.cpio.gz

1) cd rootfs

2)?打包壓縮成rootfs.cpio.gz

  • find ./* | cpio -H newc -o >?rootfs.cpio

  • gzip rootfs.cpio

?

?

8.?測試

測試該rootfs.cpio.gz

boot?kernel,出現(xiàn)如下錯(cuò)誤,我們逐個(gè)來解決:

?

8.1?VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6

[????2.086084] VFS: Cannot open root device "(null)" or unknown-block(0,0): error -6

[????2.086155] Please append a correct "root=" boot option; here are the available partitions:

[????2.086250] Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)

完成上述步驟5.2,添加init

?

8.2 can't run '/etc/init.d/rcS': No such file or directory

解決:完成上述步驟6

?

8.3?成功時(shí)的界面:

?

8.4?優(yōu)化

1)去掉:Please press Enter to activate this console.

在/etc/inittab,將::askfirst:-/bin/sh改為::respawn:-/bin/sh

2)設(shè)置hostname

在/etc/init.d/rcS加入/bin/hostname?yourname

3)設(shè)置user

在/etc/profile?設(shè)置USER=root

?

?

注:

1) 解壓rootfs.cpio.gz

gunzip?rootfs.cpio.gz

cpio -idmv <rootfs.cpio

?

?

總結(jié)

以上是生活随笔為你收集整理的基于busybox构建rootfs的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。