LVM ( Logical Volume Manager ) 邏輯卷管理 1、建立 LV 一、首先在你的虛擬機上添加一塊新的硬盤用來作實驗。 二、安裝 lvm : yum -y install lvm2 三、查看新添加的磁盤 [root@study ~]# fdisk -l Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00000000 ## 其中,/dev/sdb 就是我新添加的磁盤了 四、建立物理分區 [root@study ~]# fdisk /dev/sdb Device contains neither a valid DOS partition table, nor Sun, SGI or OSF disklabel Building a new DOS disklabel with disk identifier 0x62beb6a4. Changes will remain in memory only, until you decide to write them. After that, of course, the previous content won't be recoverable. Warning: invalid flag 0x0000 of partition table 4 will be corrected by w(rite) WARNING: DOS-compatible mode is deprecated. It's strongly recommended to switch off the mode (command 'c') and change display units to sectors (command 'u'). 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 # 打印分區類型對應的 ID 號 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 # 更改分區 ID u change display/entry units v verify the partition table w write table to disk and exit # 保存退出 x extra functionality (experts only) ## 執行的命令是 fdisk /dev/sdb . Command (m for help): n # 執行添加分區指令 Command action e extended p primary partition (1-4) p # 添加一個主分區 Partition number (1-4): 1 # 分區號爲 1 First cylinder (1-2610, default 1): # 分區起始位置(直接回車) Using default value 1 Last cylinder, +cylinders or +size{K,M,G} (1-2610, default 2610): +1024M # 分區結束位置(+1024M 表示 1G 大小) Command (m for help): n Command action e extended p primary partition (1-4) p Partition number (1-4): 2 First cylinder (133-2610, default 133): Using default value 133 Last cylinder, +cylinders or +size{K,M,G} (133-2610, default 2610): +1024M Command (m for help): p # 執行打印分區表 Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x62beb6a4 Device Boot Start End Blocks Id System /dev/sdb1 1 132 1060258+ 83 Linux /dev/sdb2 133 264 1060290 83 Linux ## 能夠看到分了兩個區 /dev/sdb1 /dev/sdb2 Command (m for help): t # 執行更改分區 ID (83 表示Linux 普通分區、82 表示swap、8e 表示LVM) Partition number (1-4): 1 Hex code (type L to list codes): 8e Changed system type of partition 1 to 8e (Linux LVM) Command (m for help): t Partition number (1-4): 2 Hex code (type L to list codes): 8e Changed system type of partition 2 to 8e (Linux LVM) Command (m for help): p Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x62beb6a4 Device Boot Start End Blocks Id System /dev/sdb1 1 132 1060258+ 8e Linux LVM /dev/sdb2 133 264 1060290 8e Linux LVM ## 已經看到分區 ID 變爲 8e ; 文件系統爲 Linux LVM Command (m for help): w # 執行保存退出 The partition table has been altered! Calling ioctl() to re-read partition table. Syncing disks. [root@study ~]# fdisk -l /dev/sdb Disk /dev/sdb: 21.5 GB, 21474836480 bytes 255 heads, 63 sectors/track, 2610 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x62beb6a4 Device Boot Start End Blocks Id System /dev/sdb1 1 132 1060258+ 8e Linux LVM /dev/sdb2 133 264 1060290 8e Linux LVM ## 能夠看到磁盤 /dev/sdb 有兩個分區 /dev/sdb1 /dev/sdb2 五、建立 PV (物理卷) [root@study ~]# pvcreate /dev/sdb1 /dev/sdb2 Physical volume "/dev/sdb1" successfully created Physical volume "/dev/sdb2" successfully created ## 使用 pvcreate 建立 PV 後面跟想要建立的分區 [root@study ~]# pvscan PV /dev/sda3 VG vg_study lvm2 [18.80 GiB / 0 free] PV /dev/sdb1 lvm2 [1.01 GiB] PV /dev/sdb2 lvm2 [1.01 GiB] Total: 3 [20.82 GiB] / in use: 1 [18.80 GiB] / in no VG: 2 [2.02 GiB] ## 使用 pvscan 、pvdisplay 、pvs 均可以查看 PV ## PV /dev/sdb1 pv /dev/sdb2 爲我新建立的 PV 大小爲 1G(PV /dev/sda3 爲以前建立的屬 VG vg_study ) 六、建立 VG (卷組) [root@study ~]# vgcreate my_vg /dev/sdb1 /dev/sdb2 Volume group "my_vg" successfully created ## 使用 vgcreate 建立卷組,後面接 vg 名,接 pv [root@study ~]# vgdisplay --- Volume group --- VG Name my_vg System ID Format lvm2 Metadata Areas 2 Metadata Sequence No 1 VG Access read/write VG Status resizable MAX LV 0 Cur LV 0 Open LV 0 Max PV 0 Cur PV 2 Act PV 2 VG Size 2.02 GiB PE Size 4.00 MiB Total PE 516 Alloc PE / Size 0 / 0 Free PE / Size 516 / 2.02 GiB VG UUID ynCJG8-ZIvI-9gBF-dO5K-aQws-N9WW-r26hch ## 一樣可使用 vgscan 、vgs 、vgdisplay 來查看 VG ## 能夠看到 VG名爲 my_vg 、VG 大小爲 2G 、PE 大小 4M 等 七、建立 LV (邏輯卷) [root@study ~]# lvcreate -L 2G -n my_lv my_vg Logical volume "my_lv" created ## 使用 lvcreate 建立 LV ,-L 指定 LV大小,-n 指定 LV名稱,後面接 VG名 [root@study ~]# lvdisplay --- Logical volume --- LV Path /dev/my_vg/my_lv LV Name my_lv VG Name my_vg LV UUID j9Bduh-3TB9-Owhz-X3PX-fVeQ-bvJe-OAFBVp LV Write Access read/write LV Creation host, time study.localhost.localdomain, 2014-11-26 11:14:28 +0800 LV Status available # open 0 LV Size 2.00 GiB Current LE 512 Segments 2 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1 ## 一樣可使用 lvscan 、lvs 、lvdisplay 來查看 LV ## 能夠看到 LV路徑 /dev/my_vg/my_lv 、LV名 my_lv 、VG名 my_vg 、LV大小 2G 等 八、建立文件系統 (格式化) [root@study ~]# mkfs.ext4 /dev/my_vg/my_lv mke2fs 1.41.12 (17-May-2010) 文件系統標籤= 操做系統:Linux 塊大小=4096 (log=2) 分塊大小=4096 (log=2) Stride=0 blocks, Stripe width=0 blocks 131072 inodes, 524288 blocks 26214 blocks (5.00%) reserved for the super user 第一個數據塊=0 Maximum filesystem blocks=536870912 16 block groups 32768 blocks per group, 32768 fragments per group 8192 inodes per group Superblock backups stored on blocks: 32768, 98304, 163840, 229376, 294912 正在寫入inode表: 完成 Creating journal (16384 blocks): 完成 Writing superblocks and filesystem accounting information: 完成 This filesystem will be automatically checked every 32 mounts or 180 days, whichever comes first. Use tune2fs -c or -i to override. ## 使用 mkfs.ext4 格式化爲 ext4 文件系統 九、掛載使用 [root@study ~]# mkdir /data [root@study ~]# mount /dev/my_vg/my_lv /data/ [root@study ~]# df -HT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_study-LogVol00 ext4 20G 1.4G 18G 8% / tmpfs tmpfs 521M 0 521M 0% /dev/shm /dev/sda1 ext4 204M 30M 164M 16% /boot /dev/mapper/my_vg-my_lv ext4 2.2G 71M 2.0G 4% /data ## 建立 /data 目錄,將 /dev/my_vg/my_lv 掛載到 /data [root@study ~]# umount /data/ [root@study ~]# blkid /dev/my_vg/my_lv /dev/my_vg/my_lv: UUID="a8cb322e-1872-4ea8-bfba-f21b678bc849" TYPE="ext4" [root@study ~]# echo "UUID="a8cb322e-1872-4ea8-bfba-f21b678bc849" /data ext4 defaults 0 0" >> /etc/fstab [root@study ~]# mount -a [root@study ~]# df -HT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_study-LogVol00 ext4 20G 1.5G 18G 8% / tmpfs tmpfs 521M 0 521M 0% /dev/shm /dev/sda1 ext4 204M 30M 164M 16% /boot /dev/mapper/my_vg-my_lv ext4 2.2G 71M 2.0G 4% /data ## 也可使用 blkid 生成 UUID 而後寫入到 /etc/fstab 文件中,實現開機自動掛載 2、擴容 LV 一、首先建立物理分區(重點是此次建立後要格式化) 二、建立 PV 三、擴容 VG [root@study ~]# vgextend my_vg /dev/sdb3 Volume group "my_vg" successfully extended ## 使用 vgextend 指令擴展 VG ,後面接要擴展的 VG名 ,後面接將哪一個 PV 擴展進去 [root@study ~]# vgdisplay my_vg --- Volume group --- VG Name my_vg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 3 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size 3.02 GiB PE Size 4.00 MiB Total PE 774 Alloc PE / Size 512 / 2.00 GiB Free PE / Size 262 / 1.02 GiB VG UUID ynCJG8-ZIvI-9gBF-dO5K-aQws-N9WW-r26hch ## 可使用 vgdisplay my_vg 來指定查看哪一個 VG ## 能夠看到 VG 總大小爲 3G 、已使用 2G 、空閒 1G(由於咱們擴進去 1G 的 PV) 四、擴容 LV [root@study ~]# lvextend -L +1G /dev/my_vg/my_lv Size of logical volume my_vg/my_lv changed from 2.00 GiB (512 extents) to 3.00 GiB (768 extents). Logical volume my_lv successfully resized ## 使用 lvextend 擴容 LV ,-L 指定擴多大 ,後面接 LV 實際路徑 /dev/my_vg/my_lv [root@study ~]# lvdisplay /dev/my_vg/my_lv --- Logical volume --- LV Path /dev/my_vg/my_lv LV Name my_lv VG Name my_vg LV UUID j9Bduh-3TB9-Owhz-X3PX-fVeQ-bvJe-OAFBVp LV Write Access read/write LV Creation host, time study.localhost.localdomain, 2014-11-26 11:14:28 +0800 LV Status available # open 1 LV Size 3.00 GiB Current LE 768 Segments 3 Allocation inherit Read ahead sectors auto - currently set to 256 Block device 253:1 ## 可使用 lvdisplay /dev/my_vg/my_lv 來查看 LV 大小 ## LV 大小變爲了 3G (原 2G) 五、投入使用 [root@study ~]# df -HT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_study-LogVol00 ext4 20G 1.4G 18G 8% / tmpfs tmpfs 521M 0 521M 0% /dev/shm /dev/sda1 ext4 204M 30M 164M 16% /boot /dev/mapper/my_vg-my_lv ext4 2.2G 71M 2.0G 4% /data ## 咱們發現分區 /data 大小仍是 2G [root@study ~]# resize2fs /dev/my_vg/my_lv resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/my_vg/my_lv is mounted on /data; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/my_vg/my_lv to 786432 (4k) blocks. The filesystem on /dev/my_vg/my_lv is now 786432 blocks long. [root@study ~]# df -HT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_study-LogVol00 ext4 20G 1.4G 18G 8% / tmpfs tmpfs 521M 0 521M 0% /dev/shm /dev/sda1 ext4 204M 30M 164M 16% /boot /dev/mapper/my_vg-my_lv ext4 3.2G 71M 3.0G 3% /data ## 使用 resize2fs /dev/my_vg/my_lv 從新計算分區大小後 發現擴容到了 3G 3、縮減 LV 一、模擬數據寫入 [root@study ~]# dd if=/dev/zero of=/data/block.db bs=1024M count=1 記錄了1+0 的讀入 記錄了1+0 的寫出 1073741824字節(1.1 GB)已複製,81.6381 秒,13.2 MB/秒 ## 咱們使用 dd 命令寫了 1G 的數據到 /data [root@study ~]# cp /etc/passwd /data/ ## 複製這個文件的目的是驗證數據是否丟失 [root@study ~]# df -HT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_study-LogVol00 ext4 20G 1.4G 18G 8% / tmpfs tmpfs 521M 0 521M 0% /dev/shm /dev/sda1 ext4 204M 30M 164M 16% /boot /dev/mapper/my_vg-my_lv ext4 3.2G 1.2G 1.9G 39% /data ## 如今這個剩餘空間 咱們想把他撤出來 1G 二、首先檢查一下文件系統 [root@study ~]# umount /data/ ## 必定要先 umount [root@study ~]# e2fsck -f /dev/my_vg/my_lv e2fsck 1.41.12 (17-May-2010) 第一步: 檢查inode,塊,和大小 第二步: 檢查目錄結構 第3步: 檢查目錄鏈接性 Pass 4: Checking reference counts 第5步: 檢查簇概要信息 /dev/my_vg/my_lv: 13/196608 files (0.0% non-contiguous), 291646/786432 blocks 三、從新計算大小 [root@study ~]# resize2fs /dev/my_vg/my_lv 2G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/my_vg/my_lv to 524288 (4k) blocks. The filesystem on /dev/my_vg/my_lv is now 524288 blocks long. ## 從新定義大小爲 2G 四、縮小 LV [root@study ~]# lvreduce -L -1G /dev/my_vg/my_lv WARNING: Reducing active logical volume to 2.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce my_lv? [y/n]: y Size of logical volume my_vg/my_lv changed from 3.00 GiB (768 extents) to 2.00 GiB (512 extents). Logical volume my_lv successfully resized ## 使用 lvreduce 來縮小 LV ,-L -1G 縮小 1G [root@study ~]# mount -a [root@study ~]# df -HT Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/vg_study-LogVol00 ext4 20G 1.4G 18G 8% / tmpfs tmpfs 521M 0 521M 0% /dev/shm /dev/sda1 ext4 204M 30M 164M 16% /boot /dev/mapper/my_vg-my_lv ext4 2.2G 1.2G 863M 58% /data [root@study ~]# ls /data/ block.db lost+found passwd ## 從新掛載分區,發現數據沒有問題 (僅是測試,沒有發現問題) 五、VG 中移除 PV [root@study ~]# vgdisplay my_vg --- Volume group --- VG Name my_vg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 6 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 1 Max PV 0 Cur PV 3 Act PV 3 VG Size 3.02 GiB PE Size 4.00 MiB Total PE 774 Alloc PE / Size 637 / 2.49 GiB Free PE / Size 137 / 548.00 MiB VG UUID ynCJG8-ZIvI-9gBF-dO5K-aQws-N9WW-r26hch ## 首先咱們 vgdisplay my_vg ,發現 VG 空閒 548M [root@study ~]# pvdisplay --- Physical volume --- PV Name /dev/sdb1 VG Name my_vg PV Size 1.01 GiB / not usable 3.41 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 258 Free PE 0 Allocated PE 258 PV UUID JB8X8v-jBPU-eOiN-aEOU-TOig-tv01-SuHytd --- Physical volume --- PV Name /dev/sdb2 VG Name my_vg PV Size 1.01 GiB / not usable 3.44 MiB Allocatable yes (but full) PE Size 4.00 MiB Total PE 258 Free PE 0 Allocated PE 258 PV UUID YXBMJJ-RyG3-z1xa-tlw6-piaI-cTgj-SIBIlz --- Physical volume --- PV Name /dev/sdb3 VG Name my_vg PV Size 1.01 GiB / not usable 3.44 MiB Allocatable yes PE Size 4.00 MiB Total PE 258 Free PE 137 Allocated PE 121 PV UUID jSpEdJ-fxZh-LP27-rFIM-0gnO-mL2x-PpBJpK ## 其次使用 pvdisplay 查看 PV 的使用狀況發現: /dev/sdb1 PE 空閒 0 /dev/sdb2 PE 空閒 0 /dev/sdb3 PE 空閒 137 (上圖顯示每一個 PE 爲 4M ,那麼 /dev/sdb3 總空閒容量=137*4 = 548M) ## 正好等於 VG 的空閒大小,而 PV /dev/sdb3 大小爲 1G ,也就是說有部分空間被佔用,因此沒法移除該 PV [root@study ~]# vgreduce my_vg /dev/sdb3 Physical volume "/dev/sdb3" still in use [root@study ~]# umount /data/ [root@study ~]# vgreduce my_vg /dev/sdb3 Physical volume "/dev/sdb3" still in use ## 提示正在被佔用,沒法移除( umount 分區也不行 ) [root@study ~]# umount /data/ [root@study ~]# e2fsck -f /dev/my_vg/my_lv e2fsck 1.41.12 (17-May-2010) 第一步: 檢查inode,塊,和大小 第二步: 檢查目錄結構 第3步: 檢查目錄鏈接性 Pass 4: Checking reference counts 第5步: 檢查簇概要信息 /dev/my_vg/my_lv: 14/163840 files (0.0% non-contiguous), 289591/652288 blocks [root@study ~]# resize2fs /dev/my_vg/my_lv 2G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/my_vg/my_lv to 524288 (4k) blocks. The filesystem on /dev/my_vg/my_lv is now 524288 blocks long. [root@study ~]# lvreduce -L -500M /dev/my_vg/my_lv WARNING: Reducing active logical volume to 2.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce my_lv? [y/n]: y Size of logical volume my_vg/my_lv changed from 2.49 GiB (637 extents) to 2.00 GiB (512 extents). Logical volume my_lv successfully resized ## 咱們把 LV 縮小了 500M [root@study ~]# vgdisplay my_vg --- Volume group --- VG Name my_vg System ID Format lvm2 Metadata Areas 3 Metadata Sequence No 9 VG Access read/write VG Status resizable MAX LV 0 Cur LV 1 Open LV 0 Max PV 0 Cur PV 3 Act PV 3 VG Size 3.02 GiB PE Size 4.00 MiB Total PE 774 Alloc PE / Size 512 / 2.00 GiB Free PE / Size 262 / 1.02 GiB VG UUID ynCJG8-ZIvI-9gBF-dO5K-aQws-N9WW-r26hch ## 如今再看 VG 大小 空閒 1G [root@study ~]# pvdisplay --- Physical volume --- PV Name /dev/sdb3 VG Name my_vg PV Size 1.01 GiB / not usable 3.44 MiB Allocatable yes PE Size 4.00 MiB Total PE 258 Free PE 258 Allocated PE 0 PV UUID jSpEdJ-fxZh-LP27-rFIM-0gnO-mL2x-PpBJpK ## pvdisplay 也發現 /dev/sdb3 正好所有空閒 [root@study ~]# vgreduce my_vg /dev/sdb3 Removed "/dev/sdb3" from volume group "my_vg" ## 已經成功將 PV /dev/sdb3 從 VG my_vg 中移除 [root@study ~]# vgs VG #PV #LV #SN Attr VSize VFree my_vg 2 1 0 wz--n- 2.02g 16.00m ## 使用 vgs 能夠看到 vg my_vg 中包含 PV 數爲 2 六、刪除 PV [root@study ~]# pvremove /dev/sdb3 Labels on physical volume "/dev/sdb3" successfully wiped ## 使用 pvremove 刪除 PV /dev/sdb3 [root@study ~]# pvs PV VG Fmt Attr PSize PFree /dev/sdb1 my_vg lvm2 a-- 1.01g 0 /dev/sdb2 my_vg lvm2 a-- 1.01g 16.00m ## 使用 pvs 看到只有兩個 PV 了 ## 而後 fdisk /dev/sdb 將 sdb3 的 ID 改成 83 ,保存 mkfs.ext4 /dev/sdb3 ,從新掛載到目錄,至此 /dev/sdb3 成爲普通分區 4、刪除整個 lv vg pv [root@study ~]# umount /data/ [root@study ~]# lvremove /dev/my_vg/my_lv Do you really want to remove active logical volume my_lv? [y/n]: y Logical volume "my_lv" successfully removed [root@study ~]# vgremove my_vg Volume group "my_vg" successfully removed [root@study ~]# pvremove /dev/sdb1 Labels on physical volume "/dev/sdb1" successfully wiped [root@study ~]# pvremove /dev/sdb2 Labels on physical volume "/dev/sdb2" successfully wiped ## 刪除比建立容易多了 ...