周五的時候我的服務(wù)器突然內(nèi)核報錯,連不上 ssh 也 無法重啟。經(jīng)過了迂回的各種搶救方案,終于救回了一千多張圖床的的圖片,心有余悸,記錄一下救援過程,順便折騰了一套新的圖床方案?! ∵@臺服務(wù)器大約已經(jīng)穩(wěn)定運行了一年半,運行了我許多重要服務(wù),還有我博客圖床的一千多張無備份的圖片通過 Docker Volume 持久化在主機上?! ∑鋵嵨抑两袢圆恢莱隽耸裁磫栴},早上剛好需要更新服務(wù)器上的我運行的
發(fā)布日期:2024-07-12 10:43瀏覽次數(shù):
周五的時候我的服務(wù)器突然內(nèi)核報錯,連不上 ssh 也 無法重啟。經(jīng)過了迂回的各種搶救方案,終于救回了一千多張圖床的的圖片,心有余悸,記錄一下救援過程,順便折騰了一套新的圖床方案。
這臺服務(wù)器大約已經(jīng)穩(wěn)定運行了一年半,運行了我許多重要服務(wù),還有我博客圖床的一千多張無備份的圖片通過 Docker Volume 持久化在主機上。
其實我至今仍不知道出了什么問題,早上剛好需要更新服務(wù)器上的我運行的 RSSHub 實例的鏡像版本,于是想著干脆把所有服務(wù)都更新到最新吧,于是一通 docker pull 和 docker-compose 重啟操作,前面的都沒什么問題,直到最后一個服務(wù)突然啟動容器失敗,報了一個類似 not enough space 的錯誤,我心想著可能是下載的鏡像太多了導(dǎo)致磁盤滿了,于是又一通 docker image prune --all、docker volume prune 和 docker system prune 操作,釋放出了接近 10G 的空間,重試,依然不行。
作為一個有且僅有一點服務(wù)器運維經(jīng)驗的開發(fā)來說,我第一反應(yīng)想到的就是重啟,未曾想,這才是一天噩夢的開始。
沒想到重啟后我的 Uptime Kuma 提醒我所有服務(wù)都下線了,也無法再通過 ssh 連上機子了。
于是趕緊登錄到服務(wù)器的線上控制臺,發(fā)現(xiàn)內(nèi)核報錯,無法啟動,強制重啟也依然不生效,并且趕緊求援我的 DevOps 朋友們。
STRRL 說應(yīng)該 rootfs 出現(xiàn)了問題,不過鑒于我的服務(wù)器云廠商并沒有提供什么高級啟動等額外的功能,這條路堵住了。但想到我有一年半毫無備份的圖床數(shù)據(jù)在上面,依然不甘心,于是開始想辦法搶救數(shù)據(jù)。
研究了一下服務(wù)器的控制臺,發(fā)現(xiàn)它提供一個大約每周一次的備份,并且可以一鍵將備份轉(zhuǎn)為快照,最近的一次在 6 月 22 日,還好。我首先想到的是直接通過快照恢復(fù)機器,如果是我今天的操作導(dǎo)致了什么配置問題,那理應(yīng)一周前的快照是能正常啟動的,于是滿懷信心地等待了十幾分鐘的快照恢復(fù),結(jié)果報了同樣的錯誤。依然不死心,把 6 月 15 的備份也恢復(fù)了一下,還是不行。
這下意識到了事情的嚴重性,甚至做好了數(shù)據(jù)全部丟失的最壞打算,同時開始檢索類似情況,最后發(fā)現(xiàn)服務(wù)器的快照鏡像是可以下載的。
于是先下載了快照鏡像,得到了一個 .disk 文件,這個文件應(yīng)該是一個專屬格式,可以通過 Virtual Box 的命令行工具 vboxmanage convertfromraw 來進行格式轉(zhuǎn)換,但官網(wǎng)下載后發(fā)現(xiàn)并不支持 M 芯片的 Mac,4166am金沙于是又在之前的老 19 款 Intel Mac 上安裝并且執(zhí)行轉(zhuǎn)換,得到了一個 .vmdk 文件。
轉(zhuǎn)換完成后將這個 .vmdk 作為一個磁盤掛載到 Virtual Box CentOS 虛擬機上,發(fā)現(xiàn)依然報同樣的錯誤。
于是另辟蹊徑,發(fā)現(xiàn) 7-Zip 軟件支持常見虛擬機格式的解壓,但客戶端只有 Windows 版本。
雖然按理說可以在 macOS 上使用命令行版本 p7zip 來執(zhí)行,但我解壓時會報錯,所以又堵住了一條路,想了個曲線救國的方式,通過虛擬機下載了一個 Win11,下載了 7-Zip 軟件直接解壓成功了。
問題又來了,解壓得到的是 1.img、2.img 這樣格式的 Linux 磁盤鏡像文件,macOS 上無法加載,又用 fuse 折騰了一下,還是無法加載。
期間倒也是有好消息,在全網(wǎng)搜羅的時候發(fā)現(xiàn)了一個數(shù)據(jù)恢復(fù)軟件 UFS Explorer,嘗試了一下可以正常加載,只是超過 768k 的文件則需要付費,當然沒打算,看到文件確實是可以識讀之后心里就安心了許多,至少數(shù)據(jù)還在,剩下都是技術(shù)問題了。
通過以上命令成功把我的 img 磁盤鏡像掛載到了 OrbStack 的 Ununtu 機器上。
緊接著趕緊打個 tar 包,然后通過 rsync 傳到了我本地的 Mac 上,本機解壓后,終于看到了我所有的圖片。
但由于這一次的遭遇,不再信任服務(wù)器單機部署的圖床穩(wěn)定性了,花了半天折騰了一套新的免費圖床系統(tǒng) —— 「從零開始搭建你的免費圖床系統(tǒng) (Cloudflare R2 + WebP Cloud + PicGo)」。
至于現(xiàn)有的數(shù)據(jù)傳到 r2,我則是使用了 rclone 來進行上傳,徹底完成遷移,大功告成!
經(jīng)過這么一次,我也開始重新考慮了服務(wù)部署、數(shù)據(jù)安全等問題,準備還是將一些重要的數(shù)據(jù)上云而不再依賴單機,也繼續(xù)把一些服務(wù)遷移到 fly.io 、Zeabur 等 serverless 平臺。