6.2. Storage: Remote file system, network block device và LVM
Mục lục
- 1. Giao thức NFS và mô hình server client
- 2. Cấu hình NFS server
- 3. Mount NFS share trên client
- 4. Nguyên lý của network block device
- 5. Cấu hình NBD server
- 6. Attach và detach block device trên NBD client
- 7. Vấn đề LVM giải quyết
- 8. Bốn khái niệm cốt lõi của LVM
- 9. Resize logical volume và file system
1. Giao thức NFS và mô hình server client
Part 6.1 chỉ làm việc với file system và block device cục bộ, tức dữ liệu nằm ngay trên hệ thống đang đăng nhập vào. Nhưng có lúc dữ liệu cần dùng lại nằm trên một hệ thống khác.
Có nhiều protocol cho phép truy cập file system ở xa. Protocol, theo một cách hình dung, là ngôn ngữ mà client và server dùng để nói chuyện với nhau. Hai bên phải nói cùng một ngôn ngữ để hiểu nhau, thương lượng được kết nối và truyền được dữ liệu.
Linux hỗ trợ nhiều protocol phục vụ việc chia sẻ file system. Nhưng để chia sẻ dữ liệu giữa hai máy Linux, protocol được dùng nhiều nhất là Network File System, viết tắt là NFS.
Dùng NFS gồm hai phần việc: dựng NFS server, rồi dựng các NFS client. Phía server, cấu hình để nó chia sẻ được một file system ra bên ngoài. Phía client, cấu hình để máy đó mount được file system ở xa từ server kia.
2. Cấu hình NFS server
Phía server, tức máy chia sẻ dữ liệu đi, trước tiên cài package NFS kernel server:
sudo apt install nfs-kernel-server
Kế tiếp phải nói cho NFS server biết muốn chia sẻ file system hay directory nào. Việc này khá đơn giản: chỉ cần sửa file /etc/exports.
sudo vim /etc/exports
Trong file có vài dòng comment rất hữu ích, chúng cho sẵn vài ví dụ và dạy luôn cách định nghĩa share. Từ các dòng đó đọc ra được cấu trúc cơ bản.
Phần đầu một dòng là đường dẫn tới directory muốn chia sẻ. Nó có thể là /srv/homes, hoặc /nfs/disk1/backups, hoặc bất cứ đường dẫn nào cần dùng. Thông thường nên trỏ tới đường dẫn nơi một file system được mount, nhưng trỏ tới một subdirectory thuộc file system đó cũng được.
Phần kế tiếp xác định ai hoặc cái gì được truy cập share này, tức chỉ định NFS client nào được dùng file system ở xa này. Ví dụ trong file ghi hostname1, đó là hostname của một máy trong mạng. Các hostname này có thể ở dạng phức tạp hơn, chẳng hạn example.com hay server1.example.com. Thay vì hostname, địa chỉ IP cũng dùng được ở đây, nên hostname1 trong dòng ví dụ thay được bằng một thứ như 10.0.0.9, hay bất cứ IP nào của máy truy cập share đó.
Còn một lựa chọn thứ ba. Khi muốn cho phép cả một dải IP truy cập share này, dùng CIDR notation, thứ đã học ở phần networking. Chẳng hạn muốn share truy cập được từ bất cứ máy nào có IP trong khoảng từ 10.0.16.1 tới 10.0.16.255, thì ghi 10.0.16.0/24 vào đây. Phần CIDR nằm ở Part 5.1: Cấu hình IP.
Cuối cùng, trong cặp ngoặc đơn là các export option. Ở dòng ví dụ chúng là rw, sync và no_subtree_check. Một điểm thú vị ở dòng đó: nhiều host được liệt kê cho cùng một share, ngay trên cùng một dòng. Trong trường hợp này, directory /srv/homes cũng được chia sẻ với một host thứ hai tên hostname2, kèm bộ export option hơi khác, cụ thể là dùng ro thay cho rw.
Các export option cần biết
Các option cần nắm là rw, ro, sync, async, no_subtree_check và no_root_squash.
rwviết tắt của read-write. Nó cho phép client mount share này từ xa vừa đọc vừa ghi vào file system hoặc subdirectory đó.roviết tắt của read-only. Nó cho client đọc nhưng không cho ghi.synclà ghi dữ liệu kiểu đồng bộ. NFS bảo đảm rằng dữ liệu client ghi đã thật sự được lưu xuống thiết bị lưu trữ trước khi báo lại rằng thao tác thành công.asynclà ghi kiểu không đồng bộ. Client gửi được nhiều write request, và NFS báo rằng các write đã xong ngay cả khi chúng chưa được lưu xuống thiết bị lưu trữ.asynccho client làm việc nhanh hơn, nhưng không bảo đảm mọi thay đổi đã được lưu thật. Có thể rơi vào tình huống NFS báo với client rằng write đã hoàn tất dù nó chưa được commit xuống thiết bị lưu trữ, và nếu server reboot bất ngờ thì thao tác write đó mất.syncchậm hơn, nhưng nó bảo đảm khi một write được báo là hoàn tất thì nó đã nằm trên thiết bị.no_subtree_checktắt subtree checking. Bình thường với NFS, nên export cả một file system. Ví dụ server NFS có một ổ backup được mount vào/nfs/disk1, rồi export/nfs/disk1làm NFS share. Nhưng export một subdirectory cũng được, chẳng hạn/nfs/disk1/backup/databases. Khi subtree checking bật, NFS server luôn kiểm tra xem file được yêu cầu có nằm đúng trong subdirectory đã export hay không, và việc này gây ra vài vấn đề khi file bị đổi tên hoặc chuyển sang subdirectory khác. Subtree checking về bản chất là một lớp kiểm tra an toàn thêm, nhưng nó có nhược điểm và ảnh hưởng tới hiệu năng. Vì vậy theo mặc địnhno_subtree_checkđược gán cho mọi NFS export, dù không tự tay ghi option này.no_root_squashcho user root trên NFS client giữ nguyên quyền root trên NFS share ở xa mà họ mount. Theo mặc định, NFS squash quyền root: nếu đang là root trên client và mount một NFS share, thì không đọc ghi được với quyền root trên file system ở xa đó. Quyền bị squash, tức bị hạ xuống thành quyền user thường. Mọi request đọc và ghi với quyền root trên client được map sang một user tênnobodytrên server. Đây là một biện pháp an toàn nhẹ, bảo đảm user root trên các NFS client không làm mọi thứ họ muốn trên file system ở xa. Để tắt hành vi này, dùng optionno_root_squash, và khi đó root trên client được đối xử như root trên file system ở xa.
Thông tin về file /etc/exports, gồm cả các mount option khác và đặc tả cú pháp, nằm trong manual:
man exports
Áp dụng thay đổi và kiểm tra
Giả sử cần chia sẻ directory /etc với một máy có địa chỉ IP 127.0.0.1, và máy đó chỉ được đọc file từ share này, không được ghi. Mở file exports ra sửa rồi thêm dòng này vào cuối:
/etc 127.0.0.1(ro)
Sửa file exports xong thì phải thông báo cho NFS server biết về thay đổi, để nó bắt đầu chia sẻ đúng những gì vừa định nghĩa:
sudo exportfs -r
Option -r là viết tắt của re-export, có thể hiểu như một lần refresh dựa trên file /etc/exports. Nó chia sẻ những gì được định nghĩa trong file đó, nhưng cũng thôi chia sẻ những gì đã bị xóa khỏi file.
Để xem các NFS share đang được export:
sudo exportfs -v
-v là verbose, tức output chi tiết. Lệnh này cho biết share nào đang hoạt động, kèm export option gắn với từng share. Một chi tiết dễ gây ngạc nhiên: dòng vừa thêm chỉ ghi ro, nhưng output lại hiện ra nhiều option khác đang hoạt động cho share này. Lý do là NFS server tự gán một số option theo mặc định, dù administrator không khai chúng trong /etc/exports.
Wildcard trong trường hostname
Trường hostname trong /etc/exports nhận cả wildcard. Chẳng hạn để chia sẻ một directory với mọi máy có hostname kết thúc bằng example.com:
/etc *.example.com(ro)
Dấu hoa thị là ký tự wildcard, khớp với bất cứ thứ gì đứng trước example.com. Nhờ vậy các client có hostname như server1.example.com hay mail.example.com đều được phép truy cập share. Để chia sẻ với mọi client, dùng dấu hoa thị đứng một mình:
/etc *(ro)
Một luật cú pháp phải nhớ: không được thêm khoảng trắng nào giữa dấu hoa thị và phần mount option. Luật này áp dụng y hệt khi dùng hostname hay địa chỉ IP. Trường định nghĩa client được phép truy cập share phải dán liền với dấu ngoặc đơn mở chứa các option.
3. Mount NFS share trên client
Phía client thì nhẹ hơn nhiều. Trước tiên bảo đảm máy có các utility cần thiết để mount NFS share. Chúng nằm trong package nfs-common:
sudo apt install nfs-common
Directory /etc đã được chia sẻ trên server, giờ mount nó từ client ở xa. Lệnh mount đã học ở Part 6.1, chỉ cần chỉnh lại cho đúng tình huống này. Cú pháp chung để mount một NFS share:
sudo mount <IP hoặc hostname của server>:<đường dẫn ở xa> <đường dẫn cục bộ>
Với tình huống cụ thể, có ba thứ cần: mount một thứ gì đó từ NFS server có IP 127.0.0.1, mount file system hoặc directory /etc từ server đó, và mount nó vào directory cục bộ /mnt. Lệnh trở thành:
sudo mount 127.0.0.1:/etc /mnt
Tất cả những gì vừa làm là thêm một phần vào lệnh mount bình thường, phần chỉ ra vị trí của server ở xa, theo sau là dấu hai chấm. Nếu muốn dùng hostname như server1 thay cho IP thì lệnh thành:
sudo mount server1:/etc /mnt
Phần còn lại giống những gì đã học. Để unmount NFS share này:
sudo umount /mnt
Muốn NFS share được mount tự động lúc boot thì các bước cũng quen rồi: mở /etc/fstab ra sửa và thêm một dòng:
127.0.0.1:/etc /mnt nfs defaults 0 0
So với các dòng fstab ở phần trước, chỉ có vài điểm khác. Field nguồn của mount này chỉ ra một địa chỉ IP cùng một directory ở xa. Field lẽ ra ghi ext4 hay xfs làm loại file system thì ở đây ghi nfs. Phần còn lại giống nhau. Ở field mount option, ghi defaults để NFS tự cấu hình mount option của nó, còn khi cần option cụ thể thì cứ liệt kê chúng vào đây như đã làm ở các mục trước, nhiều giá trị phân cách bằng dấu phẩy. Cuối cùng, vì directory này không nằm cục bộ nên không cần quét lỗi file system, nên hai field cuối là 0 0.
4. Nguyên lý của network block device
Các special file tham chiếu thiết bị lưu trữ đã quen từ phần trước: /dev/sda hay /dev/vda trỏ tới toàn bộ thiết bị lưu trữ đầu tiên trên hệ thống, còn /dev/sda1 hay /dev/vda1 trỏ tới partition đầu tiên trên ổ đĩa đầu tiên. Chúng là các block special file tham chiếu tới block device.
Network block device làm một việc tương tự, nhưng thay vì trỏ tới thiết bị lưu trữ cắm trong hệ thống, chúng trỏ tới một thiết bị lưu trữ trên một máy tính hoàn toàn khác.
Lấy một bố cục cụ thể. Có một server với hai thiết bị lưu trữ, được tham chiếu bởi các block special file /dev/vda và /dev/vdb. Rồi có một server thứ hai, cũng với hai thiết bị lưu trữ được tham chiếu bởi các file tương tự. Với network block device, server thứ nhất có thêm được một ổ đĩa thứ ba.
Các utility NBD tạo ra một special file tên /dev/nbd0. Dưới góc nhìn của ứng dụng, /dev/nbd0 trông và hành xử giống mọi block device khác. Nhưng mỗi khi có thứ gì đọc hoặc ghi vào thiết bị này, request được gửi tới block device thật trên server thứ hai. Mọi write request vào /dev/nbd0 được chuyển tiếp tới /dev/vdb trên server 2.
Khi làm việc với NBD có hai nơi cần cấu hình: NBD server, nơi chứa block device thật sẽ được chia sẻ qua mạng, và NBD client, nơi attach block device ở xa muốn thêm vào hệ thống.
5. Cấu hình NBD server
Trên server muốn chia sẻ block device đi, trước tiên cài package nbd-server:
sudo apt install nbd-server
Kế tiếp mở file cấu hình mặc định:
sudo vim /etc/nbd-server/config
Theo mặc định, NBD daemon chạy dưới một user tên nbd. Nhưng user này không có quyền đọc và ghi từ các block device như /dev/sda. May là các dòng comment trong file khá hữu ích: chúng cho biết có thể cấu hình daemon nbd-server chạy với quyền root. Có hai cách cho ra cùng kết quả: điền root vào biến user và group, hoặc comment cả hai dòng đó lại. Thêm dấu thăng để comment hai dòng này là cách dễ hơn.
Kế tiếp, thêm dòng sau vào ngay dưới dòng include-dir trong section generic:
allowlist = true
Thiết lập này cho phép NBD client liệt kê những export mà server đang có, tức xem được server chia sẻ được những block device nào.
Giờ tới phần định nghĩa export, nơi chỉ định muốn chia sẻ block device nào. Đi tới cuối file và nhấn Enter. Editor vim sẽ tự thêm dấu thăng vào đầu dòng mới, nên phải xóa dấu đó đi, nếu không dòng bị comment và không có tác dụng gì.
Định nghĩa export đơn giản nhất cần ít nhất hai dòng:
[partition2]
exportname = /dev/sda2
Trong cặp ngoặc vuông là một identifier cho export cụ thể này. Ở đây nó được gọi là partition2, nhưng tên nào cũng được. Dưới exportname là block device cụ thể muốn export, ở đây /dev/sda2 trỏ tới partition thứ hai của ổ đĩa đầu tiên.
Lưu file xong thì phải restart NBD daemon để nó đọc các thiết lập mới:
sudo systemctl restart nbd-server.service
Còn những option nào khác dùng được trong file cấu hình này? Manual có nhiều section, và section 5 là section nói về định dạng file và các quy ước. Nên tra manual như sau:
man 5 nbd-server
Trong đó có các option cho section generic, tức section vừa comment hai dòng user và group. Section này nói chung là các thiết lập cho chính daemon NBD server. Xuống dưới nữa là các option cho section export, tức chỗ vừa tạo export tên partition2, nên phần manual này giải thích các option gán được cho từng export hay từng block device được chia sẻ.
Các option được ghi chú là Boolean nhận giá trị true hoặc false. Với các option nhận giá trị string thì ghi bất cứ đoạn text nào phù hợp. Chẳng hạn exportname = /dev/sda2 là một option dạng string, và /dev/sda2 là string đó.
6. Attach và detach block device trên NBD client
Trên máy client, để attach được một block device ở xa cũng cần vài utility Network Block Device, nhưng lần này là bộ utility phía client:
sudo apt install nbd-client
Kế tiếp phải load một thứ gọi là kernel module. Module này mở rộng chức năng của kernel để nó xử lý được network block device ở xa:
sudo modprobe nbd
Lệnh trên chỉ load module cho lần boot hiện tại. Mỗi lần restart hệ điều hành lại phải load module bằng tay, và đó là tình huống không ổn. Nhưng với các hệ điều hành họ Debian và Ubuntu, có cách khai báo module nào cần load ở mỗi lần boot, chỉ cần sửa một file:
sudo vim /etc/modules-load.d/modules.conf
Trong đó ghi nbd rồi lưu file. Chi tiết về kernel module và kernel parameter nằm ở Part 3.3: Kernel parameter và package.
Giờ attach block device ở xa vào hệ thống này. Lệnh phải có tiền tố sudo, vì utility nbd-client cần quyền root để tạo các block special file /dev/nbd. Lệnh nhận hai đối số: thứ nhất là địa chỉ IP của hệ thống chứa block device ở xa, thứ hai là tên export muốn attach từ NBD server, truyền qua option -N. Export lúc dựng server được đặt tên partition2:
sudo nbd-client 127.0.0.1 -N partition2
# Output (minh họa):
Negotiation: ..size = 2048MB
bs=512, sz=2147483648 bytes
/dev/nbd0
Output in ra tên một block device, /dev/nbd0. Block special file này được gắn với block device ở xa, nên mỗi lần dùng /dev/nbd0 tại máy cục bộ là thật ra đang truy cập /dev/sda2 từ server ở xa.
Từ đây /dev/nbd0 dùng được như mọi block device khác, chẳng hạn mount nó:
sudo mount /dev/nbd0 /mnt
ls /mnt
Lệnh thứ nhất mount file system của block device ở xa vào directory /mnt, lệnh thứ hai cho thấy các file và directory như mong đợi.
Để tháo network block device này khỏi hệ thống, trước tiên unmount nó, rồi xem lại danh sách block device:
sudo umount /mnt
lsblk
# Output (minh họa):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nbd0 43:0 0 2G 0 disk
/dev/nbd0 xuất hiện trong danh sách với kích thước khác 0. Để detach hay disconnect network block device này, truyền option -d cho utility nbd-client, theo sau là đường dẫn của thiết bị:
sudo nbd-client -d /dev/nbd0
lsblk
# Output (minh họa):
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
nbd0 43:0 0 0B 0 disk
Liệt kê lại block device thì nbd0 hiện ra với kích thước 0 byte. Dấu hiệu đó cho biết nó đã được disconnect thành công và không còn trỏ tới một block device ở xa thật nào nữa.
Hai mẹo nhỏ khi dùng nbd-client. Thứ nhất, hostname dùng được thay cho địa chỉ IP, nên một lệnh như sau cũng hợp lệ:
sudo nbd-client localhost -N partition2
Thứ hai, tên export không phải lúc nào cũng biết trước. Ở đây biết vì chính mình dựng NBD server, nhưng khi một administrator khác dựng thì không. Các export có trên một NBD server liệt kê được bằng option -l:
sudo nbd-client 127.0.0.1 -l
Option allowlist = true được thêm vào section generic của file cấu hình nbd-server chính vì lệnh này. Không có nó thì việc liệt kê NBD export không thực hiện được.
7. Vấn đề LVM giải quyết
Để thấy lợi thế chính của LVM, tức Logical Volume Manager, nhìn vào một vấn đề quen thuộc trước đã.
Một ổ đĩa có bố cục như sau: một partition ở đầu ổ, một partition ở giữa, và một khoảng free space ở cuối, tức vùng chưa được phân vùng. Muốn làm Partition2 lớn hơn thì dễ: chỉ cần resize, mở rộng nó sang bên phải, vì nó có cả khoảng free space ngay bên cạnh.
Nhưng muốn làm Partition1 lớn lên thì rắc rối. Không có free space nào ở bên trái hay bên phải nó, nên không resize được. Với LVM thì chuyện này dễ xử lý.
Thay vì phân vùng trực tiếp trên ổ đĩa, ổ đĩa được thêm vào LVM trước. Giờ cùng bố cục đó nhưng trên một ổ đĩa do LVM quản lý. Muốn làm partition đầu tiên lớn lên thì những việc sau diễn ra. Logical Volume Manager đi tìm free space, và thấy còn chỗ trống ở cuối ổ đĩa. Nó cho partition đầu tiên tiếp tục dùng phần đầu của ổ đĩa như trước, nhưng gắn thêm cả khoảng free space ở cuối ổ vào chính partition đầu tiên đó.
Cách ổ đĩa được dùng thật là như vậy, nhưng cách LVM trình bày nó với hệ thống thì khác. Partition đầu tiên giờ được tạo thành từ hai vùng khác nhau trên ổ đĩa. Nhưng với hệ điều hành, LVM trình bày nó như một partition thông thường, liền mạch. Nhờ vậy Linux dùng nó bình thường, không gặp vấn đề gì, và người quản trị resize được partition của mình mà không phải nhức đầu.
Đó mới là ý tưởng cốt lõi của LVM, công cụ này làm được nhiều hơn thế. Phần còn lại của tài liệu đi qua các bài tập thực hành để hiểu rõ hơn.
Để có thứ làm việc cùng, cần thêm ba ổ đĩa ảo vào máy ảo, mỗi ổ 5 GB. Bộ công cụ LVM cài bằng lệnh sau, dù trên phần lớn hệ thống Ubuntu package này đã có sẵn:
sudo apt install lvm2
8. Bốn khái niệm cốt lõi của LVM
Bốn thuật ngữ gặp thường xuyên khi làm việc với LVM là PV, VG, LV và PE, lần lượt viết tắt của Physical Volume, Volume Group, Logical Volume và Physical Extent. Nên học thuộc các chữ viết tắt này cùng ý nghĩa của chúng, vì phần lớn lệnh LVM bắt đầu bằng một trong hai chữ cái đó.
Physical volume
PV đại diện cho thiết bị lưu trữ thật mà LVM sẽ làm việc với. Một PV thường là nguyên một ổ đĩa hoặc nguyên một SSD, nhưng đôi khi PV cũng là một partition. Để xem có những PV nào dùng được:
sudo pvs
Lệnh này cho một góc nhìn gọn gàng về các ổ đĩa và partition đang có, và cả những cái nào đã được dùng trong các cấu trúc LVM.
Thêm hai trong số các ổ đĩa mới vào LVM làm physical volume. Việc cần làm là truyền vào các file block device trỏ tới các ổ đĩa hay partition đó:
sudo pvcreate /dev/sdc /dev/sdd
Để xem những physical volume nào đang được gắn vào LVM:
sudo pvdisplay
Lệnh này cho biết tổng kích thước của PV, còn trường PFree cho biết bao nhiêu trong số đó vẫn chưa được phân vùng, tức chưa bị logical volume nào dùng tới.
Volume group
LVM đã có các thiết bị vật lý để lưu dữ liệu, tức các PV. Kế tiếp phải nói cho nó biết cách dùng dung lượng lưu trữ đó, và để làm vậy, các PV được thêm vào một VG, tức volume group. Lệnh dùng ở đây là vgcreate, với cú pháp gồm tên của group rồi tên các PV sẽ dùng. Chẳng hạn để thêm PV /dev/sdc vào một volume group tên MyVolume:
sudo vgcreate MyVolume /dev/sdc
Nhưng làm một thứ thú vị hơn: thêm hai PV cùng lúc thay vì chỉ một.
sudo vgcreate MyVolume /dev/sdc /dev/sdd
Một volume group có thể hình dung như một ổ đĩa ảo trong LVM. Ở tình huống này, hai ổ đĩa /dev/sdc và /dev/sdd đã được thêm vào LVM, chúng là hai ổ 5 GB riêng biệt. Nhưng khi đã nằm trong cùng một volume group, chúng được nhìn như một ổ đĩa liền mạch 10 GB duy nhất.
Vì sao điều đó hữu ích? Vì VG lớn lên được mãi, chỉ bằng cách thêm ổ đĩa vào server rồi thêm ổ đó vào VG này. Giống như có một ổ đĩa tự lớn lên theo thời gian khi server cần lưu nhiều dữ liệu hơn. Với một ổ đĩa thật, kích thước cố định, dữ liệu không nhét vừa nữa thì phải thay ổ. Việc đó kéo theo tắt server, di chuyển dữ liệu, rất bất tiện. Với một VG, dung lượng mở rộng được mà không cần tắt server lần nào.
Giả sử 10 GB không đủ cho VG này và cần thêm chỗ. Để mở rộng VG, trước tiên thêm một physical volume mới vào LVM, rồi dùng lệnh vgextend để thêm PV mới đó vào volume group đã tạo:
sudo vgextend MyVolume /dev/sde
sudo vgs
# Output (minh họa):
VG #PV #LV #SN Attr VSize VFree
MyVolume 3 0 0 wz--n- 14.99g 14.99g
Output cho biết VG đang dùng ba PV, tổng kích thước 14,99 GB và còn trống đúng 14,99 GB, vì chưa có logical volume nào trên đó.
Để bỏ một physical volume khỏi một volume group, dùng vgreduce. Chỉ bỏ được khi LVM chưa lưu dữ liệu nào lên PV đó. Và nếu không cần PV này nữa thì bỏ nó luôn khỏi LVM bằng pvremove:
sudo vgreduce MyVolume /dev/sde
sudo pvremove /dev/sde
Logical volume
Đi từ PV lên VG rồi, một VG giống như một ổ đĩa duy nhất trong LVM. Còn thiếu gì? Ổ đĩa hay VG này chưa được phân vùng, nên phải thêm một LV. Logical volume tương đương với partition trong thế giới LVM.
sudo lvcreate --size 2G --name Partition1 MyVolume
Lệnh trên tạo một LV 2 GB với cái tên đơn giản Partition1. Ở cuối lệnh là volume group muốn tạo logical volume trong đó. Kiểm tra lại volume group lúc này sẽ thấy nó đã có một LV và còn khoảng tám gigabyte trống.
Tạo thêm một logical volume thứ hai, đặt tên Partition2 với kích thước 6 GB, rồi liệt kê các LV:
sudo lvcreate --size 6G --name Partition2 MyVolume
sudo lvs
# Output (minh họa):
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
Partition1 MyVolume -wi-a----- 2.00g
Partition2 MyVolume -wi-a----- 6.00g
Physical extent
Nhớ lại vấn đề ở mục trước với một bố cục partition bị kẹt: Partition1 không lớn lên được vì không còn free space bên phải nó. Trong LVM giờ có một bố cục tương tự. LV thứ nhất 2 GB, LV thứ hai 6 GB. Trên một VG 10 GB thì vẫn còn 2 GB trống. Vậy làm sao cho LV thứ nhất dùng hết chỗ trống đang có?
Dữ liệu trong LVM được chia thành nhiều PE, tức physical extent. Lấy một ví dụ với hai ổ đĩa nhỏ tới mức phi thực tế, mỗi ổ 4 MB, và hai PV này được thêm vào một VG 8 MB. Tạo một logical volume 8 MB trên VG đó, rồi ghi một file 8 MB. Với ứng dụng, nó thấy mình đang ghi file vào một file system tồn tại trên một ổ đĩa liền mạch duy nhất. Nhưng thực chất LVM đã cắt dữ liệu này thành hai physical extent. Một PE 4 MB được ghi xuống ổ đĩa thứ nhất, và một PE 4 MB khác được ghi xuống ổ đĩa thứ hai.
Để bảo LVM mở rộng logical volume thứ nhất ra hết các extent đang có:
sudo lvextend --extents 100%VG MyVolume/Partition1
Chú ý phần 100%VG ở đó. Với --extents 100%VG, câu lệnh nói rằng dùng 100% dung lượng lưu trữ đang có trong VG này. Ở cuối, MyVolume/Partition1 chỉ ra tên volume group, theo sau là dấu gạch chéo rồi tên logical volume. Kiểm tra lại sẽ thấy LV thứ nhất tên Partition1 đã được resize đúng. So với việc resize một partition thông thường, thao tác resize một logical volume trên LVM nhẹ hơn hẳn.
Thu Partition1 về kích thước gốc 2 GB cũng được, vì với option --size thì LV co lại hay phình ra tới kích thước tùy ý đều được:
sudo lvresize --size 2G MyVolume/Partition1
Nếu có lúc quên hết các lệnh này thì có hai cách gỡ. Cách thứ nhất là mở manual của LVM rồi cuộn xuống hết cuối. Cách thứ hai là nghĩ tới thứ mình muốn làm việc với, chẳng hạn VG tức volume group, gõ vg vào terminal rồi nhấn Tab hai lần để nhận các gợi ý hữu ích.
9. Resize logical volume và file system
Một logical volume rỗng cũng giống một partition rỗng, chưa dùng được vào việc gì. Để lưu được file và directory trên một LV, phải tạo file system trên nó.
Partition thì nằm ở những đường dẫn như /dev/sda1. Còn logical volume nằm ở đâu? Đường dẫn tới một LV khá dễ đoán, nó có dạng tên volume group rồi tên logical volume, cả hai đặt dưới /dev:
/dev/<tên volume group>/<tên logical volume>
Các đường dẫn này cùng nhiều chi tiết khác xem được bằng lệnh sau, nên tạo file system ext4 trên đó cũng là một lệnh quen:
sudo lvdisplay
sudo mkfs.ext4 /dev/MyVolume/Partition1
Resize một LV rỗng thì nhẹ, nhưng khi trên nó đã có file system thì phải cẩn thận hơn. Lệnh dưới đây không nên dùng cho một LV đã có file system:
sudo lvextend --size 3G MyVolume/Partition1
Lệnh đó chỉ resize LV từ hai gigabyte lên ba gigabyte, trong khi file system ext4 trên nó vẫn tiếp tục dùng hai gigabyte. Cách xử lý là bảo LVM resize cả LV lẫn file system trên nó, bằng cách truyền thêm option --resizefs:
sudo lvextend --resizefs --size 3G MyVolume/Partition1
Một giới hạn cần ghi nhớ khi vận hành: một số file system phình ra được nhưng không co lại được. Trước khi hứa với ai rằng dung lượng sẽ được thu hồi lại, nên kiểm tra xem file system đang dùng có hỗ trợ shrink hay không, vì LVM thu nhỏ logical volume xuống dưới kích thước file system là mất dữ liệu.
Nguồn tham khảo
Nguồn gốc: Khóa "Prep Course - Linux Foundation Certified System Administrator (LFCS) Certification" — phần "6. Storage" (cấu hình và sử dụng remote file system với NFS, cấu hình và sử dụng network block device, quản lý và cấu hình LVM storage), nền tảng KodeKloud. Giảng viên: Jeremy Morgan và Alexandru Andrei.
Fact-check:
- File cấu hình mặc định của
nbd-servertrên Debian và Ubuntu là/etc/nbd-server/config, không phải/etc/nbd-server.confnhư bài giảng gốc đọc. Nguồn:man 5 nbd-server, 2026-10-24. - ACL nằm trong domain "Users and Groups" của đề thi chính thức ("Configure and manage ACLs"), dù khóa học dạy nó ở phần Storage. Nguồn: Linux Foundation — LFCS certification, 2026-10-24.