LVM (Logical Volume Manager) là một phương pháp cho phép ấn định không gian đĩa cứng thành những Logical Volume khiến cho việc thay đổi kích thước trở nên dễ dàng (so với partition). Với kỹ thuật LVM bạn có thể thay đổi kích thước mà không cần phải sửa lại partition table của OS. Điều này thực sự hữu ích với những trường hợp bạn đã sử dụng hết phần bộ nhớ còn trống của partition và muốn mở rộng dung lượng của nó.
LVM là kỹ thuật quản lý việc thay đổi kích thước lưu trữ của ổ cứng
Kiểm tra Hệ thống đã nhận các ổ đã gắn vào hay chưa
lsblk
Tạo ra các Partition bằng lệnh fdisk
, gắn nhãn (Lable) 8e (LVM) cho Partition. Thao tác trên sdb, các ổ còn lại làm tương tự.
Bấm m để xem các hướng dẫn
Bấm n để tạo mới 1 Partition
Bấm p
để tạo primary partition (Mỗi ổ chỉ tạo được tối đa 4 primary partititon), tùy vào mục đích sử dụng mà chúng ta chia Hard-drives thành các partition có dung lượng khác nhau. Ở ví dụ này, chỉ chia 1 partition chính. Sử dụng giá trị mặc định để lấy tất cả dung lượng của ổ.
Thay đổi lable của partition
Bấm w
để lưu lại những gì ta vừa thiết đặt.
Tạo một PV bao gồm 3 Partition (/dev/sdb1
/dev/sdc1
và /dev/sdd1
) vừa tạo ở bước trên như sau:
pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1
Từ 3 PV ở trên, ta có tạo một GV bằng lệnh
gvcreate vg-demo /dev/sdb1 /dev/sdc1 /dev/sdd1
Kiểm tra xem vg-demo
đã được tạo hay chưa bằng lệnh vgs
, kiểm tra các PV đã nằm trong VG chưa bằng lệnh pvs
Một GV có thể tạo được dùng nhiều LV với kích cỡ khác nhau nhưng không thể vượt quá size của GV bằng lệnh sau:
lvcreate -L 5G -n lv-demo vg-demo
-L
: Chỉ ra dung lượng của LV-n
: Chỉ ra tên của LVlv-demo
: Tên của LVvg-demo
: Tên của VGTạo và kiểm tra lại: lvs
Ta có thể Format LV ở các định dạng ext2, ext3, xfs,... tùy theo mục đích sử dụng.
Tạo một folder /testLV
để mount và sử dụng LV vừa format
mkdir /testLV
Mount
mount /dev/vg-demo/lv-demo /testLV
Dùng df -h
để kiểm tra xem đã nhận đầy đủ dung lượng và đúng thư mục hay chưa
Tuy nhiên, lệnh mount
chỉ dùng để mount LV tạm thời trong phiên làm việc sau khi khởi động lại sẽ mất muốn sử dụng lại thì phải mount. Ta ghi thêm vào file /etc/fstab
echo "/dev/vg-demo/lv-demo /testLV ext3 rw,noatime 0 0" >> /etc/fstab
Sau khi sử dụng một thời gian, không gian đĩa bị thu hẹp dần. Vì thế chúng ta cần tăng không gian của LV để sử dụng tiếp mà dữ liệu cũ vẫn được bảo toàn, nguyên vẹn. Làm theo hướng dẫn sau để tăng kích thước của LV.
Kiểm tra dung lượng của VG
vgdisplay
Như ta thấy ở hình, VG còn trống ~45 GB như vậy có thể cấp phát và tạo mới các LV một cách dễ dàng như sau:
lvextend -L +1G /dev/vg-demo/lv-demo
-L
là tùy chọn để tăng kích thước LV
+1G
định nghĩa cho hệ thống hiểu là tăng thêm, ở đây ta có thể tăng theo B (tối thiểu 512B), M, G
Lúc này, hệ thống chưa nhận được dung lượng vừa thêm cho LV, để làm được điều này chúng ta phải thực hiện câu lệnh
resize2fs /dev/vg-demo/lv-demo
Và kiểm tra lại bằng lệnh:
# dh -h
Trước khi thực hiện tao tác giảm dung lượng LV, ta cần phải Unmount LV cần thay đổi:
umount /testLV
Sau đó, thực hiện thay đổi dung lượng bằng lệnh và xác nhận với hệ thống:
lvreduce -L 3G /dev/vg-demo/lv-demo
Format lại LV:
mkfs.etx3 /dev/vg-demo/lv-demo
Và mount lại để sử dụng và kiểm tra xem đã đúng với yêu cầu của mình chưa:
mount /dev/vg-demo/lv-demo /testLV
df -h
Việc thay đổi không gian của VG đồng nghĩa với việc thêm hoặc bớt đi các PV. Ở trên, ta đã cho tất cả các PV vào trong vg-demo
. Vì thế, ta sẽ giảm đi nó đi trước sau đó thêm lại. :D
Ta kiểm tra PV nào đang ở trong vg-demo
bằng lệnh
pvs
Bỏ /dev/sdc1
ra khỏi vg-demo
vgreduce vg-demo /dev/sdc1
Và kiểm tra lại bằng:
pvs
Ta hiểu bản chất của việc tăng dung lượng là thêm mới một PV vào trong VG.
Bước trên, ta đã bỏ /dev/sdc1
ra khỏi vg-demo
thì bây giờ, chúng ta sẽ thêm nó lại vào bằng lệnh:
vgextend /dev/vg-demo /dev/sdc1
Kiểm tra lại:
pvs
Ngược lại với quá trình tạo, thay vì ta phải tạo các PV xong đến VG và cuối cùng là "phân chia" các LV thì ta phải xóa các LV, sau đó đến VG và cuối cùng là các PV. Quy trình lần lượt như sau:
Đầu tiên, ta phải umount
nó trước sau đó xóa PV:
umount /dev/vg-demo/lv-demo
Xóa PV vừa umount
lvremove /dev/vg-demo/lv-demo
Sau khi xóa PV xong, ta có thể xóa VG bằng lệnh:
vgremove /dev/vg-demo
Cuối cùng đến PV, ta dùng lệnh:
pvremove /dev/sda1 /dev/sdb1 /dev/sdc1
lvrename <tên-vg> <tên-lv-cũ> <tên-lv-mới>
Ví dụ: lvrename vg-demo lv-demo demo
gvrename <tên-vg-cũ> <tên-vg-mới>
Ví dụ: vgrename vg-demo demo
Snapshot là một tính năng dùng để lưu lại dữ liệu tại một thời điểm nào đó.
Thư mục trước khi tạo snapshot:
Tạo một snapshot bằng câu lệnh:
lvcreate -L 1GB -s -n snap-lv-accounting /dev/vg-meditech/lv-accounting
-s
: Tạo snapshot-n
: Tên của snapshotLưu ý: Câu lệnh trong hình tôi tạo snapshot với dung lượng là 3Gb nhưng LV mà tôi muốn snapshot chỉ có 2Gb nên hệ thống đã tự động giảm xuống.
Xem thông tin của Snapshot:
lvdisplay /dev/vg-meditech/snap-lv-accounting
Copy một số file:
Kiểm tra sự thay đổi:
Ở một mức nào đó, ổ cứng của chúng ta đầy lên và vượt quá dung lượng của snapshot mà chúng ta đã tạo ở bên trên. (Bên trên, tôi đã tạo snapshot bằng với dung lượng ổ cứng vì thế không phải lo nghĩ gì cả.)
Để tăng thêm dung lượng của snapshot ta sẽ thực hiện như sau:
lvextend -L +1G /dev/vg-meditech/snap-lv-accounting
Muốn hệ thống tự động dãn LV snapshot cho chúng ta thì phải cấu hình một chút như sau:
Đầu tiên mở file cấu hình LVM: vi /etc/lvm/lvm.conf
Tìm đến dòng có keyword như sau:
Giải thích: Khi dung lượng của snapshot đạt tới 70% tổng dung lượng mà chúng ta tạo ở trên, thì tự động hệ thống sẽ tăng thêm cho nó 20% dung lượng.
Để quay về trạng thái mà khi ta tạo snapshot, dùng câu lệnh sau:
Trước đó, chúng ta phải umount thư mục
umount /accounting
Restore lại bằng lệnh:
lvconvert --merge /dev/vg-meditech/snap-lv-accounting
Sau khi thực hiện xong, snapshot sẽ bị xóa. Chúng ta thực hiện thao tác mount
lại ổ vào thư mục và kiểm tra dữ liệu.
mount /dev/vg-meditech/lv-accounting /accounting
Chức năng này cho phép chúng ta cấp động dữ liệu cho người dùng.
Ví dụ chúng ta có một ổ cứng 15GB, cấp cho 2 người dùng mỗi người 5GB sử dụng. Một người dùng thứ 3 muốn sử dụng 5GB. Như vậy chúng ta đã hết lưu lượng khi sử dụng (Thick Volume).
Cũng trong trường hợp trên, chúng ta dùng Thin Provisioning để giải quyết vấn đề này. Thin Provisioning được hiểu nôm na là "dùng bao nhiêu thì lấy từng ấy" khác với Thick Provisioning (Cấp bao nhiêu thì lấy luôn từng ấy - cách này khá lãng phí khi người dùng không dùng hết lưu lượng được cấp). Quay trở lại với Thin Provisioning, ví dụ chúng ta có 15GB như ví dụ bên trên, khi đã cấp cho 3 người dùng 5GB mà 3 người này không lưu trữ hết dung lượng được cấp thì chúng ta có thể tận dụng khoảng không gian trống đó để cấp cho người dùng thứ 4 mà không phải gắn thêm ổ mới ngay lập tức.
Tuy nhiên, đây chỉ là cách "chữa cháy" tạm thời khi chúng ta chưa có khả năng mở rộng dung lượng ổ cứng vật lý tạm thời. Chúng ta phải mở rộng dung lượng vật lý càng sớm càng tốt, tránh rủi ro dữ liệu bị ghi đè, hoặc mất mát khi xung đột.
Lưu ý: Chúng ta tạo VG Thin Provisioning như tạo một VG bình thường nhưng với tùy chọn -s
với kích cỡ mặc định là 32M
vgcreate -s 32M vg-thin /dev/sdc1
Xem lại dung lượng của Thin VG vừa tạo bằng lệnh vgs
# lvcreate -L 6G --thinpool thin-meditech vg-thin
Xem thông tin của LV Thin vừa tạo
lvcreate -V 2G --thin -n thin-si1 vg-thin/thin-meditech
lvcreate -V 2G --thin -n thin-si2 vg-thin/thin-meditech
lvcreate -V 2G --thin -n thin-si3 vg-thin/thin-meditech
lvcreate -V 2G --thin -n thin-si4 vg-thin/thin-meditech
Xem lại thông tin của các LV vừa tạo
Tạo thư mục, ở đây tôi sẽ tạo thư mục ở /mmt
:
mkdir /mnt/si{1..4}
Format các LV:
mkfs.ext3 /dev/vg-thin/thin-si1 && mkfs.ext3 /dev/vg-thin/thin-si2 && mkfs.ext3 /dev/vg-thin/thin-si3 mkfs.ext3 /dev/vg-thin/thin-si4
Mount lên các thư mục vừa tạo:
mount /dev/vg-thin/thin-si1 /mnt/si1
mount /dev/vg-thin/thin-si2 /mnt/si2
mount /dev/vg-thin/thin-si3 /mnt/si3
mount /dev/vg-thin/thin-si4 /mnt/si4
Tôi vừa tạo 4 LV thin có dung lượng là 2GB với một ổ VG chỉ có 6GB. Tuy nhiên, như tôi đã nói ở trên là cách này chỉ để "chữa cháy" khi phải cấp cho một tài nguyên dùng tạm, cần phải thêm ổ cứng vật lý ngay.
Phân chia dữ liệu đồng đều trên các đĩa (PV).
Ở đây, tôi dùng 2 ổ 8GB.
pvcreate /dev/sd[c-d]1 -v
pvs
vgcreate -s 16M vg-strip /dev/sd[c-d]1 -v
vgs vg-strip
-s
: Xác định kích cỡ vật lý của VG-v
: Verbose: hiển thị thông tin làm việc của lệnhlvcreate -L 1GB -n lv-si-strip -i2 vg-strip
-L
: Kích cỡ của LV-n
: Tên của LV-i
: Số lượng StrippingỞ hình trên, chúng ta có thể thấy kích cỡ mặc định của strip là 64KB, chúng ta có thể thay đổi chúng bằng tùy chọn -I
.
Để xem chi tiết về LV vừa tạo ta thêm -m
vào câu lệnh:
lvdisplay vg-strip/lv-si-strip -m
1
: Số tripe2
: Kích thước mặc định của stripeTiếp theo là format và mount lên sử dụng.
Tính năng này vô cùng nổi bật và hữu ích, chúng ta có thể di chuyển dữ liệu sang disk mới mà không mất mát dữ liệu và downtime.
Hiện tại, tôi muốn thay sdb1 (8GB) bằng sdc1 (10GB) mà không làm mất dữ liệu hay downtime.
Xem lại thông tin:
vgdisplay vg-meditech -v
lvconvert
lvconvert -m 1 /dev/vg-meditech/lv-si /dev/sdb1
-m
: Mirror1
: Thêm một Morrior đơn (sdb1)lvconvert -m 0 /dev/vg-meditech/lv-si /dev/sdc1
vgreduce /dev/vg-meditech /dev/sdc1
Kiểm tra lại thì sdc1 (8GB) đã bị xóa khỏi LV và thay vào đó sdb1 (10GB).
Ngoài Morrior, chúng ta còn một cách đơn giản hơn là lvmove
pvmove -n /dev/vg-meditech/lv-si /dev/sdb1 /dev/sdc1
Câu lệnh trên tôi chuyển ngược lại từ sdb1 (10GB) sang sdc1 (8GB). Và dữ liệu vẫn được an toàn.