全部博文(1015)
分类:
2009-12-09 22:11:08
兩年以前你用 20GB 的硬碟安裝了一台 Linux server。當時,你覺得 20GB 的空間相當大,十年之內一定不會有問題。
但是,在使用這 Linux server 兩年的期間裡,因實際的需要,你不斷的增加與更新使用者所需要的網路服務軟体。你公司的員工人數越來越多,使用者的帳號也繼續不斷的在增加。 兩年前你給每一位使用者 20MB 硬碟空間,當時評估 20MB 為一個使用者的私人資料應該很夠,沒有想到,兩年之後 20MB 的硬碟空間實在不夠用了。
以現在的需求,20GB 的硬碟空間實在太小了。你想換一個比較大容量的硬碟。你如何去做?
你可能想到一種可行的解決構想,就是將 20GB 的整個硬碟,純粹給 server 使用,另外加一個容量在 40GB 以上的新硬碟,專門給使用者儲存私人的資料,應該是沒有問題了。做法是將所有使用者所使用的硬碟空間搬移到新的硬碟。將 /home 複製到新硬碟不是很難的事。
但是你要好好估計一下。你的 Linux server 服務項目,會因需要陸續的增加與更新,兩年之後,是否 20GB 給 server 使用,夠用嗎?想來想去,將整個 Linux 系統搬移到一個大容量的硬碟是最好的辦法。
如何搬?
你第一個反應可能是:在新 40GB 的硬碟安裝一個新的 Linux 系統。然後將舊硬碟的所有使用者帳號和資料複製到新硬碟就應該能解決這個問題了。這樣你不需要在新的 Linux 系統重新建立所有使用者的帳號。
這樣的想法,事實上不夠周到。沒有錯,重新安裝一個 Linux 系統是很簡單。也不需要很多的時間。不到二十分鐘就可以安裝一個新的 Linux 系統了。然後從舊硬碟的使用者帳號和資料複製到新硬碟也只不過需要幾分鐘的時間。
但是你可能沒有想到一個很重要的事。在這兩年的時間內,因了軟体的 bug 或安全的漏洞你已經更新了幾種軟体、更新了多少次?核心﹝kernel﹞應該也更新了三、四次,不是嗎?
你要重新安裝一個 Linux 系統,你安裝的是舊版本的軟体。你必須一個一個的更新這些軟体。但是你還記得你更新的是那一些軟体嗎?如果一個軟体更新了四次,你不能將舊版的軟体直接用第四個更新版來更新。可能第二更新版更改了一些設定值而第三和第四更新版已假設了這些更改,如果你從舊版的軟体直接更新到第四更新版就會發生問題。意思是說,你要從第一更新版開始一個一個的更新以致到第四更新版。不能跳過去。
這樣做是很花時間的。如果你曾將所有的更新都紀錄下來,它對你會有很大的幫助。但是一個一個的更新所有需要更新的軟体,仍然會花相當多的時間。
你現在的 Linux 系統不是已經很穩嗎?你對現在這個系統不是很滿意嗎?如果可以把這 Linux 系統複製到新的硬碟那該有多好!
在 Windows,我不敢說,但是在 Linux 我可以很確定的說一定可以把 Linux 系統從一個硬碟複製到另一個不同容量的硬碟。
現在我要談的就是這個主題。但是在討論之前,我必須列出有關討論的一些資訊。
註解:
kernel-2.6.20 到來時,所有的硬碟裝置名稱為 /dev/sdx。以前 ide 硬碟裝置名稱為 /dev/dhx,SCSI 硬碟裝置名稱為 /dev/sdx。以下是以前舊的硬碟裝置名稱:
EIDE0 primary /dev/hda EIDE0 secondary /dev/hdb EIDE1 primary /dev/hdc EIDE1 secondary /dev/hdd
在新裝置名稱規矩,第一個硬碟裝置名稱為 /dev/sda,第二個硬碟 (不管是接在哪裡是) 裝置名稱為 /dev/sdb,等。
想看看所有連接的硬碟裝置:
fdisk -l
20GB,分割為:
sda1 : 50MB /boot partition
sda2 : 19.5GB / (root) partition
sda3 : 512MB swap partition
40GB,分割為:
sda1 : 50MB /boot partition
sda2 : 39.5GB / (root) partition
sda3 : 512MB swap partition
請注意,雖然舊和新硬碟的 partition 結構可以不一樣,但是會比較麻煩。你必須編輯新硬碟的 /etc/fstab 來反映出新的分割區,複製的方式也有一點不一樣,也要設為新分割區的掛點。最好還是保持同樣的 partition 結構。Partition 的大小不一樣沒有關係。
將 Linux 系統從一個硬碟複製到另一個硬碟之方法如下:
我們做這種工作算是蠻低階的工作。最好是在 single user mode﹝一人模式﹞進行這種工作。下以下指令進入 single user mode。
init 1
fdisk /dev/sdb
我們分割時會用到以下指令:
m: 顯示指令目錄
p: 列出硬碟分割表
n: 建立新分割區
a: 切換可啟動旗標
t: 改變分割系統編號
w: 將分割表儲存﹝寫入﹞到硬碟
q: 離開 fdisk
現在把新硬碟分割為:
/dev/sdb1 50MB 為 Linux,編號 83
/dev/sdb2 39.5GB 為 Linux,編號 83
/dev/sdb3 512MB 為 linux swap,編號 82
mke2fs -j /dev/sdb1
mke2fs -j /dev/sdb2
mkswap /dev/sdb3
mkdir /new
mount /dev/sdb2 /new
mkdir /new/boot
mount /dev/sdb1 /new/boot
mkdir /new/proc使用 Fedora ﹝從 Fedora Core 2 開始﹞也需要加:
mkdir /new/selinux
mkdir /new/srv
mkdir /new/sys
/boot 的複製方式是有一點不一樣因為 /boot 事實上是一個獨立的分割區﹝sdb1﹞掛在 /new/boot。 在上面我們以掛了,我們只 /boot 下所有檔案和目錄複製過去。
cp -a /boot/* /new/boot/
在標準 RedHat/Fedora 的安裝,以下檔案和目錄必須複製到新硬碟:
cp -a /aquota.user /new/
cp -a /bin /new/
cp -a /dev /new/
cp -a /etc /new/
cp -a /home /new/
cp -a /initrd /new/
cp -a /lib /new/
cp -a /mnt /new/
cp -a /root /new/
cp -a /sbin /new/
cp -a /tmp /new/
cp -a /usr /new/
cp -a /var /new/
在你的 Linux 系統,可能還有其它的檔案和目錄必須複製到新硬碟。你可以下「ls -l /」指令看看。
我們用 cp 的 -a 參數主要的目的是複製檔案和目錄時保持檔案/目錄的屬性和擁有者的定義。這樣,除了硬碟的大小不同,新硬碟就是舊硬碟的映像。
cd /new
chroot /new
grub
root (hd1,0) # hd1:第二硬碟,0:第一分割區。exit # 離開 chroot。
setup (hd1) # 在第二硬碟的 MBR 安裝 grub。
quit # 離開 grub。
很大的可能,在 /etc/fstab 和 /boot/grub/grub.conf 分割區的掛點已經使用 LABEL 而不用裝置名稱。如果這樣就需要命名新硬碟的分割區。
e2label /dev/sdb2 /
e2label /dev/sdb1 /boot
mkswap -L swap /dev/sdb3
halt