hoangdh / Su_dung_LVM

0 stars 3 forks source link

Hướng dẫn sử dụng LVM cơ bản và nâng cao

Mục lục:

I. CƠ BẢN

II. NÂNG CAO

I. CƠ BẢN

1. LVM là gì?

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ó.

2. LVM dùng để làm gì?

LVM là kỹ thuật quản lý việc thay đổi kích thước lưu trữ của ổ cứng

3. Cấu trúc của LVM gồm những gì?

4. Hướng dẫn LVM cơ bản

4.1 Chuẩn bị

4.2 Tạo các Partition

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.

4.3 Tạo Physical Volume (PV)

Tạo một PV bao gồm 3 Partition (/dev/sdb1 /dev/sdc1/dev/sdd1) vừa tạo ở bước trên như sau:

pvcreate /dev/sdb1 /dev/sdc1 /dev/sdd1

4.4 Tạo Group Volume (GV)

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

4.4 Tạo Logical Volume (LV)

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

Tạo và kiểm tra lại: lvs

4.5 Sử dụng LV

a. Format

Ta có thể Format LV ở các định dạng ext2, ext3, xfs,... tùy theo mục đích sử dụng.

b. Mount và 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

5. Thay đổi dung lượng của LV và VG trong LVM

5.1 Với LV

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.

Tăng dung lượng

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

Giảm dung lượng LV

Khuyến cáo: Điều này sẽ làm mất hết dữ liệu hiện tại, bởi vậy khi Giảm dung lượng LV, chúng ta cần Backup lại toàn bộ dữ liệu hiện tại trước khi thao tác.

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

5.2 Với VG

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

Giảm dung lượng:

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

Tăng dung lượng:

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

6. Xóa LV, VG, PV

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:

6.1 Xóa LV

Đầ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

6.2 Xóa VG

Sau khi xóa PV xong, ta có thể xóa VG bằng lệnh:

vgremove /dev/vg-demo

6.3 Xóa PV

Cuối cùng đến PV, ta dùng lệnh:

pvremove /dev/sda1 /dev/sdb1 /dev/sdc1

BONUS

Đổi tên LV, VG

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

II. Nâng cao

1. Snapshot

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 đó.

Tạo một snapshot

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

Lư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:

Tăng dung lượng snapshot

Ở 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.

Restore lại dữ liệu tại thời điểm snapshot

Để 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

2. Thin Provisioning

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.

Tạo một Thin Volume Group

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

Tạo một LV Thin Pool từ Thin VG
# lvcreate -L 6G --thinpool thin-meditech vg-thin

Xem thông tin của LV Thin vừa tạo

Tạo các Thin Volume
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, Format và Mount sử dụng

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.

Stripping IO

Phân chia dữ liệu đồng đều trên các đĩa (PV).

Thêm các PV

Ở đây, tôi dùng 2 ổ 8GB.

pvcreate /dev/sd[c-d]1 -v
pvs
Tạo VG với tên vg-strip
vgcreate -s 16M vg-strip /dev/sd[c-d]1 -v
vgs vg-strip
Tạo LV xác định dung lượng và số Tripping
lvcreate -L 1GB -n lv-si-strip -i2 vg-strip

Ở 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

Tiếp theo là format và mount lên sử dụng.

LVM Migration

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.

Thêm ổ mới vào

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
Chuyển dữ liệu dùng phương thức Mirroring, sử dụng câu lệnh lvconvert
lvconvert -m 1 /dev/vg-meditech/lv-si /dev/sdb1
Tháo bỏ ổ cũ (sdc1) ra khỏi VG
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.