Các camera hỗ trơ FTP thì hay quá rồi, có thể ghi hình trực tiếp vào FTP server ở nhà hay upload lên Google drive, nhưng các camera này thì mắc tiền.
Thông thường, các camera rẻ tiền không có FTP nhưng cho lưu file vào NAS qua NFS hay SMB/CIFS.
Có vài cách tạo NAS trên RPi cho mục đích lưu hình của camera:
- Tải file ảnh OMV (Open Media Vault) về ghi lên đĩa, thế là có NAS trên RPi
- Chạy script cài đặt OMV trên một máy RPi chạy PiOS
- Cài nfs-kernel-server trên PiOS /Debian /Ubuntu rồi tạo thư mục share
- Cách thứ nhất nhanh nhất, nhưng tốn một máy RPi và phải làm quen với OS mới.
- Cách thứ hai tận dụng được máy RPi đang dùng với mục đích khác, nhưng script chỉ dành cho PiOS. Ngoài ra OMV cài rất nhiều tiện ích nặng máy và cấu hình lại nhiều ứng dụng đã có trên máy như nginx, php, samba…
- Cách thứ ba gọn nhẹ nhất nhưng đòi hỏi nhiều công sức.
Chúng ta sẽ làm theo cách thứ ba, tận dụng máy RPi đã có đang chạy webserver trên Ubuntu/PiOS.
Cần gì?
Một máy RPi đã cài PiOS /Debian /Ubuntu. Trên đĩa nên có một partition còn trống để share.
Nếu không có một partition trống thì có thể resize một partition thừa dung lượng để tách ra một partition trống, hoặc ghép thêm vào máy một ổ đĩa khác (USB flash chẳng hạn), hoặc sử dụng ngay trên một partition còn thừa dung lượng. Tóm lại rất đa dạng cách ứng dụng.
Chúng ta ưu tiên dùng một partition/đĩa trống để tạo các logical volume, tương tự như partition nhưng linh hoạt hơn rất nhiều. Mỗi logical volume sẽ share cho một camera chứa dữ liệu, tránh được việc ghi chồng và quản lý được dung lượng đĩa share.
Các hiểu lầm!
- Camera nhận được thư mục share qua NFS sẽ yêu cầu format. Đây chỉ là lạm dụng từ ngữ trong khi công việc chỉ là khởi tạo các file ghi chép trên thư mục đó. Việc khởi tạo chỉ thành công khi user nobody có quyền ghi trên thư mục share, tất cả file đã có trong thư mục này đều bị xóa dưới quyền nobody.
- Nếu không tách đĩa ra từng logical volume hay partition vừa đủ, mà share một thư mục trên một partition đang chứa các dữ liệu khác thì dung lượng còn trống có thể rất nhiều và camera hiểu là phải quản lý tất cả dung lượng đó.
- Mỗi kiểu camera có khả năng quản lý dữ liệu khác nhau, nếu nó chỉ cho dùng SD card 64GB mà chúng ta share một thư mục đến 512GB thì sẽ gặp lỗi trong quá trình sử dụng.
- Trung bình mỗi 128GB dung lượng đĩa sẽ được khởi tạo thành một thư mục datadir.
- Với các camera có khả năng mã hóa hình ảnh và video thì chúng ta có thể sẽ không thấy các file ảnh và video trong thư mục share hay SD card, vì chúng được lưu trong các file đã mã hóa. Ngoải ra chúng còn được ghi nối tiếp nhau trong một file dài được đánh dấu bằng file chỉ số. Nếu không bật mã hóa, chúng ta cũng sẽ có những file mkv rất dài, được tạo từ những đoạn video ghi chép tại các thời điểm phát hiện chuyển động. Tóm lại đều bất tiện như nhau, chúng ta đều phải trích xuất và download về bằng ứng dụng của hãng.
1. Cài đặt NFS
sudo apt install nfs-kernel-server
Việc cài đặt rât nhanh chóng. Tiếp theo chúng ta sẽ share đĩa qua NFS
1.A. Share thư mục trên partition đang dùng
#1. Tạo thư mục
mkdir /export/camera -p
#2. Đặt owner
sudo chown nobody:nogroup /export/camera
#3. Soạn thảo tập tin /etc/exports để xác định thư mục share
sudo nano /etc/exports
#3.1 Nếu share thư mục cho camera ở IP 192.168.0.100
/export/camera 192.168.0.100(rw,sync,no_subtree_check)
#3.2 hay share cho các máy trên cùng mạng
/export/camera 192.168.0.0/24(rw,sync,no_subtree_check)
#4. Lưu file và export thư mục share
sudo exportfs -ra
# Hoặc khởi động lại nfs server
sudo systemctl restart nfs-kernel-server
#5. Kiểm tra xem có share được chưa
sudo showmount -e localhost
Xong rồi, giờ thử kết nối với camera. Vào trang cấu hình của camera với quyền admin.
Điền các giá trị rồi bấm Test. Nếu thành công thì bấm Save, nếu không thì vướng firewall rồi.
Trên Ubuntu, firewall ufw mặc định sẽ chặn NFS cho dù có mở đủ port. Chúng ta phải lách một chút:
- Trước hết tìm trong file /etc/services một port nào chưa sử dụng, thí dụ như 222, 321, 333, 555, 666, 888, 999, 13025, 33333 …
- Thêm vào file /etc/services 2 dòng (giả sử chọn port 999) ở cuối:
mountd 999/tcp
mountd 999/udp
- Rồi tiến hành mở 3 port
sudo ufw allow from 192.168.0.0/24 to any port nfs
sudo ufw allow from 192.168.0.0/24 to any port 111
sudo ufw allow from 192.168.0.0/24 to any port 999
- Khởi động lại nfs-server
sudo systemctl restart nfs-kernel-server
Xong rồi, test lại trên trang quản lý camera.
[ Cách khác ]
Sửa file /etc/default/nfs-kernel-server
thêm port
# PORT chọn như trên
RPCMOUNTDOPTS="--manage-gids --port 999"
# Mở port như trên
# Xong khởi động lại nfs-server
1.B. Share logical volume
Giả sử chúng ta sẽ lấy một phần đĩa (logical volume) 64GB từ kho chứa (volume group) để share cho camera tại ip 192.168.0.100
Với Raspbian/PiOS cần cài đặt lvm2
sudo apt install lvm2
#1. Tạo physical volume từ partition /dev/sdb1 hay đĩa trống /dev/sdb
sudo pvcreate /dev/sdb1
hay
sudo pvcreate /dev/sdb
#2. Tạo volume group tên vgCam
sudo vgcreate vgCam /dev/sdb1
#3. Tạo logical volume 60GB tên lvCam từ kho chứa vgCam
sudo lvcreate -L 64G -n lvCam vgCam
#4. Format logical volume thành ext4
sudo mkfs.ext4 /dev/vgCam/lvCam
#5. Mount volume bằng cách thêm vào /etc/fstab
/dev/vgCam/lvCam /export/camera ext4 0 0
#6. Khởi động lại các ổ đĩa
sudo mount -a
## Tạo xong logical volume ##
## Tiếp tục bước soạn thảo file /etc/exports A.3 ##
2. Cài đặt SAMBA
sudo apt install samba samba-common
# Mở firewall cho samba
sudo ufw allow samba
Chúng ta có thể share một thư mục bất kỳ qua Samba. Thư mục này có thể được truy cập từ Windows/Linux/MacOS bình thường, nhưng có thể không dùng được cho camera. Lý do là camera không thể quản lý dung lượng của thư mục. Giải pháp là share một logical volume.
Giả sử đã tạo lvCam như trên và đã mount vào thư mục /export/camera như trên.
Soạn thảo /etc/samba/smb.conf để share thư mục này như sau:
[shareme]
path = /export/camera
writable = yes
valid users = oneuser
Thư mục /export/camera được share với tên shareme, cho phép oneuser được truy cập.
Đến đây cần xác lập quyền của oneuser trên thư mục /export/camera.
oneuser là một user của Linux được quyền đọc ghi trên thư mục nhưng còn phải là một user của samba
sudo chown -R oneuser: /export/camera
# Thêm oneuser là một samba user
sudo smbpasswd -a oneuser
# Khởi động lại samba để smb.conf có hiệu lực
sudo systemctl restart smbd
Đến đây ta có thể share thư mục với tên /shareme, tại ip của RPi, với quyền của oneuser và mật khẩu của nó.
Chú thích
- Ưu điểm của việc dùng logical volume là kiểm soát được dung lượng đĩa chia sẻ, tăng giảm dung lượng dễ dàng.
- /dev/vgCam/lvCam và /dev/mapper/vgCam-lvCam cùng trỏ đến một đối tượng.
- Có thể tạo script để chia sẻ không gian đĩa qua NFS được dễ dàng hơn.
- Share thư mục qua NFS thì owner là nobody (không mật khẩu) nhưng qua Samba thì dùng user bất kỳ có mật khẩu. Tuy nhiên không có trở ngại gì khi ta phải chọn một trong hai hình thức share vì camera không chấp nhận một thư mục được share theo hai hình thức.
- Việc chia sẻ thư mục qua Samba với các thiết bị đời cũ có thể gặp vấn đề tương thích với phiên bản Samba. Khi đó thêm vào đoạn Global dòng
min protocol = SMB2