2016年10月23日 星期日

如何建立 rootfs (新版 2020)

如何建立 rootfs
#2020/05/05 改版

Q. 什麼是 rootfs ?

嵌入式系統所使用的 Linux,如同工作站版本的 Linux 一樣,都有一個 / 目錄,這個目錄就是所謂的 rootfs。X86 主機的 / 目錄是我們在安裝 Debian Linux 時所建立,但是嵌入式系統的 Linux,其安裝流程十分不一樣,它沒有開機光碟/隨身碟等作為安裝工具,因此必須手動進行安裝。

需要工具:

debootstrap qemu-user-static

請執行:

# apt-get install debootstrap qemu-user-static

*** 我們預計先作一個虛擬的 ARM 系統,以 qemu 來執行,未來各位買 raspberry pi 來進行實作時,要安裝原廠所提供的嵌入式 Linux 作業系統 ***

安裝完畢後,我們要將之前所建立的 sd.img 再掛到 /mnt/sdcard1 /mnt/sdcard2 目錄,其中:

/mnt/sdcard1 - 大小:80M/ 檔案系統:VFAT/ 主要功能:放系統開機核心。
/mnt/sdcard2 - 大小:*  / 檔案系統:EXT4/ 主要功能:放 rootfs 及應用程式。


確定掛載後,我們要在 /mnt/sdcard2 目錄下建立新的 rootfs,指令如下:

# debootstrap \
  --arch=armhf \
  --keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
  --verbose \
  --foreign \
  buster \
  /mnt/sdcard2 \
  file:///home/ftp/debian

其中

--arch=armhf 是指我們 arm 的版本是 hf (Hard Float)
--keyring    是告訴 debootstrap 其 keyring.pgp 檔的位置
--verbose    是將過程全部顯示出來
--foreign    是指使用 armel 這個架構,一般都是在 x86_64 主機上實作其它平台的
             rootfs,所以要加上此參數。
buster       是指我們現在要安裝的 debian 版本為 buster,以後若升級至 bullseye
             的話必須要把 buster 改成 bullseye。
/mnt/sdcard2 是指要建立的 rootfs 目錄
file:///home/ftp/debian 是指建立 rootfs 時要下載的鏡像站來源,一般來說如果使用
             網路鏡像站的話,其參數為:
             ftp://debian.csie.nctu.edu.tw/debian
             或
             ftp://opensource.nchc.org.tw/debian
             等等諸如此類的鏡像站來源,使用網路鏡像站有很多缺點,最主的缺點是
             下載套件的時間是跟網路速度有關,因此先前帶大家自行建立網路鏡像站
             就是為了解決這個問題,所以請使用 file:///home/ftp/debian 即可不上
             網下載而是使用本機硬碟之鏡像站來下載,速度會非常快。

執行上述指令會出現底下訊息:

I: Retrieving Release
I: Retrieving Release.gpg
I: Checking Release signature
I: Valid Release signature (key id 75DDC3C4A499F1A18CB5F3C8CBF8D6FD518E17E1)
I: Retrieving Packages
I: Validating Packages
I: Resolving dependencies of required packages...
I: Resolving dependencies of base packages...
..
I: Extracting libmount1...
I: Extracting libsmartcols1...
I: Extracting libuuid1...
I: Extracting mount...
I: Extracting util-linux...
I: Extracting liblzma5...
I: Extracting zlib1g...

這樣表示 debootstrap 的第一階段告一段落,接著請執行:

# cp /usr/bin/qemu-arm-static /mnt/sdcard2/usr/bin/

然後進入 chroot 環境:

# chroot /mnt/sdcard2 /bin/bash
bash: warning: setlocale: LC_ALL: cannot change locale (zh_TW.UTF8)
I have no name!@120:/#

看到 I have no name! 的提示符號就表示我們已經進入 chroot 環境,請再執行:

# /debootstrap/debootstrap --second-stage
I: Keyring file not available at /usr/share/keyrings/debian-archive-keyring.gpg; switching to https mirror https://mirrors.kernel.org/debian
I: Installing core packages...
I: Unpacking required packages...
I: Unpacking acl...
I: Unpacking libacl1:armel...
..
I: Configuring tasksel...
I: Configuring tasksel-data...
I: Configuring libc-bin...
I: Configuring systemd...
I: Base system installed successfully.

看到最後一行有 Base system installed successfully 表示最原本的 rootfs 已經作好。

作完等待下次再來進行設定,請先將 sd.img 整個解除掉 (umount, losetup -d)。。

沒有留言:

張貼留言