動機
原本是為了裝arch的wsl2所以碰到rootfs,所以來整理一下
複習開機流程
- 按下電源
- BIOS做POST,去找bootloader
- PXE
- disk
- bootloader載入 kernel 與 initramfs
- initramfs,載入核心驅動,開始驅動硬體與提供作業系統資源
- 從網路上面下載 kernel 與 initramfs 檔案
- kernel 開始在記憶體內解壓縮,然後執行 kernel 的硬體偵測、資源分配等開機程序
- 將 initramfs 的內容(rootfs)解壓縮之後,暫時掛載成為根目錄
- 開始執行 rootfs 內的 /init 執行檔 (可以是 script 的格式)
- 捨棄 initramfs,掛載真正的根目錄,繼續後續的開機流程。
- 預計掛載的根目錄 /etc/fstab 來重新 chroot 到正確的根目錄
- 核心呼叫 systemd ,開始後續所有的應用程式啟用
rootfs & initramfs
rootfs就是fs連同目錄結構連同裡面的所有資料,之後被打包成一個壓縮檔
initramfs是kernel啟動後mount的第一個filesystem,在mount去跑script把pid 1的程式(systemd)跑起來
所以initramfs需要有?
- pid 1的程式: 要在這上面跑
- rootfs: 提供之後的根目錄
- /etc/fstab: mount用的分區表
- script的執行環境: 像busybox
rootfs至少需要有?
- /etc/: 放config
- /bin/: 一般exe
- /sbin/: 管理員專用的exe
- /lib/: library與kernel module
- /dev/: device
做一個initramfs與rootfs
先做rootfs
- 準備一個busybox
- 把需要的東西塞到folder去
- 寫initramfs被mount應該要做什麼事(init的script)
- 裝busybox
- mount
- proc, sys
- dev
- 在記憶體建立一塊區域放rootfs
- 解壓縮、mount rootfs,chroot,跑第一個proc(像systemd)
- 所以initramf會有 busybox(或類似的) 與 init的script
做initramfs
- 用cpio把上面的東西(busybox與script)包起來
用rootfs裝WSL2
WSL2本身就有自己的bootloader、iniramfs與類似systemd的東西
所以如果想裝自己的發行版,就要把rootfs餵給wsl,讓wsl去讀 但要注意的是wsl的rootfs是吃tar不是cpio
- 找rootfs,像arch是在這裡
- 重新包成tar
unsquashfs -d temp airootfs.sfs
tar -czf ../arch.tar.gz --hard-dereference *
- 讓wsl去讀
wsl.exe --import <DistributionName> <InstallLocation> <FileName>
- filename就是tar檔
- InstallLocation就是解壓的tar檔要放哪
- DistributionName就是方便識別的名字,
wsl --list
會出現的名字
- 進去,跑之後的設定
- resolv.conf
- new user
- update, upgrade
- 等等會在安裝linux時做的事,詳細可以看
- buildroot的postinstall
- arch的安裝tutorial
Ref
浅谈linux中的根文件系统(rootfs的原理和介绍) 專題五 - 建立 rootfs 的無磁碟 Linux 系統環境 Export and Import WSL Linux Distro in Windows 10 Install any distribution in WSL