本文是假設您已經使用 Linux 一段時間,隨著硬件的升級或空間不足,必須要升級 Linux 系統,抑或是想提供更多的網絡服務給用戶,因應這個需求而編寫的。
一、調整虛擬內存:
在 Linux 上是使用 swap 技術將硬盤空間挪用為虛擬內存,當服務器建置完成使用一段日子以後,有可能會擴充硬件,其中又以擴充主存儲器來改善執行效能最為普遍,在這種情形下,就需要增加 swap 虛擬內存的容量。
由於 swap 跟 LVM 機制一樣能將多塊磁盤分割區虛擬成一塊,因此我們並不需要將舊的 swap 扇區先移除,或是直接修改 swap 扇區大小,而是可以采用追加 swap 扇區的方式來配置。做法如下:
mkswap /dev/hdx2(將新扇區格式化為 swap)
swapon /dev/hdx2(立即啟用新的 swap 扇區)
修改 /etc/fstab 加入下面這一行
/dev/hdx2 swap swap defaults 0 0
如果硬盤已經沒有剩余空間,而且無法加裝新的硬盤,這種情況下,我們沒辦法變更 swap 扇區來滿足需求,但是可以挪用已經掛載的分割區一部分空間,以檔案的形式來追加 swap 虛擬內存的容量:
dd if=/dev/zero of=/swapfile bs=1024 count=65536(建立 /swapfile 檔案,單位為 KB,所以這是 64MB)
mkswap /swapfile(將該檔案空間格式化為 swap)
swapon /swapfile(立即啟用新的 swap 檔案)
修改 /etc/fstab 加入下面這一行
/swapfile swap swap defaults 0 0
Linux 並沒有辦法搬移 swap 扇區,如果想要把 swap 作成單一一個扇區,必須先將舊 swap 扇區移除,再加入新的 swap 扇區,如果先加入新扇區,則新舊扇區會聯合運作,造成舊扇區無法移除的現象。移除 swap 扇區的方法如下:
swapoff /dev/hdx2(關閉 swap 功能)
修改 /etc/fstab 移除 /dev/hdx2 那一行
二、加載硬盤與檔案系統轉換:
當硬盤不敷使用時,需要加掛新的硬盤到系統上,加掛硬盤的做法很簡單,先使用 fdisk 或 parted 將扇區分割好,接著使用 mkfs 指令來格式化硬盤,最後修改 /etc/fstab 讓系統重開機後能自動掛載新的硬盤。fdisk 的使用方法如下:
#> fdisk /dev/hdb(假設要加掛的硬盤,是接在第一條排線的第二個位置)
The number of cylinders for this disk is set to 2498.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): m
Command action
a
b
c
d
m
n
o
p
q
s
t
u
v
w
x toggle a bootable flag
edit bsd disklabel
toggle the dos compatibility flag
delete a partition
list known partition types
print this menu
add a new partition
create a new empty DOS partition table
print the partition table
quit without saving changes
create a new empty Sun disklabel
change a partition's system id
change display/entry units
verify the partition table
write table to disk and exit
extra functionality (experts only)
Command (m for help):
先用 l 指令列出所有已分割好的扇區,你可以使用 d 指令將不要的扇區刪除,或使用 t 指令將扇區的檔案系統改為 Linux 用的 82(swap) 或 83(ext2,ext3),假如硬盤是空的尚未分割任何扇區,這時候請用 n 指令建立扇區,所有需要的修改完成後,輸入 w 指令將設定儲存起來,然後重開機讓修改生效,以便進行後續動作。
扇區分割好了以後,必須針對每個不同檔案系統將扇區格式化,swap 扇區格式化的方法前面已經提過,而作為一般用途的扇區,建議直接格式化為 ext3:
/sbin/mkfs -t ext3 /dev/hdb1(將空白扇區格式化為 ext3)
ext3 是從 ext2 改良而來,主要是挪用 ext2 一些 inode 拿來做成日志文件(.journal),因此它與 ext2 只有些微不同,兩種系統也可以很容易互相轉換(轉換完仍需自行修改 /etc/fstab 組態):
/sbin/mke2fs /dev/hdb1(將空白扇區格式化為 ext2)
/sbin/tune2fs -j /dev/hdb1 (將 ext2 轉為 ext3,轉換時順便建立日志文件)
當新扇區格式化好了之後,就可以將它掛載上來,您可以直接指定要掛載的扇區型態:
/sbin/mount -t ext3 /dev/hdb1 /mount/point(指定掛載 ext3 扇區到 /mount/point 目錄)
或先修改 /etc/fstab 然後再掛載,修改 /etc/fstab 的方法是插入下面這一行:
/dev/hdb1 /mount/point ext3 defaults 0 0
接著掛載時不需指定扇區型態及裝置名稱,指令如下:
/sbin/mount /mount/point
已經格式化為 ext3 的扇區,如果要掛載到 6.X版以前的系統上使用,必須將格式改回 ext2,變更方法如下:
/sbin/tune2fs -O ^has_journal /dev/hdb1 (通知 kjournald 關閉日志文件功能)
mount -t ext2 /dev/hdb1 /mount/point(將 ext3 掛載為 ext2)
rm -f .journal(刪除日志文件)
將 ext2 轉換成 ext3 有許多好處,包括速度快、安全、高可用性、修復省時......等等優點。簡單的講,所謂 journal 就是把文件讀寫動作逐項紀錄下來,當硬盤未正常關機(unclean shutdown)時,不需要檢查硬盤(e2fsck)直接可以掛載(mount),如果以 fsck 強制修復硬盤,則直接從日志文件讀取需要修復的扇區資料,而不需要整顆硬盤都檢查。由於這些優點,我們也建議不要再使用舊的 ext2 格式。
掛載好後,如需進行數據移轉,可以使用 cp -Rp 指令,參數 R 表示連子數據夾一起備份,參數 p 表示要保留所有檔案權限設定,例如:cp -Rp /home /home1
三、升級磁盤系統:
LVM 邏輯扇區
事實上新版 Linux 由於提供 LVM (Logical Volume Manager)功能,可以將多個扇區組合成一個 VG(Volume Group),然後將一個 VG 掛載成單一一個目錄,這樣就可以做到扇區合並的效果,省掉轉移資料的麻煩,要使用這項功能,首先在安裝 Linux 時,必須先將可能會事後擴充的扇區做成 LVM 扇區型態(代號是 8e),如果您在安裝時沒有啟用這項功能想要事後補做,那樣可行不通,因為修改扇區型態將會造成所有資料遺失!
如果是新硬盤上的扇區,請用 fdisk 修改好扇區型態後,利用以下指令來做起始化的動作,在底下的例子裡,我們會把新硬盤上的三個扇區合並成一個,並在稍後加入第四個扇區以擴充容量(透過這些步驟,可以了解當初 Linux 安裝程序幫我們裝 LVM 時,到底做了哪些事情):
/sbin/pvcreate /dev/hdb1
/sbin/pvcreate /dev/hdb2
/sbin/pvcreate /dev/hdb3
然後需建立 VG,建立好的 VG 將被視為一個裝置名稱,事後可以用 /dev/VG_name 來引用它:
/sbin/vgcreate new_home /dev/hdb1 /dev/hdb2 /devhdb3
對於 VG 這種裝置來說,仍必須進一步在上面分割邏輯扇區才能使用,我們不妨把 VG 想象成是一個外掛的 SCSI 磁盤陣列,對主機板來說,他被視為單一一顆硬盤(LVM 並不是真正的 RAID 系統,因為它只能實作 RAID0,事實上 2.4.x 版的 kernel 另外還提供 softRAID 功能,在後面說明)。既然它是一種裝置,當然無法直接掛載使用,必須先進一步作虛擬分割及格式化的動作, 下面的例子裡,我們僅分割單一一個扇區:
/sbin/lvcreate -L 30g new_home(將 new_home 虛擬裝置中的 30 GB 空間割成一個虛擬延伸扇區)
使用 lvcreate 指令除了可以分割l邏輯延伸扇區(所謂延伸是指可以動態變大,當然變小也是可以,但應該沒有人會這麼做),還可以分割一種稱為快照的扇區,這可以用來自動備份某塊邏輯延伸扇區,而這種備份是 自動進行的,並不需要人力介入管理。
一但邏輯扇區分割好了,依照慣例仍然得先將扇區格式化,一般是格式化成 ext3:
/sbin/mkfs -t ext3 /dev/new_home/lvol1(由於當初分割扇區時未使用 -n 參數來指定名稱,因此系統會自動編號)
格式化好的扇區就可以直接掛載使用:
mkdir /home2
mount -t ext3 /dev/new_home/lvol1 /home2
接下來進行文件轉移:
cp -Rp /home /home2(將使用者文件從實體扇區拷貝到 lvm 扇區)
以光盤片開機進入 rescue mode
rm -rf /home (將 /home 刪除)
mkdir /home (建立掛載點)
mount -t ext3 /dev/new_home/lvol1 /home (重新將 /dev/new_home/lvol1 掛載到 /home)
rmdir /home2(刪除掛載點)
緊接著修改 /etc/fstab 來掛載這個新作好的邏輯扇區:
/dev/new_home/lvol1 /home ext3 defaults 0 0
重開機後,系統會嘗試掛載該虛擬扇區,如果掛載失敗,請在 /etc/rc.d/rc.local 加入以下指令:
vgchange -a y new_home
mount /dev/new_home/lvol1 /home
假如使用一段時間後, /home 的空間不足,這時我們可以動態加入新的實體扇區(以 /dev/hdb4 為例)來擴充空間:
以 fdisk 修改 /dev/hdb4 的扇區類型為 8e
/sbin/pvcreate /dev/hdb4 (邏輯扇區起始化)
/sbin/vgextend new_home /dev/hdb4(將實體扇區加入到虛擬裝置上)
/sbin/lvextend -L +10g /dev/new_home/lvol1 /dev/hdb4(從該實體扇區擴充 10GB 空間至邏輯扇區)
完成以上步驟後,現在的 /home 空間容量已經變成 40GB!然而使用 df 指令去查看 inode,卻發現空間沒有增加,經過測試後發現必須重新mkfs才能使用新的空間,這個缺點讓 LVM 有點美中不足。
SoftRAID 軟件磁盤陣列
使用軟件磁盤陣列應該在安裝 Linux 時,直接透過 Disk-Druid 來設定比較方便,如果事後想要手動加上去,步驟比較繁雜,首先和 LVM 系統一樣,你必須先使用 fdisk 將預先割好要作磁盤陣列的分割區改為 fd 類型,千萬不要拿已經有資料的 Linux ext2 或 swap 來改,否則資料會全部遺失,修改方法請自行參考前面的解說。特別要注意的是,要作磁盤陣列的分割區其容量必須一致,不可以有大有小!
改好扇區類型後,請用底下指令建立軟件磁盤陣列組態文件:
touch /etc/raidtab
該檔案內容如下:
raiddev /dev/md0 //定義磁盤陣列的裝置名稱
raid-level 1 //定義磁盤陣列的等級,RAID 1 就是 Mirror
nr-raid-disks 2 //定義磁盤陣列是由多少實體分割區組成的
chunk-size 64k //定義 chunk 大小,由於是軟件數組所以是使用系統主存儲器來進行 chunk,這個數值設大一點雖然對磁盤陣列效能有幫助,但卻會耗掉系統資源,建議使用默認值就好了
persistent-superblock 1//啟用 superblock,這是用來作磁盤尋址,它能幫助 kernel 在偵測 RAID 磁盤時不會誤判
nr-spare-disks 0 //定義備用的扇區
device /dev/hda1 //定義組成 RAID 的第一塊實體分割區
raid-disk 0
device /dev/hdc1 //定義組成 RAID 的第二塊實體分割區
raid-disk 1
以上面這個例子來說,作好的磁盤陣列在寫入數據時,兩個實體分割區都會寫入數據,讀取資料時,則只要其中一個扇區能正常讀取即可,這樣就可以充分利用磁盤陣列的好處來進行數據保全。做好組態設定以後,接下來請以下列指令開始制作磁盤陣列:
mkraid /dev/md0
磁盤陣列一但制作好了,依然得先將扇區格式化,一般是格式化成 ext3:
/sbin/mkfs -t ext3 /dev/md0
格式化好的扇區就可以直接掛載使用:
mkdir /secure_data
mount -t ext3 /dev/md0 /secure_data
資料保全測試:
使用 fdisk 將 RAID 磁盤陣列其中一個實體分割區刪除後,重新開機,發現 RAID 激活時出現錯誤訊息,警告我們有部分磁盤損毀,但儲存的資料仍然具全沒有遺失。
如果開機訊息閃得太快沒有看清楚,可以使用底下指令來觀察:
lsraid -a /dev/md0
將該分割區重新分割並修改格式為 fd 後,進行資料復原工作:
raidhotadd /dev/md0 /dev/hdc1(將空白扇區 /dev/hdc1 加入 RAID 中並復原資料)
完成以上步驟後,再使用 lsraid 指令來觀察,發現 RAID 裝置已經恢復正常。
四、工作管理進程:
Linux 提供四種自動執行程序的機制,包含:cron、anacron、at 和 batch。使用時機分述如下:
cron 主要用來做周期性工作的管理進程,會根據系統時間來判斷程序是否該執行,萬一系統時間設定不正確將會造成進程錯亂。
anacron 和 cron 一樣也是用來做周期性工作的管理進程,但是它不檢查系統時間,而改以讀取時間戳記來計算間隔日數,依間隔日數判斷是否該執行,適用於每天、每周或每月只執行一次的工作。
at 讓指定程序在某個時間點到達時自動執行,適用於只執行一次的工作。
batch 指定工作在系統閒置時執行,可用來避開高負載時段。
使用 cron 前請先確定管理程序是否已經執行,可以使用以下指令來查看:
/sbin/service crond status
雖然 cron 允許使用者自行安排自己的工作,以方便在結束聯機後,程序能自動運作,但這類工作對於已經提供多種網絡服務的服務器來說負擔太大,因此建議不要教使用者使用它,本文也不討論這類的事情,畢竟我們的服務器只是 PC,不是 main frame。
cron 的主要設定檔 /etc/crontab 內容如下:
SHELL=/bin/bash
PATH=/sbin:/bin:/usr/sbin:/usr/bin
MAILTO=root
HOME=/
# run-parts
01 * * * * root run-parts /etc/cron.hourly
02 4 * * * root run-parts /etc/cron.daily
22 4 * * 0 root run-parts /etc/cron.weekly
42 4 1 * * root run-parts /etc/cron.monthly
前面幾行是定義 cron jobs 執行時的環境,我們不需要去修改它,底下四行是用來定義工作管理進程,上面看到的是系統管理進程的定義區分為七個字段,分別代表:分、時、日、月、星期、執行時的身分、要執行的 script,而一般的工作則只區分為六個字段,前五個字段與系統管理進程相同,最後一個字段則是要執行的工作。
字段 有效數值
分 0~59, * 代表每分鐘都要執行,1-4 是指前四分鐘各要執行一次,如果執行的時間不是連續的,可以用逗號來區隔,例如:5,10,15,20 代表第五分鐘、第十分鐘、第十五分鐘、第二十分鐘時要執行,如果每隔五分鐘要執行一次,可以簡寫為 */5。
時 采用 24 時制,有效數值為 0~23,可以使用 * - , / 等通配字符,意義同上。
日 1~31,如果使用 30,則每逢二月會跳過不執行,如果使用 31,會變成大月時才執行,因此對於每月都得執行一次的工作,請安排在 28 日以前執行。當月份有指定時,必須為有效日期,否則該工作將永遠不執行。通配字符使用方式同上。
月 1~12,也可以直接用英文縮寫:jan、feb......等。 通配字符使用方式同上。
星期 0~7,其中 0 和 7 都代表星期天,也可以使用英文縮寫:sun、mon......等。 通配字符使用方式同上。
如果要執行的工作是屬於每天、每周或每月執行一次,建議改用 anacron 以確保一定會執行,如果是每小時要執行,建議直接在 /etc/cron.hourly 目錄內直接新增一個定義文件,語法需與 /etc/crontab 相同。 其它情形則把定義檔放置在 /etc/cron.d,這裡的定義檔將會每分鐘都檢查一次。
anacron 的設定檔位於 /etc/anacrontab,如前所述它是以檢查時間間隔的方式來決定是否執行,因此不受系統時間設定的影響,為了要檢查時間間隔必須紀錄每個工作每次執行時的時間戳記(timestamp),這些檔案會放置在 /var/spool/anacron 目錄裡面。
anacron 設定文件分為間隔周期、執行延遲時間、工作識別名稱、 要執行的工作四個字段,說明如下:
字段 使用說明
間隔周期 每次執行工作時應相隔幾天,小於一天的請改用 cron
執行延遲時間 當距離上次執行的時間超過時間間隔,這表示中間有執行失敗的情形,這種情形下在延遲幾分鐘後,該工作會再嘗試執行一次。
工作識別名稱 用來識別不同工作,同一名稱不能重復使用。
要執行的工作 通常是一個命令或 script
anacron 的設定檔預設內容如下:
SHELL=/bin/sh
PATH=/sbin:/bin:/usr/sbin:/usr/bin;/usr/local/sbin;/usr/local/bin
# These entries are useful for a Red Hat Linux system.
1 5 run-parts /etc/cron.daily
7 10 run-parts /etc/cron.weekly
30 15 run-parts /etc/cron.monthly
這個設定可以用來確保 cron job 一定會如期執行。
at 指令用來執行一次性的工作而非周期性的工作,我們可以指定要執行的時間,它和 cron 一樣會檢查系統時間的設定,因此設定錯誤會造成工作無法正確執行,設定方式如下:
at 16:00 011503[ ENTER](排定執行時間是 2003年1月15日下午4點)
at> perl /root/backup.pl[Ctrl-D]
我們可以使用 atq 指令來查詢現在尚未執行的預定工作。
如果想根據主機負載情形來決定執行時間,必須使用 batch 指令,實際上 batch 指令算是 at 的特殊應用,使用方式如下:
batch[ ENTER](不用指定執行時間)
at> perl /root/backup.pl[Ctrl-D]