Đến nội dung chính
Infra Notes
DOCS / UTF-8
Deployment // Triển khai hệ thốngtruenas

TrueNAS — Triển khai storage và dịch vụ SMB/NFS/iSCSI

DOC PATH deployments/truenas/storage-foundation

Doc Type
Deployment
Technology
truenas
Status
Active
Version
25.10.6
Tags
truenaszfsStorage

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.

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.

Đọ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
  1. Cài TrueNAS lên boot disk 32 GiB; không chọn bốn data disk.
  2. Sau khi boot, cấu hình địa chỉ quản lý, gateway và DNS theo inventory.
  3. Đă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.
  4. 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:

Terminal window
lsblk -d -o NAME,SIZE,HCTL,MODEL,SERIAL
ls -l /dev/disk/by-path/
zpool status

Tê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.

  • Pool tank ONLINE 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-client là 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/fstab thay đổ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.

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.

Terminal window
zpool list
zpool status tank

Chỉ tiếp tục khi mọi member ONLINE và không có known data errors.

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

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.

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.

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.

Đố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.

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

Client: uid=2001, gid=2001
↓ NFS request
Server dataset owner: 2001:2001
↓
Unix permission/ACL được áp dụng đúng

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.

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.

Trên Ubuntu, kiểm tra identity và kết nối trước:

Terminal window
id nfsuser
nc -zv -w 3 nas-host 2049
showmount -e nas-host
findmnt /mnt/truenas-nfs

Chỉ mount khi chưa có mount đang dùng cùng vị trí:

Terminal window
sudo mkdir -p /mnt/truenas-nfs
sudo mount -t nfs nas-host:/mnt/tank/nfs-data /mnt/truenas-nfs
findmnt /mnt/truenas-nfs
nfsstat -m

Dù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.

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

Backup /etc/fstab, mở bằng sudo vim /etc/fstab; thêm entry sau khi mount thủ công đã được xác nhận:

/etc/fstab — NFS
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.

Terminal window
sudo systemctl daemon-reload
sudo mount -a
findmnt /mnt/truenas-nfs

Sau 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ụ.

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.

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

Trên Ubuntu, smbclient hỏi mật khẩu tương tác:

Terminal window
smbclient //nas-host/smb-lab4 -U smbuser1
smbclient //nas-host/smb-lab4 -U smbuser2
smbclient //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.

Sau khi xác nhận credential và share:

Terminal window
sudo mkdir -p /mnt/smb-lab4
sudo mount -t cifs //nas-host/smb-lab4 /mnt/smb-lab4 -o username=smbuser1,vers=3.1.1
findmnt /mnt/smb-lab4

Tạ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=smbuser1
password=<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:

/etc/fstab — SMB
//nas-host/smb-lab4 /mnt/smb-lab4 cifs credentials=/root/.smbcredentials-lab4,vers=3.1.1,_netdev,nofail 0 0

Rà 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 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.

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.

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:

Terminal window
cat /etc/iscsi/initiatorname.iscsi
nc -zv -w 3 nas-host 3260
sudo 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.

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 = CHAP
node.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.

Terminal window
sudo iscsiadm -m node -T <target-iqn> -p <nas-ip>:3260 --login
sudo iscsiadm -m session -P 3
lsblk -o NAME,SIZE,TYPE,FSTYPE,MOUNTPOINTS
ls -l /dev/disk/by-path/

Output node/auth query có thể chứa secret; không công khai nguyên output.

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.

Terminal window
lsblk -f
sudo blkid
findmnt /mnt/iscsi-lab3

Đặt startup cho đúng node, không thay toàn bộ targets:

Terminal window
sudo iscsiadm -m node -T <target-iqn> -p <nas-ip>:3260 --op update -n node.startup -v automatic
systemctl is-enabled open-iscsi

Bảo đảm open-iscsi được enable. Entry fstab dùng UUID của partition, không dùng sdX:

/etc/fstab — iSCSI
UUID=<filesystem-uuid> /mnt/iscsi-lab3 ext4 _netdev,nofail,x-systemd.requires=open-iscsi.service 0 2

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

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.

Đặ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.