![]() |
![]() |
![]() |
![]() |
![]() |
以下是一些 LVM 的優點:
彈性和動態調整: LVM 允許你建立虛擬的邏輯卷(LV),這些卷可以跨越多個物理硬碟或硬碟分割區。這提供了更大的彈性,可以隨時調整卷的大小,而無需關閉系統或影響運行中的應用程式。
資料遷移和遷移: LVM 允許你在不中斷服務的情況下遷移資料,例如將資料從一個物理硬碟遷移到另一個硬碟,或者將資料從一個邏輯卷遷移到另一個卷。這對於升級硬碟或重新組織存儲配置非常有用。
快照和備份: LVM 提供了快照功能,可以在不中斷系統運行的情況下創建磁碟卷的快照。這對於備份和數據恢復很有幫助,因為你可以在創建快照後進行操作,而原始數據保持不變。
容錯和冗餘: LVM 支援鏡像(Mirroring)模式,使你可以在多個物理硬碟之間創建冗餘複本,提高數據的容錯能力。如果一個硬碟失效,數據仍然可用。
容量的有效管理: LVM 允許你將物理硬碟的容量進行抽象化,從而更有效地管理和分配可用空間。
即時擴充: 你可以即時地擴充邏輯卷的大小,而不需要重新分割硬碟或暫停服務。
多個文件系統: LVM 允許在同一組物理硬碟上創建多個邏輯卷,這些卷可以運行不同的文件系統,以滿足不同的需求。
總之,LVM 提供了更靈活、更具效率和更容易管理的硬碟存儲方案,特別是對於需要隨著時間進行容量調整、遷移資料或保護數據的場景來說。
# parted /dev/sdc print ←列出 partiton 資訊 Model: ST964032 2AS (scsi) Disk /dev/sdc: 640GB Sector size (logical/physical): 512B/512B Partition Table: gpt Number Start End Size File system Name Flags 1 17.4kB 160GB 160GB p1 2 160GB 320GB 160GB p2 3 320GB 480GB 160GB p3 4 480GB 640GB 160GB p4 # parted /dev/sdc set 1 lvm on ←將 partitoin#1 ID 設為〝lvm〞(如用 fdisk 操作 ID 為〝8e〞) # parted /dev/sdc set 2 lvm on ←將 partitoin#2 ID 設為〝lvm〞 # parted /dev/sdc set 3 lvm on ←將 partitoin#3 ID 設為〝lvm〞 # pvcreate /dev/sdc1 /dev/sdc2 /dev/sdc3 ←將 partitoin#1~3 轉成 PV Physical volume "/dev/sdc1" successfully created Physical volume "/dev/sdc2" successfully created Physical volume "/dev/sdc3" successfully created |
# parted /dev/hdb mklabel loop ←將硬碟〝/dev/hdb〞內的 partition 都清除 # pvcreate /dev/hdb ←將整個硬碟〝/dev/hdb〞 轉成 PV |
# dd if=/dev/zero of=disk-image bs=1 count=0 seek=100M ←產生一100M 的 image-file # losetup -fv disk-image ←將 image-file 對映到虛擬設備檔〝/dev/loopN〞 loop device is /dev/loop0 # parted /dev/loop0 mklabel loop ←將〝/dev/loop0〞設為不可再分割 partition # pvcreate /dev/loop0 ←將〝/dev/loop0〞轉 PV Physical volume "dev/loop0" successfully created |
# vgcreate MyVG /dev/sdc1 /dev/sdc3 ←〝/dev/sdc1〞和〝/dev/sdc3〞組成〝MyVG〞的 VG Volume group "VG1" using metadata type lm2 |
# lvcreate -L 2G -n MyLV1 MyVG ←從 VG〝MyVG〞 規劃出名稱為〝MyLV1〞2G 大小的 LV Logical volume "MyLV1" created # lvscan -v ←掃描一下 LV 的裝置檔名 Finding all logical volumes ACTIVE '/dev/MyVG/MyLV1' [2.00 GB] inherit # mkfs -j /dev/MyVG/MyLV1 ←format 該 LV # mount /dev/MyVG/MyLV1 /mnt ←掛載 # df -h ←確定一下掛載情形 Filesystem Size Used Avail Use% Mounted on /dev/mapper/MyVG-MyLV1 2.0G 68M 1.9G 4% /mnt |
# cp -a /etc/*.conf /mnt ←故意存一些檔案進去看調整大小過程中會不會被破壞 # lvextend -L 3G /dev/MyVG/MyLV1 ←將 LV 由原 2G 調為 3G # df -h ←確定 filesystem 有無變大 ? Filesystem Size Used Avail Use% Mounted on /dev/mapper/MyVG-MyLV1 2.0G 68M 1.9G 4% /mnt ←size 還是一樣?因 LV 雖變大了但 filesystem 還沒調整 # rezise2fs /dev/MyVG/MyLV1←調整 filesystem 大小 # df -h ←再確定 filesystem 大小 /dev/mapper/MyVG-MyLV1 3.0G 68M 2.8G 3% /mnt ←filesystem 變大了!(3G) # ls /mnt ←確認一下 filesystem 的檔案有無被破壞 |
# umount /mnt ←先卸載 # e2fsck -f /dev/MyVG/MyLV1 ←檢查 LV device-mapper 的完整性 # resize2fs /dev/MyVG/MyLV1 1G ←縮減 LV 上的 filesystem 到 1G # lvreduce -L 1G /dev/MyVG/MyLV1 ←縮減 LV 到 1G WARNING: Reducing active logical volume to 1.00 GB THIS MAY DESTORY YOUR DATA(filesystem etc.) Do you really want to reduce MyLV1? [y/n]: y ←會有造成資料損毀的警告(按<Y> 繼續) # mount /dev/MyVG/MyLV1 /mnt ←重掛載 # ls /mnt ←確認一下 filesystem 的檔案有無被破壞 |
# lvs -o segtype,devices,lv_name Type Devices LV striped /dev/sdb2(0),/dev/sdb1(0) lvol0 |
# lvcreate -L 3G -m1 --mirrorlog core vg_mirror /dev/sda /dev/sdb ←用二個 PV 跑 mirrored logical volume |
# vgcreate vg_mirr /dev/sdb /dev/sdc{1,2} ←建立 VG 的 PV 為〝/dev/sdb〞和〝/dev/sdc{1,2}〞 # lvcreate -L 1G -m1 -n lv0 vg_mirr /dev/sdb /dev/sdc1 /dev/sdc2 ←建立 mirror volume,〝/dev/sdb〞和〝/dev/sdc1〞為 mirror-leg 而〝/dev/sdc2〞為 mirror-log # mkfs /dev/vg_mirr/lv0 ←格式化此 mirror volume # mount /dev/vg_mirr/lv0 /mnt ←mount # dd if=/dev/zero of=/mnt/file_test1 bs=100M count=1 ←寫一檔案測試一下 |
# dd if=/dev/zero of=/dev/sdb bs=4K count=1000 ←破壞 PV〝/dev/sdb〞 # lvscan ←scan 一下 LV Couldn't find device with uuid 'XuwhhB-585a-20lj-vr0-kGoo-0bmg-cGRv82 ←LV 已損壞 # echo > /mnt/file_test2 ←寫一檔案看看(一個 mirror-leg 壞了還可讀寫但會自動轉變為 linear voulme) |
# vgreduce --removemissing --force vg_mirr ←移除壞的 PV # vgextend vg_mirr /dev/sdd ←加入一新的 PV〝/dev/sdd〞但新的 PV 最好不要小於壞的 PV # lvconvert -m1 /dev/vg_mirr/lv0 /dev/sdd /dev/sdc1 /dev/sdc2 ←將 linear voume 轉 mirror volume # mount /dev/vg_mirr/lv0 /mnt ←再掛載 mirror volume # ls /mnt ←看一下之前的檔案安在否? file_test1 file_test2 |
# lvcreate -L 3G -n ori_lv MyVG ←建立 3G 大小名稱為〝ori_lv〞的 LV # mkfs /dev/MyVG/ori_lv ←format 此 LV # mkdir /mnt/ori ←建立目錄〝/mnt/ori〞 # mount /dev/MyVG/ori_lv /mnt/ori ←掛載 LV〝ori_lv〞 到〝/mnt/ori〞 接下來故意放一些檔案到〝/mnt/ori〞 # dd if=/dev/zero of=/mnt/ori/1g-image bs=1 count=0 seek=1G ←產生 1G 的檔案 # cp /etc/*.conf /mnt/ori ←複製一些檔案進去 接下來產生一 300M 維護快照 meta-data 的空間,看可不可完全複製 3G 的 filesystem # lvcreate -L 300M -s -n snap_backup /dev/MyVG/ori_lv ←產生一名稱為〝snap_backup〞快照 LV,維護 meta-data 空間為 300M # mkdir /mnt/backup ←建立目錄〝/mnt/backup〞 # mount /dev/MyVG/snap_backup /mnt/backup ←掛載快照 LV〝snap_backup〞 到〝/mnt/backup〞 # df -h /mnt/ori /mnt/backup ←比較兩者 filesystem 大小,應該是一模一樣 Filesystem Size Used Avail Use% Mounted on /dev/maper/MyVG-ori_lv 3.0G 1.1G 1.8G 5% /mnt/ori /dev/maper/MyVG-snap_backup 3.0G 1.1G 1.8G 5% /mnt/backup ←300M 的 meta-data 空間可備份超過 300M 的 filesystem(此為 3G) |
# lvdisplay /dev/MyVG/snap_backup --- Logical volume --- LV Name /dev/MyVG/snap_backup VG Name MyVG LV UUID fFbaH4-33Hq-s7a3-e1mo-DPov-4wff-dvuAiI LV Write Access read/write LV snapshot status active destination for /dev/MyVG/ori_lv ←原 LV LV Status available # open 0 LV Size 3.0 GB Current LE 768 COW-table size 300.00MB ←Copy On Wirte Talbe (維護 meta-data 大小) COW-table LE 75 Allocated to snapshot 0.21% ←meta-data 使用情形不要讓其達到 100% Snapshot chunk size 4.00 KB Segments 1 Allocation inherit |
# umount /mnt ←卸載 # vgchange -an my_vg ←inactive VG # vgexport my_vg ←導出 LVM 的 VG Volume group "my_vg" successfully exported |
# vgimport vg_u01 ←導出 LVM 的 VG Volume group "my_vg" successfully imported # vgchange -ay my_vg ←activate the VG # mount /dev/my_vg/lv_0 /mnt←掛載 |
# vgcfgrestor vg01 -f myvg_backup ←備份 VG〝vg01〞的 metadata 到檔案〝myvg_backup〞 Volume group "vg01" successfully backed up. # vgcfgrestore vg01 -f myvg_backup ←還原 VG〝vg01〞的 metadata Restored volume group vg01 |