建立 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

发布留言