TrueNAS — Triển khai storage và dịch vụ SMB/NFS/iSCSI
DOC PATH deployments/truenas/storage-foundation
Tạo pool và dataset; cấu hình quyền, dịch vụ SMB, NFS, iSCSI và kiểm tra từ client. Đọc theo thứ tự các chương hoặc chọn mục cần tra cứu trong mục lục.
Điều kiện và kiểm kê
Mục có tiêu đề “Điều kiện và kiểm kê”Cài đặt TrueNAS với pool hai Mirror VDEV, dataset SMB, quyền truy cập và snapshot. Quy trình thay disk và khôi phục dữ liệu nằm ở các runbook riêng.
Điều kiện
Mục có tiêu đề “Điều kiện”Đọc Kiến trúc trước khi chọn disk và địa chỉ mạng.
| Tài nguyên | Cấu hình trong bài |
|---|---|
| TrueNAS | Community Edition 25.10.6 |
| VM | 2 vCPU, 8 GiB RAM, 1 NIC |
| Boot disk | 32 GiB |
| Data disk | 4 × 10 GiB riêng, không chứa dữ liệu cần giữ |
| Client | Windows truy cập SMB |
| Mạng | IP ổn định, gateway/DNS đúng; nas-host là tên mẫu |
Cài đặt và kiểm kê
Mục có tiêu đề “Cài đặt và kiểm kê”- Cài TrueNAS lên boot disk 32 GiB; không chọn bốn data disk.
- Sau khi boot, cấu hình địa chỉ quản lý, gateway và DNS theo inventory.
- Đăng nhập Web UI bằng tài khoản quản trị riêng; kiểm tra phiên bản và thời gian.
- Trong Storage, xác nhận boot disk thuộc
boot-pool; bốn data disk chưa thuộc pool.
Lệnh chỉ đọc trên TrueNAS:
lsblk -d -o NAME,SIZE,HCTL,MODEL,SERIALls -l /dev/disk/by-path/zpool statusTên /dev/sdX phản ánh lần nhận diện hiện tại, có thể đổi sau reboot/hot-plug. Không chọn disk chỉ theo tên đó.
Triển khai NFS, SMB phân vai trò và iSCSI trên cùng TrueNAS, dùng dataset/ZVOL riêng để tránh tác động chéo. Phạm vi phiên bản: TrueNAS 25.10.6, Ubuntu 22.04.5 LTS, Samba 4.22.10-truenas và open-iscsi 2.1.5.
Điều kiện
Mục có tiêu đề “Điều kiện”- Pool
tankONLINE và đủ dung lượng; hoàn tất Thiết lập storage. - Chuẩn bị DNS/IP ổn định, export path và tài khoản;
nas-host,linux-clientlà tên mẫu. - Ubuntu có
nfs-common,cifs-utils,smbclient,open-iscsi. - Không dùng chung dataset thử NFS và SMB ACL; giữ dữ liệu/share cũ nguyên trạng.
- Mount/login và sửa
/etc/fstabthay đổi client; cần quyền quản trị và maintenance window cho reboot.
<nas-ip>, <client-ip>, <target-iqn>, <initiator-iqn> và <filesystem-uuid> là placeholder, không dán chạy nguyên trạng.
Tạo storage và SMB cơ bản
Mục có tiêu đề “Tạo storage và SMB cơ bản”Tạo pool Mirror
Mục có tiêu đề “Tạo pool Mirror”Trong Storage, tạo pool tank với hai top-level Mirror VDEV, mỗi VDEV gồm hai disk 10 GiB. Kiểm tra topology trước khi xác nhận; không nhầm thành stripe bốn disk hoặc một Mirror bốn member.
Dung lượng usable của hai Mirror xấp xỉ một nửa tổng dung lượng raw trước metadata và phần dự phòng. Đọc zpool list và dung lượng dataset riêng; không dùng dung lượng trống của một lần cài đặt làm chuẩn cho môi trường khác.
Mỗi Mirror phải còn ít nhất một member hoạt động bình thường. Mirror còn lại không thể khôi phục dữ liệu khi mất toàn bộ member của một top-level Mirror.
zpool listzpool status tankChỉ tiếp tục khi mọi member ONLINE và không có known data errors.
Tạo dataset SMB
Mục có tiêu đề “Tạo dataset SMB”Tạo tank/documents bằng SMB preset, không share trực tiếp /mnt/tank.
| Property | Cấu hình |
|---|---|
| ACL | NFSv4 |
| Sync | STANDARD |
| Compression | Inherit LZ4 |
| Atime | OFF |
| Dedup | OFF |
| Encryption | Không bật trong ví dụ; đánh giá nhu cầu mã hóa và quản lý key trước khi tạo dataset |
Giữ property theo preset và workload; không tự bật dedup hoặc tắt sync chỉ để tăng hiệu năng. Kiểm tra giá trị case sensitivity thực tế khi tái tạo môi trường, không suy ra từ tên preset.
SMB và ACL
Mục có tiêu đề “SMB và ACL”SMB là giao thức file sharing phổ biến với Windows nhưng cũng được Linux/macOS hỗ trợ. TrueNAS thường kết hợp SMB với NFSv4-style ACL để quản lý quyền chi tiết theo user/group.
Share permission và filesystem ACL
Mục có tiêu đề “Share permission và filesystem ACL”Quyền truy cập thực tế phụ thuộc nhiều lớp: user authentication, share configuration, dataset ACL, owner/group và inheritance. Một share “được bật” nhưng ACL sai vẫn có thể khiến user bị Access Denied.
Inheritance
Mục có tiêu đề “Inheritance”ACL inheritance giúp file/subfolder mới nhận rule từ thư mục cha. Thiết kế ACL tốt thường dựa trên group thay vì gán quyền từng user để dễ vận hành.
SMB Previous Versions
Mục có tiêu đề “SMB Previous Versions”Windows Previous Versions có thể dựa trên ZFS snapshots. Đây là ví dụ rõ ràng về việc một snapshot ở storage layer trở thành tính năng self-service recovery ở client layer.
User và ACL
Mục có tiêu đề “User và ACL”| Đối tượng | Cấu hình trong bài |
|---|---|
user01 |
UID 3000; SMB Access bật |
Primary group user01 |
GID 3001 |
Auxiliary group lab-users |
GID 3000 |
Login quản trị/SSH cho user01 |
Không cấp |
ACE cho lab-users |
Allow / Modify / Inherit |
Giữ ACE quản trị cần thiết; cấp quyền qua group và kiểm tra inheritance. UID và GID cùng số không xung đột vì thuộc hai namespace khác nhau.
Chia sẻ và kiểm tra
Mục có tiêu đề “Chia sẻ và kiểm tra”Tạo share documents trỏ tới /mnt/tank/documents, bật SMB và autostart. Windows truy cập:
\\nas-host\documentsĐăng nhập bằng user SMB, không dùng tài khoản quản trị. Trên một thư mục test riêng, kiểm tra create/read/write và xóa file test đã xác nhận không cần giữ.
Kiểm tra bằng đúng user được cấp quyền: truy cập share, tạo file thử, đọc lại và sửa nội dung. Quyền thực tế phải khớp group/ACL; user không được cấp quyền phải bị từ chối truy cập.
Nếu không truy cập được, kiểm tra network → service/share → authentication → group/ACL → dataset → pool. Không kết luận lỗi pool chỉ từ việc một share bị từ chối truy cập.
NFS và định danh client
Mục có tiêu đề “NFS và định danh client”NFS, UID/GID và root_squash
Mục có tiêu đề “NFS, UID/GID và root_squash”NFS đặc biệt quan trọng ở Linux/Unix. Với AUTH_SYS, identity chủ yếu dựa trên UID/GID. Nếu cùng một người có UID khác nhau giữa client và server, quyền có thể không hoạt động như mong muốn.
UID/GID mapping
Mục có tiêu đề “UID/GID mapping”Client: uid=2001, gid=2001 ↓ NFS requestServer dataset owner: 2001:2001 ↓Unix permission/ACL được áp dụng đúngroot_squash
Mục có tiêu đề “root_squash”root_squash ánh xạ root từ client sang anonymous identity, ngăn root trên client mặc nhiên có toàn quyền trên NFS export. Vì vậy root có thể bị Permission denied trong khi user có UID/GID phù hợp vẫn truy cập bình thường.
Dataset và export
Mục có tiêu đề “Dataset và export”| Trường | Baseline |
|---|---|
| Dataset | tank/nfs-data, Generic preset |
| Owner | nfsuser:nfsuser, UID/GID 2001:2001 |
| Mode | 770 |
| Properties | LZ4, Sync STANDARD, Atime OFF, Dedup OFF |
| Path | /mnt/tank/nfs-data |
| Allowed Hosts | Chỉ client đã xác định |
| Read Only | OFF |
| Maproot / Mapall | Để trống để giữ định danh riêng của client |
| Service | NFS Running, Start Automatically bật |
Tạo user/group với UID/GID 2001:2001 nhất quán trên server và client. Với AUTH_SYS, numeric UID/GID quyết định identity, không phải username hiển thị.
Tạo NFS share và bật riêng dịch vụ NFS. Share Enabled chưa có nghĩa daemon đã chạy.
Mount trên client
Mục có tiêu đề “Mount trên client”Trên Ubuntu, kiểm tra identity và kết nối trước:
id nfsusernc -zv -w 3 nas-host 2049showmount -e nas-hostfindmnt /mnt/truenas-nfsChỉ mount khi chưa có mount đang dùng cùng vị trí:
sudo mkdir -p /mnt/truenas-nfssudo mount -t nfs nas-host:/mnt/tank/nfs-data /mnt/truenas-nfsfindmnt /mnt/truenas-nfsnfsstat -mDùng nfsstat -m để đọc phiên bản và tùy chọn được thương lượng: vers, proto, sec, hard/soft, timeo, retrans, rsize và wsize. Đọc các giá trị thực tế trên từng client.
Dùng nfsuser tạo/đọc/sửa file test. Đối chiếu ls -ln và stat ở client với /mnt/tank/nfs-data trên TrueNAS: owner 2001:2001. Directory mới 775/file 664 theo umask 002 không làm đổi mode 770 của dataset cha.
Kiểm tra UID/GID
Mục có tiêu đề “Kiểm tra UID/GID”| Ví dụ định danh với AUTH_SYS | Cách kiểm tra / ý nghĩa |
|---|---|
| Client 2002, server owner 3002; cùng username | Tên giống nhau không cấp quyền owner; kiểm tra UID/GID và mode |
| Client UID khớp owner 2002 | Quyền owner áp dụng theo UID dù server không có username tương ứng |
| Root client, Maproot/Mapall trống | Squash thành 65534:65534 |
Maproot → nfsuser |
Chỉ root client thành 2001:2001 |
Mapall → nfsuser |
Mọi user thành 2001:2001 |
Không dùng permission 777 hoặc Mapall để giải quyết sai lệch UID/GID. Với cấu hình owner 2001:2001, mode 770 và root squash, root client bị từ chối truy cập có thể là hành vi bảo mật đúng thiết kế.
Tự mount sau khởi động
Mục có tiêu đề “Tự mount sau khởi động”Backup /etc/fstab, mở bằng sudo vim /etc/fstab; thêm entry sau khi mount thủ công đã được xác nhận:
nas-host:/mnt/tank/nfs-data /mnt/truenas-nfs nfs4 defaults,_netdev 0 0_netdev đánh dấu phụ thuộc network. Xem lại các entry khác trước mount -a vì lệnh xử lý toàn bộ fstab.
sudo systemctl daemon-reloadsudo mount -afindmnt /mnt/truenas-nfsSau khi khởi động lại client trong maintenance window, kiểm tra tự mount và đọc/ghi bằng nfsuser mà không mount thủ công. Gián đoạn NFS có thể giữ process ở D-state; xem Lỗi storage và dịch vụ.
Cổng và định danh
Mục có tiêu đề “Cổng và định danh”| Protocol | Cổng dữ liệu | Identity | Đối tượng |
|---|---|---|---|
| SMB | TCP/445 | SMB user + group + NFSv4 ACL | Dataset/share |
| NFSv4.2 | TCP/2049 | AUTH_SYS numeric UID/GID | Dataset/export |
| iSCSI | TCP/3260 | Initiator IQN + network restriction + CHAP | ZVOL/LUN |
Đây là các cổng dữ liệu của cấu hình ví dụ, không phải danh sách firewall đầy đủ cho mọi phiên bản/protocol.
| NFS client identity | Baseline | Maproot → nfsuser | Mapall → nfsuser |
|---|---|---|---|
| User 2001 | 2001 | 2001 | 2001 |
| User 2003 | 2003 | 2003 | 2001 |
| Root 0 | 65534 | 2001 | 2001 |
Bảng dùng dataset owner 2001:2001, mode 770. Khi cần giữ định danh riêng của client, để Maproot/Mapall trống; không dùng Mapall để che lỗi UID/GID.
SMB: phân quyền và tự mount
Mục có tiêu đề “SMB: phân quyền và tự mount”Dataset và vai trò
Mục có tiêu đề “Dataset và vai trò”Tạo tank/smb-lab4 bằng SMB preset và share smb-lab4. Giữ share documents cũ nguyên trạng.
| Đối tượng | Baseline |
|---|---|
| Dataset properties | acltype=nfsv4, aclmode=restricted, xattr=on, LZ4 |
Group smb-lab4-users |
GID 3002, READ với inheritance |
smbuser1 |
UID 3001, group dùng chung, named ACE MODIFY |
smbuser2 |
UID 3002, chỉ READ qua group |
| Admin ACE | Giữ quyền quản trị cần thiết |
| Share Read Only | OFF để ACL phân biệt RW/RO |
| Guest access | Không cấp |
Ma trận quyền
Mục có tiêu đề “Ma trận quyền”Trên Ubuntu, smbclient hỏi mật khẩu tương tác:
smbclient //nas-host/smb-lab4 -U smbuser1smbclient //nas-host/smb-lab4 -U smbuser2smbclient //nas-host/smb-lab4 -N| Danh tính | Đọc | Ghi |
|---|---|---|
smbuser1 |
Cho phép | Cho phép |
smbuser2 |
Cho phép | Từ chối |
| Anonymous | Từ chối | Từ chối |
Đối chiếu owner của file ở TrueNAS: phải là user SMB đã xác thực. CIFS có thể hiển thị root:root ở Ubuntu; root client không vượt server ACL khi mount bằng tài khoản RO.
Tự mount CIFS
Mục có tiêu đề “Tự mount CIFS”Sau khi xác nhận credential và share:
sudo mkdir -p /mnt/smb-lab4sudo mount -t cifs //nas-host/smb-lab4 /mnt/smb-lab4 -o username=smbuser1,vers=3.1.1findmnt /mnt/smb-lab4Tạo file credential riêng /root/.smbcredentials-lab4, chỉ root đọc/ghi, mode 600. Kiểm tra path chưa được dùng, mở bằng Vim với umask 077; không ghi đè credential có sẵn.
username=smbuser1password=<smb-password>Không đưa mật khẩu vào fstab, repository hoặc command history. File mode 600 vẫn chứa plaintext secret; bảo vệ cả backup và quyền root.
Entry /etc/fstab:
//nas-host/smb-lab4 /mnt/smb-lab4 cifs credentials=/root/.smbcredentials-lab4,vers=3.1.1,_netdev,nofail 0 0Rà fstab, reload systemd và kiểm tra mount. Sau reboot, đối chiếu riêng từng mount NFS/SMB và session iSCSI trước khi cho ứng dụng ghi.
Để restore riêng file bằng Previous Versions qua smbclient và @GMT, xem Khôi phục dữ liệu.
iSCSI: target, initiator và filesystem
Mục có tiêu đề “iSCSI: target, initiator và filesystem”iSCSI vận chuyển SCSI commands qua TCP/IP. TrueNAS đóng vai trò target, còn server/host kết nối tới nó là initiator. Client thấy một block device và tự quản lý partition/filesystem phía trên.
ZVOL → Extent → Target/LUN → TCP 3260 → Initiator → /dev/sdX → Partition → Filesystem → Mount| Thành phần | Chức năng |
|---|---|
| Portal | Địa chỉ/port mà target lắng nghe, thường TCP 3260. |
| Target | Định danh iSCSI, thường bằng IQN. |
| Extent | Backing storage, thường là ZVOL. |
| LUN mapping | Gắn extent vào target dưới một LUN. |
| Initiator | Host kết nối tới target và nhận block device. |
| CHAP | Cơ chế xác thực iSCSI; không phải mã hóa dữ liệu trên đường truyền. |
Rủi ro khi iSCSI gián đoạn
Mục có tiêu đề “Rủi ro khi iSCSI gián đoạn”Khi mất kết nối tới iSCSI target, kernel client có thể vẫn giữ session và block device một thời gian dù data path đã gián đoạn. Nếu filesystem đang mount và có I/O ghi, ứng dụng có thể gặp timeout hoặc lỗi. Khi kiểm thử có kiểm soát, cần sync và unmount trước khi dừng target.
Cấu hình server
Mục có tiêu đề “Cấu hình server”Tạo ZVOL và cấu hình iSCSI qua giao diện quản trị:
| Đối tượng | Cấu hình |
|---|---|
| ZVOL | tank/iscsi-lab3, 5 GiB, volblocksize 16K, Sparse OFF |
| Portal | <nas-ip>:3260 |
| Initiator Group | IQN thực tế đọc từ Ubuntu |
| Authorized Networks | <client-ip>/32 |
| Target | lab3-target; dùng <target-iqn> thực tế |
| Extent | DISK → zvol/tank/iscsi-lab3, logical block size 512 B |
| Association | Target → LUN 0 → Extent |
| Target authentication | CHAP, không Mutual CHAP |
| Discovery authentication | NONE trong ví dụ; không thay thế CHAP của Target |
Extent block size 512 B và ZVOL volblocksize 16K thuộc hai lớp khác nhau. /dev/zd0 là ZVOL, không phải disk trống để tạo pool khác.
Trên Ubuntu:
cat /etc/iscsi/initiatorname.iscsinc -zv -w 3 nas-host 3260sudo iscsiadm -m discovery -t sendtargets -p <nas-ip>Discovery cập nhật thông tin target ở client, chưa chứng minh login được phép. Bật service iSCSI và autostart trên TrueNAS; xác nhận Portal, IQN và network restriction.
CHAP và đăng nhập
Mục có tiêu đề “CHAP và đăng nhập”Tạo Authorized Access/CHAP credential trên TrueNAS, gắn đúng Auth Group vào Target. Cấu hình node record tương ứng ở Ubuntu bằng quy trình quản lý secret phù hợp; không truyền secret thật qua command line.
node.session.auth.authmethod = CHAPnode.session.auth.username = <chap-user>node.session.auth.password = <chap-secret>Discovery thành công không bảo đảm login thành công. Nếu login trả authorization failure (24), đối chiếu CHAP credential và Auth Group của đúng Target.
sudo iscsiadm -m node -T <target-iqn> -p <nas-ip>:3260 --loginsudo iscsiadm -m session -P 3lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTSls -l /dev/disk/by-path/Output node/auth query có thể chứa secret; không công khai nguyên output.
Filesystem trên client
Mục có tiêu đề “Filesystem trên client”Các lớp cần cấu hình: LUN mới → GPT → một partition → ext4 label lab3-iscsi → /mnt/iscsi-lab3. Filesystem được tạo ở Ubuntu, không phải TrueNAS. Không format lại khi chỉ mất kết nối.
lsblk -fsudo blkidfindmnt /mnt/iscsi-lab3Khởi động lại và kiểm tra
Mục có tiêu đề “Khởi động lại và kiểm tra”Đặt startup cho đúng node, không thay toàn bộ targets:
sudo iscsiadm -m node -T <target-iqn> -p <nas-ip>:3260 --op update -n node.startup -v automaticsystemctl is-enabled open-iscsiBảo đảm open-iscsi được enable. Entry fstab dùng UUID của partition, không dùng sdX:
UUID=<filesystem-uuid> /mnt/iscsi-lab3 ext4 _netdev,nofail,x-systemd.requires=open-iscsi.service 0 2open-iscsi active (exited) có thể bình thường vì unit đã thực hiện login; iscsid duy trì kết nối. Kiểm tra lại node.startup sau discovery/CHAP để tránh cấu hình vẫn là manual.
Sau reboot, kiểm tra session đăng nhập, LUN/UUID, mount và checksum. Kiểm tra bằng tài khoản hợp lệ; nếu cấu hình CHAP, thử đăng nhập thiếu credential trong phạm vi kiểm thử phải bị từ chối.
Với bảo trì có kế hoạch, dừng workload, sync và unmount iSCSI filesystem trước khi dừng target. Sau recovery, xác nhận session LOGGED IN, mount đúng UUID và checksum. Không suy ra an toàn mất điện đột ngột từ một lần service recovery thành công.
Bảo vệ dữ liệu sau triển khai
Mục có tiêu đề “Bảo vệ dữ liệu sau triển khai”Lịch snapshot
Mục có tiêu đề “Lịch snapshot”Tạo snapshot trước thay đổi dữ liệu. Khi cần lấy lại một file, ưu tiên khôi phục riêng file hoặc tạo clone để kiểm tra, tránh rollback làm mất các thay đổi hợp lệ khác; xem Khôi phục dữ liệu.
Trong Data Protection, cấu hình Periodic Snapshot Task:
| Trường | Ví dụ chính sách |
|---|---|
| Dataset | tank/documents |
| Recursive | No |
| Schedule | Hourly |
| Lifetime | 1 day |
| Naming schema | auto-%Y-%m-%d_%H-%M |
| Enabled | Yes |
Chọn chu kỳ và thời hạn lưu theo RPO, tốc độ thay đổi dữ liệu và dung lượng. Kiểm tra snapshot thật được tạo theo lịch, không chỉ nhìn task Enabled. Snapshot cùng pool không thay thế backup độc lập.
Scrub và backup cấu hình
Mục có tiêu đề “Scrub và backup cấu hình”Đặt lịch Scrub ngoài giờ tải cao vì tác vụ làm tăng I/O. Kiểm tra cả lịch, threshold, lần chạy gần nhất và lỗi được báo trong zpool status; một lịch được bật chưa chứng minh dữ liệu đã được quét.
Sau khi cấu hình ổn định, export configuration backup ra nơi ngoài NAS:
- Khi chọn Export Password Secret Seed, bảo vệ file bằng kiểm soát truy cập phù hợp.
- Backup này hỗ trợ phục hồi cấu hình, không chứa toàn bộ dữ liệu user.
- Không dựa vào file export cấu hình để bảo vệ SSH key trong
/root/.ssh; quản lý bản sao key và quyền truy cập riêng. - Không commit config backup, secret seed hoặc credentials vào repository.