我在 windows2003 服务器 (WINJOE) 上有一个 windows 共享,我想将其备份到正确加入域的 Linux 机器 (LINUXJOE)。我的目标是将 WINJOE 的共享文件夹备份到 LINUXJOE,同时保留 windows 权限/所有者。阅读相关文献后,我认为这是不可能的...
无论如何,在理想世界中,我想在 LINUXJOE 上安装一个 win 共享(作为只读),例如 \\WINJOE\important_folder,并从那里运行 rsync 到备份目录。
我目前拥有的:
\\WINJOE\important_folder -> 要备份的共享文件夹
LINUXJOE: /mnt/important -> LINUXJOE 上 \\WINJOE\important_folder 的挂载点
LINUXJOE: /backup/$DATE-important -> 备份目标目录
目前,我可以使用我的 Windows 域帐户登录 LINUXJOE,如果我在 LINUXJOE 的文件系统上创建文件,它们会将所有者显示为“somewinuser“域用户””,因此从 Windows 到 Linux 的用户映射可以正常工作。当我使用以下命令挂载 \\WINJOE\important_folder 时:
linuxjoe# mount.cifs //WINJOE/important_folder /mnt/important \
-o ro,user=backitup,dom=TODOMAIN,cifsacl,nounix --verbose
我得到:
ls -latrh
linuxjoe# ls -latrh /mnt/important
total 518M
-r-xr-xr-x 0 root root 518M Sep 28 01:19 test.mkv
-rwxr-xr-x 0 root root 0 Oct 25 19:04 testlalala
-rwxr-xr-x 0 root root 0 Oct 25 19:05 testkoko
drwxrwxrwx 1 root domain users 0 Oct 25 19:05 .
drwxr-xr-x 5 root root 4.0K Oct 29 16:29 ..
getcifsacl
linuxjoe# getcifsacl /mnt/important/test.mkv
REVISION:0x1
CONTROL:0x8404
OWNER:BUILTIN\Administrators
GROUP:TODOMAIN\Domain Users
ACL:Everyone:ALLOWED/I/FULL
ACL:NT AUTHORITY\SYSTEM:ALLOWED/I/FULL
ACL:BUILTIN\Administrators:ALLOWED/I/FULL
ACL:TODOMAIN\lukeskywalker:ALLOWED/I/FULL
rsyncing:
linuxjoe# rsync -apvXAgo /mnt/important/koko.mkv /root/test/
linuxjoe# ls -latrh /root/test/
total 518M
-rwxrwxrwx 1 root domain users 518M Sep 28 01:19 test.mkv
drwx------ 8 root root 4.0K Oct 29 18:29 ..
drwxr-xr-x 2 root root 4.0K Oct 29 18:29 .
是否有可能,在我从 Windows 共享 rsync 到我的 Linux 备份箱时,查看 Windows 共享上文件的正确所有者,并保留该所有者以及所有 Windows 安全属性?
smb配置文件
[global]
workgroup = TODOMAIN
realm=SOMEOFFICE.SOMEWHERE.GR
server string = %h server
wins support = no
security = ads
encrypt passwords = yes
obey pam restrictions = yes
template shell = /bin/bash
template homedir = /home/%D/%U
password server=winjoe.someoffice.somewhere.gr
domain master = no
local master = no
prefered master = no
idmap config * : backend = rid
idmap config * : range = 5000-3000000000
idmap config * : base_rid = 0
idmap config TODOMAIN : backend = rid
idmap config TODOMAIN : range = 5000-3000000000
idmap cache time = 900
algorithmic rid base = 5000
client schannel = no
disable spoolss=yes
winbind separator=+
winbind use default domain=yes
winbind nested groups=yes
winbind enum users=yes
winbind enum groups=yes
winbind cache time= 300
winbind refresh tickets = yes
inherit acls = Yes
map acl inherit = Yes
acl group control = yes
答案1
不幸的是,Linux ACL 和 Windows ACL 非常不同。当您通过 Samba 从 Windows 访问 Linux 文件系统时,Samba 会设法将更简单的 Linux ACL 映射到 Windows ACL,而不会丢失太多信息。要实现这一点,您已经需要 smb.conf 中的许多选项。
反过来则困难得多,甚至可能根本不可能,尤其是 Linux 挂载的语义与 Windows 映射共享不同。而且挂载发生在一个完全没有实现 ACL 的内核驱动程序上。我们唯一的方法是使用 getcifsacl 等附加程序获取信息。
因此,像 rsync 这样的普通 Linux 工具对 Windows ACL 一无所知,也无法存储它们。如果您需要恢复这些 ACL,则需要使用 getcifsacl 自行保存它们,并使用 setcifsacl 进行恢复。不幸的是,这些命令仅适用于单个文件,并且 setcifsacl 无法直接处理 getcifsacl 的输出,因此您需要一组复杂的脚本来备份/恢复这些 ACL。快速搜索没有显示任何现有解决方案。
解决此问题的一种方法是让 Windows 进行备份并使用 Linux 共享作为备份文件(而不是单个文件)的存储。
答案2
如何创建 samba 目录中的大文件并将其挂载为循环?这是基于优秀文章的工作原理http://users.softlab.ntua.gr/~ttsiod/backup.html
dd if=/dev/zero of=/mnt/windows/BigFile bs=1M count=1 seek=150000
mount.cifs //WINJOE/important_folder /mnt/important \
-o lfs,user=backitup,dom=TODOMAIN,cifsacl,nounix --verbose
默认情况下,Samba 安装的文件大小限制为 2GB(或 4GB,不确定)。这就是为什么“低频“选项用于挂载,以允许更大的文件。
mount -o loop /mnt/important/BigFile /mnt/backup
losetup /dev/loop0 /mnt/windows/BigFile
可选地,使用加密:losetup -e aes256
mkfs.ext4 /dev/loop0
mount /dev/loop0 /mnt/important/BigFile
cd /mnt/important/BigFile
rsync -avz --exclude /proc --exclude /sys root@server:/ ./