2010年9月5日 星期日

網路不穩時, 如何下載大檔? split 與 md5sum 的螞蟻搬家法

如果你和我家一樣採用 256k 的入門等級低速網路服務, 甚至和我家一樣, 遇到溼度較高時網路就不穩, 卻又需要下載很大的檔案 (例如 linux 光碟), 該怎麼辦呢? 這時可以用 wget 下載 -- 它有一個 -c 功能可以 "直接跳到上次斷線的地方, 開始接力下載"。

不過檔案那麼大, 有沒有可能下載過程當中錯了幾個 bytes 呢? 這時就會看出 md5sum 的用處了。 用 md5sum 爬過一個大檔之後, 會產生一小組數字, 效用像是它的指紋或簽名。 當檔案經過搬動或隔了一些時空之後 (例如系統被入侵過), 可以再用 md5sum 爬一次, 如果這一小組數字沒變, 大概就可確認這個檔案內容沒有改變。

但是像 linux 光碟那麼大的檔案, 萬一檢查失敗, 需要重新下載, 不就要抱頭痛哭了嗎? 所以通常我在網路慢/不穩的地方, 都用螞蟻搬家的方式下載大檔:

  1. 在一部網路連線快速穩定的 linux 主機上, 抓回大檔。
  2. 用 split 指令把大檔拆開成一堆小檔。
  3. 把小檔慢慢傳回家裡。
  4. 用 md5sum 檢查每個小檔都 ok。
  5. 把小檔串回大檔。

例如我在連線快速穩定的 linux 主機 penguin.im.cyut.edu.tw 上面, 有一個帳號叫做 greg。 先建立一個空的目錄 pieces/, 然後 cd 進去 -- 不然等一下所產生的一大堆檔案, 會把家目錄弄得亂七入糟。 假設已用 wget 指令抓回 Fedora-13-i686-Live.iso 這個大檔。 在 pieces/ 底下, 先把大檔拆開:
split -b 5m Fedora-13-i686-Live.iso
於是出現 xaa, xab, ... 一直到 xfe 共 135 個 5M 大小的檔案。 然後產生每個檔案的指紋或簽名:
md5sum x?? > original.md5

接下來把所有檔案抓回本地的機器: 在本地機下:
scp greg@penguin.im.cyut.edu.tw:pieces/x?? .
當然, 這個指令最好也是在本地機的一個空目錄底下執行, 以免弄亂家目錄。 過程當中如果斷線或其他原因被打斷, 例如下載到 xbk 一半時斷掉, 可以這樣繼續:
scp greg@penguin.im.cyut.edu.tw:pieces/xb[k-z] greg@penguin.im.cyut.edu.tw:pieces/x[c-z][a-z] .
或者這樣:
scp greg@penguin.im.cyut.edu.tw:pieces/x{b[k-z],[c-z][a-z]} .
(注意不可省略每一句話最後面的句點, 表示 "目前目錄")

很久以後, 所有檔案終於傳完, 再產生一次指紋或簽名: md5sum x?? > downloaded.md5 然後把遠端主機上的 original.md5 抓回來, 兩者比較一下: diff original.md5 downloaded.md5 如果沒有消息, 就是好消息。 (diff 指令只印出兩個檔案有差異的地方。) 如果有任何一個檔案的指紋或簽名不正確, 就只需要重傳那一個檔案。

一切比對正確之後, 再在本地機重建大檔: cat x?? > Fedora-13-i686-Live.iso 就大功告成啦。

沒有留言:

張貼留言