動機

原本是為了裝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需要有?

  1. pid 1的程式: 要在這上面跑
  2. rootfs: 提供之後的根目錄
  3. /etc/fstab: mount用的分區表
  4. script的執行環境: 像busybox

rootfs至少需要有?

  • /etc/: 放config
  • /bin/: 一般exe
  • /sbin/: 管理員專用的exe
  • /lib/: library與kernel module
  • /dev/: device

做一個initramfs與rootfs

先做rootfs

  1. 準備一個busybox
  2. 把需要的東西塞到folder去
  3. 寫initramfs被mount應該要做什麼事(init的script)
    • 裝busybox
    • mount
      • proc, sys
      • dev
      • 在記憶體建立一塊區域放rootfs
    • 解壓縮、mount rootfs,chroot,跑第一個proc(像systemd)
  4. 所以initramf會有 busybox(或類似的) 與 init的script

做initramfs

  • 用cpio把上面的東西(busybox與script)包起來

用rootfs裝WSL2

WSL2本身就有自己的bootloader、iniramfs與類似systemd的東西

所以如果想裝自己的發行版,就要把rootfs餵給wsl,讓wsl去讀 但要注意的是wsl的rootfs是吃tar不是cpio

  1. 找rootfs,像arch是在這裡
  2. 重新包成tar
    • unsquashfs -d temp airootfs.sfs
    • tar -czf ../arch.tar.gz --hard-dereference *
  3. 讓wsl去讀
    • wsl.exe --import <DistributionName> <InstallLocation> <FileName>
      • filename就是tar檔
      • InstallLocation就是解壓的tar檔要放哪
      • DistributionName就是方便識別的名字,wsl --list會出現的名字
  4. 進去,跑之後的設定
    • 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