一、 磁盤管理的基本概念
linux系統中所有的硬件設備都是通過文件的方式來表現和使用的,我們將這些文件稱為設備文件,在Linux下的/dev目錄中有大量的設備文件,根據設備文件的不同,又分為字符設備文件和塊設備文件。
字符設備文件的存取是以字符流的方式來進行的,一次傳送一個字符。常見的有打印機,終端(TTY)、繪圖儀和磁帶設備等等,字符設備文件有時也被稱為“raw” 設備文件。
塊設備文件是以數據塊的方式來存取的,最常見的設備就是磁盤。系統通過塊設備文件存取數據的時候,先從內存中的buffer中讀或寫數據。而不是直接傳送數據到物理磁盤。這種方式有效的提高了磁盤的I/O性能。
關於硬盤設備文件的概念,我們在第二章已經進行了初步的介紹,這裡進行更深入的講述。
1.1 磁盤設備在linux下的表示方法
現在常見的磁盤類型有IDE並口硬盤、STAT串口硬盤以及SCSI硬盤,不同類型的硬盤在linux下對應的設備文件名稱不盡相同,linux下磁盤設備常用的表示方案有兩種:
方案一:
主設備號+次設備號+磁盤分區編號
對於IDE硬盤:hd[a-z]x
對於SCSI硬盤:sd[a-z]x
方案二:
(主設備號+[0-n],y)
對於IDE硬盤:(hd[0-n],y)
對於SCSI硬盤:(sd[0-n],y)
主設備號代表設備的類型,可以唯一地確定設備的驅動程序和界面,主設備號相同的設備是同類型設備,即,使用同一個驅動程序,比如hd表示IDE硬盤,sd表示SCSI硬盤,tty表示終端設備等。
次設備號代表同類設備中的序號,“a-z”就表示設備的序號。如/dev/hda表示第一塊IDE硬盤,/dev/hdb表示第二塊IDE硬盤。同理,/dev/sda以及/dev/sdb分別表示第一、第二塊SCSI硬盤。在有些情況下,系統只有一塊硬盤,但是設備文件卻顯示為hdb,這與硬盤的跳線有關,只用知道設備表示的意思就行了。
磁盤分區編號,用“x”表示在每塊磁盤上劃分的磁盤分區編號。在每塊硬盤上可能會劃分一定的分區,分區的意思類似與windows中C盤、D盤的概念,針對每個分區,linux用/dev/hdax或者/dev/sdbx表示,這裡的“x”代表第一塊IDE硬盤的第“x”個分區和第二塊SCSI硬盤的第“x”個分區。
除了用“a-z”表示同類硬盤的序號,也可以用“0-n”表示硬盤的序號,第二種方案中的“y”是一個數字,從“1”開始,表示磁盤分區編號。比如,(hd0,8)與hda7是等同的,表示第一塊IDE硬盤的第七個分區,而(sd4,3)等同與sde2,表示第5塊SCSI硬盤的第二個分區。
1.2 設備的掛載與使用
在windows下,用戶如果使用某些設備,如光盤或者軟盤時,只需將設備放入相應的驅動器,然後系統自動加載,就可以通過對應的設備盤符,如G(光驅所在的盤符)盤、A盤(軟驅盤符)來讀取數據,但是在linux系統下,沒有盤符的概念,對應的是磁盤分區,對任何設備的使用都需要通過掛載(mount)的方式實現,要完成掛載,需要滿足3個條件:
掛載磁盤分區的文件系統類型
要掛載分區對應的設備文件
已經建立好的一個目錄作為掛載點
對於磁盤分區的文件系統,linux下最常用的是ext2/ext3,關於如何在磁盤建立文件系統,在下個章節會有詳細講述。
掛載分區對應的設備文件在上面已經講述,linux下所有設備文件存放在/dev目錄下,因此對應的設備文件一般是/dev/hda1、/dev/sdc6等等。
掛載點就是在linux上建立的一個目錄,通過這個目錄建立了操作系統和磁盤存取的入口,也就是說將設備掛載到這個目錄後,對這個目錄的任何操作就相當於對設備的操作。linux系統默認的掛載點目錄為/mnt或者/media,我們也可以建立自己的掛載點。
在進行掛載設備前必須注意:用pwd命令查看當前所在的目錄是否是掛載點目錄下,如果是,請用cd命令切換到其它目錄下,不然mount時會提示“device busy”的錯誤。
如果想退出某個設備,必須進行卸載操作,卸載命令為umount,語法為umount 掛載點,例如要想彈出光驅,按光驅彈出按鈕是沒用的,只有先進行卸載(umount /mnt/cdrom)操作,然後才能彈出光驅。
請看下面的一個例子,通過df命令查看當前系統的分區情況:
[root@data1 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda5 15G 429M 14G 4% /
/dev/sda9 328G 195M 311G 1% /oracle
/dev/sda8 7.6G 146M 7.1G 2% /tmp
/dev/sda6 9.5G 151M 8.9G 2% /home
/dev/sda3 15G 3.8G 9.7G 29% /usr
/dev/sda2 15G 309M 14G 3% /var
/dev/sda1 289M 16M 259M 6% /boot
tmpfs 3.9G 0 3.9G 0% /dev/shm
/dev/sdb1 86G 9.8G 76G 2% /mnt/stor
根據命令的輸出我們可以知道:
左邊第一列“Filesystem”項顯示了每個分區對應的設備文件名,由設備文件名可知,此系統有兩塊硬盤,並且是SCSI硬盤,分別是/dev/sda和/dev/sdb。在/dev/sda設備上又劃分了7個磁盤分區,而/dev/sdb設備上僅僅劃分了一個分區。
第二列“Size”項顯示了每個磁盤分區空間的大小。
第三列“Used”項顯示了已經使用的磁盤空間大小。
第四列“Avail”項顯示了可用的磁盤空間大小。
第五列“Use%”項顯示了可用磁盤空間占用磁盤分區總空間的百分比。
最後一列“Mounted on”項顯示了磁盤分區對應的掛載點目錄名。
如果我們要卸載/dev/sdb1設備,只需執行umount /mnt/stor即可,當然卸載前要保證此分區的所有程序沒有在使用中。
1.3 磁盤分區的劃分標准
在第二章安裝操作系統時,我們就詳細講述了如何給磁盤進行分區,因為分區對於linux系統的穩定和安全非常重要,合理正確的劃分磁盤分區有助於系統的穩定運行和數據的安全保障,下面我們介紹如何合理的劃分磁盤分區以及這種劃分帶來的好處。
磁盤的分區由主分區、擴展分區和邏輯分區組成,在一塊硬盤上,主分區的最大個數是4個,其中擴展分區也算一個主分區,在擴展分區下可以建立很多邏輯分區,所以主分區(包括擴展分區)范圍是從1-4,邏輯分區從5開始,對於邏輯分區,Linux 規定它們必須建立在擴展分區上,而不是建立在主分區上。
主分區的作用是用來啟動操作系統的,主要存放操作系統的啟動或引導程序,因此建議操作系統的引導程序都放在主分區,比如linux的/boot分區,最好放在主分區上。擴展分區只不過是邏輯分區的“容器”。實際上只有主分區和邏輯分區是用來進行數據存儲的,因而可以將數據集中存放在磁盤的邏輯分區中,由於磁盤分區作用的不同,linux對主分區大小也有限制,因此,對於大量的數據,一定要存儲在邏輯分區中。
經過上面的闡述,一個合理的分區方式為:主分區在前,擴展分區在後,然後在擴展分區中劃分邏輯分區;主分區的個數加上擴展分區個數要控制在四個之內。
通過fdisk –l命令可以顯示當前系統分區的所有信息:
[root@data1 ~]# fdisk -l
Disk /dev/sda: 437.9 GB, 437998583808 bytes
255 heads, 63 sectors/track, 53250 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 38 305203+ 83 Linux
/dev/sda2 39 1950 15358140 83 Linux
/dev/sda3 1951 3862 15358140 83 Linux
/dev/sda4 3863 53250 396709110 5 Extended
/dev/sda5 3863 5774 15358108+ 83 Linux
/dev/sda6 5775 7049 10241406 83 Linux
/dev/sda7 7050 8069 8193118+ 82 Linux swap / Solaris
/dev/sda8 8070 9089 8193118+ 83 Linux
/dev/sda9 9090 53250 354723201 83 Linux
Note: sector size is 4096 (not 512)
Disk /dev/sdb: 943.7 GB, 943718400000 bytes
255 heads, 63 sectors/track, 14341 cylinders
Units = cylinders of 16065 * 4096 = 65802240 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 14341 921552408 83 Linux
對於輸出每項的含義解釋如下:
Heads代表磁盤面數;sectors代表扇區數;每個扇區大小為0.5k,cylinders代表柱面數,因此,硬盤空間總大小=磁面個數*(扇區個數*每個扇區的大小512)*柱面個數。
左邊第一列“Device”項顯示了磁盤分區對應的設備文件名
第二列“Boot”項顯示是否為引導分區,上面的/dev/sda1就是引導分區。
第三列“Start”項表示每個磁盤分區的起始位置,以柱面為計數單位。
第四列“End”項顯示了每個磁盤分區的終止位置,以柱面為計數單位。
第五列“Blocks”項顯示了磁盤分區的容量,以K為單位。
第六列“Id”項顯示了磁盤分區對應的ID,根據分區的不同,分區對應的ID號也不同,linux下用83代表主分區和邏輯分區,用5代表擴展分區,而用82代表交換分區。用7代表NTFS分區等等。
第七列“System”項的含義與第六列基本相同,都是表示不同的分區類型。
由此可知,此系統從/dev/sda1到/dev/sda4為主分區,而/dev/sda4為擴展分區,在/dev/sda4下又建立了/dev/sda5到/dev/sda9共5個邏輯分區,其中/dev/sda7為交換分區。
二、 利用fdisk工具劃分磁盤分區
fdisk是linux下一款功能強大的磁盤分區管理工具,可以觀察硬盤的使用情況,也可以對磁盤進行分割,linux下類似與fdisk的工具還有cfdisk、parted等,它們都有各自的優點,本文推薦fdisk,因為它簡單容易上手,是各個linux發行版最經常使用的磁盤分區工具,下面具體介紹這個工具的使用。
2.1 fdisk參數含義介紹
使用格式:
fdisk [-l] [-b SSZ] [-u] device
選項含義:
-l:查詢指定設備的分區狀況,如:fdisk –l /dev/sda,如果“-l”選項後面不加任何設備名稱,則查看系統所有設備的分區情況。
-b SSZ:將指定的分區大小輸出到標准輸出上,單位為區塊。
-u:一般與“-l”選項配合使用,顯示結果將用扇區數目取代柱面數目,用來表示每個分區的起始地址。
device:要顯示或操作的設備名稱。
fdisk的使用分為兩個部分,查詢部分和交互操作部分。通過fdisk device即可進入命令交互操作界面:然後輸入m顯示交互操作下所有可使用的命令。
[root@localhost /]# fdisk /dev/sdb
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): 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
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
對於交互界面下的命令含義解釋如下:
a:設定硬盤啟動區
b:編輯一個BSD類型分區
c:編輯一個DOS兼容分區
d:刪除一個分區
l:查看指定分區的分區表信息
m:顯示fdisk每個交互命令的詳細含義
n:增加一個新的分區
o:創建一個DOS分區
p:顯示分區信息
q:退出交互操作,不保存操作的內容
s:創建一個空的Sun分區表
t:改變分區類型
v:校驗硬盤分區表
w:寫分區表信息到硬盤,保存操作退出
x:執行高級操作模式。
交互命令很多,但是經常用到的只有d、l、m、n、p、q、w這幾個選項,只要熟練掌握這幾個參數的含義和用法,簡單的磁盤劃分操作不成問題。
2.2 fdisk實例講解
為了更清楚的介紹fdisk的使用方法,接下來我們通過實例講解的方式,從磁盤分區的創建顯示、修改、刪除3個方面介紹fdisk的使用方法和技巧。
1.創建磁盤分區
在現有的linux系統上增加了一塊硬盤,系統對應的設備名為/deb/sdb,下面通過fdisk命令對這個磁盤進行分區劃分,請看下面的實例講解:
[root@localhost /]# fdisk /dev/sdb
The number of cylinders for this disk is set to 1044.
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)
Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite)
Command (m for help): n #輸入“n”創建一個新的磁盤分區
Command action
e extended
#這裡的“e”代表創建一個擴展分區
p primary partition (1-4)
#這裡的“p”代表創建一個主分區
p #首先創建一個主分區
Partition number (1-4):
Value out of range.
Partition number (1-4): 1 #主分區的編號從1到4,這裡輸入1
First cylinder (1-1044, default 1): #這裡指定分區的起始值,以柱面為單位計數,默認從1開始,直接回車即可。
Using default value 1
Last cylinder or +size or +sizeM or +sizeK (1-1044, default 1044): +1024M
#這裡是指定分區大小,直接輸入需要的分區大小即可,例如“+1024M”表示此分區大小為1024M,“+8G”表示此分區大小為8G。
Command (m for help): p #這裡輸入“p”顯示分區情況,從下面可以看到,此分區已經建立起來。
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 125 1004031 83 Linux
Command (m for help): n #繼續創建一個分區
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 2
First cylinder (126-1044, default 126):
Using default value 126
Last cylinder or +size or +sizeM or +sizeK (126-1044, default 1044): +1024M
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 125 1004031 83 Linux
/dev/sdb2 126 250 1004062+ 83 Linux
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e #這裡輸入“e”創建一個擴展分區
Partition number (1-4): 3 #由於擴展分區也屬於主分區,而分區號1和2已經被使用,因此這裡輸入3。當然輸入4也可以,要遵循的一個原則是:輸入的分區號碼必須在1-4之間,而且號碼未被使用。
First cylinder (251-1044, default 251): #這裡仍然用缺省的輸入值,直接回車即可。
Using default value 251
Last cylinder or +size or +sizeM or +sizeK (251-1044, default 1044): #根據磁盤分區的劃分標准,如果要建立擴展分區,最好將磁盤所有剩余空間都分給了擴展分區,這裡直接輸入回車,磁盤剩余空間全部分給擴展分區。
Using default value 1044
Command (m for help): p #從下面可以看出,我們已經劃分了兩個主分區和一個擴展分區。
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 125 1004031 83 Linux
/dev/sdb2 126 250 1004062+ 83 Linux
/dev/sdb3 251 1044 6377805 5 Extended
Command (m for help): n
Command action
l logical (5 or over) #這裡的“l”表示創建一個邏輯分區
p primary partition (1-4) #這裡的“p”表示創建一個主分區,此時我們已經不能創建主分區了,因為所有剩余的磁盤空間都已經分給擴展分區。
l #這裡輸入“l”創建一個邏輯分區
First cylinder (251-1044, default 251): #這裡回車即可
Using default value 251
Last cylinder or +size or +sizeM or +sizeK (251-1044, default 1044): +1024M #這裡輸入要創建的邏輯分區大小,含義與上面創建主分區相同。
Command (m for help): p #顯示已經創建的磁盤分區情況,從下面可以看出,已經創建了兩個主分區和一個擴展分區,在擴展分區下創建了一個邏輯分區。
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 125 1004031 83 Linux
/dev/sdb2 126 250 1004062+ 83 Linux
/dev/sdb3 251 1044 6377805 5 Extended
/dev/sdb5 251 375 1004031 83 Linux
Command (m for help): n #接下來繼續創建一個邏輯分區
Command action
l logical (5 or over)
p primary partition (1-4)
l
First cylinder (376-1044, default 376): #輸入回車即可
Using default value 376
Last cylinder or +size or +sizeM or +sizeK (376-1044, default 1044): #這裡仍輸入回車,將剩余的所有磁盤空間給此邏輯分區。
Using default value 1044
Command (m for help): p
Disk /dev/sdb: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sdb1 1 125 1004031 83 Linux
/dev/sdb2 126 250 1004062+ 83 Linux
/dev/sdb3 251 1044 6377805 5 Extended
/dev/sdb5 251 375 1004031 83 Linux
/dev/sdb6 376 1044 5373711 83 Linux