Pi zero ssh over USB + Linux 備份 dd 解說

這篇說明如何使用一條 USB 線供電並操控 Pi,這篇不適用於 Pi B 系列(Pi 2B / Pi 3B),因為 B 系列沒有 OTG mode 可以開,倒是新出的 Pi 3 A+ 應該可以才是,其實你看到如果只有一個 USB 孔的應該都可以就是(Pi zero 有兩個 micro USB 孔? … 其中一個只有供電功能而已 …)

這篇內容大部分來自於這篇,並附加些解釋,內文內還有 Windows 的製法,有需要的可以入內看詳細,而這篇將針對 MacOS

首先寫入 image 到 TF 卡內,MacOS 在 dd 完 image 後應該會自動 mount /boot 這個 partition,原因是 Pi image 內通常包含了 /boot/,前者格式為 FAT32 後者為 EXT3 或 EXT4,因為是 FAT32 所以 Windows / MacOS / Linux 都支援,自然就把一票設定檔放在這邊了,尤其初始化的部分

Linux 內不支援早期類似 windows 的 GHOST 結構,因為 EXT3 / EXT4 有 super block 所以 size 必須非常明確,更換 size 同時必須更換 superblock 其實算是致命傷,所以要壓縮的話簡單製法類似 …

  1. free space 使用 /dev/zero 填充,然後拿去壓縮(副檔名類似 tar.gz)
  2. 一開始就切剛剛好的 size,之後 boot 後才去 resize2fs(副檔名類似 iso / image)

第一個製法是假設 1TB 硬碟,內容只有 20GB 不到,希望壓縮到 20GB 左右,則關機前先清 log / cache 之類無用檔案,然後用類似這樣的指令

dd if=/dev/zero of=tempfile_killme

也就是拿 0 來填滿某個檔案,不限制大小所以會吃光所有的硬碟空間(EXT3 / EXT4 內空白空間可能會充滿垃圾),來增加壓縮比,之後就會跳出硬碟用光的 error,噴 error 後砍掉 tempfile_killme 這個暫存檔,關機,硬碟拔去另外一台電腦或用 USB 開機,然後 dd 目標硬碟後壓縮,就能接近 20GB 或小於該大小,缺點會類似你的對象硬碟也只能 1TB,因為當初你就是切 1TB 大小,單純壓縮後只有 20GB 而已

第二種製法就是 20GB 硬碟當初只切 20GB 大一點點,從頭到尾都這樣做,開機後自動執行 resize2fs 這個指令,能把 partition 長到吃光所有 free space 所以裝到 128GB 的 TF 卡內後,自然就可以長滿到 128GB,但此狀況通常不符合一般產品用,因為 … 你必須規定最小大小才行,而其實很常會用到 overflow …

Pi 的 image 都屬於二種製法就是了,但能長出來用 resize2fs 都是 / 而非 FAT32,因為 FAT32 沒有權限控制之類的擴充, Linux 會整個噴死的 … 所以最後就是乾脆 … 切個很小的 FAT32 的 /boot 讓大家來做初始設定,然後切個能用的 EXT4 的 /,等 Pi 第一次開機後把 / 長到滿,自然就皆大歡喜 …

回歸正題, Pi 在後來的版本因為安全性議題,所以預設把 ssh 關閉的,所以必須在 /boot 內做些設定

touch /Volumes/boot/ssh

其實就是在 /boot 這個磁區內增加一個叫做 ssh 的空白檔案而已,touch 會把不存在的檔案生出來,而如果存在的話會修正它的最後變更日期(其實還有檔案鎖之類的細節),就這樣而已,之後 Pi 初始開機後偵測到該檔案,就會自動開 ssh 服務

/Volumes/boot/config.txt
#最末增加
dtoverlay=dwc2

這行是把 USB mode 做修正,因為預設記得是 OTG mode,不過細節太多略過 …

/Volumes/boot/cmdline.txt
# 在 rootwait 後面插入
modules-load=dwc2,g_ether

其實就是開機預設載入模組的意思,之後插入 Pi,記得 micro USB 那端要插 Pi 的 USB 而非 power 的那個孔,另外一端連到 MacOS 的電腦,開機後 MacOS 會多個網路卡叫 RNDIS/Ethernet Gatget 之後就可以去開設定內開 共享 > Internet 共享 就會對它開 DHCP server 和 share 了

登入 SSH 使用類似指令

# 這行只有第一次要用
ssh-keygen -R raspberrypi.local
# 來登入唄
ssh pi@raspberrypi.local

打完收工,以後就可以插著 USB 連 Pi 操控了,不過為何能直接連線 raspberrypi.local 連 IP 都不用?其實就是 MacOS 預設有開這個服務而已

anyway 這篇大概就到這裡,以上