製作純文字介面的Debian免安裝映像檔|開機直接進入文件系統|bootstrap製作Debian ISO

更新於 發佈於 閱讀時間約 14 分鐘
某些使用情境下,為了節省大量的安裝時間,及確保每台機器的安裝設定的一致性,製作一個免安裝版的映像檔就非常有必要了。

這次Violet來教大家如何製作純文字介面的免安裝ISO檔,同時也會說明如何使用指定的Kernel版本。

教學使用的作業系統為Debian11 bullseye,Kernel版本為5.10.166。

本篇文章適合無製作經驗的人參考,但需要對linux的開機順序有一定程度的了解,至少要知道什麼是root filesystem, kernel及initrd等。

清楚製作的需求後,接下來一起來看看本次的目標。

目標

  1. 使用bootstrap建構Debian11 bullseye rootfs,並打包成squashfs格式
    產生的映像:filesystem.squashfs
  2. 編譯Kernel 5.10.166
    產生的映像:vmlinuz
  3. 編譯busybox-1.36.1
    產生的映像:busybox
  4. 編寫init檔,並與busybox和rootfs打包成initrd.gz
    產生的映像:initrd.gz
  5. 編寫 isolinux.cfg 引導程式設定文件,並將其與上面產生出來的 initrd.gz、vmlinuz、rootfs 和其他必要的引導檔案一起打包成 ISO 檔,這個ISO檔就是我們最終拿來開機的image
    產生的映像:debian11-customer.iso
  6. 使用Vitrual Box來掛載debian11-customer.iso,開機後會自動進入Debian11系統,輸入以下指令來查看版本,以確認image製作成功
    檢查作業系統版本:cat /etc/os-release
    檢查內核版本:uname -a

也就是說,我們需要分別製作kernel, initrd.gz, busybox, root filesystem,將這些檔案放入指定位置,最後打包成ISO檔,ISO檔的結構如下:

debian11-customer.iso
└── iso/ (${ISO_DIR})
├── vmlinuz
├── initrd.gz (${INITRD_DIR})
├── init
├── linuxrc
├── live/
└── filesystem.squashfs
├── bin/
├── busybox
└── ...
├── sbin/
└── ...
└── usr/
└── ...
└── isolinux/
├── isohdpfx.bin
├── isolinux.bin
├── isolinux.cfg
├── ldlinux.c32
├── libutil.c32
└── menu.c32

製作步驟

知道ISO檔的結構後,我們只要將所有檔案都按照這個結構來放入,最後打包起來就完成了,如果到這邊都能讀懂的話,那麼接下來的步驟就都不會有太大問題了。

環境建置

1) 使用Virtual Box新建一台官方標準版的Debain 11虛擬機,我們會需要標準版Debian裡面的部分檔案,同時這也是我們接下來所有步驟的編譯環境

2) 確定在編譯環境是Debian 11後,開始安裝必要的安裝包

sudo apt install git-lfs
sudo apt install build-essential libncurses-dev bison flex libssl-dev libelf-dev bc
sudo apt install rsync
sudo apt install debootstrap squashfs-tools
apt install busybox-static

3) 建立專案資料夾,在此資料夾裡新建相關檔案,bootstrap_debian就是我們製作的${ROOT_DIR}

mkdir bootstrap_debian
cd ​bootstrap_debian

製作rootfs

1) 建一個 Debian rootfs(這裡以 bullseye 為例)

debootstrap --arch=amd64 bullseye ./live-rootfs http://deb.debian.org/debian/

2) 將Debian rootfs打包成 squashfs格式,並放入指定的ISO檔目錄結構中

mkdir live/
mksquashfs ./live-rootfs ./live/filesystem.squashfs -e boot

製作vmlinuz

1) 建置kernek資料夾,下載 kernel 5.10.166到此資料夾(這邊想要改成其他kernel也可以,確認好自己的下載版本即可,但也要確認你所下載的版本是否能與Debian 11相容)

mkdir kernel
cd kernel
wget --no-check-certificate https://cdn.kernel.org/pub/linux/kernel/v5.x/linux-5.10.166.tar.xz

2) 解壓縮剛剛下載的檔案

tar -xf linux-5.10.166.tar.xz

3) 進入kernel source code的根目錄

cd linux-5.10.166

4) 調整自己想要的kernel config,可以修改.config或者下指令make menuconfig來操作。這邊列出幾個比較重要的config設定:

  • 關閉BTF及Enable loadable module suppor設定
  • 開啟以下設定
CONFIG_NET=y
CONFIG_UNIX=y
CONFIG_NETLINK=y
CONFIG_UEVENT_HELPER=y
CONFIG_DEVTMPFS=y

5) 調整完後,確保config生效後再編譯

make olddefconfig make -j2

6) 編譯完成後,打包成.deb檔,編譯完後會產生類似的檔案linux-image-5.10.166_amd64.deb

make -j$(nproc) bindeb-pkg

7) 這個deb檔是kernel的更新檔,檔可以在現成的Debian系統上直接使用dpkg命令來安裝,但我們的目標是想要包成ISO檔,因此需要取出裡面的vmlinuz

ar x linux-image-5.10.166_amd64.deb
tar -xf data.tar.xz ./boot/vmlinuz-5.10.166

這裡的vmlinuz-5.10.166就是我們要的vmlinuz了,將其放到指定的ISO檔目錄結構中

cp -r boot/vmlinuz-5.10.166 ${ROOT_DIR}/iso/vmlinuz​

製作busybox

1) 下載busybox並解壓縮

wget https://busybox.net/downloads/busybox-1.36.1.tar.bz2
tar -xvjf busybox-1.36.1.tar.bz2

2) 進入busybox資料夾,在菜單中,啟用「Build static binary (no shared libs)」選項,並編譯靜態資料庫的busybox

cd busybox-1.36.1
make defconfig
make menuconfig
make

3) 編譯完成後,可在busybox的根目錄下找到busybox,將其放入指定的ISO檔目錄結構中,並在該目錄下安裝
${BUSYBOX_DIR}為你編譯busybox的目錄,Violet的busybox目錄是busybox-1.36.1
${INITRD_DIR}為之後要製作成initrd.gz的目錄

make -C ${BUSYBOX_DIR} CONFIG_PREFIX=${INITRD_DIR} install

產生isolinux資料夾裡的檔案

1) isolinux資料夾裡的檔案,除了isolinux.cfg之外,都可以在我們的Debian編譯環境中找到,找到後,將這些檔案放入指定的ISO檔目錄結構中。這些檔案是grub啟動時需要用到的,如果沒有會造成開機失敗

mkdir isolinux
#確保資料夾裡面有以下檔案,檔案都從Debian編譯環境中複製過來
├── isohdpfx.bin
├── isolinux.bin
├── ldlinux.c32
├── libutil.c32
└── menu.c32

2) isolinux.cfg是開機的引導程式設定文件,需要根據自己的需求來設定,以下是範例

# D-I config version 2.0
# search path for the c32 support libraries (libcom32, libutil etc.)

UI menu.c32
PROMPT 0
TIMEOUT 50
DEFAULT linux

LABEL linux
menu label ^Boot Kernel 5.10.166 (Violet build)
kernel /vmlinuz
append initrd=/initrd.gz root=/dev/sdb1 rw init=/bin/sh console=tty0,115200 quiet

製作initrd.gz

1) 上面的映像檔及必要檔案都製作完畢後,接下來要來編寫rootfs的初始化流程,也就是init檔,以下是範例

#!/bin/sh

mkdir -p /proc /sys /dev /mnt
mkdir -p /mnt/sys/fs/cgroup
mkdir -p /mnt/sys/fs/cgroup/systemd
mkdir -p /mnt/run

mount -t proc none /proc
mount -t sysfs none /sys
mount -t devtmpfs none /dev

echo "Mounting rootfs.squashfs..."
mount -t squashfs -o loop /live/filesystem.squashfs /mnt || {
echo "Mount failed!"
exec sh
}

mount --bind /dev /mnt/dev
mount --bind /proc /mnt/proc
mount --bind /sys /mnt/sys

echo "Switching to new root..."
exec switch_root /mnt /sbin/init

2) 編寫完成後,務必確認好檔案都就緒,接著進入要打包成initrd.gz的目錄,開始打包initrd.gz

find . -print0 | cpio --null -ov --format=newc | gzip > ${ISO_DIR}/initrd.gz

3) 當之後測試開機有問題時,可以使用指令來檢查打包的inird.gz結構是否正確

lsinitramfs ${ISO_DIR}/initrd.gz

使用xorriso來製作ISO檔

mkdir build_image
xorriso -as mkisofs \
-o build_image/debian11-customer.iso \
-isohybrid-mbr isolinux/isohdpfx.bin \
-c isolinux/boot.cat \
-b isolinux/isolinux.bin \
-no-emul-boot -boot-load-size 4 -boot-info-table \
-J -R -V "Debian 11 Custom kernel" \
live-rootfs

成功後,就可以拿這個debian11-customer.iso到另一台全新的虛擬機上測試是否能正常開機了,開機後要能直接進入到Debian11的環境,進入後查看版本是否正確

cat /etc/os-release #檢查作業系統版本
uname -a #檢查內核版本

完成

以上就是本次的步驟做法,如有任何問題,也歡迎留言提出討論哦~



感謝您耐心閱讀~
本專題將會持續收錄Violet的職場筆記。
若有理解不對的地方,歡迎留言指教!
若喜歡我的文章,歡迎贊助支持,您的支持將會成為我繼續創作的動力!



留言
avatar-img
留言分享你的想法!
avatar-img
Violet旅遊札記
37會員
72內容數
記錄每一次珍貴的旅行,讓回憶變成永恆 這裡沒有華麗的詞藻,卻有最真實的筆記 札記撰寫耗時,願我有動力一直寫下去! ※本沙龍每次只會挑其中一個專題來發佈文章,每隔三週的週五為發佈日,若未發佈文章,下一個發佈日就是三週後,希望大家可以多多支持,也歡迎留言指教,您的留言或愛心都是Violet持續創作的寶貴動力唷~
Violet旅遊札記的其他內容
2024/02/22
想要進入工程師的世界,首先要先學會架設自己的Build code環境,有了編譯環境,接下來就可以安心的撰寫你想要的C語言程式啦! 如果你不知道該從何下手,那不妨先照著本篇文章的步驟做,Violet一步一步教你並解釋每個步驟的意義,很快你就會得到一個能編譯C語言程式碼的虛擬基環境哦!
Thumbnail
2024/02/22
想要進入工程師的世界,首先要先學會架設自己的Build code環境,有了編譯環境,接下來就可以安心的撰寫你想要的C語言程式啦! 如果你不知道該從何下手,那不妨先照著本篇文章的步驟做,Violet一步一步教你並解釋每個步驟的意義,很快你就會得到一個能編譯C語言程式碼的虛擬基環境哦!
Thumbnail
2023/10/12
當大量的網路封包在有限的頻寬中傳輸,總有一些服務的封包會因為搶不過其他封包而造成卡頓,例如玩遊戲時,若同時也在下載其他大型檔案,就會造成遊戲卡頓甚至斷線。這時候客製化QOS來決定哪些封包能優先被傳送,就能有效地提升指定服務的順暢度,進而提升使用者在網路上的體驗。 本篇文章接介紹如何在OpenW
Thumbnail
2023/10/12
當大量的網路封包在有限的頻寬中傳輸,總有一些服務的封包會因為搶不過其他封包而造成卡頓,例如玩遊戲時,若同時也在下載其他大型檔案,就會造成遊戲卡頓甚至斷線。這時候客製化QOS來決定哪些封包能優先被傳送,就能有效地提升指定服務的順暢度,進而提升使用者在網路上的體驗。 本篇文章接介紹如何在OpenW
Thumbnail
2023/07/04
V2G雙向充電是指,電動車及電網具有雙向充放電的功能,電力系統往往都是單向性,由電網輸電力給終端使用者,但在智慧電網的應用場景中,透過有V2G技術的電動車及充電樁,電動車內的電池能反向將電力回饋給電網,作為電力調度使用。 例如:在用電尖峰時段,若區域A的電力不足,可將位於區域B的電動車內的電能調度至
Thumbnail
2023/07/04
V2G雙向充電是指,電動車及電網具有雙向充放電的功能,電力系統往往都是單向性,由電網輸電力給終端使用者,但在智慧電網的應用場景中,透過有V2G技術的電動車及充電樁,電動車內的電池能反向將電力回饋給電網,作為電力調度使用。 例如:在用電尖峰時段,若區域A的電力不足,可將位於區域B的電動車內的電能調度至
Thumbnail
看更多
你可能也想看
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
介紹朋友新開的蝦皮選物店『10樓2選物店』,並分享方格子與蝦皮合作的分潤計畫,註冊流程簡單,0成本、無綁約,推薦給想增加收入的讀者。
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
當你邊吃粽子邊看龍舟競賽直播的時候,可能會順道悼念一下2300多年前投江的屈原。但你知道端午節及其活動原先都與屈原毫無關係嗎?這是怎麼回事呢? 本文深入探討端午節設立初衷、粽子、龍舟競渡與屈原自沉四者。看完這篇文章,你就會對端午、粽子、龍舟和屈原的四角關係有新的認識喔。那就讓我們一起解開謎團吧!
Thumbnail
使用靜態檔案下載 Bootstrap 的原因主要有以下幾點: 客製化:當你下載了 Bootstrap 的靜態檔案,你可以根據自己的需求來修改這些檔案。例如,你可以改變預設的顏色、字型大小、間距等,使其更符合你的網站風格。這是直接使用 CDN 所無法做到的。 效能優化:如果你的網站只使用 Boot
Thumbnail
使用靜態檔案下載 Bootstrap 的原因主要有以下幾點: 客製化:當你下載了 Bootstrap 的靜態檔案,你可以根據自己的需求來修改這些檔案。例如,你可以改變預設的顏色、字型大小、間距等,使其更符合你的網站風格。這是直接使用 CDN 所無法做到的。 效能優化:如果你的網站只使用 Boot
Thumbnail
下載處: 安裝msi  https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 或單獨使用 https://the.earth.li/~sgtatham/putty/latest/w64/pscp.exe  安裝好可以
Thumbnail
下載處: 安裝msi  https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html 或單獨使用 https://the.earth.li/~sgtatham/putty/latest/w64/pscp.exe  安裝好可以
Thumbnail
這篇文章紀錄了安裝Ubuntu Server的過程,包括選擇HWE內核、語言、更新安裝程式、語系、儲存配置等步驟。
Thumbnail
這篇文章紀錄了安裝Ubuntu Server的過程,包括選擇HWE內核、語言、更新安裝程式、語系、儲存配置等步驟。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
自訂元件生成位置顧名思義就是可以指定部分HTML區塊渲染在特定的畫面上,即使在不同組件也能把A組件內的部分畫面,展現在B組件上,以下方程式舉例。
Thumbnail
GitLab為程式碼管理倉庫,且從8.0開始提供CI/CD。 安裝 更新套件索引 sudo apt update 安裝postfix sudo apt install ca-certifi​cates curl openssh-server postfix 切換目錄 cd /t
Thumbnail
GitLab為程式碼管理倉庫,且從8.0開始提供CI/CD。 安裝 更新套件索引 sudo apt update 安裝postfix sudo apt install ca-certifi​cates curl openssh-server postfix 切換目錄 cd /t
Thumbnail
在先前的文章中說明了Linux大致上的安裝流程,整個過程只要依照畫面的指示設定,都可以安裝成功。其中可能比較困難在於硬碟空間的分配,這對於許多新手來說也是一個難點,也是這篇所要說的重點。
Thumbnail
在先前的文章中說明了Linux大致上的安裝流程,整個過程只要依照畫面的指示設定,都可以安裝成功。其中可能比較困難在於硬碟空間的分配,這對於許多新手來說也是一個難點,也是這篇所要說的重點。
Thumbnail
sudo apt-get update sudo apt-get upgrade sudo apt install lightdm sudo dpkg-reconfigure lightdm(option選項,如需要切換可以依據需求執行,參考畫面如下) 安裝 x11VNC sudo apt-
Thumbnail
sudo apt-get update sudo apt-get upgrade sudo apt install lightdm sudo dpkg-reconfigure lightdm(option選項,如需要切換可以依據需求執行,參考畫面如下) 安裝 x11VNC sudo apt-
Thumbnail
本文教授如何安裝Ubuntu伺服器,建議選擇偶數版本如22.04, 20.04, 18.04等LTS版本以獲得穩定的未來性支撐。
Thumbnail
本文教授如何安裝Ubuntu伺服器,建議選擇偶數版本如22.04, 20.04, 18.04等LTS版本以獲得穩定的未來性支撐。
Thumbnail
VCENTER_8_新增NAS磁碟機
Thumbnail
VCENTER_8_新增NAS磁碟機
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
Thumbnail
到存放虛擬機的磁碟處\點選想要註冊的機器\註冊機器(登錄虛擬機器)
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News