使用樹莓派或其它單板機建立一個“家庭私有雲”。
構建一個家庭實驗室可以是一個有趣的方式,可以讓你學習的新概念和實驗新技術時還能自娛自樂。得益於以 樹莓派 為首的單板計算機(SBC)的流行,在舒適的家裡就可以輕鬆構建一個多計算機實驗室。比起試圖在主流的雲服務商建立的相同設定,建立一個“家庭私有雲”以花更少的錢來體驗到雲原生技術,也是一個極好的方法。
這篇文章闡述如何修改樹莓派或其它的單板機的磁碟映象,預設定主機的 SSH,並禁用首次啟動時強制競選互動設定的服務。這是一個讓你的裝置“即啟動,即執行”的極好方法,類似於雲端範例。之後,你可以使用自動化的流程通過 SSH 連線來進行更專業和更深入的設定。
此外, 當向你的實驗室新增更多的樹莓派時,修改磁碟映象可以來讓你只需要將該映象寫到一個 SD 卡、放入樹莓派中就可以了!
對於這個專案,你需要修改一個伺服器磁碟映象。在測試期間,我使用 Fedora Server 31 ARM。在你下載該磁碟映象並驗證其校驗和之後,你需要將其解壓縮並掛載其到宿主機的檔案系統的某個位置上,以便你可以根據需要修改它。
你可以使用 xz 命令通過 --decompress
引數來解壓縮 Fedora 伺服器映象:
xz --decompress Fedora-Server-armhfp-X-y.z-sda.raw.xz
這會留下一個解壓縮後的原始磁碟映象(它會自動地替換 .xz
壓縮檔案)。這個原始磁碟映象就像它聽起來的那樣:一個包含格式化後安裝好的磁碟上的所有資料的檔案。這包含分割區資訊、啟動分割區、root 分割區以及其它分割區。你需要掛載你打算在其中進行修改的分割區,但是要做到這一點,你需要知道磁碟映象中的分割區起始位置和磁區大小,這樣你才可以掛載該檔案正確的磁區。
幸運的是,你可以在一個磁碟映象上使用 fdisk 命令,就像在實際磁碟上使用一樣容易。使用 --list
或 -l
引數來檢視分割區的列表和其資訊:
# 使用 fdisk 來列出原始映象檔案的分割區:$ fdisk -l Fedora-Server-armhfp-31-1.9-sda.rawDisk Fedora-Server-armhfp-X-y.z-sda.raw: 3.2 GiB, 3242196992 bytes, 6332416 sectorsUnits: sectors of 1 * 512 = 512 bytesSector size (logical/physical): 512 bytes / 512 bytesI/O size (minimum/optimal): 512 bytes / 512 bytesDisklabel type: dosDisk identifier: 0xdaad9f57Device Boot Start End Sectors Size Id TypeFedora-Server-armhfp-X-y.z-sda.raw1 8192 163839 155648 76M c W95 FFedora-Server-armhfp-X-y.z-sda.raw2 * 163840 1163263 999424 488M 83 LinuxFedora-Server-armhfp-X-y.z-sda.raw3 1163264 6047743 4884480 2.3G 83 Linux
你需要的所有資訊都可在上面的輸出中獲得。第 3 行表示磁區大小(包括邏輯和物理的):512 位元組 / 512 位元組。
裝置列表顯示的是原始磁碟映象中的分割區。第一個,Fedora-Server-armhfp-X-y.z-sda.raw1
毫無疑問是載入程式分割區,因為它是第一個,很小(僅僅 76MB),而且型別被標識為 c
,即 W95 FAT32(LBA),這是一個從 SD 卡啟動的 FAT32 分割區。
第二個分割區也不是非常大,只有 488MB。這個分割區是一個 Linux 原生型別分割區(Id 83),它可能是包含核心和 initramfs 的 Linux 啟動分割區。
第三個分割區可能是你需要的東西:它有 2.3GB 大小,所以在它其中應該有發行版的主要部分,並且它是一個 Linux 原生分割區型別,這也是在預料之中的。這個分割區應該包含了你需要修改的分割區和資料。
第三個分割區從磁區 1163264 開始(在 fdisk
的輸出中被顯示為 Start
列),所以你的掛載偏移量是 595591168
,計算方法是將磁區大小(512)乘以起始磁區(1163264)(即 512 * 1163264
)。這意味著你需要以偏移量 595591168
掛載該檔案,才能掛載到正確位置。
裝備了這些資訊,現在你可以將第三個分割區掛載到你的家目錄中了:
$ mkdir ~/mnt$ sudo mount -o loop,offset=595591168 Fedora-Server-armhfp-X-y.z-sda.raw ~/mnt$ ls ~/mnt
在磁碟映象被解壓縮和被掛載到宿主機上的一個位置後,就可以修改映象以符合你的需求。在我看來,對映象進行更改的最簡單的方法是使用 chroot
來將你對談的工作根目錄更改為掛載映象的工作根目錄。不過,有點棘手。
在你改變了根目錄後,你的對談將使用新的根目錄下的二進位制檔案。除非你是在一個 ARM 系統做這些所有的操作,否則解壓縮後的磁碟映象的架構將與你正在使用的宿主機系統不同。即使在 chroot 環境中,宿主機系統也無法使用一個不同架構的二進位制檔案。至少,不能在本機使用。
幸運的是,這裡有一個解決方案:qemu-user-static。來自 Debian Wiki 的說明:
“[qemu-user-static] 提供了使用者模式的模擬二進位制檔案,是靜態構建的。在這個模式中,QEMU 可以在一個 CPU 上啟動為另一個 CPU 編譯的 Linux 進程 …… 如果安裝了 binfmt-support 軟體包,qemu-user-static 軟體包會註冊提供的模擬器可以處理的二進位制檔案格式,以便其能夠直接執行其他架構的二進位制檔案。”
這正是你需要在 chroot 環境中非本地架構中工作所需的。如果宿主機系統是 Fedora,使用 DNF 來安裝 qemu-user-static
軟體包,並重新啟動 systemd-binfmt.service
:
# 使用 DNF 啟用非原生的 arch chroot 環境,新增新的二進位制檔案格式資訊# 輸出映象了精簡$ dnf install qemu-user-static$ systemctl restart systemd-binfmt.service
使用這種方法,你一個能夠更改根目錄到掛載的磁碟映象,執行 uname
命令來驗證一切都在正常:
sudo chroot ~/mnt/ /usr/bin/uname -a -rLinux marvin 5.5.16-200.fc31.x86_64 #1 SMP Wed Apr 8 16:43:33 UTC 2020 armv7l armv7l armv7l GNU/Linux
在 chroot 環境中執行 uname
將在輸出中顯示 armv7l
,這個原始磁碟映象的架構, 而不是宿主機的架構。一切如預期,可以繼續修改映象了。
現在你可以直接切換到這個基於 ARM 的磁碟映象中,並在該環境中工作了,你可以對映象自身映象修改了。你需要設定該映象,以便它能夠啟動並可立即存取,而不需要在樹莓派上做任何額外的設定。為此,你需要安裝並啟用 sshd(OpenSSH 守護行程),並為 SSH 存取新增授權密碼。
為了使其表現得更像一個雲環境,實現在家裡建立私有雲的夢想,新增一個本地使用者,給予該使用者 sudo
許可權,並(為了像雲端的重度使用者一樣)允許該使用者無需密碼就可以使用 sudo
。
所以,你將做的事情是:
sudo
(無需密碼,可選)我使用 GitHub 功能,它允許你上傳你的 SSH 公鑰,並在 https://github.com/.keys 處可存取。我發現這是一種很方便的分發公鑰的方法,不過我生性多疑,我總是檢查下載的金鑰是否與我預期的匹配。如果你不想使用這種方法,你可以從你宿主機中複製你公鑰到 chroot 環境中,或者你可以將公鑰托管在你控制的 Web 伺服器上以便使用相同的工作流。
要開始修改磁碟映象,再次切換根目錄到掛載的磁碟映象中,這次啟動一個 shell,以便可以執行多個命令:
# 為了簡潔起見,省略了這些命令的輸出(如果有的話) $ sudo chroot ~/mnt /bin/bash# 安裝 openssh-server ,並啟用它 (在 Fedora 上已經完成)$ dnf install -y openssh-server$ systemctl enable sshd.service# 允許 root 使用授權密碼存取 SSH$ mkdir /root/.ssh# 下載或者另外新增授權密碼檔案,你的公共密碼# 將 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# 下載並新增你的授權密碼# 像你上面所做的那樣更改 home 目錄和URLmkdir /home/chris/.sshcurl <https://github.com/clcollins.keys> -o /home/chris/.ssh/authorized_keyschmod 700 /home/chris/.sshchmod 600 /home/chris/.ssh/authorized_keyschown -R chris.chris /home/chris/.ssh/# 允許 wheel 組( 使用你的本地使用者) 不需要使用密碼來使用 susoecho "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/91-wheel-nopasswd
這就是樹莓派或其它單板機在首次啟動時需要完成設定 SSH 的全部工作。不過,每個發行版都有自己的特點。例如,Raspbian 已經包含一個本地使用者:pi
,並且不使用 wheel
組。因此對於 Raspbian 來說,最好使用現有使用者,或者刪除 pi
使用者,並使用另一個使用者來替換它。
在 Fedora ARM 的情況下,映象會在首次引導啟動時提示你完成設定。這會破壞你在上面所做的修改的目的,尤其是在設定完成之前,它會完全阻止啟動。你的目標是使樹莓派的功能類似於私有雲的基礎設施的一部分一樣執行,而這個工作流程包括在主機啟動時通過 SSH 遠端設定主機。 禁用初始化設定,它由 initial-setup.service
控制:
# 對多使用者和圖形目標禁用 initial-setup.serviceunlink /etc/systemd/system/multi-user.target.wants/initial-setup.serviceunlink /etc/systemd/system/graphical.target.wants/initial-setup.service
當你在 chroot 環境時,你可以對你系統做任何你想做的其它更改,或者就放在那裡,在第一次啟動後,按照雲原生的工作流通過 SSH 進行設定。
完成了這些更改後,剩下的就是重新壓縮磁碟映象,並將其安裝其到你的樹莓派的 SD 卡上。
確保退出 chroot 環境,然後解除安裝磁碟映象:
$ sudo umount ~/mnt/
就像最初解壓縮映象一樣,你可以再次使用 xz
命令來壓縮映象。通過使用 --keep
引數,xz
將保留原始的映象,而不是清理掉它。雖然這會佔用更多的磁碟空間,但保留下來的未壓縮映象將允許你對正在處理的映象進行增量更改,而不需要每次都對其進行解壓縮。這對於在測試和調整映象時節省時間是非常好的。
# 壓縮壓縮磁碟映象為一個 .xz 檔案,但保留原始磁碟映象xz --compress Fedora-Server-armhfp-31-1.9-sda.raw --keep
壓縮過程將花費一些時間,所以趁著這個時間站起來,舒展身體,讓你的血液再次流動。
在壓縮完成後,可以將新的、已修改過的磁碟映象複製到 SD 卡上,以便與樹莓派一起使用。標準的 dd
方法將映象放置到 SD 卡上也很好用,但是我喜歡使用 Fedora 的 arm-image-installer
,因為它因為它在處理未經編輯的映象時提供了一些選項。它對編輯過的映象也很好用,並且比 dd
命令更友好一些。
確保檢查 SD 卡在哪個磁碟驅動器上,並用 --media
引數使用它:
# 使用 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
現在,你已經為樹莓派或其它單板機準備好了一個新的、已修改的 Fedora Server ARM 映象,準備好啟動並立即 SSH 到你的修改映象中。這種方法也可以用來做其它的修改,並且你也可以使用其它發行版的原始磁碟映象,如果你更喜歡它們,而不是 Fedora 的話。這是一個開始構建家庭實驗室私有雲的良好基礎。在以後的文章中,我將指導你使用雲技術和自動化建立一個家庭實驗室。
為了學習如何做這篇文章中的事情,我做了很多研究。以下是我找到的兩個對學習如何客製化磁碟映像和使用非原生架構最有幫助的資料。它們對我從“不知道自己在做什麼”到“我能夠完成它!”非常有幫助。