2022年12月28日 星期三

善用 debootstrap 建立 SDK/RDK 開發環境

 前言

       因為工作或興趣需求,常常需要在不同的環境下編繹程式,但如 Debian Stable backport 套件或是embedded system 的 cross-compile 套件,然而每個環境都會有對應的 OS:Debian backport 時必須安裝 Stable;不同的 SDK 也會有 OS 環境限制(常見有 Ubuntu)。

       拜 Virtualization 的技術,目前有 VirtualBox, VMware, KVM 的幫忙可以安裝多個 OS,雖然記憶體價降價很多,但是多了一層虛擬,使得編繹工作無法全速利用 CPU 多核。時間就是金錢,這邊慢一點,那邊慢一點,累積起來就是慢很多。

      由於大部份的編繹都是 Linux 相關,所以希望能有一個方式是在 Linux 下,可以安裝各個版本 OS,而且還能享受全速的 CPU 效能。

      為瞭解決上述困擾,也就出現了該篇文章的主角:debootstrap


debootstrap原理

      這個工具是利用 chroot(change root dir) 的概念,先下載基本的 OS 套件,並解壓安裝到一個指令的目錄下。

       安裝完成後,利用 chroot 指令,切換到該目錄,這個目錄變成了新的 system root,而且不會影響到您的系統環境,是完全的隔離。

      在這個目錄下進行任何套件安裝或是檔案修改,都不會變動到原本的環境,加上沒有多一層虛擬化(畢竟只是換目錄),所以又能享受到原本電腦的所有效能。

      聽起來很心動吧!趕緊來看使用方法。

debootstrap建置

環境準備:

  • /mnt/chroot/stable (chroot 的目錄)
  • 確認可連網
  • apt install debootstrap

準備完成下,執行以下指令

/$ sudo mkdir -p /mnt/chroot/stable
/$ cd /mnt/chroot
/$ sudo debootstrap --arch=amd64 bullseye stable http://debian-archive.trafficmanager.net/debian/

接下來 console 會持續出現一連串的訊息,直到訊息停止,就完成第一步的基礎安裝。 

 

 設定 chroot 環境

接下來設定這個新安裝好的 Debian Stable 環境,由於目錄內只有單純的檔案,沒有辦法得到本機狀態,所以要將核心的虛擬檔案系統(proc, sys)掛載至新的環境。執行下述的指令完成:

/# sudo mount -t proc proc /mnt/chroot/stable/proc
/$ sudo mount -t devtmpfs devtmpfs /mnt/chroot/stable/dev
/$ sudo mount -t devpts devpts /mnt/chroot/stable/dev/pts
/$ sudo mount -t sysfs sysfs /mnt/chroot/stable/sys
增加 "chroot" 字串至 chroot 環境,以便 console 顯示 "chroot" 字串方便我們辨識:
/$ sudo echo "chroot" > /mnt/chroot/stable/etc/debian_chroot
拷貝 hosts 至 chroot 環境,才不會造成 "unable to resolve XXXX" 問題。
/$ sudo cp /etc/hosts /mnt/chroot/stable/etc/
增加一個帳號方便我們切換至 chroot 使用,並賦予 sudo 及不用輸入密碼的權限
/$ sudo chroot /mnt/chroot/stable /usr/sbin/adduser your_account
/$ echo "your_account ALL=(ALL) NOPASSWD: ALL" | sudo tee -a  /mnt/chroot/stable/etc/sudoers

 透過上述的指令,我們讓新的環境能讀取到本機狀態,接下來就是重頭戲. 

chroot 切換

執行下列指令準備第一次切換:

/# sudo chroot /mnt/chroot/stable /bin/su - your_acount

透過該指令能在 chroot 的同時切換到您的帳號。只下 chroot 的話,切過去是 root,還要再下一次 su 切到您的帳號。

因為大部的編繹程式會用到 /sbin 目錄,所以把 sbin 加到帳號的 PATH 內,要再重登入一次生效:

/$ echo "PATH=${PATH}:/sbin:/usr/sbin:/usr/local/sbin" >> ~/.profile
/$ exit
/$ sudo chroot /mnt/chroot/stable /bin/su - your_acount

這樣就完成了整個 debootstrap 安裝,設定 chroot 環境,網速夠快的話,大約 10min 就能完成整個步驟。

Tips - binding workspace

我編寫程式習慣在自已的 home 目錄進行,然後在切換到 chroot 環境編繹,所以資料必須同步至 chroot 目錄下,rsync 是個好辦法,但會多一些 I/O,且不夠即時。介由 kernel binding folder 的機制,可以讓我編繹檔案時,同時 chroot 環境也能看到變更:

 

/$ sudo mount -o bind /home/your_account/project /mnt/chroot/stable/home/your_account/project  

這樣兩個路徑的資料是一致,不管修改哪一邊,都能同時看到變化。

如果用 symbolic link 是不行的喔,因為 chroot 環境無法探索到外界的目錄。 因為兩者的“root”不同。

Tips - easy script to chroot

前面提到掛載核心虛擬檔案系統至 chroot 環境,為了減少切換的準備工作,可以將這些資訊寫到 /etc/fstab 內:

proc      /mnt/chroot/stable/proc     proc     defaults 0 0
sysfs     /mnt/chroot/stable/sys      sysfs    defaults 0 0
devtmpfs  /mnt/chroot/stable/dev      devtmpfs defaults 0 0
devpts    /mnt/chroot/stable/dev/pts  devpts   defaults 0 0  
如果您只有一個 chroot 還好,當您有3個以上時,每次執行 mount,會出現太多的 chroot 的檔案系統,即使您沒有 chroot,為了這個問題,我習慣要用時再掛載,所以寫了一個 script 需要時執行一次自動掛載並切帳號。
 
chroot.sh:使用的方法很簡單:
chroot.sh -d /mnt/chroot/stable -u your_account -b /home/your_account/project
  • -d:chroot 目錄路徑
  • -u:帳號名稱
  • -b:額外 binding 的目錄,多個目錄請用空白分開,前後加入" " 字元

透過這個小小指令,就能快速切換,雖然有些小 bug,還請大家鞭小力點,祝大家 Happy Hacking!

除了 debootstrap,還有 supermin

debootstrap 是在 Debian 安裝 DEB base 的系統,如果想在 Debian 環境安裝 RPM base,就可以用 supermin (前身為febootstrap) 工具,有可興趣的可自行 apt install supermin 研究。

沒有留言: