修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國使用樹莓派或其它單板機創建一個“家庭私有云”。
https://linux.cn/article-12277-1.html
作者:Chris Collins
譯者:鄭

使用樹莓派或其它單板機創建一個“家庭私有云”。

構建一個 家庭實驗室 可以是一個有趣的方式,可以讓你學習的新概念和實驗新技術時還能自娛自樂。得益於以 樹莓派 爲首的單板計算機(SBC)的流行,在舒適的家裏就可以輕鬆構建一個多計算機實驗室。比起試圖在主流的雲服務商建立的相同配置,創建一個“家庭私有云”以花更少的錢來體驗到雲原生技術,也是一個極好的方法。

這篇文章闡述如何修改樹莓派或其它的單板機的磁盤鏡像,預配置主機的 SSH,並禁用首次啓動時強制競選交互配置的服務。這是一個讓你的設備“即啓動,即運行”的極好方法,類似於雲端實例。之後,你可以使用自動化的流程通過 SSH 連接來進行更專業和更深入的配置。

此外 , 當向你的實驗室添加更多的樹莓派時,修改磁盤鏡像可以來讓你只需要將該鏡像寫到一個 SD 卡、放入樹莓派中就可以了!

修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國

Multiple Raspberry Pi computers, a switch, and a power bank

修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國

解壓縮和掛載鏡像

對於這個項目,你需要修改一個服務器磁盤鏡像。在測試期間,我使用 Fedora Server 31 ARM。在你下載該磁盤鏡像並 驗證其校驗和 之後,你需要將其解壓縮並掛載其到宿主機的文件系統的某個位置上,以便你可以根據需要修改它。

你可以使用 xz 命令通過 --decompress 參數來解壓縮 Fedora 服務器鏡像:
``` 1. xz --decompress Fedora-Server-armhfp-X-y.z-sda.raw.xz

這會留下一個解壓縮後的原始磁盤鏡像(它會自動地替換 `.xz` 壓縮文件)。這個原始磁盤鏡像就像它聽起來的那樣:一個包含格式化後安裝好的磁盤上的所有數據的文件。這包含分區信息、啓動分區、root 分區以及其它分區。你需要掛載你打算在其中進行修改的分區,但是要做到這一點,你需要知道磁盤鏡像中的分區起始位置和扇區大小,這樣你纔可以掛載該文件正確的扇區。

幸運的是,你可以在一個磁盤鏡像上使用 [fdisk]() 命令,就像在實際磁盤上使用一樣容易。使用 `--list` 或 `-l` 參數來查看分區的列表和其信息:
```      1. # 使用 fdisk 來列出原始鏡像文件的分區:
      2. $ fdisk -l Fedora-Server-armhfp-31-1.9-sda.raw
      3. Disk Fedora-Server-armhfp-X-y.z-sda.raw: 3.2 GiB, 3242196992 bytes, 6332416 sectors
      4. Units: sectors of 1 * 512 = 512 bytes
      5. Sector size (logical/physical): 512 bytes / 512 bytes
      6. I/O size (minimum/optimal): 512 bytes / 512 bytes
      7. Disklabel type: dos
      8. Disk identifier: 0xdaad9f57
      9.   10. Device                               Boot   Start     End Sectors  Size Id Type
      11. Fedora-Server-armhfp-X-y.z-sda.raw1         8192  163839  155648   76M  c W95 F
      12. Fedora-Server-armhfp-X-y.z-sda.raw2 *     163840 1163263  999424  488M 83 Linux
      13. Fedora-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 掛載該文件,才能掛載到正確位置。

裝備了這些信息,現在你可以將第三個分區掛載到你的家目錄中了:
``` 1. $ mkdir ~/mnt
2. $ sudo mount -o loop,offset=595591168 Fedora-Server-armhfp-X-y.z-sda.raw ~/mnt
3. $ ls ~/mnt

![修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國](https://img.chainnews.com/material/images/96b10e70c4f99f2a60c8d0577bbdc27f.svg)

直接在磁盤鏡像中作業

在磁盤鏡像被解壓縮和被掛載到宿主機上的一個位置後,就可以修改鏡像以符合你的需求。在我看來,對鏡像進行更改的最簡單的方法是使用 `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`:
```      1. # 使用 DNF 啓用非本地的 arch chroot 環境,添加新的二進制文件格式信息
      2. # 輸出鏡像了精簡
      3. $ dnf install qemu-user-static
      4. $ systemctl restart systemd-binfmt.service

使用這種方法,你一個能夠更改根目錄到掛載的磁盤鏡像,運行 uname 命令來驗證一切都在正常:
``` 1. sudo chroot ~/mnt/ /usr/bin/uname -a -r
2. 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 環境中運行 `uname` 將在輸出中顯示 `armv7l`,這個原始磁盤鏡像的架構, 而不是宿主機的架構。一切如預期,可以繼續修改鏡像了。

![修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國](https://img.chainnews.com/material/images/96b10e70c4f99f2a60c8d0577bbdc27f.svg)

修改磁盤鏡像

現在你可以直接切換到這個基於 ARM 的磁盤鏡像中,並在該環境中工作了,你可以對鏡像自身鏡像修改了。你需要設置該鏡像,以便它能夠啓動並可立即訪問,而不需要在樹莓派上做任何額外的設置。爲此,你需要安裝並啓用 sshd (OpenSSH 守護進程),併爲 SSH 訪問添加授權密碼。

爲了使其表現得更像一個雲環境,實現在家裏建立私有云的夢想,添加一個本地用戶,給予該用戶 `sudo` 權限,並(爲了像雲端的重度用戶一樣)允許該用戶無需密碼就可以使用 `sudo`。

所以,你將做的事情是:

◈ 安裝並啓用 SSHD (SSHD 已經在 Fedora ARM 鏡像中安裝並啓用,但是你可能需要爲你發行版手動執行這些工作)◈ 設置一個本地用戶◈ 允許本地用戶來使用 `sudo`(無需密碼,可選)◈ 添加授權密鑰◈ 允許 root 使用授權密碼鏡像 SSH (可選)

我使用 GitHub 功能,它允許你上傳你的 SSH 公鑰,並在 [https://github.com/.keys]() 處可訪問。我發現這是一種很方便的分發公鑰的方法,不過我生性多疑,我總是檢查下載的密鑰是否與我預期的匹配。如果你不想使用這種方法,你可以從你宿主機中複製你公鑰到 chroot 環境中,或者你可以將公鑰託管在你控制的 Web 服務器上以便使用相同的工作流。

要開始修改磁盤鏡像,再次切換根目錄到掛載的磁盤鏡像中,這次啓動一個 shell,以便可以運行多個命令:
```      1. # 爲了簡潔起見,省略了這些命令的輸出 (如果有的話) 
      2. $ sudo chroot ~/mnt /bin/bash
      3.   4. # 安裝 openssh-server ,並啓用它 (在 Fedora 上已經完成)
      5. $ dnf install -y openssh-server
      6. $ systemctl enable sshd.service
      7.   8. # 允許 root 使用授權密碼訪問 SSH
      9. $ mkdir /root/.ssh
      10.   11. # 下載或者另外添加授權密碼文件,你的公共密碼
      12. # 將 URL 替換爲你自己公共密碼的路徑
      13. $ curl <https://github.com/clcollins.keys> -o /root/.ssh/authorized_keys
      14. $ chmod 700 /root/.ssh
      15. $ chmod 600 /root/.ssh/authorized_keys
      16.   17. # 添加一個本地用戶,並放置他們到 wheel 組中
      18. # 將組和用戶更改爲您想要的一切
      19. useradd -g chris -G wheel -m -u 1000 chris
      20.   21. # 下載並添加你的授權密碼
      22. # 像你上面所做的那樣更改 home 目錄和 URL
      23. mkdir /home/chris/.ssh
      24. curl <https://github.com/clcollins.keys> -o /home/chris/.ssh/authorized_keys
      25. chmod 700 /home/chris/.ssh
      26. chmod 600 /home/chris/.ssh/authorized_keys
      27. chown -R chris.chris /home/chris/.ssh/
      28.   29. # 允許 wheel 組 ( 使用你的本地用戶) 不需要使用密碼來使用 suso
      30. echo "%wheel ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/91-wheel-nopasswd

這就是樹莓派或其它單板機在首次啓動時需要完成設置 SSH 的全部工作。不過,每個發行版都有自己的特點。例如,Raspbian 已經包含一個本地用戶:pi,並且不使用 wheel 組。因此對於 Raspbian 來說,最好使用現有用戶,或者刪除 pi 用戶,並使用另一個用戶來替換它。

在 Fedora ARM 的情況下,鏡像會在首次引導啓動時提示你完成設置。這會破壞你在上面所做的修改的目的,尤其是在設置完成之前,它會完全阻止啓動。你的目標是使樹莓派的功能類似於私有云的基礎設施的一部分一樣運行,而這個工作流程包括在主機啓動時通過 SSH 遠程設置主機。禁用初始化設置,它由 initial-setup.service 控制:
``` 1. # 對多用戶和圖形目標禁用 initial-setup.service
2. unlink /etc/systemd/system/multi-user.target.wants/initial-setup.service
3. unlink /etc/systemd/system/graphical.target.wants/initial-setup.service

當你在 chroot 環境時,你可以對你係統做任何你想做的其它更改,或者就放在那裏,在第一次啓動後,按照雲原生的工作流通過 SSH 進行配置。

![修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國](https://img.chainnews.com/material/images/96b10e70c4f99f2a60c8d0577bbdc27f.svg)

重新壓縮並安裝修改後的鏡像

完成了這些更改後,剩下的就是重新壓縮磁盤鏡像,並將其安裝其到你的樹莓派的 SD 卡上。

確保退出 chroot 環境,然後卸載磁盤鏡像:
```      1. $ sudo umount ~/mnt/

就像最初解壓縮鏡像一樣,你可以再次使用 xz 命令來壓縮鏡像。通過使用 --keep 參數,xz 將保留原始的鏡像,而不是清理掉它。雖然這會佔用更多的磁盤空間,但保留下來的未壓縮鏡像將允許你對正在處理的鏡像進行增量更改,而不需要每次都對其進行解壓縮。這對於在測試和調整鏡像時節省時間是非常好的。
``` 1. # 壓縮壓縮磁盤鏡像爲一個 .xz 文件,但保留原始磁盤鏡像
2. xz --compress Fedora-Server-armhfp-31-1.9-sda.raw --keep

壓縮過程將花費一些時間,所以趁着這個時間站起來,舒展身體,讓你的血液再次流動。

在壓縮完成後,可以將新的、已修改過的磁盤鏡像複製到 SD 卡上,以便與樹莓派一起使用。標準的 `dd` 方法將鏡像放置到 SD 卡上也很好用,但是我喜歡使用 Fedora 的 `arm-image-installer`,因爲它因爲它在處理未經編輯的鏡像時提供了一些選項。它對編輯過的鏡像也很好用,並且比 `dd` 命令更友好一些。

確保檢查 SD 卡在哪個磁盤驅動器上,並用 `--media` 參數使用它:
```      1. # 使用 arm-image-installer 來複制已修改的磁盤鏡像到 SD 卡上
      2. 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 的話。這是一個開始構建家庭實驗室私有云的良好基礎。在以後的文章中,我將指導你使用雲技術和自動化建立一個家庭實驗室。

修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國

延伸閱讀

爲了學習如何做這篇文章中的事情,我做了很多研究。以下是我找到的兩個對學習如何定製磁盤映像和使用非原生架構最有幫助的資料。它們對我從“不知道自己在做什麼”到“我能夠完成它!”非常有幫助。

如何修改你的自定義 Linux 發行版的原始磁盤鏡像使用 DNF 維基


via: https://opensource.com/article/20/5/disk-image-raspberry-pi

作者:Chris Collins 選題:lujun9972 譯者:robsean 校對:wxy

本文由 LCTT 原創編譯,Linux 中國 榮譽推出

修改磁盤鏡像來創建基於樹莓派的家庭實驗室 | Linux 中國

來源鏈接:mp.weixin.qq.com