项目场景:
- 首先,准备在原先的NTFS硬盘上使用docker部署mysql并对mysql的数据进行持久化,持久化的硬盘选择空间大的NTFS格式硬盘。
- 然后,部署的时候发现mysql容器的启动日志中针对my.cnf文件的提示是ignore,原因是权限设置为World-Read即所有人都可以读取。
- 接下来,无论如何使用chmod 777还是chmod 644依旧改变不了my.cnf文件的权限,文件权限保持-rwxrwxrwx;
- 随着想起之前挂载NTFS硬盘文件的设置,之前遇到的问题是硬盘回收站失效,即删除文件的时候是永久删除而没有回收站机制。
在/etc/fatab中的挂载语句如下,此时文件的权限管理失效:
UUID=C7E7C8FFF7C15075 /my_data ntfs defaults,utf8,uid=1000,gid=1000 0 0
查询资料后改动为下面的格式,发现新的问题是又没有回收机制了,删除一个文件就只能永久删除
UUID=C7E7C8FFF7C15075 /my_data ntfs permissions 0 1
改回原来的格式后,开始思考
考虑到这个硬盘需要在Linux系统中频繁地进行数据集的读写,不如直接将文件系统换回Linux常用格式EXT4
问题描述
Linux中将my_data硬盘的文件拷贝到备份硬盘时,出现拷贝到一半时不能完全拷贝的问题,于是切换Windows系统并使用工具进行硬盘修复;修复完成后,在Windows系统下复制文件会出现0x80070005的错误。
于是切换回Ubuntu系统,可以完整拷贝完文件夹;准备换回Windows系统查看,发现统计的文件夹大小差异很大。
硬盘是NTFS格式,通过Ubuntu系统写入文件,然后在Windows系统中读取文件。
备份硬盘文件时出现的问题
在Windows系统中打开由Ubuntu系统中创建的文件,出现问题。
- 分区:NTFS
- Windows系统版本:Windows10企业版
- Linux系统版本:Ubuntu 22.04
- Linux中硬盘的挂载方式:
cmd输入systeminfo
vi /etc/fstab后能看到
UUID=C7E7C8FFF7C15075 /my_data ntfs defaults,utf8,uid=1000,gid=1000 0 0
原因分析:
针对拷贝前后的文件夹进行比较。
根据logs和pth文件的共性,推测可能是文件名含有@的原因。
推测1:当硬盘是NTFS格式的时候,使用Ubuntu系统创建或复制文件名称中含有@符号的文件,在Windows系统中读取不出来。
验证:在Linux系统中,创建下面两个文件“fileBuilt@Linux.txt“和“fileBuiltInLinux.txt”,其中log文件是其它地方拷贝过来的。
实验表明,在Linux系统中手动创建的两个文件都可以打开,那么推测1就是错误的。
推测2:使用Ubuntu系统创建的文件或文件夹不符号Windows的命名规则,这个时候在Windows系统中读取不出来。
这个命名不对的文件没办法被Windows读取,改名也改不了,因为Windows无法定位它。
在Linux中复制好这个文件之后,将英文状态下的:去除,发现改名后的文件可以被拷贝。
然后继续进行格式转换,并在Linux系统中改变挂载方式
此时,格式化后分区的uuid会发生变化,需要重新修改/etc/fstab文件里面的内容才方便挂载,不行的话先注释掉
使用linux系统获取各个分区以及uuid信息如下:
lsblk -f | grep -v /snap
vi /etc/fstab
EXT4格式的硬盘设置为detault就好,后面可以使用chmod命令更改权限。
下面的NTFS格式硬盘
记住uid和gid分别代表挂载时权属的用户和用户组,dmask和fmask分别是文件夹掩码和文件掩码,权限最高是777;
使用文件夹掩码022就是777-022 = 755,属于id=1000的当前用户有读、执行和写权限,同组用户、其它用户有读、执行权限。
chmod改变权限依旧无效,不如mask全部设置为0
解决方案:
- 如果复制文件的时候报错,请先使用Linux或Windows下的文件修复工具对硬盘进行修复;
- 含有Windows系统不支持的命名字符的文件,可以使用Linux系统复制,但千万别在Windows系统中打开,复制或重命名;
- 以后在Linux系统中也尽量避免使用Windows不支持的命名字符。