---
# System prepended metadata

title: BeagleBone Black using busybox

---

BeagleBone Black using busybox
===

[前一篇BeagleBone Black Build Syatem](https://hackmd.io/iiylzysrQYyvolJCiI61qg)

之前我直接使用debian的rootfs，這裡建置busybox當作rootfs(書上第5章節)。

在途中，有遇到一些問題，我找到了一些資料。
[X-021-ROOTFS](http://www.wowotech.net/x_project/simple_busybox.html)
[使用qemu建立一個linux核心和busybox根檔案系統](https://hackmd.io/@c_0KKCwzQE2rsd39mpvNQQ/rknxhDzvB)


:::info
上一篇有建置過的內容，本篇不在建置，直接使用。
* 前一篇已建置完成的
    Linux kernel
    u-boot
:::

---

:::info
* Cross-compile使用arm-linux-gnueabi-
:::

1. 從github下載busybox的原始碼:

```bash=
CC=arm-linux-gnueabi-
git clone --depth=1 https://github.com/mirror/busybox
```

2. 初始化busybox:

```bash=
make ARCH=arm CROSS_COMPILE=${CC} distclean
make ARCH=arm CROSS_COMPILE=${CC} defconfig
```

3. 選擇靜態編譯:

輸入以下命令，進入進階設定
```bash=
make ARCH=arm CROSS_COMPILE=${CC} menuconfig
```

:::info
Settings->Build static library

![](https://i.imgur.com/QYT5RUe.png)

![](https://i.imgur.com/Ovwwcql.png)
:::

4. 編譯busybox

```bash=
make ARCH=arm CROSS_COMPILE=${CC} -j6
```

5. 建立安裝目標目錄，並安裝busybox

```bash=
mkdir rootfs
make ARCH=arm CROSS_COMPILE=${CC} install CONFIG_PREFIX=```pwd```/rootfs
```

6. 建立rootfs所需的其餘資料夾
```bash=
mkdir -pv ```pwd```/rootfs/{root,boot,tmp,bin,sbin,etc,proc,sys,usr,dev/{bin,sbin}}
```

7. 複製etc/init.d/rcS範例到自己的rootfs

```bash=
mkdir -p rootfs/etc/init.d/
cp examples/bootfloppy/etc/init.d/rcS rootfs/etc/init.d/
vim rootfs/etc/init.d/rcS
```

修改成
```bash=
#! /bin/sh                                                                            

/bin/mount -a
mount -t proc proc /proc
mount -o remount,rw /
mount -t sysfs sysfs /sys
```

8. 創建etc/inittab (書上 5.9 init)

```bash=
touch rootfs/etc/inittab
vim rootfs/etc/inittab
```

內文輸入:

```text=
#first: run the system script file

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

::respawn:/sbin/getty -L ttyS0 115200 vt100                                           

::ctrlaltdel:-/bin/reboot

#umount all filesystem

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

#restart init process

::restart:/sbin/init

```

9. 新增使用者帳號
```bash=
touch rootfs/etc/passwd
vim rootfs/etc/passwd
```

為了加入使用者，passwd檔案內新增以下資料:

```text=
root:x:0:0:root:/root:/bin/sh
daemon:x:1:1:daemon:/usr/bin:/bin/false
```

:::info
passwd檔案格式:

格式:
* 登入帳號名稱
* 用來驗證密碼的hash(x表示存在/etc/shadow中)
* UID使用者編號
* GID使用者群組編號
* 備註欄位(通常留空)
* 使用者的家目錄(home)位置
* (非必要)使用者所使用的命令列環境
:::

10. 新增密碼(/etc/shadow)

```bash=
touch rootfs/etc/shadow
vim rootfs/etc/shadow
```

```text=
root::10933:0:99999:7:::
daemon:*:10933:0:99999:7:::
```

:::info
格式:
* 帳號名稱
* 密碼(*表示不管輸入什麼密碼都無法登入)
* 其餘七個跟密碼的複雜度有關係，但Embedded system卻不會使用到。[詳細參考shadow(5)](https://man7.org/linux/man-pages/man5/shadow.5.html)
:::

11. 新增群組(/etc/group)
```bash=
touch rootfs/etc/group
vim rootfs/etc/group
```

```text=
root:x:0:
daemon:x:1:
```

:::info
格式:
* 帳號名稱
* 用來驗證密碼的hash(x表示存在/etc/shadow中)
* GID使用者群組編號(以逗點分隔使用者所屬的群組)
:::

12. 將整個建立完成的rootfs複製到sdcard

```bash=
sudo cp -rf rootfs/* /media/rootfs/
```

13. 複製Linux kernel到rootfs。[前一篇BeagleBone Black Build Syatem](https://hackmd.io/iiylzysrQYyvolJCiI61qg)

```bash=
cd linux
kernel_version=`make kernelversion`
sudo sh -c "echo 'uname_r=${kernel_version}' >> /media/rootfs/boot/uEnv.txt"
sudo cp -v arch/arm/boot/zImage /media/rootfs/boot/vmlinuz-${kernel_version}
sudo mkdir -p /media/rootfs/boot/dtbs/${kernel_version}
sudo cp -v arch/arm/boot/dts/*.dtb /media/rootfs/boot/dtbs/${kernel_version}
sudo make -j6 ARCH=arm CROSS_COMPILE=${CC} INSTALL_MOD_PATH=/media/rootfs modules_install
sync
```


![](https://i.imgur.com/c2iSdPc.png)
