修改磁盤鏡像來創(chuàng)建基于樹莓派的家庭實驗室
使用樹莓派或其它單板機創(chuàng)建一個“家庭私有云”。
構(gòu)建一個家庭實驗室可以是一個有趣的方式,可以讓你學習的新概念和實驗新技術(shù)時還能自娛自樂。得益于以 樹莓派 為首的單板計算機(SBC)的流行,在舒適的家里就可以輕松構(gòu)建一個多計算機實驗室。比起試圖在主流的云服務(wù)商建立的相同配置,創(chuàng)建一個“家庭私有云”以花更少的錢來體驗到云原生技術(shù),也是一個極好的方法。
這篇文章闡述如何修改樹莓派或其它的單板機的磁盤鏡像,預配置主機的 SSH,并禁用首次啟動時強制競選交互配置的服務(wù)。這是一個讓你的設(shè)備“即啟動,即運行”的極好方法,類似于云端實例。之后,你可以使用自動化的流程通過 SSH 連接來進行更專業(yè)和更深入的配置。
此外, 當向你的實驗室添加更多的樹莓派時,修改磁盤鏡像可以來讓你只需要將該鏡像寫到一個 SD 卡、放入樹莓派中就可以了!
Multiple Raspberry Pi computers, a switch, and a power bank
解壓縮和掛載鏡像
對于這個項目,你需要修改一個服務(wù)器磁盤鏡像。在測試期間,我使用 Fedora Server 31 ARM。在你下載該磁盤鏡像并驗證其校驗和之后,你需要將其解壓縮并掛載其到宿主機的文件系統(tǒng)的某個位置上,以便你可以根據(jù)需要修改它。
你可以使用 xz 命令通過 --decompress
參數(shù)來解壓縮 Fedora 服務(wù)器鏡像:
xz --decompress Fedora-Server-armhfp-X-y.z-sda.raw.xz
這會留下一個解壓縮后的原始磁盤鏡像(它會自動地替換 .xz
壓縮文件)。這個原始磁盤鏡像就像它聽起來的那樣:一個包含格式化后安裝好的磁盤上的所有數(shù)據(jù)的文件。這包含分區(qū)信息、啟動分區(qū)、root 分區(qū)以及其它分區(qū)。你需要掛載你打算在其中進行修改的分區(qū),但是要做到這一點,你需要知道磁盤鏡像中的分區(qū)起始位置和扇區(qū)大小,這樣你才可以掛載該文件正確的扇區(qū)。
幸運的是,你可以在一個磁盤鏡像上使用 fdisk 命令,就像在實際磁盤上使用一樣容易。使用 --list
或 -l
參數(shù)來查看分區(qū)的列表和其信息:
# 使用 fdisk 來列出原始鏡像文件的分區(qū):
$ fdisk -l Fedora-Server-armhfp-31-1.9-sda.raw
Disk Fedora-Server-armhfp-X-y.z-sda.raw: 3.2 GiB, 3242196992 bytes, 6332416 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0xdaad9f57
Device Boot Start End Sectors Size Id Type
Fedora-Server-armhfp-X-y.z-sda.raw1 8192 163839 155648 76M c W95 F
Fedora-Server-armhfp-X-y.z-sda.raw2 * 163840 1163263 999424 488M 83 Linux
Fedora-Server-armhfp-X-y.z-sda.raw3 1163264 6047743 4884480 2.3G 83 Linux
你需要的所有信息都可在上面的輸出中獲得。第 3 行表示扇區(qū)大?。òㄟ壿嫼臀锢淼模?12 字節(jié) / 512 字節(jié)。
設(shè)備列表顯示的是原始磁盤鏡像中的分區(qū)。第一個,Fedora-Server-armhfp-X-y.z-sda.raw1
毫無疑問是引導程序分區(qū),因為它是第一個,很小(僅僅 76MB),而且類型被標識為 c
,即 W95 FAT32(LBA),這是一個從 SD 卡啟動的 FAT32 分區(qū)。
第二個分區(qū)也不是非常大,只有 488MB。這個分區(qū)是一個 Linux 原生類型分區(qū)(Id 83),它可能是包含內(nèi)核和 initramfs 的 Linux 啟動分區(qū)。
第三個分區(qū)可能是你需要的東西:它有 2.3GB 大小,所以在它其中應(yīng)該有發(fā)行版的主要部分,并且它是一個 Linux 原生分區(qū)類型,這也是在預料之中的。這個分區(qū)應(yīng)該包含了你需要修改的分區(qū)和數(shù)據(jù)。
第三個分區(qū)從扇區(qū) 1163264 開始(在 fdisk
的輸出中被顯示為 Start
列),所以你的掛載偏移量是 595591168
,計算方法是將扇區(qū)大?。?12)乘以起始扇區(qū)(1163264)(即 512 * 1163264
)。這意味著你需要以偏移量 595591168
掛載該文件,才能掛載到正確位置。
裝備了這些信息,現(xiàn)在你可以將第三個分區(qū)掛載到你的家目錄中了:
$ mkdir ~/mnt
$ sudo mount -o loop,offset=595591168 Fedora-Server-armhfp-X-y.z-sda.raw ~/mnt
$ ls ~/mnt
直接在磁盤鏡像中作業(yè)
在磁盤鏡像被解壓縮和被掛載到宿主機上的一個位置后,就可以修改鏡像以符合你的需求。在我看來,對鏡像進行更改的最簡單的方法是使用 chroot
來將你會話的工作根目錄更改為掛載鏡像的工作根目錄。不過,有點棘手。
在你改變了根目錄后,你的會話將使用新的根目錄下的二進制文件。除非你是在一個 ARM 系統(tǒng)做這些所有的操作,否則解壓縮后的磁盤鏡像的架構(gòu)將與你正在使用的宿主機系統(tǒng)不同。即使在 chroot 環(huán)境中,宿主機系統(tǒng)也無法使用一個不同架構(gòu)的二進制文件。至少,不能在本機使用。
幸運的是,這里有一個解決方案:qemu-user-static。來自 Debian Wiki 的說明:
“[qemu-user-static] 提供了用戶模式的仿真二進制文件,是靜態(tài)構(gòu)建的。在這個模式中,QEMU 可以在一個 CPU 上啟動為另一個 CPU 編譯的 Linux 進程 …… 如果安裝了 binfmt-support 軟件包,qemu-user-static 軟件包會注冊提供的仿真器可以處理的二進制文件格式,以便其能夠直接運行其他架構(gòu)的二進制文件。”
這正是你需要在 chroot 環(huán)境中非本地架構(gòu)中工作所需的。如果宿主機系統(tǒng)是 Fedora,使用 DNF 來安裝 qemu-user-static
軟件包,并重新啟動 systemd-binfmt.service
:
# 使用 DNF 啟用非本地的 arch chroot 環(huán)境,添加新的二進制文件格式信息
# 輸出鏡像了精簡
$ dnf install qemu-user-static
$ systemctl restart systemd-binfmt.service
使用這種方法,你一個能夠更改根目錄到掛載的磁盤鏡像,運行 uname
命令來驗證一切都在正常:
sudo chroot ~/mnt/ /usr/bin/uname -a -r
Linux marvin 5.5.16-200.fc31.x86_64 #1 SMP Wed Apr 8 16:43:33 UTC 2020 armv7l armv7l armv7l GNU/Linux
在 chroot 環(huán)境中運行 uname
將在輸出中顯示 armv7l
,這個原始磁盤鏡像的架構(gòu), 而不是宿主機的架構(gòu)。一切如預期,可以繼續(xù)修改鏡像了。
修改磁盤鏡像
現(xiàn)在你可以直接切換到這個基于 ARM 的磁盤鏡像中,并在該環(huán)境中工作了,你可以對鏡像自身鏡像修改了。你需要設(shè)置該鏡像,以便它能夠啟動并可立即訪問,而不需要在樹莓派上做任何額外的設(shè)置。為此,你需要安裝并啟用 sshd(OpenSSH 守護進程),并為 SSH 訪問添加授權(quán)密碼。
為了使其表現(xiàn)得更像一個云環(huán)境,實現(xiàn)在家里建立私有云的夢想,添加一個本地用戶,給予該用戶 sudo
權(quán)限,并(為了像云端的重度用戶一樣)允許該用戶無需密碼就可以使用 sudo
。
所以,你將做的事情是:
- 安裝并啟用 SSHD(SSHD 已經(jīng)在 Fedora ARM 鏡像中安裝并啟用,但是你可能需要為你發(fā)行版手動執(zhí)行這些工作)
- 設(shè)置一個本地用戶
- 允許本地用戶來使用
sudo
(無需密碼,可選) - 添加授權(quán)密鑰
- 允許 root 使用授權(quán)密碼鏡像 SSH(可選)
我使用 GitHub 功能,它允許你上傳你的 SSH 公鑰,并在 https://github.com/.keys 處可訪問。我發(fā)現(xiàn)這是一種很方便的分發(fā)公鑰的方法,不過我生性多疑,我總是檢查下載的密鑰是否與我預期的匹配。如果你不想使用這種方法,你可以從你宿主機中復制你公鑰到 chroot 環(huán)境中,或者你可以將公鑰托管在你控制的 Web 服務(wù)器上以便使用相同的工作流。
要開始修改磁盤鏡像,再次切換根目錄到掛載的磁盤鏡像中,這次啟動一個 shell,以便可以運行多個命令:
# 為了簡潔起見,省略了這些命令的輸出(如果有的話)
$ sudo chroot ~/mnt /bin/bash
# 安裝 openssh-server ,并啟用它 (在 Fedora 上已經(jīng)完成)
$ dnf install -y openssh-server
$ systemctl enable sshd.service
# 允許 root 使用授權(quán)密碼訪問 SSH
$ mkdir /root/.ssh
# 下載或者另外添加授權(quán)密碼文件,你的公共密碼
# 將 URL 替換為你自己公共密碼的路徑
$ curl <https://github.com/clcollins.keys> -o /root/.ssh/authorized_keys
$ chmod 700 /root/.ssh
$ chmod 600 /root/.ssh/authorized_keys
# 添加一個本地用戶,并放置他們到 wheel 組中
# 將組和用戶更改為您想要的一切
useradd -g chris -G wheel -m -u 1000 chris
# 下載并添加你的授權(quán)密碼
# 像你上面所做的那樣更改 home 目錄和URL
mkdir /home/chris/.ssh
curl <https://github.com/clcollins.keys> -o /home/chris/.ssh/authorized_keys
chmod 700 /home/chris/.ssh
chmod 600 /home/chris/.ssh/authorized_keys
chown -R chris.chris /home/chris/.ssh/
# 允許 wheel 組( 使用你的本地用戶) 不需要使用密碼來使用 suso
echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/91-wheel-nopasswd
這就是樹莓派或其它單板機在首次啟動時需要完成設(shè)置 SSH 的全部工作。不過,每個發(fā)行版都有自己的特點。例如,Raspbian 已經(jīng)包含一個本地用戶:pi
,并且不使用 wheel
組。因此對于 Raspbian 來說,最好使用現(xiàn)有用戶,或者刪除 pi
用戶,并使用另一個用戶來替換它。
在 Fedora ARM 的情況下,鏡像會在首次引導啟動時提示你完成設(shè)置。這會破壞你在上面所做的修改的目的,尤其是在設(shè)置完成之前,它會完全阻止啟動。你的目標是使樹莓派的功能類似于私有云的基礎(chǔ)設(shè)施的一部分一樣運行,而這個工作流程包括在主機啟動時通過 SSH 遠程設(shè)置主機。 禁用初始化設(shè)置,它由 initial-setup.service
控制:
# 對多用戶和圖形目標禁用 initial-setup.service
unlink /etc/systemd/system/multi-user.target.wants/initial-setup.service
unlink /etc/systemd/system/graphical.target.wants/initial-setup.service
當你在 chroot 環(huán)境時,你可以對你系統(tǒng)做任何你想做的其它更改,或者就放在那里,在第一次啟動后,按照云原生的工作流通過 SSH 進行配置。
重新壓縮并安裝修改后的鏡像
完成了這些更改后,剩下的就是重新壓縮磁盤鏡像,并將其安裝其到你的樹莓派的 SD 卡上。
確保退出 chroot 環(huán)境,然后卸載磁盤鏡像:
$ sudo umount ~/mnt/
就像最初解壓縮鏡像一樣,你可以再次使用 xz
命令來壓縮鏡像。通過使用 --keep
參數(shù),xz
將保留原始的鏡像,而不是清理掉它。雖然這會占用更多的磁盤空間,但保留下來的未壓縮鏡像將允許你對正在處理的鏡像進行增量更改,而不需要每次都對其進行解壓縮。這對于在測試和調(diào)整鏡像時節(jié)省時間是非常好的。
# 壓縮壓縮磁盤鏡像為一個 .xz 文件,但保留原始磁盤鏡像
xz --compress Fedora-Server-armhfp-31-1.9-sda.raw --keep
壓縮過程將花費一些時間,所以趁著這個時間站起來,舒展身體,讓你的血液再次流動。
在壓縮完成后,可以將新的、已修改過的磁盤鏡像復制到 SD 卡上,以便與樹莓派一起使用。標準的 dd
方法將鏡像放置到 SD 卡上也很好用,但是我喜歡使用 Fedora 的 arm-image-installer
,因為它因為它在處理未經(jīng)編輯的鏡像時提供了一些選項。它對編輯過的鏡像也很好用,并且比 dd
命令更友好一些。
確保檢查 SD 卡在哪個磁盤驅(qū)動器上,并用 --media
參數(shù)使用它:
# 使用 arm-image-installer 來復制已修改的磁盤鏡像到 SD 卡上
arm-image-installer --image=Fedora-Server-armhfp-X-y.z-sda.raw.xz --target=rpi3 --media=/dev/sdc --norootpass --resizefs -y
現(xiàn)在,你已經(jīng)為樹莓派或其它單板機準備好了一個新的、已修改的 Fedora Server ARM 鏡像,準備好啟動并立即 SSH 到你的修改鏡像中。這種方法也可以用來做其它的修改,并且你也可以使用其它發(fā)行版的原始磁盤鏡像,如果你更喜歡它們,而不是 Fedora 的話。這是一個開始構(gòu)建家庭實驗室私有云的良好基礎(chǔ)。在以后的文章中,我將指導你使用云技術(shù)和自動化建立一個家庭實驗室。