作者:陳柏菁 E-mail
索引:
5.1
檔案系統介紹
在第二章我們有提到過檔案系統的概念及目錄樹狀結構,相信各位應該還不健忘吧 !
在 Linux 的目錄結構中,於根目錄底下的一些主要目錄可以個別獨立成一個分割區,比如 /var、/usr、/tmp、/home、/boot、…
等等,當然每個分割區您都需要給它一個檔案系統。如果您有安裝過 windows 的經驗,應該很清楚的知道在安裝之前需要先將您所指定的分割區做格式化動作,這個行為就是在製造一個檔案系統給該分割區的意思。
不同分割區可能會有相同或不同的檔案系統 (partition types),以 windows 的 partition
來說,如 FAT32、NTFS ; 以 Linux 來說,如 Linux native 及 swap 等。Linux swap 是用來做虛擬記憶體的分割區,其
system id 為 82 ; 至於 system id 為 83 則是 Linux native 的分割區,而在 Linux native 分割區上常見到的檔案系統如
ext2、ext3、reiserfs、JFS 等等。
5.1.1 認識 ext2 及日誌式 (journaling)
檔案系統
如果您接觸 Linux 已有一段時間的話,應該曾經使用過 ext2 這個傳統的檔案系統,先來說說它的一些特色:
| 1. |
支援最長檔名為 255 個字元。 |
| 2. |
支援單一檔案的最大容量為 16 GB ~ 2 TB。 |
| 3. |
支援單一分割區的最大容量為 2 TB ~ 16 TB。 |
| 4. |
檔案的存取與管理是以 " inode " 來實現。inode 的觀念在下一小節會說明。 |
| 5. |
加快系統執行效能:
ext2 檔案系統會把我們所更動的資料先暫存至記憶體的緩衝區內,直到緩衝區空間滿了或系統閒置下來時才回存磁碟之中。大家都知道記憶體處理資料的效能要比磁碟高上許多,所以採用這種非同步
(async) I/O 的處理方式,的確是加分的。 |
雖然 ext2 的執行效能不錯,不過卻有一個比較大的缺失,就是萬一您遇到了非預期的電力中斷或不正常關機時,可能會使得緩衝區裡頭的資料還來不及回存磁碟,因而造成資料的不完整性,所以在您下次重新開機時,系統就會幫整個檔案系統做強迫性的磁碟檢查動作,看看是否有損壞或遺失的資料,假使此時您檔案系統裡的資料有好幾十
GB 甚至更多,這個動作將會耗費您不少時間。
那日誌式的檔案系統是怎麼一回事呢 ? 所謂的 " 日誌 " 就是 " 紀錄 " 的意思,也就是會將系統欲做的更動先行紀錄在日誌區塊裡,紀錄完成後才開始進行資料的異動。萬一發生了斷電或不正常關機,在
reboot 後系統會先去檢查日誌區塊裡的相關紀錄,如果發現紀錄裡頭有未完成的行為,那麼就只需針對這部分來進行處理即可,此時系統可能會幫您繼續執行未完成的動作或者是取消這個動作,所以檔案系統回復的速度很快,而不必像
ext2 還需對整個檔案系統做磁碟檢查。因此使用日誌式的檔案系統,除了讓您在開機的時候節省不少寶貴時間以外,還可大大提高資料的完整性。
以下列舉幾個常聽到的日誌式檔案系統:
| 1. |
ext3:
ext3 檔案系統是在原本 ext2 檔案系統的特色下,再加上個日誌式功能,因此可以把它當成 ext2 的改良版,並且可以向下相容於 ext2
; 所以如果您系統原本是使用 ext2 檔案系統的話,可以很輕易的將其轉換成 ext3。 RedHat 是最早使用 ext3 的 distribution。
|
| 2. |
reiserfs:
除了擁有日誌功能外,對存取大量小檔案的效能較傳統的 ext2 還要快上許多。SuSE 預設就是使用這種檔案系統。 |
| 3. |
XFS:
SGI 公司所研發,對於處理大型檔案有不錯的效果。 |
| 4. |
JFS:
由 IBM 公司所研發,與 XFS 的特色差不多。 |
Linux 作業系統本身可以支援很多的檔案系統,除了剛剛所介紹的那一些外,其它如 msdos、vfat、ntfs、iso9660、nfs、smbfs
等等,而想讓這些檔案系統能夠被存取,則該檔案系統必需先被掛載到根目錄下的某個目錄或子目錄中才行,也就是說一定要將其掛載至根目錄樹狀結構中的某個點,如果脫離了根目錄,則無法對這些檔案系統作任何的存取。
5.1.2
資料存取原理及 inode 觀念
這裡我們分別針對 ext2 (ext3) 及 ReiserFS 來跟各位解說。
| ※ |
ext2
(ext3)
檔案系統
| 1. |
資料區塊 (data block) 的觀念:
在 ext2 (ext3) 檔案系統中, 資料的寫入是以區塊為單位,也就是說資料存放的最小儲存單位為區塊的意思,而其區塊的有效值為
1024、2048、4096 bytes。舉個例來說,假設我們系統中預設的區塊大小 (block size) 為 4096 bytes,當製造一個
100 bytes 的檔案時,將會佔用掉一個區塊,或許您會問那剩下的空間可不可以提供給其他的檔案來存放呢 ? 答案當然是不行的 ;
又如果製造了一個 5000 bytes 的檔案,由於一個區塊已不夠用,所以將會使用掉兩個區塊。
我們這裡所稱的區塊是指用來存放檔案或目錄內容的地方,所以也稱其為資料區塊 (data block)。或許您又會問系統中存在於這麼多的資料區塊,究竟是如何找到每個檔案目錄的內容是存放在哪個區塊呢
? 要了解這個問題,就要先認識一下 inode 了。 |
| |
|
| 2. |
inode (index node) 的觀念:
index node 顧名思義就是索引節點,那當然就是指引您找尋某些資料的意思囉 ! 一個 inode 的大小為 128 bytes,其所存放的是該檔案的相關屬性及
pointer ; 檔案屬性部分如檔案類型、檔案的擁有者與所屬群組 ID、檔案存取權限、檔案大小、連結數及時間相關訊息等,而 pointer
主要是指出檔案內容所實際存放的區塊位置。
inode 裡頭存在著 12 個直接指標 (direct pointer),分別指向 12 個直接區塊 (direct data
blocks)。而當您在建立一個很大的檔案時,可能這 12 個直接區塊不夠存放,此時就會使用到間接指標 (indirect pointer)
來尋找另一個可用的區塊,以便能夠指向更多的間接資料區塊 (indirect data blocks),那如果再不夠用,就會動用到
double indirect pointer 甚至 triple indirect pointer。inode 結構圖請參考以下:
從剛剛介紹的 inode 觀念裡,並沒有提到檔案名稱,因其不是存放在 inode
中,而是安置於上一層目錄的資料區塊裡頭。
|
| |
|
| 3. |
inode number:
每個檔案目錄都必須要有其唯一的 inode,若撇開連結檔不講,十個檔案就會用掉十個 inode,一百個檔案就會用掉一百個 inode,而這些
inode 的集合就是所謂的 inode table。
當我們建立起一個檔案時,系統就會分配給它一個專用的 inode,並給予此檔案一個 inode number,爾後藉由這個 inode
number 就可以找到 inode table 裡該檔案的 inode 位置,因而能夠找到檔案內容所實際存放的區塊位置。
另外您還需了解的是目錄的內容,在目錄的資料區塊裡所存放的是其下的檔案目錄名稱及這些檔案目錄的 inode number,參考以下的概略圖應該就能清楚:
當您將分割區格式化成 ext2 的檔案系統時,block count 及 inode count 就已經固定下來了,所以每個分割區都有它們固定的
block count 及 inode count。而在同一 partiton 中的檔案目錄都有其唯一的 inode number
(排除連結檔),但不同 partition 之間的檔案目錄,其 inode number 就有可能會相同,因為每個 partition
的 inode number 是彼此獨立開來使用的,請參考以下例子:
barry@suselinux:~>
ls -ldi / /var
2 drwxr-xr-x 25 root root 584 Aug 20 15:26 /
2 drwxr-xr-x 16 root root 392 Aug 13 20:27 /var |
查看檔案目錄的 inode number,可使用 ls 指令加上個 " -i "
參數。上面結果顯示 / 目錄及 /var 目錄的 inode number 都是相同的 (皆為 2),因為它們是分屬不同分割區的關係。 |
| |
|
| 4. |
超級區塊 (Super Block):
分割區最前面的那個區塊稱之為 Super Block,其內記載著檔案系統裡的一些相關重要資訊,比如 inode 大小與區塊大小、inode
數與區塊數、保留的區塊數 (幫 root 所保留的空間,為總區塊數的百分之五 )、已用掉了 inode 數與區塊數、剩下的 inode
數與區塊數、每個區塊群組所分配的區塊數、 … 等等。當您對此檔案系統進行存取動作時,就一定會先經過 Super Block,那萬一
Super Block 掛了,後果您可想而知。
Super Block 裡所存放的訊息可藉由執行 " tune2fs -l device-name "
來取得:
|
| |
|
| 5. |
檔案系統的結構:
以上觀念都有了之後,接著就來談 ext2 檔案系統的整個架構。當您對某個 partition 格式化成 ext2 的檔案系統時,除最前面的
512 bytes 為 boot sector 外,其他區域則是由數個區塊群組 (block group) 所構成的。
在 partition 裡的第一個 block group (下圖中的 Block Group 0) 中的第一個 block 為
Primary Super Block (主要超級區塊),至於存在於其他 block groups 中的 Super Block
則稱為 Backup Super Block (可不是每個 block group 都有 Backup Super Block
噢),所以萬一主要的超級區塊損壞時,還會有備份的超級區塊來讓您對檔案系統做正常存取噢。
接著來探討每個 Block Group 是由哪幾個部分來組成的,請參考下圖:
區塊群組結構圖中的超級區塊部分請參考第四點的說明,這裡只針對其他部分來解說:
| Group Descriptor |
記載一些資料記錄區所在的位置,比如 Block Bitmap 及 Inode Bitmap
等。 |
| Block Bitmap |
紀錄資料區塊目前的使用狀況。從這裡可以了解哪些區塊已使用,哪些未使用。 |
| Inode Bitmap |
紀錄 inode 的使用狀況。從這裡可以了解哪些 inode 已使用,哪些未使用。 |
| Inode table |
存放檔案屬性及 pointer 等資料。 |
| Data Blocks |
這是檔案資料真正存放的地方。 |
區塊群組裡所存放的資訊可以使用 " dumpe2fs device-name "
來觀察:
suselinux:~ # dumpe2fs
/dev/hda10
:
前面部分是 super block 的訊息,與剛剛看到的一樣,所以就省略囉
!
Group 0: (Blocks 1-8192)
Primary superblock at 1, Group descriptors at 2-3
Block bitmap at 4 (+3), Inode bitmap at 5 (+4)
Inode table at 6-261 (+5)
750 free blocks, 2036 free inodes, 2 directories
Free blocks: 275-1024
Free inodes: 13-2048
Group 1: (Blocks 8193-16384)
Backup superblock at 8193, Group descriptors at 8194-8195
Block bitmap at 8196 (+3), Inode bitmap at 8197 (+4)
Inode table at 8198-8453 (+5)
6874 free blocks, 2048 free inodes, 0 directories
Free blocks: 9511-16384
Free inodes: 2049-4096
: 略 |
我們以 Group1 來做說明好了:
Blocks 8193-16384:Group 1
的範圍是從第 8193 個區塊至第 16384 個區塊。
Backup superblock at 8193:備份超級區塊在第 8193 個區塊。
Group descriptors at 8194-8195:Group descriptors
在第 8194 及 8195 這兩個區塊。
Block bitmap at 8196:第 8196 個區塊處紀錄著區塊目前的使用狀況。
Inode bitmap at 8197:第 8197 個區塊處紀錄著 inode 的使用狀況。
Inode table at 8198-8453:Inode table 是存放在第 8198
~ 8453 個區塊中。
Free blocks:還可以使用的區塊範圍是從第 9511 ~ 16384 個區塊 (共 6874
個)。
Free inodes:尚可使用的 inode,其 inode number 是從 2049
~ 4096 (共 2048 個)。
一般所謂的 metadata 就是指 Super Block、Block bitmap 及 Inode bitmap 這些紀錄資料,那像
inode table 及 data block 就稱為資料儲存區域。而在談到 ext2 檔案系統時,不是有提到不正常關機後會造成資料的不完整性,這就是因為資料儲存區域與
metadata 的紀錄不相符所造成的。
了解了這個觀念後,來補充一下日誌式檔案系統的運作:
當您在修改一個檔案時,會先將您要採取的這個動作紀錄在日誌區塊裡,然後才開始正式的寫入檔案並記錄在 metadata 中,最後當以上步驟都整個完成後,會再次的寫入日誌區塊,表示已經完成了檔案的修改動作了。
|
底下就以存取 /etc/passwd 作例子,來看看是怎麼樣的一個存取流程:
| 1. |
先從 / partition 裡找到 / 的 inode,再依 inode 中的 pointer 找到了
/ 所在的 block 位置。 |
| 2. |
從 / block 取得 etc 的 inode number,因而找到了 etc 的 inode,並依 pointer 找到了
etc 的 block。 |
| 3. |
從 etc 的 block 得到 passwd 的 inode number,因而找到了 passwd 的 inode。 |
| 4. |
最後就根據 passwd 的 inode 而找到其實際存放的 block,這就是 passwd 的內容了。 |
| 補充: |
一般所謂的 block count,約略是將分割區的大小去除以資料區塊大小所得到的數值。比如分割區大小為
512 MB,一個資料區塊為 2048 Bytes,則用 512 x 1024 x 1024 去除以 2048 而可得到 262144
個 block count。
至於 inode count 是將分割區大小去除以預計給每一個 inode 所指向檔案的儲存空間大小 ( bytes-per-inode
)。假設分割區還是 512 MB,而系統規劃每一個 inode 所指向的檔案,其儲存空間大小為 4096 Bytes,則 512 x
1024 x 1024 去除以 4096 而可得到 131072 個 inode count。
如您了解了以上的觀念後,應該知道 inode count 比 block count 還多是沒啥用處的,舉個例子來說,假使 inode
count 為 262144,block count 為 131072,那當我們所建立的每個檔案都小於一個資料區塊大小時,則最多只能建立
131072 個檔案,也就是說最多只會用掉 131072 個 inode,結果您會發現系統還會剩下一半的 inode,但卻無法再製造任何的檔案,所以
inode count 大於 block count 是不具任何意義的。
如果今天我們所製造的每個檔案都很大,有可能會造成磁碟空間都用盡了,但卻還有 inode 可用的現象發生,反過來說如果建立了很多的小檔案,那就有可能會造成
inode 用光了但尚有磁碟空間可使用,這時候當然就無法讓您再建立任何的檔案了。如果不清楚為什麼,建議您再好好把本小節的內容多看個幾次。 |
|
| |
|
| ※ |
ReiserFS 檔案系統
| 1. |
ReiserFS 的檔案系統,其檔案目錄的資料是被存放在一個叫平衡樹系 (balanced binary tree) 的資料結構內,對於存取大量的小檔案時有著絕佳的效率,而這一方面也是
ext2 所望塵莫及的。 |
| 2. |
ReiserFS 其 inode 配置是採取動態分配,而不是像 ext2 檔案系統建立起來後就有一定的 inode count。 |
| 3. |
ReiserFS 檔案系統中,目錄的空間配置採動態分配,對於此目錄已佔用的磁碟空間,於日後目錄內容縮減時還可以做回收,而
ext2 的檔案系統就做不到這一點。在 ext2 中,若某個目錄已佔用 8192 bytes 的空間,現在將此目錄內容刪除至 4096
bytes 時,實際上這個目錄還是佔據著 8192 bytes 的空間。 |
| 4. |
在平衡樹系內的小型檔案可以共用同一個區塊,大大的節省磁碟的空間。以往在 ext2 的檔案系統裡,如果存在著愈多的小檔案,則會浪費愈多的空間,比如有
5 個檔案,其大小都只有 50 bytes,如 block size 為 4096 bytes 時,那一個檔案就會浪費掉 4000
多 bytes 的空間,五個檔案您就知道會浪費多少空間了。 |
|
5.2
磁碟分割、格式化及掛載
首先一開始先來談一談要如何規劃磁碟分割。當我們在安裝 Linux 時,稍有經驗的人都會盡可能的讓一些目錄擁有自己的 partition,而這樣做當然有他的好處在,比如現在要是有某個分割區出問題時,則不致會影響到其他的
partition,而此時就只需針對此 partition 做處理就可以了。另外您還容易追蹤每個 partition 所使用空間的概況,萬一不足時還可適時的作調整,比如您
/home partition 空間不足時,就可使用連結或加掛硬碟的方式來解決這個問題,詳細做法在 5.7.3 小節會提及。除此之外當然還有許多好處,就等您慢慢體會了。
接著再來談談 partition 要切割多大才適當,關於這個問題沒有絕對的答案,因為您需要考慮系統的實際需求才能做決定,比如您打算安裝多少套件在系統上,系統主要用途為何,是要用來架設
Mail Server、Apache、FTP 還是 Samba 呢 ? 而架設這些 Server 的相關目錄所存在的 partition 大小可就要好好規劃一下了。
再來我們就大略說一下每個分割區大小的分配要點:
| 1. |
/boot 分割區一般分配個 100M 就已足夠,且盡量分配在 1024 cylinder 之前 (如果您有 1024
cylinder 困擾的話)。 |
| 2. |
/ 分割區可劃分小一些,這樣可以讓出其它空間給須較大空間的目錄,不過先決條件是 /usr 及其他目錄需獨立出來。 |
| 3. |
/var 分割區的大小視您系統用途而定,且須足以掌握記錄檔及循環檔。 |
| 4. |
/usr 分割區須能容納系統程式、說明文件、核心編繹等等。 |
| 5. |
/home 分割區須視使用者多寡而定,若架 SAMBA,還須讓使用者有足夠的空間放置他們自己的資料。 |
| 6. |
/tmp 分割區可彈性調整,如您打算讓使用者能於此處放置很多暫存資料的話,就需切割大一些。 |
| 7. |
swap 分割區則視您實際需要了。一般若實體記憶體不夠用時,並不建議加大 swap 空間,因當系統使用到 swap 時,您的執行效率可能已經大打折扣了,所以這時候最好能加大您的實體記憶體而非加大
swap。 |
而在您作業系統安裝完畢後,還是可以針對一些重要的目錄來給予其專用的 partition,比如架設 Mail Server 時,使用者的信件是存放在 /var/spool/mail,那您就可以劃分一個
partition 來專門給這個目錄使用,至於詳細的做法,就是現在要介紹的主題。
底下我們開始要介紹如何在硬碟上新增一個分割區,並且讓這個分割區至最後能夠被我們來存取使用。要達到這個目的就必須執行以下的步驟:1. 建立一個新的分割區 2.
將此分割區進行格式化 3. 執行分割區掛載動作
5.2.1 建立磁碟分割區
這裡會使用 fdisk 這個指令來建立分割區,fdisk 幾乎可適用在所有的 distribution 上頭。
●
fdisk:
create partition ; Partition table manipulator for Linux.
| |
管理 partition table 的工具,主要是用來建立及刪除 partition。
| 指令語法: |
fdisk device
fdisk -l [device ...]
fdisk -s partition ... |
參數說明:
| -l |
列出所指定裝置的 partition table,如 /dev/hda、/dev/hdb、/dev/sda
等。 |
| -s |
列出所指定分割區的大小,如 /dev/hda3、/dev/hdb5、/dev/sda2 等。 |
首先我們先學會如何觀看 partition table:
suselinux:~ # fdisk
-l /dev/hda
→ 顯示第一顆硬碟的 partition table。若未指定 device
,則會列出在 /proc/partitions 中的 partition table。
suselinux:~ # fdisk -s /dev/hda3
→ 只顯示第一顆硬碟的第三個分割區大小。 |
接著就來看看如何在硬碟上修改我們的 partition table:
| suselinux:~ #
fdisk /dev/hda
The number of cylinders for this disk is set to 4865.
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., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help) :
|
若不知道接下來要輸入什麼指令,可先輸入 m 來尋求幫忙:
Command (m for help) :
m
← 輸入 m。
Command action
| a |
toggle a bootable flag |
| b |
edit bsd disklabel |
| c |
toggle the dos compatibility flag |
| d |
delete a partition |
| l |
list known partition types |
| m |
print this menu |
| n |
add a new partition |
| o |
create a new empty DOS partition table |
| p |
print the partition table |
| q |
quit without saving changes |
| s |
create a new empty Sun disklabel |
| t |
change a partition's system id |
| u |
change display/entry units |
| v |
verify the partition table |
| w |
write table to disk and exit |
| x |
extra functionality (experts only) |
Command (m for help) : |
這裡就列舉幾個常用的指令來給各位說明:
| m |
列出指令的用法。 |
| a |
設定啟動旗標。 |
| d |
刪除分割區 |
| l |
列出分割區類型與 system id 的對照一覽表。 |
| n |
新增一個分割區。 |
| p |
列出 partition table。 |
| q |
未儲存所做的改變而離開。 |
| t |
改變分割區的 system id。 |
| w |
將所做的修改寫入 partition table 並離開。 |
開始練習囉 ! 請先輸入 p 指令來查閱一下目前的 partition table:
| Command (m for help) :
p ←
輸入 p。
Disk /dev/hda: 40.0 GB, 40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
| Device |
Boot |
Start |
End |
Blocks |
|
I d |
|
System |
| /dev/hda1 |
* |
1 |
1020 |
8193118 |
+ |
7 |
|
HPFS/NTFS |
| /dev/hda2 |
|
1021 |
2040 |
8193150 |
|
c |
|
W95 FAT32 (LBA) |
| /dev/hda3 |
|
2041 |
2053 |
104422 |
+ |
83 |
|
Linux |
| /dev/hda4 |
|
2054 |
4865 |
22587390 |
|
f |
|
W95 Ext'd (LBA) |
| /dev/hda5 |
|
2054 |
2210 |
1261071 |
|
83 |
|
Linux |
| /dev/hda6 |
|
2211 |
2524 |
2522173 |
+ |
83 |
|
Linux |
| /dev/hda7 |
|
2525 |
2588 |
514048 |
+ |
83 |
|
Linux |
| /dev/hda8 |
|
2589 |
2652 |
514048 |
+ |
83 |
|
Linux |
| /dev/hda9 |
|
2653 |
2691 |
313236 |
|
82 |
|
Linux swap / Solaris |
Command (m for help) :
|
接著來練習新增分割區,請先輸入 n 指令來新增一個 partition:
Command (m for help)
: n ←
輸入 n 來新增一個 partition。
| → |
如果目前 partition
table 裡只有 hda1 及 hda2 時,那在輸入 n 來建立新分割區時,您將會看到 e (extended) 及
p (primary partition) 這兩個選項,不過在這裡因為筆者硬碟的 primary partiton 早就用完了,所以不會看到這個詢問畫面噢。 |
First cylinder (2692-4865, default 2692) : ←
起始磁柱的設定,使用預設值即可,所以直接按下 Enter 鍵。
Using default value 2692
Last cylinder or +size or +sizeM or +sizeK (2692-4865, default 4865)
: +500 M ←
結束磁柱請輸入欲設定的分割區大小。
Command (m for help) : |
完成後再輸入 p 指令來檢查一下剛剛那個新增的分割區有沒有出現:
| Command (m for help) : p
Disk /dev/hda: 40.0 GB,
40020664320 bytes
255 heads, 63 sectors/track, 4865 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device |
Boot |
Start |
End |
Blocks |
|
I d |
|
System |
/dev/hda1 |
* |
1 |
1020 |
8193118 |
+ |
7 |
|
HPFS/NTFS |
/dev/hda2 |
|
1021 |
2040 |
8193150 |
|
c |
|
W95 FAT32 (LBA) |
/dev/hda3 |
|
2041 |
2053 |
104422 |
+ |
83 |
|
Linux |
/dev/hda4 |
|
2054 |
4865 |
22587390 |
|
f |
|
W95 Ext'd (LBA) |
/dev/hda5 |
|
2054 |
2210 |
1261071 |
|
83 |
|
Linux |
/dev/hda6 |
|
2211 |
2524 |
2522173 |
+ |
83 |
|
Linux |
/dev/hda7 |
|
2525 |
2588 |
514048 |
+ |
83 |
|
Linux |
/dev/hda8 |
|
2589 |
2652 |
514048 |
+ |
83 |
|
Linux |
/dev/hda9 |
|
2653 |
2691 |
313236 |
|
82 |
|
Linux swap / Solaris |
/dev/hda10 |
|
2692 |
2753 |
497983 |
+ |
83 |
|
Linux ←
多了這一行。 |
Command (m for help) :
|
若一切 ok 的話,就可以輸入 w 指令來將剛剛修改過後的結果寫入 partition table,並退出 fdisk:
Command (m for help) : w ←
輸入 w。
The partition table has been altered!
Calling ioctl( ) to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device
or resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot. ←
這是說要重新開機後,此 partition table 才會生效。
Syncing disks.
suselinux:~ #
|
其他像輸入 d 指令可以刪除 partition,輸入 t 指令可以改變 partition
的 system id ,此時如您不曉得 system id 是多少,可以輸入 l 指令來查詢,這些請自行練習看看。 |
5.2.2 建立檔案系統 (格式化)
當成功建立起磁碟分割區後,必須製造一個檔案系統來給它使用,即所謂的分割區格式化。這裡主要就是使用 mkfs 指令來幫我們完成這個動作。
●
mkfs:build a Linux file system.
| |
建立 Linux 檔案系統。
指令語法:mkfs [ -t fstype ] [ fs-options ] device
| |
device 是指定要進行格式化的那個裝置名稱,如 /dev/hda3、/dev/sda5、/dev/fd0
等 ; 而 " -t " 是用來指定分割區要建立的檔案系統類型 ; 至於 fs-options
中比較常用的是 " -c ",這個參數主要是讓您在建立檔案系統之前,先檢查有無壞軌。
|
範例說明:
suselinux:~ # mkfs
-t msdos /dev/fd0
→ 將磁碟片格式化成 msdos 的檔案系統。
suselinux:~ # mkfs -t ext2 -c /dev/hda10
suselinux:~ # mkfs.ext2 -c /dev/hda10
suselinux:~ # mke2fs -c /dev/hda10
→ 執行以上指令的其中一種,就可以將
/dev/hda10 格式化成 ext2 的檔案係統,並在格式化前檢查有無壞軌。
執行 mkfs 時若未指定檔案系統類型,則預設為 ext2。
suselinux:~ # mke2fs -j /dev/hda10
suselinux:~ # mkfs.ext3 /dev/hda10
suselinux:~ # mkfs -t ext3 /dev/hda10
→ 將
/dev/hda10 格式化成 ext3 的檔案系統。
suselinux:~
# mkfs -t reiserfs
/dev/hda10
→ 格式化成
SuSE 預設的 reiserfs。
|
|
剛剛範例中出現了一個 mke2fs 的指令,來看看怎麼使用吧:
● mke2fs:create
an ext2/ext3 filesystem.
| |
建立 ext2 或 ext3 的檔案系統。
| 指令語法: |
mke2fs [ -b block-size ] [ -i bytes-per-inode
] [ -j ]
[ -N number-of-inodes ] device |
參數說明:
| -b |
指定資料區塊大小。其有效值為 1024、2048、4096 bytes。 |
| -c |
建立檔案系統前,先檢查有無壞軌。 |
| -i |
設定每一個 inode 所指向的檔案,其預計所能儲存的空間大小 ( bytes-per-inode )。請勿設定小於 block
size,否則無意義。 |
| -j |
建立 ext3 日誌式檔案系統。 |
| -N |
指定 inode count。 |
| -L |
格式化同時,指定檔案系統標籤 (fs label)。fs label 可以用來替代裝置名稱來使用。 |
範例說明:
suselinux:~ # mke2fs
-j -b 2048 -i 4096 -L test /dev/hda10
| → |
將
/dev/hda10 格式化成 ext3 的檔案系統,並指定其資料區塊大小為 2048 bytes,預計每一個 inode
所指向的檔案儲存空間大小為 4096 bytes,同時指定 /dev/hda10 的 fs-label 為 test。 |
suselinux:~ # tune2fs -l /dev/hda10
| → |
使用
tune2fs 指令來檢查一下相關設定內容是否符合。 |
|
|
●
mkreiserfs (mkfs.reiserfs):create tool for the Linux ReiserFS
file system.
| |
建立 ReiserFS 檔案系統。
指令語法:mkreiserfs [ -b block-size] [ -l LABEL ] device
參數說明:
| -b |
指定資料區塊大小。其有效值為 512、1024、2048、4096、8192 bytes,預設為 4096
bytes。 |
| -l |
指定檔案系統標籤 (fs-label)。 |
範例說明:
suselinux:~
# mkreiserfs /dev/hda10
→ 格式化成 ReiserFS 的檔案系統。
suselinux:~ #
mkreiserfs -b 1024 -l testlabel /dev/hda10
→ 格式化成 ReiserFS 的同時,指定其區塊大小為
1024 bytes,檔案系統標籤為 testlabel。
suselinux:~ #
reiserfstune /dev/hda10
→
查看 Blocksize 及 LABEL 是否符合您所指定的內容。 |
|
從一開始介紹格式化到現在,好像都沒談到 swap 分割區的建立方式,所以這裡做一下補充。要建立 swap 交換區使用 mkswap 指令即可:
● mkswap:set
up a Linux swap area.
| |
mkswap 指令可以將 swap 建立在分割區或檔案之中,而這裡主要是針對分割區來做介紹。 範例說明:
suselinux:~ # mkswap
/dev/hda10
Setting up swapspace version 1, size = 509927 kB
suselinux:~ # swapon /dev/hda10
→ 啟用 swap 交換區。啟用之後您可使用 "free"
指令去做個確認。 |
|
5.2.3 掛載檔案系統
我們前面已經學會了如何新增分割區及格式化,現在就只差一個掛載的步驟就可以讓我們開始對這個檔案系統作存取了。您必須要把
Linux 所支援的檔案系統掛載至根目錄下的某個目錄或子目錄當中才能夠被 Linux 所存取,這個被掛載的目錄或子目錄就稱為掛載點 (mount point),所以將檔案系統掛載至
mount-point 的動作就叫做掛載 (mount) 啦。
不過這裡您要注意的是掛載點的選擇,首先掛載點必須是一個已經存在的目錄,而且最好是一個空目錄 (可自行建立),但千萬不要選擇根目錄下的一些重要目錄作為掛載點,那要是真的這樣做會發生什麼事呢
? 舉個例子,如果剛剛上面所建立的分割區 /dev/hda10 您把它掛載至 /home,那麼您在 /home 目錄中所看到的將會是 /dev/hda10
的內容,而原本 /home 裡頭的資料將會暫時的消失,所以想當然爾,使用者此時當然就無家目錄可用了,除非等您執行卸載 (umount) 後才又能讓 /home
回復到原來的內容。了解這個道理後,您可以想想看,如果我把 /dev/hda10 掛載到 /etc 會產生什麼嚴重的後果 ?
Linux 本身能支援很多的檔案系統,如 minix、ext2、ext3、reiserfs、ntfs、vfat、msdos、iso9660
(CD-ROM)、udf (DVD-ROM),以及像nfs、smbfs 這類的網路檔案系統等等,而要存取這些檔案系統就必須將它們掛載進來,執行掛載任務的就是要靠
mount 這個指令。
●
mount:mount a file system.
| |
用來掛載檔案系統的指令。
| 指令語法: |
mount [-l]
mount -a
mount [ -t fs-type ] [ -n ] [ -o options ] device-name mount-point |
| |
單純的執行 mount 指令,可以顯示 /etc/mtab 裡頭檔案系統的掛載資訊。mtab
(mount table) 是用來紀錄檔案系統的掛載訊息,當您掛載一個新的檔案系統後,就會在 /etc/mtab 內多上一筆掛載紀錄。 |
參數說明:
| -l |
如您有為檔案系統設立標籤 (label),那麼執行 " mount -l "
時,所輸出的 mount table 內容中會多個檔案系統標籤出來。 |
| -n |
執行掛載時若加上這個參數,將不會把此掛載紀錄寫入 /etc/mtab 之中。如果您的 /etc 目錄是處在一個唯讀的檔案系統中時,就需要用到這個參數。 |
| -a |
將列在 /etc/fstab 裡頭有設定 auto 選項的檔案系統全都掛載起來,那當然如果是設定
noauto 選項的檔案系統就不會被掛載啦。 |
| -t |
指定要掛載的檔案系統類型。 |
| -L |
當檔案系統有設定 fs-label,那麼執行掛載時可以使用 " -L Label "
來代替裝置名稱。比如 /dev/hda10 的 fs-label 為 test,則可以執行 " mount
-L test /mnt/hda10 " 來將此 partition 掛載進來。 |
| -o |
掛載檔案系統時,可以使用 " -o " 來額外指定一些選項進去,不過有少部分選項,只有設定在
/etc/fstab 時才能發揮效用。
以下大略列出一些選項來提供參考:
| exec: |
允許存在於檔案系統上的 binary file 能被執行 ; 相反選項為 noexec。 |
| suid: |
檔案系統的 binary file 如具有 SUID 或 SGID 屬性,則能發揮這個屬性的效用 ; 相反選項為
unsuid。 |
| user: |
允許一般使用者掛載該檔案系統,不過當使用者執行掛載後,只有該使用者及 root 可以執行卸載,如您想讓每個使用者都可以執行掛載及卸載,則需改用
users 選項 ; 相反選項為 nouser。 |
| sync: |
檔案系統所採取的是同步 I/O (INPUT/OUTPUT),也就是將系統所做的更動,讓磁碟與記憶體建立同步寫入動作
; 相反選項為 async。 |
| ro、rw: |
將檔案系統掛載成唯讀 (ro) 或可讀可寫 (rw)。 |
| dev: |
能於檔案系統上解析出字元裝置或區塊裝置 ; 相反選項為 nodev。 |
| remount: |
對於已經掛載的檔案系統,執行重新掛載的動作。 |
| auto: |
當您在 /etc/fstab 裡的檔案系統有設定 auto 選項時,則在開機過程會被自動掛載,另外您在 command
line 執行 " mount -a " 時也能自動掛載這些檔案系統
; 相反選項為 noauto。 |
| defaults: |
defaults 就等於以下選項的組合:rw、suid、dev、exec、auto、nouser、async。 |
|
範例說明:
suselinux:~ # mkdir
/mnt/hda10
→ 先製造 /dev/hda10 的掛載點。
suselinux:~ # mount -t reiserfs /dev/hda10
/mnt/hda10
→ 這裡是假設剛剛您已將
/dev/hda10 格式化成 reiserfs 的檔案系統,然後來進行掛載的動作。
完成掛載後,您可用 "df" 或 "mount"
指令檢查看看是否有掛載起來:
suselinux:~ # df
| Filesystem |
1K-blocks |
Used
|
Available |
Use% |
|
Mounted
on |
| /dev/hda5 |
1261012 |
591192 |
669820 |
47% |
|
/ |
| tmpfs |
128156 |
0 |
128156 |
0% |
|
/dev/shm |
| /dev/hda3 |
104376 |
36764 |
67612 |
36% |
|
/boot |
| /dev/hda8 |
514028 |
32876 |
481152 |
7% |
|
/home |
| /dev/hda6 |
2522028 |
1775520 |
746508 |
71% |
|
/usr |
| /dev/hda7 |
514028 |
93596 |
420432 |
19% |
|
/var |
| /dev/hda10 |
497900 |
32840 |
465060 |
7%
|
|
/mnt/hda10
|
suselinux:~ # umount /mnt/hda10
→ 執行卸載。umount
指令等一下會說明。
suselinux:~ # mount -o ro,noexec /dev/hda10
/mnt/hda10
→ 將
device 掛載成唯讀的檔案系統,並且無法執行存在於檔案系統中的程式。
suselinux:~ # cd
/mnt/hda10
suselinux:/mnt/hda10 #
touch testfile
touch: cannot touch `testfile': Read-only file
system
→ 因剛剛 /dev/hda10 已被掛載成 read-only fs,所以無法新增檔案。
suselinux:~ # mount -o rw,exec,remount
/mnt/hda10
→ 重新掛載成可讀寫及可以執行程式的檔案系統。這裡我們是針對
mount-point,當然您要針對 device-name 也是可行的。
suselinux:~ # mkdir /mnt/cdrom
→ 製造
cdrom 的掛載點。
suselinux:~ # mount -t iso9660 /dev/cdrom
/mnt/cdrom
→ 將
cdrom 掛載於 /mnt/cdrom 目錄下 (光碟片可不要忘了先放進去噢)。
其實在 SuSE 裡頭您不需對 floppy 或 cdrom 執行掛載指令,因為您只要將光碟片或磁片放進去後並開始對其做存取時,他就會自動幫您掛載,至於詳細情形在稍後要提到的
/etc/fstab 時我們再說明。 |
執行 mount 指令時,沒使用 -t 參數來指定檔案系統類型也是可以的,因為系統會自動到 /etc/filesystems 去尋找您合用的檔案系統。
學會了掛載之後,接著來學習卸載指令 umount 囉。 |
●
umount: unmount file systems.
| |
卸載檔案系統。
指令語法:umount [ device | mount-point ]
| |
umount 可以針對裝置名稱或掛載點來進行卸載。不過卸載前記得要先將目錄切離目前的掛載點,否則無法執行卸載。 |
範例說明:
suselinux:/mnt/hda10
# umount /mnt/hda10
umount: /mnt/hda10: device is busy
umount: /mnt/hda10: device is busy
→ 看到沒,因為您目前的工作目錄就在掛載點上,所以無法進行卸載。
suselinux:/mnt/hda10 # cd
suselinux:~ # umount /mnt/hda10
→ 這樣就可以成功卸載了。
不過有時候您會發現雖然目前的工作目錄不是在掛載點上,但還是無法進行卸載,此時您可使用
lsof 或 fuser
指令檢查一下:
suselinux:~ # umount /home
umount: /home: device is busy
suselinux:~ # lsof /home
| COMMAND |
PID |
USER |
FD |
TYPE |
DEVICE |
SIZE |
NODE |
NAME |
| bash |
4695 |
barry |
cwd |
DIR |
3,17 |
704 |
5 |
/home/barry |
| vi |
4818 |
barry |
cwd |
DIR |
3,17 |
704 |
5 |
/home/barry |
| vi |
4818 |
barry |
3u |
REG |
3,17 |
4096 |
20 |
/home/barry/.barryfile.swp |
→ 由以上可以看出
bash 及 vi 兩支程式目前正在存取 /home partition ,且執行身分為 barry,因此目前無法對 /home 進行卸載。
uselinux:~ # fuser
-vm /home
| |
USER |
PID |
ACCESS |
COMMAND |
| /home |
barry |
4695 |
. . c . . |
bash |
| |
barry |
4818 |
f . c . . |
vi |
→ 使用
fuser 指令來查看也行。若您想終止所有程式對
/home 的存取,可再加上個 " -k " 參數即可:
uselinux:~ # fuser
-vmk /home →
存取 /home 的程式被終止後,應該就能順利卸載了。
卸載 cdrom :
suselinux:~ # umount /mnt/cdrom
|
|
5.2.4
df 及 du 指令
上一小節裡有提到 df 這個指令,而實際上這個指令主要是用來查看目前檔案系統所使用磁碟空間的狀況。至於
du 則是顯示檔案目錄所使用磁碟空間的情形。
● df: report
file system disk space usage.
| |
報告檔案系統所使用磁碟空間的狀況。
指令語法:df [OPTION]... [FILE]...
參數說明:
| -k |
以 KB 為單位來顯示檔案系統使用空間情形。此為預設值。 |
| -h |
會以適當的讀取格式來調整顯示的單位。 |
| -T |
所檢視的內容中,會多一個檔案系統類型的欄位。 |
| -t |
只列出想要查看的檔案系統類型。 |
| -i |
列出 inode 訊息。 |
範例說明:
barry@suselinux:~> df
| Filesystem |
1K-blocks |
Used |
Available |
Use% |
|
Mounted on |
| /dev/hda5 |
1261012 |
586384 |
674628 |
47% |
|
/ |
| tmpfs |
128156 |
0 |
128156 |
0% |
|
/dev/shm |
| /dev/hda3 |
104376 |
36764 |
67612 |
36% |
|
/boot |
| /dev/hda8 |
514028 |
33048 |
480980 |
7% |
|
/home |
| /dev/hda6 |
2522028 |
1600516 |
921512 |
64% |
|
/usr |
| /dev/hda7 |
514028 |
125912 |
388116 |
25% |
|
/var |
| → |
查看目前已掛載的檔案系統所使用磁碟空間的情形,如已使用空間、剩餘可用空間、空間使用率及掛載點等,顯示大小單位預設為
kilo bytes。若希望以 MB 的單位來顯示,則可使用 "df -m"。
|
barry@suselinux:~> df -h
| → |
使用此參數可讓顯示大小單位視字元長度而自動調整。 |
barry@suselinux:~> df -T
| → |
會讓所列出的內容中多一個
fs-type 的欄位。 |
barry@suselinux:~> df -i
| → |
檢視每個檔案系統
inode count 的資訊。此參數 ReiserFS 不適用,因其 inode 是屬於動態分配的。
|
barry@suselinux:~> df -t reiserfs
|
|
●
du:estimate file space
usage.
| |
計算檔案目錄所使用磁碟空間大小。
指令語法: du [OPTION]... [FILE]...
參數說明:
| -k |
以 KB 為單位來列出檔案目錄使用空間情形。此為預設值。 |
| -h |
會以適當的讀取格式來調整顯示的單位。 |
| -a |
輸出的內容中會包含檔案在內。 |
| -s |
只列出檔案目錄所佔用的總空間數值。 |
| -b |
顯示單位為 bytes,如要以 MB 為單位,則需使用 " -m " 參數。 |
範例說明:
barry@suselinux:~> du
| → |
du
後面沒指定檔案目錄,就是列出目前所在的工作目錄共使用了多少磁碟空間,而這個使用空間大小不是只算目錄本身噢,還包括此目錄樹系裡的所有檔案目錄。另外預設的顯示單位為
KB,所以跟 " du -k " 是相同的。 |
barry@suselinux:~> du
-b /etc/passwd
2074 /etc/passwd
| → |
顯示
passwd 的檔案大小為 2074 bytes。如您以預設的顯示單位 KB 來計算的話,則是 4 K,因為 SuSE
預設的區塊大小為 4096 bytes。 |
barry@suselinux:~> du
/etc/passwd
4 /etc/passwd
suselinux:~ # du
/etc
suselinux:~ # du
-a /var
| → |
加上
-a 參數後,會在螢幕上把所有檔案所使用的空間大小都列出來。如不加此參數,則預設只列出目錄。 |
suselinux:~ # du
-s /home
249 /home
|
|
5.3 設定開機自動掛載
各位或許會覺得納悶,為什麼當我們登入系統後沒執行 mount 指令,卻可以正常的存取每個 partition ? 這就是因為 /etc/fstab
檔案裡頭設定的關係啦 ! /etc/fstab 記載的是檔案系統的相關資訊,其為系統於開機過程中必須去讀取的一個重要檔案。
/etc/fstab 的內容共分六欄位,其格式如下:
| device |
mount-point |
fs-type |
options |
dump |
fsck |
| 裝置 |
掛載點 |
檔案系統類型 |
選項 |
備份 |
磁碟檢查 |
看了這個內容後,有沒有感覺跟我們在執行 mount 指令時很像,沒錯,其實系統在開機過程中,就是根據這裡的設定來幫我們將 device 掛載至 mount-point
上頭,所以在開機完成後您便可以很輕鬆的存取每個 partition。
以下我們會以 Fedora 及 SuSE 這兩種版本來跟各位介紹 /etc/fstab。
5.3.1 Fedora 的 /etc/fstab
先來看一下內容:
| [root@fedora root]#
cat /etc/fstab |
|
|
|
|
| LABEL=/boot |
/boot |
ext3 |
defaults |
1 |
2 |
| LABEL=/ |
/ |
ext3 |
defaults |
1 |
1 |
| LABEL=/usr |
/usr |
ext3 |
defaults |
1 |
2 |
| LABEL=/home |
/home |
ext3 |
defaults |
1 |
2 |
| /dev/hda5 |
swap |
swap |
defaults |
0 |
0 |
| /dev/cdrom |
/mnt/cdrom |
udf,iso9660 |
noauto,owner,kudzu,ro |
0 |
0 |
| /dev/fd0 |
/mnt/floppy |
auto |
noauto,owner,kudzu |
0 |
0 |
| none |
/proc |
proc |
defaults |
0 |
0 |
|
我們從第一至第六欄位依序介紹:
| 1. |
裝置名稱:
分割區的裝置名稱一般使用 /dev/hdax (如 hda1、hda2、…) 來做設定,不過 Fedora 在這裡是使用 file
system label 的方式來代替 device-name。
如您想知道某個分割區裝置的 fs-label ,可使用 e2label 指令 (適用於 ext2 及 ext3):
您也可以修改 fs-label:
| # e2label /dev/hda3 new-label |
更改過後可記得要到 /etc/fstab 內作調整。
另外您亦可使用 tune2fs 指令來修改 fs-label:
| # tune2fs -L new-label /dev/hda3 |
| Note: |
如果是 SuSE 的 ReiserFS 檔案系統,則可以使用 " reiserfstune
" 指令來設定或修改 fs-label。比如您 /dev/hda8 是掛載至 /home,想為 /dev/hda8 設定標籤為
/home 時就可以這麼做:
# umount /home
# reiserfstune -l /home /dev/hda8 |
設定完成後,就可以至 /etc/fstab 將 /dev/hda8 那個欄位改成 LABEL=/home,試試看吧
!
檢視此 partition 的 fs-label、block size、free blocks 等等相關資訊。 |
|
| |
|
| 2. |
掛載點:
這個應該不成問題,不過裡頭有兩個比較特殊的名稱,分別為 swap 及 /proc,由於這個範例中的 /dev/hda5 是做 swap 交換區,所以這個欄位需設定成
swap ; 至於 /proc 是屬於一個虛擬目錄,不佔硬碟空間,您可以在 /proc 目錄中檢視很多的系統資訊。 |
| |
|
| 3. |
檔案系統類型:
這裡也應沒啥問題,比較有意思的是 Floppy 在這個地方設定成 auto,這代表系統會自動去找尋合適的檔案系統來給 Floppy 使用。如您不使用
auto 的話,那現在如果 Floppy 格式化成 ext2 時,在這裡您就要設定 ext2,萬一哪天您又將它格式化成 vfat,則又要去修改一次,所以為了避免麻煩,就使用
auto 來做設定囉 ! |
| |
|
| 4. |
掛載參數 (options):
就是在 mount 指令中所介紹的那些選項,請自行參考 mount 那邊的說明。另外因為 cdrom 及 floppy 一般都是需要用到時才掛載,所以這裡設定為
noauto ; 至於 owner 選項是說裝置的擁有者才有權掛載。 |
| |
|
| 5. |
備份 (dump):
dump 這個欄位可以設定成 1 或 0,當設定成 1 時,表示當磁碟分割區內資料有異動時,會先暫存在記憶體緩衝區中,一直到緩衝區滿了或系統閒置時才寫入磁碟裡
; 而設定成 0 代表不做 dump。因此選擇做 dump 時,都會搭配第六個欄位的 fsck 來使用。一般若是 Linux 的標準檔案系統,其
dump 皆設為 1,其他則設 0。
|
| |
|
| 6. |
磁碟檢查 (fsck):
設定系統開機時,執行磁碟檢查的順序,其值可設定成 0、1 或 2。
設定成 1,表示該檔案系統是在開機時最優先做磁碟檢查的,因 root partition 須先於其它分割區作磁碟檢查,故應設為 1。而 root
partition 以外的其他 partition 則設為 2,如 /boot、/home、/var、/tmp 等等。至於非 Linux native
者就設成 0。
這裡還有一個地方要注意,以 ext2 來說,如果上一次您是正常關機的話,則在這次開機時並不會做 fsck,除非是不正常關機才會在下次開機時強迫做磁碟檢查。
|
當我們使用 mount 指令執行掛載時,如 /etc/fstab 內已有該檔案系統的相關紀錄,則執行掛載之時,只需針對 device 或 mount-point
來進行 mount 即可。比如要掛載 Floppy 或 cdrom 時,可以這麼執行:
# mount /mnt/floppy
# mount /mnt/cdrom |
另外有時候在掛載 CD-ROM 或 Floppy 後會發現中文檔名無法正確顯示,此時您可以修改一下 /etc/fstab:
# vi /etc/fstab
/dev/fd0 /mnt/floppy auto noauto,owner,kudzu,iocharset=cp950
0 0 |
不然您也可以在執行 mount 時直接加上去:
| # mount -o iocharset=cp950 /mnt/floppy |
最後來談一下檔案系統轉換的問題,如果您原本檔案系統為 ext2,現在想轉換成擁有日誌功能的 ext3 要如何做呢 ? 由於 ext2 及 ext3 的基本檔案結構都相同,所以可以很容易的進行轉換,只要使用
tune2fs 指令就行了:
轉換成功後,再將 /etc/fstab 內 /dev/hda10 的 fs-type 改成 ext3。
5.3.2 SuSE 的 /etc/fstab
SuSE 的 fstab 檔案內容如下:
suselinux:~ #
cat /etc/fstab
| /dev/hda5 |
/ |
reiserfs |
acl,user_xattr |
1 |
1 |
| /dev/hda3 |
/boot |
reiserfs |
acl,user_xattr |
1 |
2 |
| /dev/hda8 |
/home |
reiserfs |
acl,user_xattr |
1 |
2 |
| /dev/hda6 |
/usr |
reiserfs |
acl,user_xattr |
1 |
2 |
| /dev/hda7 |
/var |
reiserfs |
acl,user_xattr |
1 |
2 |
| /dev/hda9 |
swap |
swap |
pri=42 |
0 |
0 |
| devpts |
/dev/pts |
devpts |
mode=0620,gid=5 |
0 |
0 |
| proc |
/proc |
proc |
defaults |
0 |
0 |
| usbfs |
/proc/bus/usb |
usbfs |
noauto |
0 |
0 |
| sysfs |
/sys |
sysfs |
noauto |
0 |
0 |
| /dev/dvd |
/media/dvd |
subfs |
noauto,fs=cdfss,ro,procuid,nosuid,nodev,exec,iocharset=utf8 0 0 |
| /dev/fd0 |
/media/floppy |
subfs |
noauto,fs=floppyfss,procuid,nodev,nosuid,sync 0 0
|
|
SuSE 裡頭對於移動式的儲存媒體 (如 cdrom 及 floppy) 是使用 subfs 的檔案系統,使用這個檔案系統的目的是讓
submountd 程式能夠自動掛載及卸載可移動式的媒體裝置。當您將光碟片或磁片放入並開始對其所掛載的目錄做存取時,submountd
就會自動掛載這些裝置,而當您存取動作停止時,submountd 就會自動卸載他們。以這裡的設定來說,DVD ROM 是掛載到 /media/dvd,而 floppy
是掛載到 /media/floppy,所以您只要把光碟片或磁片放入後,就可以直接切換到這些目錄下去做存取,而不需額外執行 mount 指令來掛載。至於 options
部分,設定成 " fs=cdfss " 是要讓 submound 嘗試掛載 iso9660 或 udf
的檔案系統,設定成 " fs=floppyfss" 是要讓 submound 嘗試掛載 vfat 或
ext2 的檔案系統,您也可以使用 fs=auto 來讓 submount 決定要使用的檔案系統。至於其他詳細說明可 "man
submount" 來自行查閱。
再來您會看到 Linux native 檔案系統都有設定 acl (Access Control Lists) 及 user_xattr (Extended
User Attributes),這兩個選項是用來支援存取控制表及檔案延伸屬性的。
最後您在檔案系統欄位還會見到幾個怪怪的名稱,如 devpts、proc、sysfs 等,這就是現在要介紹的虛擬檔案系統。在 Linux 中,有一些檔案系統它並不是存在於實體的儲存裝置上,那當然也就不會佔用儲存空間了。當這一類的檔案系統在被掛載後,我們就可以去存取其內的檔案目錄資料,而這些資料都是由核心所建立維護的。以下簡單說明一些虛擬檔案系統的作用:
| |
˙ |
proc
其所對應的目錄在 /proc,而此目錄內所顯示訊息是由核心取得,包括了很多系統資訊於其中,如系統所有行程、硬體裝置的資訊、cpu 及記憶體的訊息、裝置
IRQ 值 及 I/O port、… 等等。 範例說明:
suselinux:~ # cat
/proc/cpuinfo
→ 查看 cpu 廠牌、頻率等等相關訊息。
suselinux:~ # cat /proc/interrupts
→ 查看週邊裝置的
IRQ 值 (中斷要求)。
suselinux:~ # cat /proc/ioports
→ 查看週邊裝置的
I/O Address。I/O Address 為 device 與 cpu 或 device 與 memory 間溝通的管道。
suselinux:~ # cat /proc/meminfo
→
顯示記憶體及 swap 資訊。
suselinux:~ # cat /proc/mounts
→ 顯示系統目前已掛載的檔案系統。
suselinux:~ # cat /proc/modules
→ 顯示目前核心已載入的模組。
|
|
| |
|
|
| |
˙ |
devpts
其作用是當使用者作遠端連線時,會提供虛擬終端機來供其使用。至於在 options 欄位中的 mode,是用來設定
/dev/pts 目錄下那些裝置檔案的預設權限,gid 是說那些裝置檔案的擁有群組為何。 |
| |
|
|
| |
˙ |
sysfs
綜合了 proc、devfs 及 devpts 這三者的訊息,其所對應的目錄是在 /sys,請自行查閱。 |
/etc/fstab 檔案大致就是如此啦 !
一般人容易把 /etc/fstab 及 /etc/mtab 搞混,其實您只要針對檔名的解釋就應該能很清楚區分。fstab 是 file system table,mtab
是 mount table,一個是用來設定檔案系統的資訊,並可決定下次開機時要自動掛載哪些檔案系統 ; 另一個是用來紀錄目前有掛載的檔案系統資訊,這樣子解釋應該就能夠分辨了吧
!
我們若要查詢系統目前正掛載哪些檔案系統,可用以下的方式:
barry@suselinux:~> cat
/proc/mounts
barry@suselinux:~> cat /etc/mtab
barry@suselinux:~> mount
barry@suselinux:~> df |
5.4
使用 YaST 執行磁碟分割
從 5.2 節至
5.3 節,各位應該已經學會如何在 command line 下做磁碟分割,並且讓此分割區最後能被系統所存取的做法,甚至也了解要如何讓檔案系統在開機時自動掛載
; 不過這一連串的動作,如果是使用 YaST 這個強大的工具來執行的話,一次就能幫您全部搞定。等一下我們會在文字介面下來執行 YaST,如您喜歡在 X-WINDOW
操作也不反對,話不多說,馬上來實做一次吧 !
首先請您以 root 的身分在 command line 上執行 yast 或 yast2 指令,然後就會進入到 YaST 的控制中心主畫面:

先在畫面左邊的主選單選取
[System],再選取 [Partitioner] 這個項目,然後按下 Enter 鍵。
這只是個警告訊息,直接選取
[Yes] 來進行下一步。
這是在您這顆硬碟上目前所存在的分割區,請選取 [Create] 來建立一個新的分割區。
在左邊的 [Format] 中選擇您要格式化的檔案系統,接著在右邊的 [Size] 中指定這個分割區大小,請在結束磁柱
[End] 處做輸入即可,最後就是指定這個分割區的掛載點 [Mount Point],筆者是打算掛載到 /mnt/hda10 這個目錄 (必須事先存在),所以就直接輸入
/mnt/hda10,完成後選取 [OK] 來進行下一步。
如您想繼續建立其他的分割區,請再重複剛剛的步驟即可,否則請選取 [Apply]。
這是要求您做最後確認的提示訊息,選取 [Apply] 或 [Finish] 皆可。
由於筆者剛剛是選取 [Apply],所以會看到這個畫面,如沒問題的話,選取 [Quit] 離開即可。若剛剛您是選取
[Finish] 的話,則會直接回到 YaST 控制中心的主畫面。
當您以上步驟都完成後,就可以直接對 /mnt/hda10 做存取,夠方便吧 ! 另外 /etc/fstab 也都幫您搞定了噢 !
5.5
磁碟檢查
剛開始接觸 Linux 的朋友一定都有個經驗,只要遇到操作過程不順或者無法正常開機時,乾脆就把作業系統重灌一次,這是因為您對系統的相關知識認識的還不夠,不曉得遇到問題時該如何處理,所以才會一直重複安裝作業系統,而一旦您對系統慢慢的熟悉之後,自然就懂得如何找出問題點及如何除錯了。
有很多時候造成無法開機的原因,是因為檔案設定的問題,不過如果您確認系統一些與開機相關的重要檔案都沒設定錯誤,但還是無法順利開啟作業系統時,那可能就要執行磁碟檢查了。
這裡我們主要是要介紹磁碟檢查的工具,像 fsck、reiserfsck 等,它們是用來檢查及修復 Linux 的檔案系統。在一般系統正常的情況下,不需使用這些工具,只有在檔案系統出問題時才考慮去使用它。
一般在執行磁碟檢查時都會在維護模式 (單人模式、救援模式) 中進行,所以先學會如何進入維護模式是必要的。另外如果與開機相關的檔案設定有誤而造成無法順利啟動系統時,那也是要進入維護模式才能修改檔案啊。
5.5.1 進入維護模式的方式
我們先針對 Fedora 來介紹幾種進入維護模式的方法:
| |
| 1. |
進入單人模式:
於 grub 選單畫面下,先選取您要開啟的 Linux 作業系統,然後按 e 進入編輯,接著選擇
kernel 那一行,再按 e 進入編輯,並於該行最後面空一格後補上 linux
-s ( linux s 亦可) 或 linux single ,若只輸入 s 或 single 亦可,然後按 Enter
鍵後再按 b 就大功告成了。另外一種比較快速的做法,是在選擇好您要開啟的 Linux 作業系統並按下
a ( appand 之意 ) 之後,直接於該行最後面空一格補上 s 或 single 就行了。 |
| |
|
| 2. |
進入救援模式:
使用第一片安裝光碟開機時,看到 boot 提示號後馬上輸入 linux rescue ( 救援模式
) :
按下 Enter 鍵後再經過一問一答就可順利進入,而在成功登入後請記得執行:
這樣就可以開始對檔案系統進行除錯了。 |
| |
|
| 3. |
使用開機片:
一樣是在 boot 提示號下輸入 " linux -s " 來進入到單人模式。 |
|
再來看看使用 SuSE 進入維護模式的幾種方法:
| |
| 1. |
先於 SuSE 的 Grub 選單畫面中選取 Linux 作業系統,接著到最底下的 Boot
Options 處輸入數字 " 1 " ,然後按下 Enter
鍵,最後在您成功輸入 root 密碼後就可順利進入。 |
| |
|
| 2. |
使用 SuSE 第一片安裝光碟開機時,在選單上選擇 " Rescue System
" ,然後按下 Enter 鍵,當您看到 " Rescue login: "
的登入提示時直接輸入 root 即可。不過登入成功後您需先將 root partition 掛載起來:
為了待會兒操作方便,可以將根目錄改變至 /mnt:
另外您用 df 指令檢查時,如果發現其他分割區沒被掛載進來,那就執行 "
mount -a " 囉 !
這樣大致上就可以了。完成修復工作後可執行 " reboot " 指令來重新開機。 |
| |
|
| 3. |
在 grub 選單畫面上按下 ESC 鍵後,您會看到 " You are leaving
the graphical boot menu and starting the text mode interface. "
這個訊息,請選擇 " OK ",接下來的步驟就跟 Fedora 的第一點做法類似,不再贅述。 |
| |
|
| 4. |
在 grub 選單畫面上選擇 Failsafe,然後以 root 來登入就行了 (需輸入密碼)。 |
|
5.5.2 執行磁碟檢查
要執行磁碟檢查之前,請先把即將進行磁碟檢查的分割區 umount ( root partition 除外 ) 或者 remount 為 read-only
( 例如根目錄 ),然後才開始對該分割區執行檔案系統的檢查工作。以下就介紹幾個檢查檔案系統的工具。
●
fsck: check and repair a Linux file system.
| |
檢查及修復 Linux 檔案系統。 指令語法:fsck
[options] device-name
參數說明:
| -t |
指定要被檢查的檔案系統類型。 |
| -A |
對 /etc/fstab 所列的檔案系統進行檢查。這個參數會在開機過程中、在掛載檔案系統前被核心來使用,只要是不正常卸載檔案系統時就會對該檔案系統進行磁碟檢查。 |
| -r |
Interactively repair the file system.
使用互動式交談來修復檔案系統 ; 一般在執行磁碟檢查時,若發現有要修復的檔案,系統會詢問您是否要修復,等您回答後才繼續進行下一個動作。 |
| -a |
Automatically repair the file system without any questions.
不會提出詢問,而自動幫您修復檔案系統。 |
範例說明:
suselinux:~ # fsck
-t ext2 /dev/hda10
→ 上式也可寫成 "e2fsck /dev/hda10"
suselinux:~ # fsck
-a /dev/hda10
→ 自動修復檔案系統,不做任何的詢問。
|
|
●
e2fsck:check a Linux second extended file system.
| |
檢查及修復 ext2 或 ext3 的檔案系統。 常用參數:
| -c |
檢查有無壞軌。 |
| -p |
不詢問使用者,自動修復檔案系統。與 -a 參數差不多意思 。 |
| -y |
執行磁碟檢查的過程中,對所有的詢問系統會自動幫您回答 " yes "。 |
範例說明:
suselinux:~ # e2fsck
-c /dev/hda10
→ 做磁碟檢查前先檢查有無壞軌。
suselinux:~ # e2fsck -y /dev/hda10
→ 對所有要修復檔案的詢問,自動幫您回答
yes。
|
|
●
reiserfsck: checking tool for the ReiserFS filesystem.
| |
若您是使用 ReiserFS
檔案系統的話,可使用 reiserfsck
或 fsck.reiserfs 指令:
suselinux:~ #
fsck.reiserfs /dev/hda10
Will read-only check consistency of the filesystem on /dev/hda10
Will put log info to 'stdout' Do you
want to run this program?[N/Yes] (note need to type Yes if you do):
Yes
########## ↑
reiserfsck --check started at Wed May 3
22:33:54 2006 確認要做磁碟檢查
##########
Replaying journal..
Reiserfs journal '/dev/hda10' in blocks [18..8211]: 0 transactions
replayed
Checking internal tree..finished
Comparing bitmaps..finished
Checking Semantic tree:
finished
No corruptions found
There are on the filesystem:
Leaves 17
Internal nodes 1
Directories 30
Other files 65
Data block pointers 16 (0 of them are zero)
Safe links 0
##########
reiserfsck finished at Wed May 3 22:33:57
2006
##########
suselinux:~ # reiserfsck -y /dev/hda10
→ 加上
-y 參數後,就不會看到 [ Do you want to run this program?
] 這個詢問了。
|
|
●
badblocks:search a device for bad blocks.
| |
使用這個指令可檢查您磁碟有無壞軌:
suselinux:~ # badblocks
-v /dev/hda10
→
加上 -v 參數,可以顯示檢查進度。 |
|
5.6 實現
LVM ( Logical Volume Manager)
5.6.1 LVM 概述
所謂的 LVM (邏輯磁區管理),就是把一些磁碟分割區或硬碟結合在一起成為一個比較大的空間後,再於這個空間中去做邏輯磁區的分割,並給於這些邏輯磁區所要使用的檔案系統及掛載點。與傳統的磁碟分割最大的不同在於
LVM 可隨時調整分割區的大小,比如哪天您要是發覺 /var 目錄空間不足時,就可以放大 /var 的邏輯磁區,所以相較於傳統的分割來說,具備了更大的彈性。
LVM 相關的名詞:
| PV |
Physical Volume,實體磁區之意。實體磁區可以是磁碟本身或是磁碟上的分割區,只不過這些磁區是打算用來做
LVM 的,也就是說這個 PV 實際上就是由 partition 轉換而來的。 |
| VG |
Volume Group,磁區群組之意。將一些 PV 給他集合在一起,就構成了 VG,也就是說 VG 是由 PV 組合而成的。所以說您的 LVM
裡頭能有多大的空間來做邏輯磁區的分割,就要看 VG 大小為何了。 |
| LV |
Logical Volume,邏輯磁區之意。LV 是由 VG 中所切割出來的。 |
| PE |
Physical Extent,為 PV 的組成單位。當我們將 PV 組成 VG 時,LVM 會將每個 PV 裡邊切割成好幾個區塊,這個區塊空間就是
PE。一般 PE 大小是 4 MB。 |
| LE |
Logical Extent,為 LV 的組成單位,其大小通常與 PE 相同或為 PE 的倍數。 |
LVM 的基本結構圖如下所示:
待會我們要實作 LVM 時,請記得以上所講過的概念,也就是一定要先產生 PV,有了 PV 才能進一步組成一個 VG,進而在 VG 之中去切割 LV。
| Note: |
如果您在安裝 Linux 時是採取 LVM 的方式,請記得將 /boot 獨立出來,也就是 /boot partition
不能存在於 VG 中,以免造成 boot loader 無法讀取。 |
5.6.2 實作 LVM
以 下的實作,都是在圖形介面下使用 YaST 來操作的。首先筆者會先切割兩個分割區來做 PV,然後再組成 VG,最後於 VG 中切割成三個 LV:
一開始先點選 [Partitioner] 去建立實體磁區。
點選 [Create] 來建立 PV。
在左邊的 Format 裡選擇不格式化,且 [File system ID] 處選擇 [0x8E Linux LVM],再來分割區大小我給它 1G,完成後請點選
[OK]。
按照相同的步驟再建立第二個實體磁區,建立好後的畫面就像上面這個樣子。沒問題的話,請點選 [Apply]。
這只是詢問您是否確定要做改變而已,直接點選 [Finish] 就行了,這樣就完成了實體磁區的建立。
回到主畫面後,請點選 [LVM]。
這裡我們輸入磁區群組的名稱為 test,而 PE 大小使用預設值即可。
左半邊是實體磁區的部分,先選取 /dev/hda10,然後點選 [Add Volume],這樣就可以把這個實體磁區加入磁區群組中。請用相同的步驟來將
/dev/hda11 也加入磁區群組中。
此時我們可以看到目前右半邊磁區群組的總空間為 1.7G,也就是剛剛加入的那兩個實體磁區的總和。所以接下來就可以開始點選 [Add] 來新增第一個邏輯磁區了。
首先在 [Format] 部分選擇您要給這個 LV 所使用的檔案系統,而在 [Logical volume name] 請輸入邏輯磁區的名稱 test1,再來指定
LV 的 [Size],這裡我是輸入 500 M,最後則是指定這個 LV 的掛載點。由於筆者打算把等一下建立起來的 LV 分別掛載至 /test1、/test2
及 /test3,所以這些目錄必須事先建立起來。完成後請點選 [OK]。
在畫面右半邊已經可以看到剛剛設定後的結果。接著請用相同的方式再新增兩個 LV 出來。
成功建立起三個 LV 後,請點選 [Finish],此時就會看到確認訊息的詢問,那當然是 [OK] 啦 !
整個步驟都完成後會回到主畫面。要關掉 YaST 視窗的話就點選 [Close] 吧 !
接著您可以開始嘗試對 LV 做存取囉 ! 另外您可以到 /etc/fstab 裡頭去看看做了什麼改變,或者用 df 指令查看系統目前的掛載狀況。
調整邏輯磁區大小:
若您發覺 /test2 的 LV 空間已經不夠使用怎麼辦, 很簡單,只要 VG 中尚留有多餘的空間可用,那麼直接進行調整即可。
由上圖可以了解目前還有 320 M 可使用,所以筆者打算把 /test2 的 LV 由 400 M 調整成 600M,請點選 [Edit] 進去編輯。
直接修改 [Size] 成 600 M 即可。完成後點選 [OK]。
這就是調整後的畫面,沒問題的話,點選 [Finish] 就可以了。
邏輯磁區的空間加大是沒問題的,那縮小可行嗎 ? 如果您這個邏輯磁區內已經存在著很多資料,是不建議把空間縮減,因為有可能會造成您資料的遺失,那如果尚未存放什麼資料的話,當然是可行的,不過要縮減前請記得先將該邏輯磁區卸載下來。
加大磁區群組空間:
我們隨時可以加大磁區群組的空間。比如現在又新增了一個實體磁區 /dev/hda12,那麼跟前面的做法一樣,將其加入磁區群組即可。這就留給各位去練習了。
5.7 連結檔
在 Linux 中的連結檔有區分成兩種,分別是硬式連結檔 (hard link file) 與符號連結檔 (symbolic link file),而符號連結檔又稱為軟式連結檔
(soft link file), 至於建立連結檔所使用的指令為 " ln ",其基本語法如下:
ln [OPTION]... TARGET [LINK_NAME]
ln [OPTION]... TARGET... DIRECTORY
TARGET 是指所建立的連結檔是連結到哪裡,LINK_NAME 就是您所建立的連結檔名稱 ; 那如果您的 TARGET 有好幾個,則最後一個引數必須是一個已經存在的目錄,這樣才能在這個目錄下建立與那些
TARGET 同名的連結檔出來。
參數說明:
| -s |
想要建立符號連結檔時,就必須使用這個參數,而不加此參數所建立起來的就是硬式連結檔。 |
| -f |
當您要建立的連結檔名稱已經存在時,則會先將這個檔案移除,然後再讓您成功建立起連結檔。
|
5.7.1 符號連結檔
相關說明如下:
| 1. |
不同分割區可以做 soft link。 |
| 2. |
可以針對目錄做 soft link。 |
| 3. |
target file 與 link file 的 inode number 不同。 |
| 4. |
target file 與 link file 的檔案屬性不同。 |
| 5. |
target file 或 link file 修改內容後,另一個檔案的內容也會跟著改。 |
| 6. |
target file 刪除後,link file 就看不到任何內容了。 |
範例說明:這裡的 /home 與 / 為不同分割區噢。
suselinux:~ #
cp /etc/passwd /testfile
suselinux:~ # su - barry
barry@suselinux:~> ln -s /testfile softfile
→ 針對不同 partition 做符號連結。
barry@suselinux:~> ln -s /var softdir
→ 針對目錄做符號連結。
執行以上兩個步驟都應該會成功。接著用長格式比較檔案屬性及 inode number
是否不同:
barry@suselinux:~> ls -li /testfile softfile
| 161 |
-rw- r- - r- - |
1 |
root |
root |
1414 |
Aug 29 07:03 |
/testfile |
| 151 |
lrwxrwxrwx |
1 |
barry |
users |
9 |
Aug 29 07:03 |
softfile
--> /testfile |
再來請您使用 root 身分去修改 /testfile 的內容,修改完後再觀察 softfile
的內容是否也有跟著改變,自己練習看看囉 !
另外要留意的是 barry 對這個符號連結檔的真正存取權限是與 TARGET file
相同的。
最後把 TARGET file 刪除,然後用 barry 登入,並對 softfile 做存取:
suselinux:~ # rm -f /testfile
barry@suselinux:~> cat softfile
cat : softfile : No such file or directory
其實符號連結檔說穿了也不過是個 pointer 罷了,其所指向的是一個 path-name
,所以當 TARGET file 刪除後自然就無法存取連結檔了。
barry@suselinux:~> ln
-s /etc/passwd
barry@suselinux:~> ls
passwd
→ 當忽略 LINK_NAME 時,就會在目錄下建立一個與 TARGET file
同名稱的連結檔。
barry@suselinux:~> ln -s /etc/fstab passwd
ln : creating symbolic link `passwd' to `/etc/fstab' : File exists
→ 由於
passwd 這個檔名已經存在,所以無法成功建立連結檔。
barry@suselinux:~> ln -sf /etc/fstab passwd
→ 加上
" -f " 參數後,就可以先將 passwd 檔案移除,之後當然就可以順利建立起來了。
barry@suselinux:~> mkdir dir
barry@suselinux:~> ln -s /etc/passwd /etc/fstab
dir
barry@suselinux:~> ls dir
fstab passwd
→ 此範例說明了
TARGET file 有多個時,最後一個引數必須是一個已經存在的目錄。
|
5.7.2 硬式連結檔
相關說明如下:
| 1. |
不同分割區無法做 hard link。 |
| 2. |
不能針對目錄做 hard link。 |
| 3. |
target file 與 link file 的 inode number 相同。 |
| 4. |
target file 與 link file 的檔案屬性相同。 |
| 5. |
target file 或 link file 修改內容後,另一個檔案的內容也會跟著改。 |
| 6. |
任何一個檔案刪除後,另一個檔案仍保有原內容。 |
範例說明: /home 與 / 為不同分割區
suselinux:~ #
cp /etc/passwd /testfile
suselinux:~ # su - barry
barry@suselinux:~> ln /testfile hardfile
ln : creating hard link `hardfile' to `/testfile' : Invalid cross-device
link
→
這是在不同分割區建立硬式連結失敗後所顯示的訊息。
barry@suselinux:~> ln /etc hardfile
ln : `/etc' : hard link not allowed for directory
→
無法對目錄做硬式連結。
接著使用 root 身分來複製 /etc/fstab 至 /home/barry 內:
suselinux:~ # cp
/etc/fstab /home/barry
再來使用 barry 身分來建立硬式連結檔:
barry@suselinux:~> ln
fstab hardfile
barry@suselinux:~> ls
-li fstab hardfile
81 -rw-r--r-- 2 root root 1680 Aug 29 08:03 fstab
81 -rw-r--r-- 2 root root 1680 Aug 29 08:03 hardfile
→
這結果顯示 TARGET file 與 hard link file 的檔案屬性及
inode number 皆相同。
|
最後可試著將 target file 或 link file 刪除,結果另外一個檔案的內容還是會存在著。
由於 target file 與 hard link file 兩者是使用同一個 inode,所以當然是存取相同的 data block,假使其中一個檔案不小心被刪除了,另一個檔案還可以保有這個
inode 及 block 的資料,除非您將這兩個檔案都刪除後,此 data block 的空間才能被釋放出來。
其實平常我們在建立連結時,使用符號連結的機會較大,因為硬式連結畢竟有一些限制存在。而做連結的好處除了可以節省磁碟空間外,也可以藉著修改 TARGET file,而讓所有連結至這個檔案的使用者取得檔案內容的一致性。
5.7.3 分割區空間不足的解決方式
針對 soft link 還有一個很好用的地方,就是當我們磁碟上的某個分割區空間不足時,可以藉由連結的方式來暫時解決這個問題 ; 假設 /home 及 /var
為各自獨立的 partition,而現在發現 /home 已經剩沒多少空間可用,但是 /var 的分割區還有很多空間,那麼您可以利用連結的方式來解決這個問題:
suselinux:~ # cp
-a /home /var/home
→ 先將 /home 目錄複製至 /var 中。
suselinux:~ # umount /home
→ 上一步驟執行完成後,就可以把
/home partition 卸載囉。
suselinux:~ # rm -rf /home
suselinux:~ # ln -s /var/home /home
→ 請注意,如果
/home 目錄沒事先移除的話,那麼是會在 /home 底下建立起一個 home 的連結檔噢。
若要回復原來的狀態,可以這麼做:
suselinux:~ #
rm -rf /home
suselinux:~ # mkdir
/home
suselinux:~ # mount
/home |
針對磁碟空間不足的另外一種解決方式是加掛一顆硬碟,當然您要先用 fdisk 來新增一分割區,比如為 /dev/hdb1,並且製造一檔案系統給他,然後才可以接著以下的步驟:
suselinux:~
# mkdir /mnt/hdb1
→ 先建立掛載點。
suselinux:~ # mount
/dev/hdb1 /mnt/hdb1
→ 將新增的
partition 掛載上去。
suselinux:~ # cp
-a /home/* /mnt/hdb1
→ 把使用者的家目錄複製到新增的分割區當中。
suselinux:~ # umount
/mnt/hdb1
suselinux:~ #
umount /home
suselinux:~ # mount
/dev/hdb1 /home
→
將新增的分割區掛載至 /home。 |
最後再到 /etc/fstab 裡去做個調整:
| /dev/hdb1 /home reiserfs acl,user_xattr 1 2 |
5.8
磁碟限額管理 (Managing
disk quota)
quota 是用來對 user 或 group 做不同的或相同的磁碟空間使用限制,且 quota 只能針對 partition 做限制,而無法針對 partition下的某個目錄設限。比如您想限制使用者在家目錄下的使用空間,那麼就可針對
/home partition 做 quota ; 又如想限定使用者的信箱容量,則可針對 /var/spool/mail 來做 quota (可要事先給
/var/spool/mail 一個獨立的 partition 噢)。
5.8.1 確認 quota 套件的安裝
在執行 quota 之前,您需要先確認 quota 套件有安裝,不過由於套件管理尚未學習到,所以可以先使用 YaST 來搞定:

點選安裝移除軟體項目。

在 Search 那個地方輸入您要搜尋的套件名稱 quota,然後再按下 [Search] 按鈕。

畫面的右邊是您搜尋出來的結果,如 quota 套件名稱的旁邊有打勾,表示此套件已安裝在系統上,那萬一沒有的話就給它勾上,然後按下 [Accept]。

這個畫面是提示您 quota 套件在第三片光碟中,所以趕快放進去吧 ! 最後再按下 [OK] 就行了。

這是 SuSEconfig 正在幫您寫入相關組態檔,完成後就結束套件的安裝了。
5.8.2 設定 quota
接著我們就以 /home partition 為例,來說明 quota 的設定:
步驟一:設定 /home partition 的 quota 功能
| |
編輯 /etc/fstab,並在 /home partition 那一行的 options 欄位補上 usrquota
或 grpquota,當然如果只想針對使用者做 quota,那就補上 usrquota 就行了:
suselinux:~ # vi
/etc/fstab
| /dev/hda5 |
/ |
reiserfs |
acl,user_xattr |
1 |
1 |
| /dev/hda3 |
/boot |
reiserfs |
acl,user_xattr |
1 |
2 |
| /dev/hda8 |
/home |
reiserfs |
acl,user_xattr,usrquota,grpquota 1 2 |
:略 |
|
步驟二:重新掛載 /home partition
| |
這個步驟主要是更新 /etc/mtab 的資料,因為在設定 quota 的過程中,往往會去讀取這個檔案的內容,如果您
/etc/mtab 裡沒有 usrquota 或 grpquota 的相關紀錄存在,則在設定過程會出問題。另一種更新 mtab 的方式就是重新開機,不過比較麻煩就是了。
suselinux:~ # mount
-o remount /home
suselinux:~ # cat /etc/mtab | grep home
/dev/hda8 /home reiserfs rw,acl,user_xattr,usrquota,grpquota 0 0
→ 確定在 /etc/mtab 的 options 欄位有 usrquota 或 grpquota。 |
|
步驟三:建立 aquota.user 及 aquota.group
| |
這兩個檔案主要是用來紀錄使用者及群組在這個做
quota 的分割區上所使用的空間狀況。不過您也可以略過這個步驟,直接進行下一步驟 quotacheck,他會自動幫您產生這兩個 quota file。這裡我們就先手動建立囉:
| suselinux:~
# touch /home/aquota.user /home/aquota.group
|
|
步驟四:掃描磁碟空間使用情形
| |
這裡是使用 quotacheck 指令來掃描使用者及群組目前在這個做 quota
的 partition 中所使用的磁碟空間及 inode count,並將統計數據寫入 aquota.user 及 aquota.group 裡。以下先來介紹這個指令的用法:
●
quotacheck:scan a filesystem for disk usage.
| |
指令語法:quotacheck [ -gufvm ]
-a | filesystem
| |
filesystem 可以是 device-name 或 mount-point ; 而當您有使用
-a 參數時就不需要指定 filesystem。 |
參數說明:
| -g |
掃描群組目前已使用的磁碟空間及 inode count。 |
| -u |
掃描使用者目前已使用的磁碟空間及 inode count。 |
| -v |
顯示執行過程。 |
| -m |
正常在執行 quotacheck 時,系統會先自動將該檔案系統 remount 成 read-only,然後再進行掃描,等完成掃描後才又再
remount 回 read-write,而當您加上 -m 參數後,就會忽略 remount
這個動作。 |
| -f |
一般在執行 quotacheck 前,都會先將 quota 關掉 (使用 quotaoff 指令),而如您想在 quota
啟動的狀態下執行掃描,可加上 -f 參數來強迫執行 quotacheck,不過不建議這樣做。 |
| -a |
依據 /etc/mtab 來掃描要做 quota 的檔案系統。 |
|
接著就來對 /home partition 進行 quotacheck:
suselinux:~ # quotacheck
-guv /home
→ 掃描使用者及群組在 /home partition 裡已使用的磁碟空間及
inode count,並將掃描結果寫入 quota file 中。
您也可以不指定 filesystem,而直接使用 -a 參數:
suselinux:~ # quotacheck -guva |
|
步驟五:啟動 quota
| |
使用 quotaon 指令來啟動 quota,先認識這個指令吧:
●
quotaon:turn filesystem quotas on.
| |
就是啟用 quota 限額啦。
指令語法:quotaon [ -guv] -a | filesystem
| |
filesystem 可以是 device-name 或 mount-point ; 而當您有使用
-a 參數時就不需要指定 filesystem。 |
參數說明:
| -u |
啟用使用者的 quota。 |
| -g |
啟用群組的 quota。 |
| -v |
顯示執行過程。 |
| -a |
依據 /etc/mtab 的內容,而將有設定 quota 選項的檔案系統,啟動其 quota 功能。另外如果您有設定開機時啟動
quota 的話,通常就會使用到這個參數來檢查 /etc/fstab,而把有設定 quota 選項的檔案系統啟動其 quota
功能。 |
|
現在直接就給它啟動:
suselinux:~ # quotaon
-guva
/dev/hda8 [/home] : group quotas turned on
/dev/hda8 [/home] : user quotas turned on
→ 啟動使用者及群組的 quota。您也可以執行:
suselinux:~ # quotaon -va
/dev/hda8 [/home] : group quotas turned on
/dev/hda8 [/home] : user quotas turned on
如果您只想啟動使用者 quota,可以這麼做:
suselinux:~ # quotaon -uva
/dev/hda8 [/home] : user quotas turned on
若不使用 -a 參數的話,那就需指定 filesystem:
suselinux:~ # quotaon
-guv /home
/dev/hda8 [/home] : group quotas turned on
/dev/hda8 [/home] : user quotas turned on
|
欲停用 quota 的話,執行 quotaoff 即可:
suselinux:~ #
quotaoff -va
/dev/hda8 [/home] : group quotas turned off
/dev/hda8 [/home] : user quotas turned off |
|
步驟六:編輯 quota 限額
| |
●
edquota:edit user or group quotas.
| |
編輯使用者或群組的 quota 限額,不過除了這個基本用法之外,edquota 還可以拿來做複製用途,也就是將已經設定好的使用者或群組
quota,複製給其他使用者或群組來使用。另外也可以用來設定期限,這部分等等會有說明。
| 指令語法: |
edquota [ -p protoname ] [ -u | -g ] username...
| groupname...
edquota [ -u | -g ] -t |
| |
protoname 是指要複製 quota 的來源使用者或群組名稱,比如您要將 user01
的 quota 限額複製給 user02 及 user03,那麼就執行 " edquota -p
user01 -u user02 user03 "。 |
參數說明:
| -u |
編輯使用者 quota。 |
| -g |
編輯群組 quota。 |
| -p |
複製使用者或群組的 quota 限額給其他的使用者或群組。 |
| -t |
磁碟限額有分 soft limit 及 hard limit,而當所使用的磁碟空間或 inode count 達 soft
limit 時,就會開始以預設的七天期限來倒數計時,在此七天期限內,只要不超過 hard limit 的限制,都可以持續使用磁碟空間或建立新檔案
; 現在若想修改這個預設期限,就需使用 " -t " 參數,比如您要修改使用者的期限,請執行
" edquota -ut ",若是針對群組的話則是 "
edquota -gt "。 |
|
範例說明一:編輯使用者 barry 的 quota
| suselinux:~ # edquota
-u barry ← 進入編輯畫面後,請按下
[Insert] 鍵去修改。
Disk quotas for user barry (uid 1006) :
Filesystem blocks soft hard inodes soft hard
/dev/hda8 102 5000 5500
20 0 0
|
blocks 是統計 barry 在 /dev/hda8
(/home partition) 已使用的磁碟空間為 102 KB,這是剛剛做 quotacheck 時所掃描出來的數值,所以不要去修改他。
soft 及 hard 就是我們要設定使用者 quota 限額的地方 ; 前面的 soft 及 hard 是針對使用磁碟空間大小做限制,後面的
soft 及 hard 則是針對 inode count 做限制,設定成 0 表示不設限。
以這個例子來說,當 barry 使用磁碟空間達 5000 KB (soft limit) 時,系統會提出警告,並開始七天 (預設) 的倒數計時,在此七天時間內,只要使用空間不超出
5500 KB (hard limit),都可以持續的製造一些新檔案,但若七天期限一到,縱使尚未超過 hard 的限制亦無法再新增檔案。所以 soft
是警告使用者所使用的磁碟空間已經超過了,要趕快將您的使用空間降至 soft limit 以下 ; hard 則是使用者所能使用最大空間的上限。至於後面的
inodes 是代表 barry 已用掉了 20個 inodes,那接著的 soft 及 hard 當然就是針對 inode count 來設限。
如果您要編輯群組 quota,則執行 " edquota -g groupname " 就行了。
在完成了以上的步驟後,我們先用 root 的身分來檢視一下 barry 的 quota:
suselinux:~ #
quota -u barry
Disk quotas for user barry (uid 1006) :
|
Filesystem |
blocks |
quota |
limit |
grace |
files |
quota |
limit |
grace |
|
| /dev/hda8 |
102 |
5000 |
5500 |
|
20 |
0 |
0 |
|
|
|
若是 barry 要查看自己的 quota,直接執行 quota 指令即可:
barry@suselinux:~>
quota
Disk quotas for user barry (uid 1006) :
| Filesystem
|
blocks |
quota |
limit |
grace |
files |
quota |
limit |
grace |
|
| /dev/hda8 |
102 |
5000 |
5500 |
|
20 |
0 |
0 |
|
|
|
範例說明二:複製 quota 限額
suselinux:~ # edquota
-p barry -u user01 user02 user03
→ 將 barry 的 quota 限額,複製一份予其他的使用者。
接著您可以做個確認:
suselinux:~ # quota
-u user01 user02 user03 |
另外一種複製 quota 限額的做法是事先編輯一檔案,比如 /etc/quotauser,然後將要套用 barry quota 限額的使用者名單全寫入此檔內:
suselinux:~ #
vi /etc/quotauser
user01 user02 user03 user04 user05 user06 user07 user08 user09 user10
接著再執行複製 quota 的動作:
suselinux:~ # edquota -p barry -u `cat
/etc/quotauser` |
至於群組 quota 的複製也是一樣的道理,如 " edquota -p grp1 -g grp2 grp3 "。
範例說明三:修改 soft limit 期限 ( grace
)
suselinux:~ # edquota
-ut
Grace period before enforcing soft limits for users :
Time units may be : days , hours , minutes , or seconds
Filesystem Block grace period Inode grace period
/dev/hda8 3hours 7days
|
設定使用者所使用的磁碟空間或 inode count 一旦超過 soft limit 限制時,此三小時的期限就開始倒數計時,在這三個鐘頭內,只要使用者不超過
hard limit 的限制,都可以繼續新增檔案,一旦期限到期便無法再新增任何資料。設定為 0,如 0minutes、0hours,是表示一旦超過
soft limit 時就無法再新增任何資料。至於期限可以使用的單位有 seconds、minutes、 hours、days、weeks、 months。 |
以上這幾個步驟就是設定 quota 的一些基本程序。而在
quota 設定完成後,有些時候管理者可能會想要去了解一下目前使用者或群組使用 quota 的狀況,如果以我們前面所學,您可能會這麼執行: " quota
-u user01 user02 … " 或者 " quota -g grp01 grp02 … ",但是萬一您的使用者人數超過百人甚至更多怎麼辦
? 這時候 repquota 指令就可以派上用場了。
● repquota:summarize
quotas for a filesystem.
| |
檢視磁碟限額的概況。
指令語法:repquota
[ -vug ] -a | filesystem...
| |
filesystem
可以是 device-name 或 mount-point ; 而當您有使用 -a 參數時就不需要指定 filesystem。 |
參數說明:
| -g |
檢視群組 quota 的使用狀況。 |
| -u |
檢視使用者 quota 的使用狀況。 |
| -v |
這個參數可以額外提供一些訊息。 |
| -a |
依據 /etc/mtab 裡有設定 quota 選項的檔案系統,檢視其 quota 的使用狀況。 |
範例說明:
suselinux:~ #
repquota -guva
→ 檢視使用者及群組 quota 的使用情形。其實 repquota 主要就是去讀取 aquota.user
及 aquota.group 這兩個檔案的內容啦。
suselinux:~ # repquota -gv /home
→ 檢視群組在
/home partition 所使用 quota 的情形。 |
|
設定群組 quota:
最後我們稍微提一下群組 quota 怎麼做 ? 當我們設定群組 quota 限額時,必須先把那些即將受群組 quota 規範的使用者,把他們的預設群組調整成要做
quota 的這個群組才行,請參考以下的步驟:
suselinux:~ # groupadd
group01
suselinux:~ # usermod -g group01 barry
| → |
將
barry 的預設群組改成 group01。接著您可以嘗試以 barry 的身分去建立一些檔案,看看這些檔案的擁有群組是否為 group01。 |
suselinux:~ # edquota -g group01
| → |
編輯群組
quota。完成後您可以執行 " quota -g group01 " 來檢視一下。
|
|
註:當使用者與群組 quota 都做設定時,就看誰先到達 quota 限額就以誰為主。
設定下次開機時啟動 quota 功能:
suselinux:~ #
chkconfig --level 35 quota on
suselinux:~ # chkconfig quota 35
以上兩種做法都可以。
做個確認:
suselinux:~ # chkconfig -l quota
quota 0 : off 1 : off 2 : off 3 : on 4
: off 5 : on 6 : off
如想要取消開機過程啟動 quota 的話,請執行:
suselinux:~ # chkconfig quota off |
利用 YaST 來做設定也行:

選擇 [Runlevel Editor] 後按下 Enter 鍵。

先選取 [quota],再使用 Tab 鍵移動至 [Enable],並按下 Enter 鍵。
這個訊息是說現在已經幫您啟動 quota 了。
按下 [Finish] 即可。
要您再做一次確認,按下 Enter 鍵後就結束了。
從以上操作可知,使用 YaST 來設定下次開機啟動 quota 服務的同時,亦可同時幫您啟動 quota 的服務。
5.9
檔案搜尋
以下我們介紹幾個搜尋檔案的指令,藉由執行這些指令就可以很輕易地找到其所存在的位置。
●
find :search
for files in a directory hierarchy.
| |
find 指令是依照所指定的目錄,至其目錄樹系裡頭遞迴地搜尋所要找的檔案。單純的執行 find 指令可以將該目錄樹系裡所有的內容顯示出來,比如:
指令語法:find [path...] [expression] [action]
| |
path 是我們所指定要搜尋的目錄 ; expression 則表示可以使用一些參數來指定要搜尋的條件,這樣子就可以縮小搜尋的範圍。最後那個
action 是對於搜尋出來的結果,要採取什麼動作的意思。 |
expression 中的參數說明:
| -type filetype |
根據檔案類型來做搜尋 ; 常用到的 filetype 有 d (目錄)、f (一般檔案)、l (符號連結檔)、b、c
(裝置檔) 等等。 |
| -perm mode |
根據檔案權限來做搜尋 ; 比如 " -perm 4755 "。 |
| -uid n |
搜尋檔案擁有者 ID 為 n 者的所有檔案,其中 n 為數字 ; 比如 " -uid 1002 "。若針對群組的話就是
" -gid n "。 |
| -user uname |
搜尋檔案擁有者為 uname 的所有檔案 ; 比如 " -user barry "。若針對群組的話就是 "
-group gname "。 |
| -name pattern |
根據指定的檔名來做搜尋 ; 比如 -name "file"、-name
"[a-z]file"、-name "file*"、-name
"file?"。 |
| -size n[cbk] |
根據檔案大小來做搜尋,n 為數字,[cbkMG] 是所指定的單位,另外 n 前面可使用 "+" (比 n 還要大)
或 "-" (比 n 還要小)。先來認識 [cbkMG] 意義:
| c : |
表示 bytes (character)。 " -size 2000c "
表示搜尋大小為 2000 bytes 的檔案。 " -size +2000c " 表示搜尋大於
2000 bytes 的檔案。 " -size -2000c " 表示搜尋小於 2000 bytes
的檔案。 |
| b : |
表示 512 bytes (block)。1b 代表 1 ~ 512 bytes,2b 代表 513 ~ 1024
bytes,餘依此類推。 " -size 2b " 表示搜尋檔案的大小是介於 513 ~ 1024
bytes 之間。 " -size +2b " 表示搜尋大於 1024 bytes 的檔案。
" -size -2b " 表示搜尋小於 513 bytes 的檔案。 |
| k : |
表示 Kilobytes (1024 bytes)。1k 代表 1 ~ 1024 bytes,2k 代表 1025
~ 2048 bytes,餘依此類推。 " -size 2k " 表示搜尋檔案的大小是介於
1025 ~ 2048 bytes 之間。 " -size +2k " 表示搜尋大於 2048
bytes 的檔案。 " -size -2k " 表示搜尋小於 1025 bytes 的檔案。 |
至於 M 及 G 分別是以 MB 及 GB 做單位來搜尋。 |
| -maxdepth levels |
依據目錄的最大層級深度來做搜尋 ; levels 為一非負數的整數。比如 " find /var -maxdepth
3 " 表示搜尋 /var 目錄結構中的第 0 ~ 3 層,第 0 層就是指 /var 本身。
另外一個相類似的參數為 -mindepth,比如 " find /var -mindepth
3 " 表示搜尋 /var 目錄結構中的第三層至最後一層。 |
| -atime n |
根據檔案的存取時間 (access time) 來做搜尋。n 為數字,表示 n x 24 小時,也就是 n 天的意思,數字前面可以加上
" + " 或 " - "。比如 " -atime +3 " 表示搜尋三天以前有被存取過的檔案,"
-atime -3 " 表示搜尋三天內有被存取過的檔案," -atime 3 " 表示搜尋三天前的那一天有被存取過的檔案。
這樣子解釋可能還不是很清楚,舉個實際例子好了,假設現在時間是 9 月 20 日早上 10 點,就在此時此刻執行 " find
/etc -atime 3 ",那麼三天前的那一天就是指 9/17 AM 10:00 ~ 9/16 AM 10:00,也就是檔案的存取時間在這個範圍的都會被搜尋出來
; 而 " find /etc -atime -3 " 是搜尋檔案的存取時間在 9/17 AM 10:00 ~
9/20 AM 10:00 這個範圍的 ; 最後 " find /etc -atime +3 " 則是針對存取時間在
9/16 AM 10:00 以前的檔案做搜尋。了解了以上的說明後,那 " -atime 0 " 應該知道意思吧
! 就是從現在算起,往前的 24 小時內囉 ! |
| -mtime n |
根據檔案的修改時間 (modification time) 來做搜尋。您只要把上一個欄位解釋中的 " 存取 "
兩字改成 " 修改 " 來看,然後把 atime 用 mtime 來取代,這樣就可以知道意思了。 |
| -ctime n |
根據檔案狀態的改變時間 (change time) 來做搜尋。比如您修改了某個檔案的權限、擁有者或擁有群組時,就是改變了這個檔案的狀態。使用
" ls -l --time=ctime " 所看到的時間欄位就是 ctime。 |
action 中的參數說明:
| -exec command
; |
將 find 指令的搜尋結果交給 -exec 後面的指令來處理。 |
| -print |
將 find 指令的搜尋結果輸出到螢幕上。這是預設的參數。 |
範例說明:
suselinux:~ #
find /home -type d
| → |
將
/home 目錄下,檔案類型為目錄者找出。 |
suselinux:~ # find /usr/bin -perm
4755
| → |
搜尋
/usr/bin 目錄中,檔案權限為 4755 者。 |
suselinux:~ # find /home -uid 1006
| → |
只要檔案擁有者
ID 為 1006 者,都會被搜尋出來。 |
suselinux:~ # find /etc -size 1947c
| → |
將
/etc 目錄中,檔案大小剛好為 1947 bytes 的檔案找出。 |
suselinux:~ # find
/etc -size +20000c
| → |
將
/etc 目錄中,大於 20000 bytes 的檔案找出。 |
suselinux:~ # find /home -size +2k
| → |
搜尋
/home 中,大於 2048 bytes 的檔案。 |
suselinux:~ # find /var -size -2b
| → |
搜尋
/var 目錄中,小於 513 bytes 的檔案。 |
suselinux:~ # find /etc -name "passwd"
| → |
找出
/etc 目錄中,檔案名稱為 passwd 者。 |
suselinux:~ # find /etc -name "auto*"
| → |
找出
/etc 目錄中,檔案名稱是以 auto 為首者的所有檔案。 |
suselinux:~ # find
/home/barry -type f -name "[0-9]*" -exec rm -f {} \;
| → |
將
barry 家目錄中,檔名是以數字為首的檔案找出,並將所搜尋出來的檔案當成 "-exec" 後面所接指令
rm 的引數,所以這些檔案就會被刪除啦。 |
suselinux:~ # find /etc /var
-mtime -3
| → |
將
/etc 及 /var 目錄裡,三天內有被修改過的檔案找出。 |
suselinux:~ #
find /var -type d -maxdepth 2
|
|
●
which:shows the full path of (shell) commands.
| |
搜尋指令所存在的位置。which 指令主要是根據環境變數 PATH 來做搜尋,看看所要找的程式有沒有在 PATH 所定義的這些目錄當中。which
在搜尋的時候,是按照 PATH 所定義的目錄依序尋找,找到後就不會再往下搜尋,除非加上 "-a"
參數。 範例說明:
suselinux:~
# which chmod fdisk
/bin/chmod
/sbin/fdisk |
|
●
locate:list files in databases that match a pattern.
| |
locate 指令是根據 /var/lib/locatedb
資料庫來做搜尋。需要安裝的套件為 findutils-locate。
範例說明:
suselinux:~
# locate fstab
/etc/fstab
/etc/samba/smbfstab
/opt/kde3/bin/update_fstab.sh
→ 搜尋含有 fstab 這個 pattern 的檔案。 |
補充:updatedb
指令
當您建立一些新檔案後,並無法馬上用 locate 指令搜尋出來,因為您尚未更新資料庫裡頭的資料,此時我們可以執行 updatedb
來立刻更新資料庫:
更新完畢後再使用 locate 去搜尋看看,應該就行了 ! 不過如果您要尋找的是存放在一些暫存目錄中的檔案,如 /tmp、/var/tmp、/var/spool
等等,那就會搜尋不到。要調整這方面的限制,需要去修改 /etc/sysconfig/locate 檔案:
suselinux:~ # vi
/etc/sysconfig/locate
# uptdatedb can skip directories for its database.
The following parameter
# says which ones.
#
# UPDATEDB_PRUNEPATHS="/mnt /cdrom /tmp /usr/tmp
/var/tmp /var/spool /proc /media" ←
原本的設定
# locate 資料庫不會包含這個變數所定義的這些目錄內容,因此使用
locate 指令搜尋時,這些目錄下的檔案將會搜尋不到。
# 現在如果想讓
locate 能找得到 /tmp 及 /var/spool 目錄下的檔案,則需將這兩個目錄從 UPDATEDB_PRUNEPATHS
變數中移除:
UPDATEDB_PRUNEPATHS="/mnt /cdrom /usr/tmp /var/tmp /proc /media"
←
這是已經調整過的變數內容。 |
修改完 /etc/sysconfig/locate 之後,請執行 /etc/cron.daily
目錄下的 updatedb script:
| suselinux:~ #
/etc/cron.daily/updatedb |
這樣就搞定了。
|
copyright © 2005 by barry ( 柏青哥
)