這里提供相關工具的下載地址
Linux內核下載地址
busybox下載地址
Qemu下載地址
u-boot下載地址
文中使用的版本為Linux-4.9.268、busybox-1.33.0、qemu-5.2.0、u-boot-2021.01-rc4
版本差別不大,應該都沒有問題的
一、busybox制作根目錄,通過鏡像啟動linux內核模擬ARM板
1、編譯linux內核
編譯條件:gcc編譯器,交叉編譯器
sudo apt install gcc
sudo apt install gcc-arm-linux-gnueabi
具體安裝配置見:交叉編譯器安裝使用
清除做過的配置
make clean

自定義內核配置,通過空格鍵選擇配置。這里不做修改,采用默認配置,后面可以根據需要再修改。
make menuconfig

如果運行make menuconfig出錯,則需要安裝如下的支持包
sudo apt-get install lncurses-dev
sudo apt-get install libncurses5-dev
保存退出后會自動生成.config配置文件
然后創建一個腳本build.sh
輸入下面內容,運行即可編譯
#! /bin/sh
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm vexpress_defconfig
make CROSS_COMPILE=arm-linux-gnueabi- ARCH=arm

運行命令,開始編譯,內容比較多,會花一些時間
sudo sh build.sh

然后會在源碼目錄下的arch/arm/boot/文件夾下生成鏡像Image和zImage
2、編譯busybox
進入到busybox目錄下,編輯Makefile
搜索如下兩個變量,更改成這樣
ARCH ?= arm
CROSS_COMPILE ?= arm-linux-gnueabi-
執行下面命令,使得編譯器生效
source /etc/profile
修改配置文件
make menuconfig
如果出現沒有<curses.h>頭文件,嘗試安裝如下支持包
sudo apt-get install libncurses5-dev
修改配置完成后,make編譯

再make install生成默認文件_install

文件內容

記住這個_install文件夾位置,制作根目錄的時候會用到
3、編譯安裝qemu
為了更好的使用qemu,安裝前先下載一些安裝包
#必要安裝包
sudo apt-get install git libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev
#推薦安裝包
sudo apt-get install git-email
sudo apt-get install libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev
sudo apt-get install libcap-dev libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev
sudo apt-get install libibverbs-dev libjpeg8-dev libncurses5-dev libnuma-dev
sudo apt-get install librbd-dev librdmacm-dev
sudo apt-get install libsasl2-dev libsdl1.2-dev libseccomp-dev libsnappy-dev libssh2-1-dev
sudo apt-get install libvde-dev libvdeplug-dev libvte-2.90-dev libxen-dev liblzo2-dev
sudo apt-get install valgrind xfslibs-dev
#額外安裝包
sudo apt-get install libnfs-dev libiscsi-dev
自帶的qemu可能比較老,這里采用安裝包的方式安裝新版本
解壓后進入qemu文件夾
這里選擇一種在其他目錄安裝的方式,比較安全,不會向原目錄增加多余的文件
# 在qemu根目錄打開終端
# 准備一個本機debug版本
mkdir -p bin/debug/native cd bin/debug/native
# 配置 QEMU 並啟動構建
../../../configure --enable-debug
如果提示沒有Ninja,則進行下面的操作
#安裝支持包
sudo apt install re2c
#安裝編譯ninja
git clone git://github.com/ninja-build/ninja.git && cd ninja
./configure.py --bootstrap
#如果提示沒有python,則sudo apt install python
#如果還報錯沒有c++,則安裝sudo apt-get install g++,裝完后再次執行上面的命令
ls #查看生成的ninja文件
cp ninja /usr/bin/ #拷貝ninja文件到/usr/bin/路徑下
#檢查ninja版本
ninja --version
#如果檢查報錯就安裝
sudo apt install ninja-build

錯誤解決,再回到出錯的步驟繼續執行
cd .. #回到native目錄
../../../configure --enable-debug

配置完成,然后make編譯
這里有8000多行的編譯,時間會比較長

安裝
sudo make install

# 返回到QEMU根目錄
cd ../../..
運行./configure --help 可以獲得幫助信息
測試qemu編譯是否正常,輸入命令
bin/debug/native/x86_64-softmmu/qemu-system-x86_64 -L pc-bios

彈出QEMU界面,安裝成功。由於還沒有制作根目錄,所以顯示沒有設備
根據界面頂端提示,使用ctrl+alt+g退出輸入界面
可以用qemu-system-arm -machine help命令來查看所支持的開發板

4、制作啟動根目錄
自己選擇一個地方創建rootfs目錄

在rootfs里面創建下面的這些空目錄(和busybox的_install文件夾里重復的文件夾也可以不用創建,馬上要復制過來)

(1)完善編譯環境
先將剛剛busybox里生成的_install文件夾內部的全部內容復制到rootfs文件夾里。
在rootfs文件夾內打開終端
sudo cp -r ../../busybox-1.33.0/_install/* ./
命令里的文件夾路徑根據自己的情況來寫

當然lib庫還是不夠的,因為文件系統運行在arm平台,所以還需要arm-linux-gnueabi的庫,直接從系統里安裝的交叉編譯器里復制過來。
sudo cp -p /usr/arm-linux-gnueabi/lib/* ./lib

接着來完善根目錄文件
(2)完善設備文件dev內容
從終端進入dev文件夾
-
創建四個串口設備
sudo mknod -m 666 tty1 c 4 1
sudo mknod -m 666 tty2 c 4 2
sudo mknod -m 666 tty3 c 4 3
sudo mknod -m 666 tty4 c 4 4
-
創建控制台
sudo mknod -m 666 console c 5 1
-
創建null
sudo mknod -m 666 null c 1 3

(3)完善配置文件etc內容
從終端進入etc文件夾

-
創建inittab
::sysinit:/etc/init.d/rcS
#::respawn:-/bin/sh
#::respawn:-/bin/loginconsole
::askfirst:-/bin/sh
#tty2::askfirst:-/bin/sh
::ctrlaltdel:/bin/umount -a -r
-
創建fstab
proc /proc proc defaults 0 0
none /dev/pts devpts mode=0622 0 0
mdev /dev ramfs defaults 0 0
sysfs /sys sysfs defaults 0 0
tmpfs /dev/shm tmpfs defaults 0 0
tmpfs /dev tmpfs defaults 0 0
tmpfs /mnt tmpfs defaults 0 0
var /dev tmpfs defaults 0 0
ramfs /dev ramfs defaults 0 0
-
創建profile
# /etc/profile: system-wide .profile file for the Bourne shells
echo "-----------------------------------"
echo "Mini2440 FileSystem is Ready ..."
echo "-----------------------------------"
USER="`id -un`"
LOGNAME=$USER
#PS1='[\u@\h \W]\# ' #顯示主機名、當前路徑等信息
PS1='pymeia@Mini2440:\w # ' #顯示主機名、當前路徑等信息
PATH=$PATH
HOSTNAME=`/bin/hostname`
export USER LOGNAME PS1 PATH
-
創建init.d/rcS
#! /bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin #可執行程序 環境變量
export LD_LIBRARY_PATH=/lib:/usr/lib #動態鏈接庫 環境變量
/bin/mount -n -t ramfs ramfs /var
/bin/mount -n -t ramfs ramfs /tmp
/bin/mount -n -t sysfs none /sys
/bin/mount -n -t ramfs none /dev
/bin/mkdir /var/tmp
/bin/mkdir /var/modules
/bin/mkdir /var/run
/bin/mkdir /var/log
/bin/mkdir -p /dev/pts //telnet服務需要
/bin/mkdir -p /dev/shm //telnet服務需要
#echo /sbin/mdev > /proc/sys/kernel/hotplug//USB自動掛載需要
/sbin/mdev -s //啟動mdev在/dev下自動創建設備文件節點
/bin/mount -a
echo "-----------------------------------"
echo " welcome to Mini2440 board"
echo "-----------------------------------"
-
創建group
root:*:0:
daemon:*:1:
bin:*:2:
sys:*:3:
adm:*:4:
tty:*:5:
disk:*:6:
lp:*:7:
lpmail:*:8:
news:*:9:
uucp:*:10:
proxy:*:13:
kmem:*:15:
dialout:*:20:
fax:*:21:
voice:*:22:
cdrom:*:24:
floppy:*:25:
tape:*:26:
sudo:*:27:
-
創建passwd
root::0:0:root:/:/bin/sh
ftp::14:50:FTP User:/var/ftp:
bin:*:1:1:bin:/bin:
創建var文件夾,存放日志信息
sudo ln -s /tmp var/lock
sudo ln -s /tmp var/log
sudo ln -s /tmp var/run
sudo ln -s /tmp var/tmp
5、qemu啟動開發板鏡像
制作根文件系統鏡像,把rootfs根目錄的內容復制到這個鏡像中,然后用qemu啟動模擬開發板。
方法1
制作磁盤鏡像啟動方式
(1)制作磁盤鏡像img
制作磁盤鏡像並格式化
qemu-img create -f raw disk.img 512M #生成512M大小的磁盤鏡像
mkfs -t ext4 ./disk.img #把磁盤鏡像格式化成ext4文件系統
也可以將其打包成mkdisk.sh腳本,方便再次創建
sudo sh mkdisk.sh
#!/bin/sh
qemu-img create -f raw disk.img 512M
mkfs -t ext4 ./disk.img

(2)復制rootfs內容到磁盤鏡像
將rootfs根目錄中所有內容復制到磁盤鏡像中
mkdir tmpfs #創建一個臨時文件夾,文件夾與rootfs同級
sudo mount -o loop ./disk.img tmpfs/ #創建掛載點並掛載
sudo cp -r rootfs/* tmpfs/ #復制文件到鏡像
sudo umount tmpfs #卸載
也可以打包起來方便更新磁盤內容
sudo sh update.sh
#!/bin/sh
sudo mount -o loop ./disk.img tmpfs/
sudo cp -r rootfs/* tmpfs/
sudo umount tmpfs

更新期間會將rootfs的內容復制到tmpfs,再刪除

檢查鏡像文件信息
file disk.img
(3)啟動開發板
不帶qemu界面
直接在終端啟動,不帶lcd界面
sudo sh runnolcd.sh
#! /bin/sh
qemu-system-arm -M vexpress-a9 -m 512M -dtb ../linux-4.9.268/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ../linux-4.9.268/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd disk.img
如果遇到拒絕訪問的情況,請授予文件訪問權限,刪掉磁盤重新創建(直接更新不成功)

chmod +x rcS
chmod -R 777 init.d/*
或者授予etc的所有文件訪問權限
chmod -R 777 etc/
啟動界面如下

帶qemu界面
帶lcd界面啟動方式
sudo sh runlcd.sh
#! /bin/sh
qemu-system-arm -M vexpress-a9 -m 512M -dtb ../linux-4.9.268/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ../linux-4.9.268/arch/arm/boot/zImage -append "root=/dev/mmcblk0 rw console=tty0" -sd disk.img
啟動界面如下

【注意】:啟動終端的命令,里面的路徑一定要根據自己創建的文件夾填寫正確。啟動命令也可以直接在終端輸入,但是比較麻煩。
方法2
制作sd根文件系統鏡像啟動方式
(1)制作sd卡鏡像
生成虛擬sd卡並格式化為ext格式
sudo sh mksd.sh
#! /bin/sh
dd if=/dev/zero of=rootfs.ext3 bs=1M count=32
mkfs.ext3 rootfs.ext3
(2)復制內容到sd鏡像
將虛擬sd卡掛載到/mnt,拷貝rootfs的所有文件到sd,然后卸載sd
sudo sh update.sh
#! /bin/sh
mount -t ext3 rootfs.ext3 /mnt/ -o loop
cp -r rootfs/* /mnt
umount /mnt
(3)啟動開發板
不帶qemu界面
sudo sh runnolcd.sh
#! /bin/sh
qemu-system-arm -M vexpress-a9 -m 512M -dtb ../linux-4.9.268/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ../linux-4.9.268/arch/arm/boot/zImage -nographic -append "root=/dev/mmcblk0 rw console=ttyAMA0" -sd rootfs.ext3
帶qemu界面
sudo sh runlcd.sh
#! /bin/shqemu-system-arm -M vexpress-a9 -m 512M -dtb ../linux-4.9.268/arch/arm/boot/dts/vexpress-v2p-ca9.dtb -kernel ../linux-4.9.268/arch/arm/boot/zImage -append "root=/dev/mmcblk0 rw console=tty0" -sd rootfs.ext3
6、關閉虛擬開發板
方法一:直接關掉終端
方法二:ctrl +a 放手,然后按x
方法三:打開另一個終端輸入
sudo killall qemu-system-arm
二、u-boot啟動Linux內核方式,模擬ARM開發板
1、生成uImage內核映像
我們的目的是:uImage文件
生成它的步驟是:編譯u-boot生成mkimage--->用mkimage生成uImage
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
這里解釋一下uImage:
Linux內核編譯(make)之后會生成兩個文件,一個Image,一個zImage,其中Image為內核映像文件,而zImage為內核的一種映像壓縮文件,Image大約為4M,而zImage不到2M
而uImage是用mkimage工具根據zImage制作而來的,它是uboot專用的映像文件,它是在zImage之前加上一個長度為64字節的“頭”,說明這個內核的版本、加載位置、生成時間、大小等信息;其0x40之后與zImage沒區別。
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
(1)編譯u-boot
修改配置
進入u-boot源碼目錄,分別進入Makefile和config.mk修改配置
修改頂層Makefile,指定交叉編譯器
CROSS_COMPILE ?= arm-linux-gnueabi-
修改頂層config.mk,指定ARM架構
ARCH := arm
編譯
#配置開發板
make vexpress_ca9x4_defconfig
#編譯u-boot
make –j4

如果編譯出錯,缺少如下配置

則安裝如下,解決問題
sudo apt install bison flex
如果make -j4報錯可能是上面的配置沒有起到作用,則嘗試如下命令
export CROSS_COMPILE=arm-linux-gnueabi-
export ARCH=arm
make clean
make vexpress_ca9x4_defconfig
make -j4
編譯完成后如圖

測試效果
在u-boot源碼路徑下,運行u-boot看是否成功
qemu-system-arm -M vexpress-a9 -kernel u-boot -nographic -m 512M
這里由於u-boot還沒有uImage鏡像,讓倒計時結束自動加載會出問題。看到提示后,快速按任意按鍵,停止自動加載,出現下圖,說明編譯成功。

(2)拷貝mkimage
編譯完u-boot源碼,會在tools目錄下生成mkimage,用它可以將zImage轉變成uImage
把u-boot目錄下tools/mkimage 拷貝到/usr/bin目錄下,為了可以執行mkimage相關的命令。
如果不拷貝直接執行命令,你會發現/usr/bin缺少文件

除此之外,還可以,直接命令下載,也會再該/usr/bin目錄下生成mkimage
sudo apt install u-boot-tools
這種方法下載自帶的u-boot-tools不知道會不會出問題,可以嘗試嘗試。
為nfs服務做准備
再生成uImage前,需要nfs配置的修改,重新編譯Linux內核,讓內核支持nfs功能,生成新的zImage,然后再轉化成uImage
修改配置如下,在Linux內核目錄下輸入:make menuconfig
進入File system --->

再進入Network File System --->

將帶有NFS的都用空格鍵選上

選中后如圖

保存退出
(3)生成uImage(疑問待解決)
方法一:
直接按照以下命令重新編譯(待驗證,地址也有問題)
export ARCH=arm
export CROSS_COMPILE=arm-linux-gnueabi-
make vexpress_defconfig
make zImage -j8
make modules -j8
make LOADADDR=0x60003000 uImage -j8
make dtbs
方法二:將編譯生成的zImage轉化成uImage(也是地址問題待解決)
切換到Linux內核目錄下,執行下面命令
mkimage -n 'mini2440' -A arm -O linux -T kernel -C none -a 0x30008000 -e 0x30008040 -d arch/arm/boot/zImage arch/arm/boot/uImage
參數說明
-n 'mini2440' #指定鏡像名稱
-A arm #設置為arm架構
-O linux #設置操作系統為linux
-T kernel #設置鏡像類型為kernel
-C none #設置壓縮類型為none
-a 0x30008000 #指定加載地址為0x30008000
-e 0x30008040 #執行入口地址為0x30008040
-d arch/arm/boot/zImage #指定鏡像數據文件路徑
arch/arm/boot/uImage #最終生成的uImage的路徑和文件名稱
這里直接在zImage旁邊生成uImage


到此uImage鏡像生成結束
然后將uImage文件拷貝到tftpboot目錄下(這一步也可以后面再一起做),這個文件夾是在配置tftp的時候創建的。
sudo cp ../../linux-4.9.268/arch/arm/boot/uImage ./ #路徑根據自己的情況來

2、安裝配置nfs服務
在前面我們已經裝好了tftp服務器,但還需要安裝nfs服務
(1)安裝
sudo apt-get install nfs-kernel-server

(2)創建nfs共享目錄,設置權限
sudo chmod 777 ./rootfs

(3)添加NFS共享目錄路徑
vi /etc/exports
在/etc/exports添加以下路徑
/home/pymeia/qemu/ARM/ubootA9/rootfs *(rw,sync,no_subtree_check)
其中:
rw 可讀可寫操作
sync 內存和磁盤上的內容保持同步
no_root_squash Linux主機不再將開發板設置為匿名用戶,可以操作文件讀寫
注意:Ubuntu20.04,這個文件里不填這個參數,會報錯。exports文件里有參考實例說明,只有三個參數
no_subtree_check 不檢查根文件系統子目錄文件
(4)重啟nfs服務
sudo /etc/init.d/rpcbind restart
sudo /etc/init.d/nfs-kernel-server restart
或者
systemctl restart nfs-kernel-server
(5)檢查nfs是否啟動正常
sudo showmount -e
#顯示全部可以掛載的目錄
sudo /etc/init.d/nfs-kernel-server status #查看nfs服務的當前狀態
ps -e |grep nfs #看進程中nfs服務是否啟動

(6)nfs使用
自己創建一個目錄當作nfs目錄,然后再/etc/exports中添加路徑,可以把你的程序放到這個目錄下,通過掛載映射到./mnt。./mnt可以再主機上,也可以在開發板上,方便進行代碼的調試。
在本機localhost上掛載nfs目錄到./mnt,這樣rootfs的內容就映射到了./mnt

sudo mount -t nfs localhost:/home/pymeia/qemu/ARM/ubootA9/rootfs ./mnt/
#這里掛載的目錄一定要在/etc/exports里添加,否則掛載無效

卸載后,文件刪除
umount ./mnt
同理,在開發板上掛載nfs目錄到/mnt(假設主機IP地址為192.168.146.129)
mount -t nfs -o nolock 192.168.146.129:/dev/nfs /mnt
#其中:-o nolock是去除文件鎖,否則會報錯
3、安裝配置tftp服務
(1)安裝tftp
sudo apt-get install tftp-hpa tftpd-hpa xinetd
(2)更改配置文件
sudo cp /etc/default/tftpd-hpa /etc/default/tftpd-hpa_back #備份原始設置
sudo gedit /etc/default/tftpd-hpa
填寫自己要創建tftpboot文件的路徑

(3)創建tftp目錄,設置權限
配置好后,到上面填寫的路徑,創建文件夾,並設置權限
#切換到上面填寫的路徑
sudo mkdir tftpboot
sudo chmod 777 tftpboot
(4)重啟tftp服務,讓其生效
sudo /etc/init.d/tftpd-hpa restart

(5)測試tftp服務是否正常
把需要的文件如u-boot、dtb、uImage等拷貝到tftpboot文件夾(后面u-boot啟動要用到)
uImage
cp -r /home/pymeia/qemu/ARM/linux-4.9.268/arch/arm/boot/uImage ./
u-boot
cp -r /home/pymeia/qemu/ARM/ubootA9/u-boot/u-boot ./
vexpress-v2p-ca9.dtb
cp -r /home/pymeia/qemu/ARM/linux-4.9.268/arch/arm/boot/dts/vexpress-v2p-ca9.dtb ./
整理copy.sh
#! /bin/sh
cp -r /home/pymeia/qemu/ARM/linux-4.9.268/arch/arm/boot/uImage ./
cp -r /home/pymeia/qemu/ARM/ubootA9/u-boot/u-boot ./
cp -r /home/pymeia/qemu/ARM/linux-4.9.268/arch/arm/boot/dts/vexpress-v2p-ca9.dtb ./

tftp 192.168.146.129 #主機ip可以用ifconfig來查看
tftp> get uImage #獲取文件,保存到用戶名目錄下
tftp> q #退出tftp
ps -e | grep "tftp" #查看 tftp 的進程號

可以看到,獲取的文件和獲取失敗的文件都會顯示在用戶目錄下

4、配置qemu和ubuntu網絡橋接功能(這一部分,暫時沒有搞完)
VMware 需要配置成NAT模式, 在VMware的橋接模式下面,目前qemu無法成功連接網絡
VMware也不能設置成靜態ip地址,設置成靜態ip地址也是無法連接網絡
安裝橋接依賴包
sudo apt install uml-utilities bridge-utils
#bridge-utils 虛擬網橋工具
#uml-utilities UML(User-mode linux)工具
查看是否tun設備文件,如果存在說明宿主機的內核支持TAP網絡接口
ls /dev/net

如果沒有,則要手動創建
sudo mkdir /dev/net
sudo mknod /dev/net/tun c 10 200
加載tun模塊
sudo /sbin/modprobe tun
非常建議更改重要配置的節點時,及時創建虛擬機快照,方便恢復,已經重裝一次,吸取教訓了
下面是大雷區,不要亂用,或者在用之前創建還原快照,否則會直接導致Ubuntu 20.04 LTS失去網絡,甚至運氣差點要重裝
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
修改配置文件(重啟生效)
sudo gedit /etc/network/interfaces
添加以下內容
# interfaces(5) file used by ifup(8) and ifdown(8)
auto lo
iface lo inet loopback
auto ens33
auto br0
iface br0 inet dhcp
bridge_ports ens33
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
添加qemu有關系統腳本
在/etc/qemu-ifup文件中添加以下內容
#!/bin/sh
echo sudo tunctl -u $(id -un) -t $1
sudo tunctl -u $(id -un) -t $1
echo sudo ifconfig $1 0.0.0.0 promisc up
sudo ifconfig $1 0.0.0.0 promisc up
echo sudo brctl addif br0 $1
sudo brctl addif br0 $1
echo brctl show
brctl show
sudo ifconfig br0 192.168.146.129
# 根據自己的實際情況修改 IP地址,注意:uboot 中的 CONFIG_SERVERIP(serverip) 要跟這里一樣
在/etc/qemu-ifdown文件中添加以下內容
#!/bin/sh
echo sudo brctl delif br0 $1
sudo brctl delif br0 $1
echo sudo tunctl -d $1
sudo tunctl -d $1
echo brctl show
brctl show
給上面的腳本添加執行權限
sudo chmod +x /etc/qemu*
重啟網絡使生效
sudo service network-manager restart
u-boot啟動
修改u-boot配置文件include/configs/vexpress_common.h
sudo gedit include/configs/vexpress_common.h
#define CONFIG_BOOTCOMMAND \
"tftp 0x60003000 uImage;tftp 0x60500000 vexpress-v2p-ca9.dtb; \
setenv bootargs 'root=/dev/mmcblk0 console=tty0'; \
bootm 0x60003000 - 0x60500000;"
#define CONFIG_IPADDR 10.0.2.14
#define CONFIG_NETMASK 255.255.255.0
#define CONFIG_SERVERIP 192.168.146.129
所有配置完成后,開始建立u-boot啟動內核文件
新建啟動腳本ubootqemu.sh
#! /bin/sh
qemu-system-arm \
-M vexpress-a9 \
-kernel u-boot \
-nographic \
-m 512M \
-net nic,vlan=0 -net tap,vlan=0,ifname=tap0 \
-sd rootfs.ext3
未完....問題解決后更新
參考文章鏈接:
https://blog.csdn.net/u010344264/article/details/82949143
https://zhuanlan.zhihu.com/p/340362172
https://www.jianshu.com/p/8619a6739040
https://www.cnblogs.com/schips/p/12350122.html
https://blog.csdn.net/wxh0000mm/article/details/90056912
