遷移和移動 UNIX 檔案系統(轉)

amyz發表於2007-08-10
遷移和移動 UNIX 檔案系統(轉)[@more@]

  瞭解如何在活動的系統中傳輸整個檔案系統,包括如何建立、複製和重新實現新的檔案系統。如果出現了 UNIX® 磁碟、系統故障或只是填滿了檔案系統,那麼您需要建立新的分割槽和檔案系統,並對相關內容進行復制。甚至可能需要將新的分割槽裝入到適當的地方,以保持重要的檔案和元件的位置。更復雜的情況是,您需要在活動的系統中完成這項工作,需要保持檔案許可權、所有權和可能存在的命名管道以及其他元件。高效地傳輸這些元件並保持所有這些資訊,是遷移過程中的重要部分。

  關於本系列

  通常,UNIX® 管理員都擁有一套常用的輔助程式管理的實用工具、訣竅和系統。本文提供了各種用於簡化各個過程的關鍵實用工具、命令列鏈和指令碼。這些工具中的一部分來自於作業系統,而大部分的訣竅則來源於長期的經驗積累和減輕系統管理員的工作壓力的要求。本系列文章主要專注於最大限度地利用各種 UNIX 環境中可用的工具,包括簡化異類環境中的管理任務的方法。

  移動 UNIX 目錄或檔案系統

  在許多情況下,您可能需要將 UNIX 檔案系統從一個裝置或硬碟分割槽移動到另一個裝置或硬碟分割槽,或者需要移動檔案系統中的內容以釋放所佔用的空間,在處理這些情況的過程中,都需要建立新的檔案系統。可能是因為裝置將會出現故障,或者僅僅只是耗盡了空間。您可以在執行於單使用者模式的系統或者活動的 和執行的系統(需要確保檔案在移動的過程中仍然可用)中完成這項任務。

  在後面的這種情況下,即對活動的檔案系統進行遷移時,您可能需要在某個應用程式執行的過程中對其進行移動。對於上面的這兩種情況,您可能需要移動與系統相關的檔案系統(如 /usr 或 /var),無論是否執行於單使用者模式,該檔案系統都有可能正在被使用。

  在任何檔案系統的移動操作中,您必須確保正確地將資料複製到新的目標。作為一個典型的示例,假定您的系統的檔案/磁碟佈局和使用情況如清單 1 所示。

  清單 1. 示例檔案/磁碟佈局和使用情況

  Filesystem      1K-blocks   Used Available Use% Mounted on

/dev/sda3       7692908  6467756  1225152 84% /

udev          517560    184  517376  1% /dev

/dev/hda1      115377640  1743668 107773060  2% /var/lib/mysql

/dev/hdb1      115380192 14604460 94914696 14% /export/data

/dev/hde1       96132940  3962940 87286644  5% /export/home

/dev/hde4       22960280  133484 21660480  1% /tmp

none          517560     0  517560  0% /dev/shm

  正如您在清單 1 中所看到的,根檔案系統已使用了百分之八十四,您可能應該將處於單個分割槽的根檔案系統中的目錄移動到新的分割槽或裝置,以確保根檔案系統不會被佔滿。

  最好是移動顯著影響希望釋放空間的檔案系統中的具有特定用途的單個目錄。例如,在這個示例中,您可能希望將 /var 或 /usr 目錄移動到它自己的檔案系統。移動多個更小的目錄,效率會比較低。您所需要做的只是輕鬆地移動單個目錄以釋放所佔用的空間。

  在有些情況下,您可能需要將現有的分割槽移動或複製到一個新的位置(例如,在裝置可能出現故障的情況下)。這裡,已經解釋了究竟是應該選擇目錄還是現有的檔案系統。

  在本文中,假設您已經新增了一個新的硬碟裝置或具有備用的硬碟裝置或分割槽,以用作目錄或檔案系統的移動目標。

  移動資料的快速指導

  移動檔案系統或將現有的目錄移動到新的檔案系統,基本操作序列如下:

  • 選擇要進行復制的資料。
  • 建立一個新的分割槽。
  • 在該分割槽上建立一個新的檔案系統。
  • 將該分割槽裝入到一個臨時目錄。
  • 將資料複製到這個臨時目錄。
  • 對原始目錄進行重新命名。
  • 建立新的裝入點。
  • 裝入這個檔案系統。

  理想情況下,在完成這些操作之後,您應該重新啟動計算機,儘管這並不總是必需的或可能的,但是應該在允許的情況下儘早重新啟動計算機。

  讓我們對序列中的每個步驟進行更仔細的研究。

  建立新的分割槽和檔案系統

  在建立新的分割槽和檔案系統之前,首先確保可用大小和空間與要移動到新的檔案系統中的檔案/目錄的大小相匹配。要完成這項工作,最簡單的方法是使用 du 工具來確定當前檔案/目錄的大小。例如,如果您打算對示例系統中的 /usr 目錄進行移動,可以使用如清單 2 所示的命令。

  清單 2. 移動示例系統中的 /usr 目錄

  $ du -sk /usr

3923068 /usr

  -s 選項確保生成整個目錄的摘要資訊,而不是所有內容的資訊,並且 -k 選項確保以 KB 為單位顯示目錄大小。從上面的輸出結果中您可以確定,需要至少 4GB 大小的新的分割槽。

  如果您將現有的檔案系統(而不是現有的檔案系統中的單個目錄)移動到一個更大的分割槽,那麼可以使用 df 的輸出來確定當前檔案系統的大小。

  在知道了其大小之後,理想情況下,您應該建立一個比所需大小大百分之二十五的新的分割槽,並且至少要大百分之十。對於上面的示例檔案系統,您至少需要建立一個 5GB 大小的新的分割槽。

  要建立新的分割槽和檔案系統,需要使用適合於您的作業系統的工具。例如:

  • 在 Linux® 中,您需要使用 fdisk 對物理硬碟上的各個分割槽進行配置,並使用 mke2fs 或 mkfs.* 建立命令中的一個,以便在新的分割槽上建立合適的檔案系統。
  • 在 Solaris SPARC 系統中,可以使用 format 來建立並配置分割槽。在 Solaris x86 系統中,在使用 format 對 Sun 分割槽表進行配置之前,您可能還需要使用 fdisk 來配置磁碟分割槽。然後,您可以使用 newfs(或某個檔案系統特定的命令)來建立檔案系統。
  • 在 AIX® 中,可以使用 mkvg、chpv 或某個其他的卷管理工具為新的分割槽建立合適的分割槽或卷組。然後,可以使用 crfs 建立檔案系統。

  建立了檔案系統之後,在對資料進行復制時,需要在進行載入的新檔案系統中建立一個新的目錄。例如,我個人喜歡在相似的位置建立新的檔案系統,並且透過名稱將其標識為臨時檔案系統。

  對於上面的 /usr 示例,我將建立一個新的目錄 /mnt/usr.tmp,並將新的檔案系統載入到該目錄。

  複製資訊

  事實上,複製資訊可能是整個過程中最簡單的部分,但是選擇合適的工具將直接影響到資訊傳輸的有效性和效率。然而,您應該確保將檔案複製到正確的位置,要避免覆蓋現有的資料。

  有許多種不同的方法可以完成這個任務,但是主要的兩種解決方案是使用基本的 cp 工具或 tar 工具。前者是一種非常快速的方法,但是在某些作業系統中,對於一些非標準的檔案,如管道和裝置,可能會出現問題。tar 工具可能是一種速度較慢的替代方法,但是在傳輸其他型別的檔案時,它更加可靠並且提供了關於複製過程的更加視覺化的反饋資訊。

  無論您使用哪一種方法,都應該確保不要對原始檔系統中的任何檔案進行更新。請記住,您所建立的任何副本僅包含在進行復制操作時對應的檔案中所包含的資料。如果在進行復制的過程中對該檔案系統中的檔案進行了更新,那麼新的檔案系統中的檔案可能是不完整的並且受到了損壞。

  使用 cp

  cp 工具提供了一個遞迴複製選項 (-r),使用該選項可以將所有的檔案、目錄以及這些目錄中的檔案全部複製到目標。您還可以使用 -p 選項來保持所有權和複製的檔案的許可權。如果您希望確保新的檔案系統保留原始檔系統的安全細節,那麼這是至關重要的。在大多數情況下,這樣做是必須的。

  要將檔案從現有的目錄複製到新的位置,請執行以下步驟:

  1. 改變到新的目標目錄並確認位於正確的位置(請參見清單 3)。

      清單 3. 改變目標目錄

      $ cd /mnt/usr.tmp

    $ pwd

    /mnt/usr.tmp

      

  2. 將檔案從舊的目錄複製到當前(新的)目錄,如清單 4 所示。

      清單 4. 將檔案複製到新的目錄

      $ cp -pr /usr/* .

      

  您應該進行快速的驗證以確保成功地複製了這些檔案。簡單的 ls 即可以得到清楚的指示(請參見清單 5)。稍後您將瞭解到更詳細的檢查方法。

  清單 5. 驗證成功地複製了這些檔案

  $ ls -l /usr

total 238

drwxr-xr-x  2 root   bin     1024 Apr 20 13:11 4lib/

lrwxrwxrwx  1 root   root      5 Apr 20 12:40 5bin -> ./bin/

lrwxrwxrwx  1 root   root      9 Apr 20 12:34 X -> ./openwin/

drwxr-xr-x  6 root   bin     512 Apr 20 12:42 X11/

lrwxrwxrwx  1 root   root      3 Apr 20 12:41 X11R6 -> X11/

lrwxrwxrwx  1 root   root     10 Apr 20 13:03 adm -> ../var/adm/

drwxr-xr-x 10 root   bin     512 Apr 20 12:59 apache/

drwxr-xr-x  8 root   bin     512 Apr 20 12:47 apache2/

drwxr-xr-x  8 root   bin     512 Apr 20 12:53 appserver/

drwx------  8 root   bin     512 Apr 20 12:53 aset/

drwxr-xr-x  4 root   bin    16384 Apr 20 13:17 bin/

drwxr-xr-x  4 root   bin     512 Apr 20 12:33 ccs/

...

lrwxrwxrwx  1 root   root     10 Apr 20 12:32 tmp -> ../var/tmp/

drwxr-xr-x  4 root   bin     2048 Apr 20 13:00 ucb/

drwxr-xr-x  4 root   bin     512 Apr 20 13:17 ucbinclude/

drwxr-xr-x  3 root   bin     1024 Apr 20 13:17 ucblib/

drwxr-xr-x  7 root   bin     512 Apr 20 13:03 vmsys/

drwxr-xr-x  5 root   bin     512 Apr 20 12:44 xpg4/

drwxr-xr-x  3 root   bin     512 Apr 20 12:40 xpg6

  如果您發現沒有正確地複製某些檔案或者符號連結和其他特殊型別的檔案,那麼您可能需要嘗試使用 tar。

  使用 tar

  與 cp 相比,tar 工具提供了許多的好處。首先,也是最重要的,對於非標準的檔案型別,它通常更加可靠。其次,因為它能夠提供關於複製的檔案的視覺化反饋資訊,所以使用它將檔案複製到新的系統會更加方便。最後一點也非常重要,您可以使用 tar 建立檔案系統的存檔檔案,萬一在出現問題時,該檔案可以作為源目錄/檔案系統的備份。在處於單使用者模式的計算機的使用者檔案系統中,這種 tar 檔案方法可以用來建立新的檔案系統內容,而無需將新的目標裝入到臨時目錄裝入點。

  使用 tar 進行檔案複製的最好的方法是,透過管道將 tar 建立的檔案傳遞到位於新的位置進行檔案提取的另一個 tar。清單 6 中給出了一個這樣的示例。

  清單 6. 使用 tar 進行檔案複製

  $ cd /usr

$ tar cfp - ./* |(cd /mnt/usr.tmp; tar xvfp -)

  第一個 tar 中的 c 引數告訴 tar 建立一個存檔。v、f 和 p 選項分別指定輸出詳細資訊(顯示正在新增或提取的檔案)、對檔案(而不是磁帶裝置)進行寫入/讀取、保持許可權和所有權。

  清單 6 中的命令列能夠正常工作,這是因為在管道的後半部分中,在從標準輸入讀取管道的前半部分中建立的 .tar 檔案之前,首先改變到了目標目錄。

  如果您需要建立一個 .tar 檔案並使用這種方法,而不是執行直接的複製,那麼您必須擁有一個能夠容納源目錄中所有檔案的檔案系統。清單 7 介紹了進行復制的過程。

  清單 7. 進行復制的過程

  $ cd /usr

$ tar cfp /tmp/usr.tar ./*

$ cd /mnt/usr.tmp

$ tar xvfp /tmp/usr.tar

  無論使用哪一種解決方案,您將在每個檔案複製到/複製出存檔檔案時獲得相應的報告,假設您使用了 v 命令列選項(請參見清單 8)。

  清單 8. 列印出複製過程

  a ./4lib/ 0K

a ./4lib/libX.so.1.0 symbolic link to ./libX11.so.4.3

a ./4lib/libX11.so.4.3 216K

a ./4lib/libXaw.so.4.0 208K

a ./4lib/libXmu.so.4.0 72K

a ./4lib/libXol.so.3.1 1056K

a ./4lib/libXt.so.4.1 264K

a ./4lib/libce.so.0.0 48K

a ./4lib/libdeskset.so.0.1 64K

a ./4lib/libdga.so.1.0 40K

a ./4lib/libhelp.so.1.0 24K

a ./4lib/libolgx.so.3.1 56K

a ./4lib/libtt.so.1.1 848K

a ./4lib/libttstub.so.1.1 32K

a ./4lib/libxview.so.3.73 1328K

a ./4lib/libdl.so.1.0 symbolic link to ../../lib/libdl.so.1

a ./4lib/libc.so.1.9 403K

a ./4lib/libc.so.2.9 402K

...

  使用 tar 和直接檔案系統交換

  要將檔案系統的內容複製到新的位置,而無需建立臨時裝入點,您必須首先擁有足夠容納源目錄中所有檔案的空間。

  如果使用新的檔案系統來替代一個目錄,可以執行以下操作:

  1. 和前面一樣,建立新的分割槽和檔案系統。
  2. 建立源目錄的 .tar 檔案(請參見清單 9)。

      清單 9. 建立 .tar 檔案

      $ cd /home

    $ tar cfvp /tmp/home.tar

      

  3. 對源目錄進行重新命名(請參見清單 10)。

      清單 10. 對源目錄進行重新命名

      $ cd ..

    $ mv home home.old

      

  4. 建立目錄,並將其許可權和所有權設定為與原始目錄相同。
  5. 將新的檔案系統裝入到這個新的目錄。
  6. 提取 .tar 檔案(請參見清單 11)。

      清單 11. 提取 .tar 檔案

      $ cd home

    $ tar xvfp /tmp/home.tar

      

  如果您需要為現有的檔案系統改變分割槽(如清單 10 中所示),那麼命令序列是類似的,但是您需要解除安裝現有的檔案系統,而不是對目錄進行重新命名(請參見清單 12)。

  清單 12. 為現有的檔案系統改變分割槽

  $ cd ..

$ umount /home

  這種方法仍然是安全的,這是因為您擁有舊分割槽上原始檔系統的完整副本。無論在哪一種解決方案中,您都沒有刪除內容或源資料。

  對複製進行驗證

  無論使用 cp 還是 tar,您始終都應該驗證複製過程是否成功完成。儘管 tar 對所複製的檔案進行了證實(使用 v 選項),但是您應該確保在新的檔案系統中正確地建立了這些檔案。

  首先,檢查 du 對舊的和新的系統的輸出(請參見清單 13)。

  清單 13. 檢查 du 的輸出

  $ du -sk /usr

3923068 /usr

$ du -sk /mnt/usr.tmp

3923068 /mnt/usr.tmp

  這兩個數字應該是相等的,然而,根據新檔案系統的型別以及舊檔案系統/目錄和新檔案系統/目錄中對應的檔案和目錄的分配大小的不同,您可能會發現它們在大小上有些細微的差異。

  另一種好的測試方法是,比較源和目標檔案/目錄的數目。您可以使用簡單的 find command 來完成這項工作,如清單 14 所示。

  清單 14. 比較源和目標檔案/目錄的數目

  $ find /usr |wc -l

347001

$ find /mnt/usr.tmp |wc -l

347001

  如果您將檔案從一個檔案系統複製到另一個檔案系統,那麼還有一種好的測試方法,即比較索引節點數目,這將顯示分配了多少個索引節點。如果您將檔案從一個檔案系統複製到另一個與其型別完全相同的檔案系統,那麼所使用的索引節點的數目應該是相等的。可以使用帶 -i 命令列選項的 df 命令獲取索引節點的統計資訊,或者在傳統的 UNIX 系統中,不帶引數的 df 可以輸出建立“檔案”的數目。

  清單 15 中的示例來自於 Linux 系統。

  清單 15. 比較索引節點數目

  $ df -i /usr

Filesystem      Inodes  IUsed  IFree IUse% Mounted on

/dev/sda3       977280 411959 565321  43% /

  清單 16 中的示例來自 Solaris。

  清單 16. 在 Solaris 中比較索引節點數目

  $ /bin/df /usr

/usr        (/dev/dsk/c0t0d0s3 ): 9076010 blocks  863695 files

  更新系統以反映新的組織結構

  此時,您應該已經擁有了一個新的檔案系統,其中包含了要移動到這個新檔案系統的檔案系統或目錄的副本。現在,您應該對系統檔案(特別是檔案系統裝入資訊)進行更新,以反映新的結構。該資訊儲存在 /etc/fstab、/etc/vfstab 中,或透過特定的管理工具來訪問,如 HP-UX 上的 SAM。

  如果您需要對現有檔案系統中的目錄進行遷移,可以執行下面的操作:

  1. 對原始目錄進行重新命名。
  2. 建立新的目錄。
  3. 使用 chown 和 chmod 設定新目錄的所有權和許可權。

  理想情況下,您應該重新啟動系統以確保使用新的佈局。如果您將檔案系統從一個裝置遷移到另一個裝置,那麼必須重新啟動。通常,您可以解除安裝現有的檔案系統,特別是當它為系統目錄(換句話說,/var 或 /usr 下的系統目錄)時。

  如果無法進行重新啟動,可以手動地將新的系統裝入到新的裝入點,然後儘可能早地進行重新啟動。

  在重新啟動並證實一切正常工作之後,可以刪除舊的目錄或重用舊的分割槽。

  結束語

  在許多情況下,需要對活動或非活動的 UNIX 檔案系統進行復制。可能是因為耗盡了磁碟空間,所以檔案系統需要更大的分割槽來安裝軟體,甚至是因為硬體將會出現故障。在這些情況下,您需要使用本文中介紹的技巧,將現有的檔案複製到新的檔案系統。

  這種複製操作本身存在一定的陷井,即對活動的檔案系統進行復制可能是有風險的,特別是在開啟了多個檔案的情況下。您還應該注意,務必避免用要複製的檔案意外地覆蓋分割槽或現有的檔案。然而正如您所看到的,經過周密的考慮,可以高效地、可靠地對檔案進行遷移,以充分利用更大的空間,即使是在活動的系統中也可以實現。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-941658/,如需轉載,請註明出處,否則將追究法律責任。

相關文章