在samba服务中使用虚拟硬盘来限制用户可用空间和便于后续迁移
默认情况下,samba客户端能够访问得空间大小是挂载点可用的空间大小。可以使用可扩充的qcow2虚拟硬盘进行空间限制,以及便于单个用户的用户文件迁移。
测试环境为debian10,如果没有安装samba,可通过以下命令安装。
sudo apt-get update && sudo apt-get install samba
之后添加samba用户,并设置用户的访问密码。
smbpasswd -a 用户名
然后编辑/etc/samba/smb.conf文件,添加用户的共享配置。其中,[share]为smb协议的访问路径,之后可通过\IP\share进行访问,也可以将访问名share修改为其他名字。
[share]
path = /mnt/share #共享路径
read only = no #非只读
writable = yes #可写
public = no #非公开分享
browseable = yes #共享名可以直接被看到
valid users = 用户名 #允许的用户
之后需要给挂载点授予访问权限(可以使用chown修改目录的所有者,或chmod添加写入权限,此处以chmod为例),若无需限制用户空间,则直接运行第二条命令以重启服务即可访问了。
sudo mod ugo+w /mnt/share
sudo service smbd restart
接下来创建虚拟硬盘以用作挂载点,让用户的文件直接写入到虚拟硬盘中。此处使用空间不立即分配的qcow2格式,避免一次性占用较大的储存空间。如果安装过qemu,则可省略软件包qemu-utils的安装,否则使用以下命令安装该软件包:
sudo apt-get install qemu-utils
这样,就可以使用qemu-img创建qcow2格式的虚拟硬盘了。此处以储存在根目录的/share.qcow2为例,容量为20G。(注意文件储存权限)
qemu-img create -f qcow2 /share.qcow2 20G
之后在挂载之前,需要启用内核的网络设备块(nbd)功能。该命令在开机后只需运行一次以加载模块即可。max_part为可管理的最大分区数,通常情况下设置为8已经足够使用。
sudo modprobe nbd max_part=8
然后就可以以网络设备块的形式挂载虚拟硬盘:
sudo qemu-nbd --connect=/dev/nbd0 /share.qcow2
这样,这块虚拟硬盘就被连接到/dev/nbd0中。此时,硬盘还没有分区,也没有文件系统。如果无需对硬盘分区,则可以直接对该虚拟硬盘进行格式化,以下以ext4为例:
sudo mkfs.ext4 /dev/nbd0
之后就可以将其挂载到share目录了:
sudo mount /dev/nbd0 /mnt/share
如果需要卸载该虚拟硬盘,除非重启,则需要先卸载目录,再取消硬盘的连接:
sudo umount /dev/nbd0
sudo qemu-nbd --disconnect /dev/nbd0
如果需要对硬盘分区,则可使用fdisk或者parted像普通硬盘一样对其分区,然后重新连接虚拟硬盘:
sudo qemu-nbd --disconnect /dev/nbd0
sudo qemu-nbd --connect=/dev/nbd0 /share.qcow2
重新连接后,各个分区会以p1、p2、p3的顺序依次排列在/dev/nbd0后,以分区1为例,使用ext4对其格式化并挂载:
sudo mkfs.ext4 /dev/nbd0p1
sudo mount /dev/nbd0p1 /mnt/share
同样,断开虚拟硬盘时,需要先卸载该挂载的分区。
sudo umount /dev/nbd0p1
sudo qemu-nbd --disconnect /dev/nbd0
分区挂载后,启用smbd,就可以使用户的分享路径限制在虚拟硬盘内了。注意,卸载挂载点时,如果smbd仍在运行,会导致卸载失败,需要先用service停用smbd,再进行卸载。