0. 背景:
inux用戶安裝Linux操作系統時遇到的一個常見的難以決定的問題就是如何正確地評估各分區大小,以分配合適的硬盤空間。普通的磁盤分區管理方式在邏輯分區划分好之后就無法改變其大小,當一個邏輯分區存放不下某個文件時,這個文件因為受上層文件系統的限制,也不能跨越多個分區來存放,所以也不能同時放到別的磁盤上。而遇到出現某個分區空間耗盡時,解決的方法通常是使用符號鏈接,或者使用調整分區大小的工具,但這只是暫時解決辦法,沒有從根本上解決問題。隨着Linux的邏輯卷管理功能的出現,這些問題都迎刃而解,用戶在無需停機的情況下可以方便地調整各個分區大小。
1. 硬盤類型 /dev/sda VS /dev/hda
/dev/sda
- ide (integrated drive electronics) 把盤體和控制器集成在一起
- sata (serial ATA(advanced technology attachment))
- scsi (small computer system interface)
- 光纖通道 fibre channel
其中hda、hdb分別代表第一個IDE、第二個IDE。假如你電腦上插有2個IDE硬盤,就會出現hda、hdb嗎?不一定,因為貌似IDE硬盤默認有兩個部分,Master和Slave,即主分區和擴展分區,而且a、b是根據IDE接口插槽順序來分的。這樣的話,第一IDE插槽主分區為hda,擴展分區為hdb,第二IDE插槽主分區為hdc,擴展分區為hdd。
但是SATA硬盤好像沒有擴展分區,而且Linux識別SATA等類型裝置的順序不是按插槽順序來的,是按照設備被偵測到的順序來定的,比如SATA的第1、5插槽分別插有硬盤,電腦上還插有一個USB,那么啟動Linux的時候,先后偵測到SATA的第1、5插槽的硬盤和USB設備,那么分配的名稱就分別是sda,sdb,sdc。
但貌似,Ubuntu自8.04起,所有硬盤都編號為“sdx”,即不管IDE還是SATA,一律認作SCIS硬盤。
2. 分區 (Partition)
計算機中存放信息的主要的存儲設備就是硬盤,但是硬盤不能直接使用,必須對硬盤進行分割,分割成的一塊一塊的硬盤區域就是磁盤分區。在傳統的磁盤管理中,將一個硬盤分為兩大類分區:主分區和擴展分區。主分區是能夠安裝操作系統,能夠進行計算機啟動的分區,這樣的分區可以直接格式化,然后安裝系統,直接存放文件。
在一個MBR分區表類型的硬盤中最多只能存在4個主分區。如果一個硬盤上需要超過4個以上的磁盤分塊的話,那么就需要使用擴展分區了。如果使用擴展分區,那么一個物理硬盤上最多只能3個主分區和1個擴展分區。擴展分區不能直接使用,它必須經過第二次分割成為一個一個的邏輯分區,然后才可以使用。一個擴展分區中的邏輯分區可以任意多個。
磁盤分區后,必須經過格式化才能夠正式使用,格式化后常見的磁盤格式有:FAT(FAT16)、FAT32、NTFS、ext2、ext3等。
那么sda1、sda2又分別代表什么呢?代表分區(Partition),比如
- P1:/dev/hda1
- P2:/dev/hda2
- L1:/dev/hda5
- L2:/dev/hda6
- L3:/dev/hda7
- L4:/dev/hda8
- L5:/dev/hda9
為什么沒有hda3、4呢?因為P1~4保存給了Primary和Extended分區。一個硬盤的結構如下:
MBR|主分區1|主分區2|主分區3|主分區4(擴展分區)|, 其中擴展分區可以分為: |邏輯分區1|邏輯分區2|……|邏輯分區n|
所以說上面的P1、2指明系統有兩個主分區,L1~5代表有5個邏輯分區。主分區(包括擴展分區)的總個數不能超過四個;也不能把擴展分區包圍在主分區之間。
參考: http://blog.csdn.net/zollty/article/details/7001950
fdisk 命令
root@dev:/home/s1# fdisk -l
Disk /dev/sda: 250.1 GB, 250059350016 bytes //這個硬盤有250.1 GB的容量
255 heads, 63 sectors/track, 30401 cylinders, total 488397168 sectors //255個磁頭;63個扇區每磁道,30401個磁柱
Units = sectors of 1 * 512 = 512 bytes //每個 cylinder(磁柱)的容量是512字節
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x000d7bf1
存儲容量=磁道(柱面)數×磁頭數×每道扇區數×每扇區字節數 = 30401 * 255 * 63 * 512 = 25396387380 bytes
Device Boot Start End Blocks Id System //Start (開始)/End (結束):表示的一個分區從X sector開始/結束
/dev/sda1 * 2048 484298751 242148352 83 Linux //引導(Boot):表示引導分區,在上面的例子中 hda1 是引導分區
/dev/sda2 484300798 488396799 2048001 5 Extended //Blocks:表示的意思的確是容量的意思,其單位是K
/dev/sda3 484298752 484300797 1023 83 Linux
/dev/sda5 484300800 488396799 2048000 82 Linux swap / Solaris //大小,2048000/1024=2G
?
這里有一個主分區sda1,一個擴展分區sda2,sda2包括兩個邏輯分區sda3和sda4.
硬盤總容量=主分區(包括擴展分區)總容量
- 主分區大小為 242148352 /1024 = 236473 M = 236 G
- 擴展分區大小為:2014001 / 1024 = 2000M = 2G
- 磁盤總容量大小為:236 + 2 = 238G
擴展分區容量=邏輯分區總容量
我們估算一個硬盤是否完全被划分,我們只要看 fdisk -l 輸出的內容中的 cylinders(柱體) 上一個分區的End 和 下一個分區的Start是不是一個連續的數字,另外要看一下每個硬盤設備的fdisk -l 的開頭部份,看一下他的 cylinders(柱體)的值。可見上圖中,擴展分區都分完了。
df -h 命令:
注: df 下沒有顯示swap分區
改變Linux分區大小
1. 建議在安裝Ubuntu的過程中,選擇手動方法進行磁盤分區。可參考 http://blog.sina.com.cn/s/blog_56a70c0401018dki.html 中的具體步驟。
2. linux安裝好以后,根分區容量一般是不允許改變的。
LVM can be set up after the system is installed. But putting the root partition on the LVM after the fact is quite difficult and probably would be better done with a reinstallation. Furthermore, it is not possible to just create a LVM on a already mounted partition.
LVM可以在系統裝好后安裝。但是將根分區放進LVM是非常困難的,因此建議重裝系統的時候再設置。而且,在已經掛載的分區上創建LVM是不行的。
3.實在要改變,推薦用gparted-LiveCD進行調整
(1)、准備
1、下載最新版本的gparted ISO 鏡像文件:http://gparted.sourceforge.net/
2、將gparted鏡像文件刻錄成光盤或壓制在U盤上制成LiveUSB
3、建議備份重要數據到移動硬盤上
4、在BIOS中,將啟動順序設置為首先光驅啟動(如果是用LiveUSB,應設為USB-HDD)
(2)、調整分區
1、將光盤放入光驅(如果是用LiveUSB,插上U盤),重啟電腦. 這時候我遇到一個錯誤:vesamenu.c32 not a com32r image。 解決辦法是到Ubuntu系統中找到這個文件,替換掉USB上的這個文件,它存在於兩個文件夾中。
2、進入gparted啟動界面,直接選Defalt settings
3、第二個界面繼續按回車7 y: O. l3 A" E/ P N0 L: j
4、接下來選語言,輸入“26”回車(就是簡體中文,盡管漢化不全)
5、接着提示將要進入X-Windows界面,回車
6、進入gparted,就會發現和瘟到死的PQ相似的界面,實際操作也是一樣的,而且也支持瘟到死分區的調整
7、點擊你要騰出空間的分區,彈出右鍵菜單選擇“Resize/Move”& Z)
8、用鼠標托動或數字精確調整要釋放的空間大小,若要釋放在分區頭部拉左側的控制條(輸入第一行數值),若要釋放在分區尾部拉右側的控制條(輸入第三行數值),調整好之后點“更改大小/移動”按鈕。
9、點擊欲擴大容量的分區,彈出右鍵菜單選擇“Resize/Move”
10、按照第8步的方法操作,只是現在變成擴大分區容量而已
11、點擊“Edit”菜單,選擇“Apply All Operations”3
12、再次確認要調整分區容量后,gparted開始調整分區,完成后點“Close”按鈕
13、點“gparted”菜單,選“Quit”關閉gparted窗口,再雙擊左上角的“Exit”按鈕退出gparted系統
14、在彈出的窗口中選“Reboot”重啟電腦,退出時系統會提示你取出光盤
(3)、可能遇到的問題
可能會發生swap分區丟失的情況,可在終端中用“free -m”命令查看swap分區是否激活(是否顯示容量),如果未激活,可用“sudo mkswap /dev/sdaX”命令(X為swap分區的編號)進行激活,並將激活所得的UUID碼替換掉“/etc/fstab”文件(需要管理員權限)中原來 swap分區的UUID編碼,重啟后即可自動激活掛載
具體操作方法,請進Ubuntu官方論壇中查找,有教程帖8 z. \0 s8 }- M& c
警告:對swap分區的激活操作及對fstab文件的修改應謹慎,必需仔細核對修改的值
在界面上縮小sda1的大小,並創建新的分區,重啟電腦后終於看到一個新的分區了,還有一些未分配空間。接下來就可以用下面的LVM方法來創建LVM啦。。
3. 掛載和掛載點
一個掛載點就是一個文件夾,將分區掛載到一個掛載點,掛載點就成了分區的入口。沒有掛載分區的掛載點將使用根目錄的空間,沒有掛載到掛載點的分區是無法訪問的,如上邊第四個邏輯分區。
例如,如果分區 /dev/hda5 被 掛載在 /usr 上,這意味着所有在 /usr 之下的文件和目錄在物理意義上位於 /dev/hda5 上。因此文件 /usr/share/doc/FAQ/txt/Linux-FAQ 被儲存在 /dev/hda5上,而文件 /etc/X11/gdm/Sessions/Gnome 卻不是。
繼續以上的例子,/usr 之下的一個或多個目錄還有可能是其它分區的掛載點。例如,某個分區(假設為,/dev/hda7)可以被掛載到 /usr/local 下,這意味着 /usr/local/man/whatis 將位於 /dev/hda7 上而不是 /dev/hda5 上。
linux系統中每個分區都是一個文件系統,都有自己的目錄層次結構。linux會將這些分屬不同分區的、單獨的文件系統按一定的方式形成一個系統的總的目錄層次結構。將一個文件系統的頂層目錄掛到另一個文件系統的子目錄上,使它們成為一個整體,稱為掛載。把該子目錄稱為掛載點。
注意:1、掛載點必須是一個目錄。
2、一個分區掛載在一個已存在的目錄上,這個目錄可以不為空,但掛載后這個目錄下以前的內容將不可用。對於其他操作系統建立的文件系統的掛載也是這樣。但是需要理解的是:光盤、軟盤、其他操作系統使用的文件系統的格式與linux使用的文件系統格式是不一樣的。光盤是ISO9660;軟盤是fat16或ext2;windows NT是fat16、NTFS;windows98是fat16、fat32;windows2000和windowsXP是fat16、fat32、NTFS。
掛載前要了解linux是否支持所要掛載的文件系統格式。
掛載時使用mount命令:
格式:mount [-參數] [設備名稱] [掛載點]
其中常用的參數有
-t<文件系統類型> 指定設備的文件系統類型,常見的有:
minix linux最早使用的文件系統
ext2 linux目前常用的文件系統
msdos MS-DOS的fat,就是fat16
vfat windows98常用的fat32
nfs 網絡文件系統
iso9660 CD-ROM光盤標准文件系統
ntfs windows NT 2000的文件系統
hpfs OS/2文件系統
auto 自動檢測文件系統
-o<選項> 指定掛載文件系統時的選項。有些也可用在/etc/fstab中。常用的有
codepage=XXX 代碼頁
iocharset=XXX 字符集
ro 以只讀方式掛載
rw 以讀寫方式掛載
nouser 使一般用戶無法掛載
user 可以讓一般用戶掛載設備
提醒一下,mount命令沒有建立掛載點的功能,因此你應該確保執行mount命令時,掛載點已經存在。(不懂?說白了點就是你要把文件系統掛載到哪,首先要先建上個目錄。這樣OK?)
例子:windows98裝在hda1分區,同時計算機上還有軟盤和光盤需要掛載。
# mk /mnt/winc
# mk /mnt/floppy
# mk /mnt/cdrom
# mount -t vfat /dev/hda1 /mnt/winc
# mount -t msdos /dev/fd0 /mnt/floppy
# mount -t iso9660 /dev/cdrom /mnt/cdrom
現在就可以進入/mnt/winc等目錄讀寫這些文件系統了。
自動掛載:
在/etc/fstab文件里,第一列是掛載的文件系統的設備名,第二列是掛載點,第三列是掛載的文件系統類型,第四列是掛載的選項。添加新行實現自動掛載:
/dev/hdb1 /mnt/winc vfat defaults,codepage=936,iocharset=cp936 0 0
/dev/hda5 /mnt/wind vfat defaults,codepage=936,iocharset=cp936 0 0
4. LVM幾個基本概念
優點
比起正常的硬盤分區管理,LVM更富於彈性:
- 使用卷組(VG),使眾多硬盤空間看起來像一個大硬盤。
- 使用邏輯卷(LV),可以創建跨越眾多硬盤空間的分區。
- 可以創建小的邏輯卷(LV),在空間不足時再動態調整它的大小。
- 在調整邏輯卷(LV)大小時可以不用考慮邏輯卷在硬盤上的位置,不用擔心沒有可用的連續空間。It does not depend on the position of the LV within VG, there is no need to ensure surrounding available space.
- 可以在線(online)對邏輯卷(LV)和卷組(VG)進行創建、刪除、調整大小等操作。LVM上的文件系統也需要重新調整大小,某些文件系統也支持這樣的在線操作。
- 無需重新啟動服務,就可以將服務中用到的邏輯卷(LV)在線(online)/動態(live)遷移至別的硬盤上。
- 允許創建快照,可以保存文件系統的備份,同時使服務的下線時間(downtime)降低到最小。
這些優點使得LVM對服務器的管理非常有用,對於桌面系統管理的幫助則沒有那么顯著,你需要根據實際情況進行取舍。
缺點:
- 只能在Linux上使用。對於其他操作系統(如FreeBSD, Windows等),尚未有官方支持。
- 在系統設置時需要更復雜的額外步驟。
- 假如你使用的是btrfs文件系統,那么它所提供的子卷(subvolume)實際上已經時一層可動態調整的存儲層,此時再用LVM就顯得多余了。
操作:
#umount /dev/web_document/www1
#lvremove /dev/web_document/www1
lvextend -L12G /dev/web_document/www1
lvextend -L +1G /dev/web_document/www1
#umount /dev/web_document/www1 #resize_reiserfs /dev/web_document/www1 #mount-treiserfs /dev/web_document/www1/data/wwwroot
#umount /data/wwwroot #resize_reiserfs -s -2G /dev/web_document/www1 #lvreduce -L -2G /dev/web_document/www1 #mount-treiserfs /dev/web_document/www1/data/wwwroot
lvreduce 可以使用兩種類型的size:
(1)指定減少的size
lvreduce --size -40G /dev/vg0/foo
(2)指定減少到的size
lvreduce --size 80G /dev/vg0/foo
[root@rh65 ~]# umount /home [root@rh65 ~]# e2fsck -f /dev/mapper/vg_rh65-lv_home e2fsck 1.41.12 (17-May-2010) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/mapper/vg_rh65-lv_home: 38/80543744 files (10.5% non-contiguous), 23715920/322174976 blocks [root@rh65 ~]# resize2fs /dev/mapper/vg_rh65-lv_home 800G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/mapper/vg_rh65-lv_home to 209715200 (4k) blocks. The filesystem on /dev/mapper/vg_rh65-lv_home is now 209715200 blocks long. [root@rh65 ~]# lvreduce --size 800G /dev/mapper/vg_rh65-lv_home WARNING: Reducing active logical volume to 800.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce lv_home? [y/n]: y Reducing logical volume lv_home to 800.00 GiB Logical volume lv_home successfully resized [root@rh65 ~]# fsck /dev/mapper/vg_rh65-lv_home fsck from util-linux-ng 2.17.2 e2fsck 1.41.12 (17-May-2010) /dev/mapper/vg_rh65-lv_home: clean, 38/52428800 files, 21950847/209715200 blocks [root@rh65 ~]# mount /dev/mapper/vg_rh65-lv_home /home
2. 增加 lv 容量
先使用 lvextend 增加 lv 容量,在使用 resize2fs 增加文件系統的容量,使得兩者的size一直,否則重啟后會出現 fsck 錯誤。
[root@rh65 ~]# lvextend -L +500G /dev/mapper/vg_rh65-lv_root Extending logical volume lv_root to 1.07 TiB Logical volume lv_root successfully resized [root@rh65 ~]# resize2fs /dev/mapper/vg_rh65-lv_root resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/mapper/vg_rh65-lv_root is mounted on /; on-line resizing required old desc_blocks = 19, new_desc_blocks = 69 Performing an on-line resize of /dev/mapper/vg_rh65-lv_root to 288358400 (4k) blocks. The filesystem on /dev/mapper/vg_rh65-lv_root is now 288358400 blocks long.
lvextend(8), lvmchange(8), lvmdiskscan(8),
lvmcreate_initrd(8), lvmsadc(8), lvmsar(8),
lvreduce(8), lvremove(8), lvrename(8),
lvscan(8), pvchange(8), pvcreate(8), pvdata(8),
pvdisplay(8), pvmove(8), pvscan(8), vgcfgbackup(8),
vgcfgrestore(8), vgchange(8), vgck(8), vgcreate(8),
vgdisplay(8), vgexport(8), vgextend(8), vgimport(8),
vgmerge(8), vgmknodes(8), vgreduce(8), vgremove(8),
vgrename(8), vgscan(8), vgsplit(8)