:將/home遷移至reComputer)
1. 項目緣起為什么要把Orin Nano的/home挪到reComputer上最近在折騰Jetson Orin Nano Developer Kit這玩意兒性能是真不錯但有個老問題又冒出來了內(nèi)置的eMMC存儲空間實在不夠看。我裝了幾個開發(fā)環(huán)境比如PyTorch、TensorRT再拉幾個數(shù)據(jù)集/home目錄很快就告急了。每次編譯點東西或者處理數(shù)據(jù)都得小心翼翼生怕把存儲寫滿導致系統(tǒng)卡死。這嚴重影響了開發(fā)效率尤其是在做需要大量中間文件的AI模型訓練或數(shù)據(jù)處理時。于是我想到了手頭另一臺設備reComputer。它通常有更大的存儲空間無論是SATA SSD還是NVMe容量和速度都比Orin Nano自帶的eMMC強不少。把/home這個用戶數(shù)據(jù)和配置文件最集中的地方遷移過去聽起來是個一勞永逸的方案。這不僅能解決空間瓶頸還能利用reComputer可能更好的I/O性能提升開發(fā)體驗。更重要的是這種架構(gòu)讓Orin Nano專注于計算存儲交給reComputer有點小型工作站的味道了。但遷移/home不是簡單的復制粘貼。它涉及到系統(tǒng)用戶、權(quán)限、正在運行的進程以及大量應用程序的配置文件。操作不當輕則登錄不了桌面重則系統(tǒng)無法啟動。網(wǎng)上搜了一圈發(fā)現(xiàn)大家踩的坑五花八門從權(quán)限錯亂到服務啟動失敗什么都有。所以我決定把這次從Jetson Orin Nano到reComputer的/home數(shù)據(jù)遷移全過程包括原理、步驟、踩的坑和最終驗證詳細記錄下來。2. 遷移前的核心準備環(huán)境分析與方案設計動手之前必須先搞清楚現(xiàn)狀和目標。盲目操作是數(shù)據(jù)災難的開始。2.1 源與目標設備狀態(tài)確認我的源設備是Jetson Orin Nano Developer Kit系統(tǒng)是JetPack 5.1.2基于Ubuntu 20.04。使用df -h命令查看發(fā)現(xiàn)根分區(qū)/和/home同在一個分區(qū)這是NVIDIA官方鏡像的默認布局。總?cè)萘考s60GB/home已經(jīng)使用了40多GB。目標設備是一臺reComputer我給它裝了一塊1TB的NVMe SSD并安裝了與Orin Nano相同版本的Ubuntu 20.04系統(tǒng)以確保庫文件版本一致減少兼容性問題。首先需要在兩臺設備間建立穩(wěn)定、高速的網(wǎng)絡連接。最可靠的方式是通過千兆以太網(wǎng)直連或者連接至同一個局域網(wǎng)交換機。我選擇用網(wǎng)線將兩臺設備直接相連并手動配置了靜態(tài)IP地址避免DHCP可能帶來的不穩(wěn)定性。Orin Nano (源): 192.168.1.100reComputer (目標): 192.168.1.101配置完后立即用ping命令測試連通性確保網(wǎng)絡鏈路通暢。2.2 遷移工具選型為什么是rsync遷移大量文件cp或scp不是最佳選擇。cp在中斷后無法續(xù)傳scp雖然能跨網(wǎng)絡但效率相對較低且缺乏完整性校驗。我選擇rsync這是此類任務的行業(yè)標準工具理由如下增量同步與斷點續(xù)傳rsync只傳輸源和目標之間有差異的文件部分首次是全量之后若需重試或同步更新速度極快。網(wǎng)絡不穩(wěn)定時重新執(zhí)行命令即可續(xù)傳。保持屬性通過-aarchive參數(shù)可以完美保留文件的權(quán)限permission、所有權(quán)owner/group、時間戳modify time、符號鏈接symbolic link等所有元數(shù)據(jù)。這對于/home目錄至關(guān)重要因為很多應用程序依賴特定的文件權(quán)限和屬主才能正常運行。安全與驗證支持SSH加密傳輸并且傳輸結(jié)束后可以校驗文件一致性。試運行模式-ndry-run參數(shù)可以模擬執(zhí)行列出將會發(fā)生的變化而不實際傳輸用于最終檢查避免誤操作。因此核心命令骨架確定為rsync -avz --progress -e ssh /home/ userrecomputer-ip:/path/to/new/home/。其中-z用于壓縮傳輸數(shù)據(jù)節(jié)省帶寬--progress顯示實時進度。2.3 關(guān)鍵預處理清理、備份與用戶處理在按下回車鍵開始同步之前還有幾件必須做的事1. 源端(/home)清理運行du -sh /home/* | sort -hr查看/home下各個用戶目錄的大小。我發(fā)現(xiàn)有很多緩存文件如.cache、臨時文件、舊的下載包和Docker鏡像占用了大量空間。我清理了瀏覽器緩存、pip和conda的緩存包pip cache purge,conda clean --all并移除了不再需要的Docker容器和鏡像。這一步為我騰出了近10GB空間減少了不必要的傳輸量。2. 完整系統(tǒng)備份這是最重要的保險措施。即使操作再小心也有意外可能。我使用dd命令將Orin Nano的整個eMMC備份到了一個外接USB硬盤上。sudo dd if/dev/mmcblk0 of/media/usb-backup/orin-nano-full-backup.img bs4M statusprogress這條命令將整個存儲設備逐塊備份成鏡像文件。萬一遷移失敗導致系統(tǒng)崩潰我可以利用這個鏡像快速恢復。3. 處理已登錄用戶和進程遷移/home時必須確保沒有程序正在讀寫其中的文件。最穩(wěn)妥的方式是進入單用戶模式或恢復模式。對于Jetson Orin Nano我選擇在開機時進入GRUB菜單選擇“Advanced options”再選擇“recovery mode”然后進入“root”命令行。這樣系統(tǒng)只有最基礎的服務運行所有普通用戶都已退出可以安全地操作/home目錄。如果無法進入恢復模式則必須手動確保所有用戶已注銷。通過who命令查看登錄用戶用pkill -KILL -u username強制結(jié)束相應用戶的所有進程。但請注意這會導致該用戶所有未保存的工作丟失務必提前通知。3. 分步實施從掛載、同步到切換準備工作就緒后我們進入核心操作階段。這個過程需要嚴格按照順序執(zhí)行。3.1 在reComputer上準備目標存儲位置我的目標是在reComputer的1TB NVMe SSD上專門劃出一個分區(qū)來承載新的/home。假設這塊SSD在系統(tǒng)中識別為/dev/nvme0n1。分區(qū)使用fdisk或parted工具。我選擇parted因為它對GPT分區(qū)表更友好。sudo parted /dev/nvme0n1 (parted) print # 查看現(xiàn)有分區(qū)布局 (parted) mkpart primary ext4 1GB 100% # 創(chuàng)建一個從1GB開始到磁盤末尾的主分區(qū)預留前1GB可能用于其他用途如boot (parted) set 1 lvm on # 可選如果打算用LVM可以設置標志 (parted) quit然后格式化新分區(qū)為ext4文件系統(tǒng)兼容性好日志式sudo mkfs.ext4 /dev/nvme0n1p1創(chuàng)建臨時掛載點并掛載我們不直接掛載到/home先掛載到一個臨時位置進行數(shù)據(jù)同步。sudo mkdir -p /mnt/new_home sudo mount /dev/nvme0n1p1 /mnt/new_home掛載后使用df -h確認掛載成功并看到正確的容量。初始化目標目錄結(jié)構(gòu)在/mnt/new_home下我們需要創(chuàng)建與源/home相同的用戶目錄骨架并確保權(quán)限正確。最簡單的方法是先同步空目錄結(jié)構(gòu)。# 在Orin Nano源上執(zhí)行假設我們已經(jīng)通過恢復模式root登錄 rsync -av --dry-run /home/ /mnt/new_home/ # 先模擬看輸出但更關(guān)鍵的是在reComputer上我們需要先手動創(chuàng)建/mnt/new_home目錄并設置正確的所有權(quán)給root因為rsync會保持這個頂層的權(quán)限。3.2 執(zhí)行首次全量數(shù)據(jù)同步這是最耗時的一步。在Orin Nano的恢復模式root shell下執(zhí)行真正的同步命令。注意我們使用-e ssh指定通過SSH傳輸前提是已經(jīng)在兩臺機器間配置了SSH密鑰免密登錄否則需要多次輸入密碼。# 在Orin Nano上執(zhí)行 rsync -avz --progress -e ssh /home/ root192.168.1.101:/mnt/new_home/參數(shù)解釋-a: 歸檔模式保持所有屬性。-v: 詳細輸出讓你看到正在同步的文件。-z: 傳輸時壓縮節(jié)省網(wǎng)絡時間。--progress: 顯示每個文件的傳輸進度。-e ssh: 使用SSH作為遠程shell。執(zhí)行過程中的注意事項網(wǎng)絡穩(wěn)定性確保網(wǎng)線連接牢固。如果中斷重新執(zhí)行相同的rsync命令即可它會自動跳過已傳輸?shù)南嗤募崿F(xiàn)續(xù)傳。權(quán)限問題如果遇到rsync: failed to set permissions on ...: Operation not permitted (1)之類的警告通常是因為目標文件系統(tǒng)如某些NAS或特定掛載參數(shù)不支持完整的Linux權(quán)限。我們的目標是ext4所以應該沒問題。如果出現(xiàn)可以嘗試加上--no-perms和--no-owner參數(shù)但這是下策會破壞權(quán)限結(jié)構(gòu)后續(xù)需要手動修復。跳過特定文件可以使用--exclude參數(shù)排除一些臨時或緩存目錄如--exclude.cache --exclude.Trash以加快速度。但首次全量同步我建議包含所有內(nèi)容確保一致性。同步完成后在reComputer上檢查/mnt/new_home目錄確認所有用戶文件夾、隱藏配置文件都已存在并且ls -la顯示的文件屬主和權(quán)限與源端基本一致。3.3 修改reComputer的fstab實現(xiàn)自動掛載數(shù)據(jù)同步到位后需要讓reComputer在每次啟動時自動將新的分區(qū)掛載到/home。獲取新分區(qū)的UUID使用blkid命令。sudo blkid /dev/nvme0n1p1輸出類似/dev/nvme0n1p1: UUIDa1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8 TYPEext4記下這個UUID用它來標識分區(qū)比用/dev/nvme0n1p1更穩(wěn)定因為設備名可能會變。備份并編輯/etc/fstab文件sudo cp /etc/fstab /etc/fstab.backup.$(date %Y%m%d) sudo nano /etc/fstab在文件末尾添加一行UUIDa1b2c3d4-e5f6-7890-g1h2-i3j4k5l6m7n8 /home ext4 defaults,nofail 0 2UUID...: 用你實際的UUID替換。/home: 掛載點。ext4: 文件系統(tǒng)類型。defaults: 默認掛載選項包括rw, suid, dev, exec, auto, nouser, async。nofail: 非常重要即使啟動時該分區(qū)不存在或無法掛載系統(tǒng)也會繼續(xù)啟動防止因存儲設備未就緒導致系統(tǒng)卡在啟動界面。0 2: 最后一個數(shù)字2表示非根分區(qū)需要dump工具備份和fsck檢查順序。測試fstab配置 在真正掛載到/home之前先測試語法是否正確并嘗試掛載到一個臨時位置。sudo mount -a # 掛載fstab中所有未掛載的分區(qū)如果沒有報錯再用df -h查看新分區(qū)是否已掛載到我們指定的臨時位置如果之前沒卸載的話?,F(xiàn)在不要直接掛載到/home因為那里可能還有老數(shù)據(jù)。3.4 切換掛載點關(guān)鍵時刻的操作這是最緊張的一步。我們需要將reComputer上原有的/home內(nèi)容移走備份然后將新分區(qū)掛載上去。在reComputer上操作 首先確保所有用戶已注銷。切換到單用戶模式或使用一個非/home目錄下的root shell例如通過ssh從另一臺機器登錄或者使用CtrlAltF3進入TTY3終端以root登錄。備份舊的/home并掛載新的/home# 進入單用戶模式后執(zhí)行以下命令 cd / # 將舊的/home目錄重命名備份以防萬一 mv /home /home.old.backup # 創(chuàng)建新的空/home目錄作為掛載點 mkdir /home # 將新分區(qū)掛載到/home mount /dev/nvme0n1p1 /home # 立即檢查掛載是否成功 ls -la /home你應該看到從Orin Nano同步過來的所有用戶數(shù)據(jù)。此時/home.old.backup里是reComputer原來的用戶目錄如果有的話。驗證并重啟 快速驗證幾個關(guān)鍵點能否切換到某個遷移過來的用戶su - username該用戶的環(huán)境變量是否正常家目錄下的配置文件如.bashrc是否存在。確認無誤后重啟reComputer進入正常的多用戶模式。reboot重啟后正常登錄圖形界面或SSH檢查/home下的文件是否完好用戶桌面、文檔、應用程序配置是否都正常。4. 遷移后的驗證、問題排查與優(yōu)化系統(tǒng)成功啟動并登錄只是第一步。我們需要進行一系列驗證確保遷移完全成功并解決可能出現(xiàn)的后續(xù)問題。4.1 基礎功能驗證清單我制定了一個檢查清單逐一驗證文件系統(tǒng)與容量df -h /home確認掛載點正確顯示的是新分區(qū)1TB的容量而不是原來的小分區(qū)。用戶與權(quán)限ls -la /home檢查各用戶目錄的所有者owner和組group是否與Orin Nano上一致。例如用戶jetson的目錄應該屬于jetson:jetson。如果出現(xiàn)屬主變成root或數(shù)字UID說明同步時權(quán)限未保持需要手動修復sudo chown -R username:username /home/username。用戶登錄與環(huán)境分別用每個遷移過來的用戶登錄SSH或本地。檢查家目錄是否正常echo $HOME應輸出/home/username。檢查基礎Shell配置cat ~/.bashrc看內(nèi)容是否完整。測試用戶專屬的應用程序配置是否生效。例如對于開發(fā)者檢查git config --global --list是否還能看到之前的配置。應用程序兼容性測試Python環(huán)境激活原有的conda或venv環(huán)境運行一個簡單的Python腳本看是否報錯。常見錯誤是虛擬環(huán)境的python可執(zhí)行文件路徑硬編碼了舊的/home路徑但我們的/home掛載點沒變所以通常沒問題。但如果虛擬環(huán)境是在不同架構(gòu)如x86_64上創(chuàng)建的在ARM的Orin Nano或reComputer上可能無法直接運行需要重建。Docker運行docker ps檢查Docker服務是否正常。Docker的鏡像和容器默認存儲在/var/lib/docker不受/home遷移影響。但用戶目錄下的docker-compose.yml等配置文件應能正常讀取。桌面環(huán)境登錄圖形界面檢查桌面壁紙、圖標布局、自啟動程序是否都保留了下來。4.2 常見問題與根因排查在實際操作中我遇到了幾個典型問題以下是排查思路問題一用戶登錄后提示“無法創(chuàng)建家目錄”或“權(quán)限被拒絕”?,F(xiàn)象SSH登錄時提示Could not create directory /home/username/.ssh或者登錄后提示某些配置文件無法讀取。根因目標分區(qū)/dev/nvme0n1p1的掛載屬性或文件系統(tǒng)權(quán)限有問題導致非root用戶無法在自己的家目錄下寫文件。排查檢查掛載選項mount | grep /home。確保沒有noexec,nosuid, 或特別是nouser這會導致只有root能操作。我們的fstab里用的是defaults通常包含user或users允許普通用戶掛載不defaults不含user。實際上對于/homedefaults就夠了因為目錄本身的權(quán)限由文件系統(tǒng)控制。檢查家目錄的權(quán)限ls -ld /home/username。應該是drwxr-xr-x或drwx------所有者是username。如果所有者是root則需要用chown修復。檢查/home目錄本身的權(quán)限ls -ld /home。應該是drwxr-xr-x root root。問題二應用程序報錯“找不到庫”或“可執(zhí)行文件格式錯誤”?,F(xiàn)象類似熱詞中提到的bash: /home/wyl/miniconda3/envs/lerobot/bin/ffmpeg無法執(zhí)行二進制文件: 可執(zhí)行文件格式錯誤。根因這個錯誤通常與/home遷移無關(guān)而是二進制文件架構(gòu)不匹配。如果這個ffmpeg是從x86_64的機器上復制過來的conda環(huán)境中的那么在ARM64架構(gòu)的Jetson Orin Nano或reComputer上就無法執(zhí)行。解決方案確認設備架構(gòu)uname -mJetson是aarch64。為當前架構(gòu)重新安裝該軟件包。對于conda環(huán)境可以嘗試conda install ffmpeg -c conda-forgeconda會自動選擇ARM64版本的包。如果整個虛擬環(huán)境都是跨架構(gòu)遷移的最穩(wěn)妥的方法是重建環(huán)境使用針對ARM64的包源。問題三系統(tǒng)啟動時卡住提示“Failed to mount /home”或進入緊急模式(emergency mode)。根因/etc/fstab配置錯誤或者新分區(qū)UUID在啟動時尚未就緒在復雜的磁盤陣列或USB連接存儲中常見。排查在啟動時按Esc或Shift進入GRUB選擇恢復模式以root身份登錄。檢查/etc/fstab中UUID是否正確blkid對比。檢查分區(qū)是否存在lsblk -f。嘗試手動掛載mount /dev/nvme0n1p1 /mnt看具體報錯信息??赡苁俏募到y(tǒng)損壞運行fsck或者分區(qū)類型不對。關(guān)鍵技巧fstab中的nofail選項就是為了防止此問題。如果沒加加上它。如果已經(jīng)加了但還卡住可能是系統(tǒng)在等待超時??梢試L試在defaults后加上,nofail,x-systemd.device-timeout5將超時時間設為5秒。4.3 性能優(yōu)化與后續(xù)維護建議遷移完成后還可以做一些優(yōu)化讓新/home跑得更快、更穩(wěn)。文件系統(tǒng)掛載選項優(yōu)化 編輯/etc/fstab針對SSD優(yōu)化掛載參數(shù)。將原來的defaults改為更具體的選項UUIDxxxx /home ext4 defaults,noatime,nodiratime,discard,errorsremount-ro 0 2noatime,nodiratime禁止記錄文件的訪問時間減少不必要的寫操作顯著提升I/O性能對SSD壽命也有好處。絕大多數(shù)應用不需要atime。discard啟用TRIM功能讓SSD在刪除文件時能及時回收存儲塊保持長期性能。但注意有些老內(nèi)核或特定SSD搭配discard可能有問題。更穩(wěn)妥的做法是定期用fstrim命令手動TRIM如加入cron每周執(zhí)行。errorsremount-ro當文件系統(tǒng)出現(xiàn)錯誤時以只讀方式重新掛載防止數(shù)據(jù)損壞。定期備份策略 現(xiàn)在數(shù)據(jù)集中在reComputer的大容量SSD上定期備份更為重要。我設置了一個簡單的rsync備份腳本通過cron每周自動執(zhí)行將/home增量同步到另一臺NAS或大容量硬盤上。# 示例備份腳本 /usr/local/bin/backup_home.sh #!/bin/bash rsync -av --delete /home/ usernas-ip:/path/to/backup/location/ --exclude.cache --exclude*.tmp記得給腳本加執(zhí)行權(quán)限并在/etc/crontab中添加任務。監(jiān)控磁盤健康 對于NVMe SSD可以安裝nvme-cli工具定期檢查SMART健康狀態(tài)。sudo apt install nvme-cli sudo nvme smart-log /dev/nvme0關(guān)注percentage_used使用壽命百分比和critical_warning等關(guān)鍵指標。5. 延伸思考這種架構(gòu)的優(yōu)劣與適用場景完成這次遷移后我對這種“計算與存儲分離”的微型工作站架構(gòu)有了更深體會。它并非適用于所有場景但有其獨特的價值。優(yōu)勢突破嵌入式設備存儲瓶頸這是最直接的收益。Jetson等嵌入式開發(fā)板為了尺寸和功耗通常配備有限的eMMC。將/home外遷相當于解除了存儲限制可以存放大型數(shù)據(jù)集、模型文件、日志等。便于數(shù)據(jù)集中管理與備份所有開發(fā)數(shù)據(jù)都在reComputer的單一分區(qū)上備份、遷移、版本管理都變得更簡單。甚至可以在reComputer上搭建GitLab或文件共享服務供團隊協(xié)作。潛在的升級靈活性如果未來reComputer的存儲不夠了可以很方便地更換更大容量的硬盤或者升級為RAID陣列、更快的PCIe 4.0 SSD而無需動Jetson主板。隔離風險Jetson系統(tǒng)盤只保留核心系統(tǒng)變得更“干凈”。即使Jetson系統(tǒng)崩潰需要重刷/home數(shù)據(jù)在另一臺設備上安然無恙重裝系統(tǒng)后重新掛載即可。劣勢與注意事項單點故障轉(zhuǎn)移reComputer成了數(shù)據(jù)單點。如果它的硬盤損壞或設備故障所有數(shù)據(jù)都會丟失。因此必須實施嚴格的備份策略如上面提到的。網(wǎng)絡依賴與性能/home的訪問速度現(xiàn)在受限于網(wǎng)絡帶寬千兆以太網(wǎng)約110MB/s和reComputer的磁盤I/O。對于需要極高磁盤IOPS的應用如高頻數(shù)據(jù)庫讀寫這可能成為瓶頸??紤]使用萬兆網(wǎng)絡或直接通過PCIe連接存儲可以緩解但成本增加。復雜度提升系統(tǒng)從一個自包含的設備變成了兩個設備相互依賴。配置、維護、故障排查的復雜度都增加了。需要確保reComputer在Jetson啟動前就緒。用戶習慣一些應用程序或腳本可能硬編碼了路徑假設。雖然/home掛載點沒變但如果腳本里寫了類似/media/old_home的路徑就會出錯。遷移后需要對所有自動化腳本進行檢查。適用場景建議AI模型訓練與數(shù)據(jù)科學需要在Jetson上處理大量本地數(shù)據(jù)的項目。長期運行的邊緣計算節(jié)點產(chǎn)生大量日志和結(jié)果數(shù)據(jù)需要存儲。多項目、多環(huán)境開發(fā)開發(fā)者需要在同一臺Jetson上切換多個項目每個項目都有獨立的虛擬環(huán)境和數(shù)據(jù)。作為小型服務器將Jetson reComputer組合作為一個輕量級服務器提供持續(xù)服務。不適用場景對啟動速度和可靠性要求極高的工業(yè)現(xiàn)場額外的網(wǎng)絡掛載會增加啟動失敗的風險和啟動時間。設備需要頻繁移動或斷電兩個設備的連接和供電會變得麻煩。存儲IO是絕對性能瓶頸的應用網(wǎng)絡延遲和帶寬可能無法滿足需求。最后我個人在實際操作中的體會是規(guī)劃比操作更重要。花時間設計好分區(qū)方案、網(wǎng)絡配置、備份策略能避免后續(xù)無數(shù)麻煩。這次遷移過程中因為提前做了完整備份我在測試fstab配置時即使不小心寫錯參數(shù)導致啟動失敗也能從容地從備份鏡像恢復心態(tài)完全不一樣。對于在Jetson這類資源受限但計算強大的設備上進行長期開發(fā)的同行來說將/home外掛到一個更可靠的存儲上是一個值得考慮的、能顯著提升幸福感的方案。