建立 Root File System (rootfs)

前置作業

請先基礎瞭解此篇文章的內容:自動化建立、分割、格式化、掛載虛擬映像檔

橋接介面也要先做好:每次開機自動建立 br10 虛擬橋

最後也要架設自己的鏡像站:架設自幹鏡像站

什麼是 Root File System(rootfs)?

所謂的 rootfs 就是開機後系統必須讀取的安裝系統,簡單來說就是整個系統的根目錄 (/)

由於這個學期做的是嵌入式系統,這是一個微型的 linux 系統

因此其 rootfs 大部份來說與 PC Linux 的磁碟分割配置會不同

一般 PC Linux 會有分成好幾個分割區

但是嵌入式系統就只有一個分割區。

STARTO!

建立一個虛擬 sdcard.img

建立一個檔案名為 create_image.sh,輸入以下程式碼

SD_IMAGE=sdcard.img
SD_IMAGE_SIZE=1G
SD_IMAGE1=sdcard.img1
SD_IMAGE2=sdcard.img2
PART1_SIZE=80M
PART1_OFFSET=1
PART1_SECTORS=1
PART1_BLOCKS=1
PART2_OFFSET=1
PART2_SECTORS=1
PART2_BLOCKS=1
LOOP0=/dev/loop0
LOOP1=/dev/loop1
LOOP2=/dev/loop2
MOUNT_DIR1=/mnt/sdcard1
MOUNT_DIR2=/mnt/sdcard2
echo "建立掛載資料夾"
mkdir $MOUNT_DIR1 2>/dev/null
mkdir $MOUNT_DIR2 2>/dev/null
sleep 1
echo "建立完成,開始解除掛載資料夾 $MOUNT_DIR1 $MOUNT_DIR2"
umount $MOUNT_DIR1 2>/dev/null
umount $MOUNT_DIR2 2>/dev/null
sleep 1
echo "清除連接裝置 $LOOP2"
losetup -d $LOOP2 2>/dev/null
echo "清除連接裝置 $LOOP1"
losetup -d $LOOP1 2>/dev/null
echo "清除連接裝置 $LOOP0"
losetup -d $LOOP0 2>/dev/null
sleep 1
echo "建立虛擬 SD 卡 $SD_IMAGE 中"
dd if=/dev/zero of=$SD_IMAGE bs=$SD_IMAGE_SIZE count=1 2>/dev/null
echo "建立完成"
sleep 1
echo "更改使用者權限"
chown eecs:eecs $SD_IMAGE
echo "開始執行虛擬映像 $SD_IMAGE 的分割 (PART1: 建立腳本)..."
cat > /tmp/fdisk.cmd << EOF
n
p
1
+$PART1_SIZE
t
b
n
p
2
w
EOF
echo "腳本建立完成"
sleep 1
echo "開始執行虛擬映像 $SD_IMAGE 的分割 (PART2: 執行腳本)..."
fdisk $SD_IMAGE < /tmp/fdisk.cmd >/dev/null
echo "分割完成"
sleep 1
echo "開始計算分割所需容量..."
PART1_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\  -f 2`
PART1_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE1 | tr -s ' ' | cut -d\  -f 4`
PART1_BLOCKS=`expr $PART1_SECTORS / 2`
PART2_OFFSET=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\  -f 2`
PART2_SECTORS=`fdisk -lu $SD_IMAGE | grep $SD_IMAGE2 | tr -s ' ' | cut -d\  -f 4`
PART2_BLOCKS=`expr $PART2_SECTORS / 2`
echo "計算完成"
sleep 1
echo "開始將 $SD_IMAGE 連接至 $LOOP0 上"
losetup $LOOP0 $SD_IMAGE
echo "開始將 $SD_IMAGE1 連接至 $LOOP1 上"
losetup -o `expr $PART1_OFFSET \* 512` $LOOP1 $LOOP0
echo "開始將 $SD_IMAGE2 連接至 $LOOP2 上"
losetup -o `expr $PART2_OFFSET \* 512` $LOOP2 $LOOP0
# echo PART1_OFFSET=$PART1_OFFSET, PART1_BLOCKS=$PART1_BLOCKS
# echo PART2_OFFSET=$PART2_OFFSET, PART2_BLOCKS=$PART2_BLOCKS
sleep 1
echo "裝置連接完成,執行格式化..."
apt-get install dosfstools -y >/dev/null
mkdosfs -s 2 $LOOP1 $PART1_BLOCKS 2>/dev/null
mkfs.ext4 $LOOP2 >/dev/null
sleep 1
echo "格式化完成,執行掛載..."
mount $LOOP1 $MOUNT_DIR1
mount $LOOP2 $MOUNT_DIR2
echo "掛載完成。"
echo ""

使用root 權限,執行這個腳本

su -
cd /home/eecs/
sh create_image.sh
初次建立要等候一下

待腳本執行完成後,虛擬裝置分割區 1、2 即掛載完成到系統上,可以確認一下

df -h

更新自己的鏡像站

請先執行一次取得校外鏡像站的 getdeb.sh 腳本

或是執行取得 pominglee 鏡像站的指令

把本身電腦的鏡像站更新到最新

一樣要使用 root 權限

安裝基本套件

安裝建立 rootfs 的套件

apt-get install debootstrap -y

安裝 qemu-user-static 套件

apt-get install qemu-user-static -y

建立一個建立 rootfs 的腳本(使用 eecs 權限)

進入 ~/virtualarm

cd ~/virtualarm

新建一個檔案名為 debootstrap_armhf.sh

nano debootstrap_armhf.sh
ROOTFS_DIR=/mnt/sdcard2
DEBIAN_VERSION=buster
debootstrap \
--arch=armhf \
--keyring=/usr/share/keyrings/debian-archive-keyring.gpg \
--verbose \
--foreign \
$DEBIAN_VERSION \
$ROOTFS_DIR \
file:///home/ftp/debian

使用 root 權限,執行這個腳本

su -
cd /home/eecs/virtualarm
sh debootstrap_armhf.sh

完成後檢查一下檔案有沒有寫入 /mnt/sdcard2

df -h
成功寫入 /mnt/sdcard2,容量變為 183M

第1階段告一段落,請執行複製虛擬執行環境(一樣使用 root 權限)

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

再來進入 chroot 環境

chroot /mnt/sdcard2 /bin/bash
/mnt/sdcard2 已經變為臨時的root 目錄

執行以下指令執行第2階段

/debootstrap/debootstrap --second-stage

會執行一段時間,請耐心等待,結束後會看到這個畫面

看到 Base system installed successfully. 表示基礎系統安裝成功

設定虛擬機器裡面的環境

總共要做以下這些事情(注意:要在 chroot 的虛擬機裡面做)

  • root 密碼:leenix123
  • 新增一個使用者帳號 leenix/密碼: leenix123
  • 設定 locale (可裝/可不裝)
  • 設定網路
  • 設定 apt 來源
  • 架設 apache 伺服器
  • 設定主機名稱
  • 清理不必要檔案以節省空間

設定 root 密碼:leenix123

echo root:leenix123 | chpasswd

新增一個使用者帳號 leenix/密碼: leenix123

useradd leenix
echo leenix:leenix123 | chpasswd

設定網路

進入 interfaces ,貼上以下設定檔。儲存並退出

nano /etc/network/interfaces
# The loopback network interface
auto lo
iface lo inet loopback
# The primary network interface
allow-hotplug eth0
iface eth0 inet static
address 192.168.10.100
netmask 255.255.255.0
geteway 192.168.10.1

設定 apt 來源

先編輯 sources.list 檔案

nano /etc/apt/sources.list

輸入以下內容(注意以下IP:127.117.72.23部份,請替換成自己電腦的IP)

deb http://127.117.72.23/debian/ buster main contrib non-free
deb http://security.debian.org/debian-security buster/updates main

儲存並退出,輸入指令更新套件清單

apt-get update
如圖,現在虛擬機已經可以連上網路更新套件了

架設 apache 伺服器

安裝 apache2 套件並啟用開機自動啟動套件

apt-get install apache2 -y
systemctl enable apache2
至此已經安裝並啟用完成

查看 apache2 啟動狀態

systemctl is-enabled apache2
apache2 已經啟用

設定主機名稱

echo arm_leenix > /etc/hostname

清理不必要檔案以節省空間

基礎清除

首先看一下現在虛擬機佔了多少空間,在實體機下指令

df -h
使用了457M

下指令清除不必要的東西

apt-get clean

再看一次佔了多少空間

df -h

跳出 chroot 環境

exit

至此,rootfs 基本設定結束。

解除掛載虛擬機

解除掛載 /mnt/sdcard

umount /mnt/sdcard2
umount /mnt/sdcard1

解除連接 sdcard.img

losetup -d /dev/loop2
losetup -d /dev/loop1
losetup -d /dev/loop0
SHXJ
Latest posts by SHXJ (see all)

在〈建立 Root File System (rootfs)〉中有 2 則留言

  1. 自動引用通知: 整合虛擬 SD 卡 – SHXJ BLOG

發佈留言