定製Ubuntu檔案系統
上一篇文章介紹瞭如何構建一個Linux系統,裡面用到了一個叫ubuntu-base的包,這個包就是個最簡化的ubuntu檔案系統,如果使用qemu模擬器啟動這個系統會發現裡面除了基礎檔案讀寫功能外啥玩意也沒有,甚至沒有網路?這能忍?這篇文章就介紹如何從ubuntu-base包裡構建出一個功能更加完善的ubuntu系統。
獲取Ubuntu-base
Ubuntu-base可以從Ubuntu-cdimage網站獲取,網址為:http://cdimage.ubuntu.com/,如果你身處中國大陸,推薦從中科大映象中下載該檔案以加快下載速度,網址為:https://mirrors.ustc.edu.cn/ubuntu-cdimage/,選擇你需要的版本和構架,筆者使用從中科大映象站中下載amd_64 focal版本作為演示:
mkdir rootfs
cd rootfs
wget https://mirrors.ustc.edu.cn/ubuntu-cdimage/ubuntu-base/releases/focal/release/ubuntu-base-20.04.1-base-amd64.tar.gz
tar xvzf ubuntu-base-20.04.1-base-amd64.tar.gz
rm ubuntu-base-20.04.1-base-amd64.tar.gz
執行上面的命令之後可以得到一個rootfs目錄,裡面儲存著Ubuntu-base的所有檔案。
修改Ubuntu-base
cp -b /etc/resolv.conf rootfs/etc/resolv.conf #拷貝本地dns配置到rootfs,讓網路可用
cp /usr/bin/qemu-*-static rootfs/usr/bin/ #拷貝模擬器到rootfs中,為下一步的模擬做準備
cp -r /etc/skel rootfs/etc/ #拷貝使用者配置
chmod 777 rootfs/tmp
模擬啟動Ubuntu-base
這裡的模擬啟動和上篇文章介紹的不一樣,不需要核心映象檔案,通過模擬環境模擬目標構架來安裝或者修改系統中的資訊並儲存到rootfs裡面。
1.掛載虛擬檔案系統
linux系統裡面有很多不佔用硬碟空間的目錄,例如/proc /dev /sys等這些目錄是系統實時的執行資訊,需要先在rootfs上掛載虛擬的檔案系統才能正常模擬:
mount -v --bind /dev rootfs/dev
mount -vt devpts devpts rootfs/dev/pts -o gid=5,mode=620
mount -vt proc proc rootfs/proc
mount -vt sysfs sysfs rootfs/sys
mount -vt tmpfs tmpfs rootfs/run
啟動模擬環境
完成上面的步驟後直接在根目錄執行sudo chroot .
就能啟動模擬,在模擬環境中,剛剛修改過的rootfs就是根目錄,物理機的實時環境就是模擬環境的實時環境,這事可以像普通的機器上執行命令去修改這個rootfs了,比如:
apt update && apt upgrade #更新系統
passwd root #修改root使用者密碼
完成修改後在模擬環境中執行exit
命令就能退出模擬環境回到物理機器的終端中,退出後一定要記得解除安裝虛擬檔案系統,否則在備份rootfs時會造成拷貝失敗,物理機的實時執行環境也會受到影響,執行下面的命令就能解除安裝模擬環境:
umount -vt devpts rootfs/dev/pts
umount -vt proc rootfs/proc
umount -vt sysfs rootfs/sys
umount -vt tmpfs rootfs/run
umount -v rootfs/dev
再清理掉一些垃圾檔案:
rm -rf rootfs/usr/bin/qemu-*-static
rm -rf rootfs/etc/apt/sources.list.d/*.key
rm -rf rootfs/var/lib/apt/lists/*
備份製作檔案系統映象
sudo dd if=/dev/zero of=rootfs.img bs=1M count=300 #這裡注意要以做好的rootfs目錄大小為準定義大小bs=1M的意思是一步1M大小count=300的意思是300步,也就是做一個300M的映象,修改這兩個值就可以修改製作的映象大小
sudo mkfs.ext4 rootfs.img
mkdir tmp
sudo mount rootfs.img tmp
sudo cp -rf rootfs/* tmp/
sudo umount tmp
sudo e2fsck -p -f rootfs.img
sudo resize2fs -M rootfs.img
快速構建
我開源了一個ubuntu檔案系統的快速構建指令碼,github地址:https://github.com/Jubian540/ubuntu-rootfs-build.git,專案中的README.md中有具體使用說明。