[玩法/技巧] NFS文件夹建立索引的解决办法 |
本帖最后由 cn2012 于 2023-8-17 17:13 编辑
目录 0、前言 1、安装DSM 2、开启SSH 3、打补丁支持NFS索引 4、配置磁盘 5、半洗白 6、安装PhotoStation 7、配置NFS 8、解决Photo Station无法删除NFS上的相册 9、制作补丁 0、前言 本文以DS918+的DSM 6.2.3-25426版本为例,详细讲述让DSM6系统支持NFS索引的方法。 如果你不想自己动手制作,可以下载笔者制作好的虚拟机文件直接使用。 下载链接:https://pan.baidu.com/s/1LvB5zGp3GyNRyZG5yciyJg 提取码:giyi 注意:请勿升级PhotoStation套件!!!否则需要重新做一下【解决Photo Station无法删除NFS上的相册】这个步骤 要实现的目标: 以Windows Server 2016作为宿主主机并且开启NFS服务,DSM6.2.3在VMware虚拟机中运行,DSM的Photo Station、Video Station等挂载在windows的NFS目录能正常索引。 准备工作: 1) 安装VMware Workstation,最好使用15.x版本的,因为低版本的似乎通过synoboot.img引导的时候搜索不到IP地址下载地址:https://download3.vmware.com/software/wkst/file/VMware-workstation-full-15.5.0-14665864.exe 2) 安装Synology Assistant 下载地址:https://cndl.synology.cn/download/Utility/Assistant/6.2-24922/Windows/synology-assistant-6.2-24922.exe 3) 下载用于引导DSM的镜像文件 下载地址:http://down.nas2x.com/synology/dsm/6.2/synoboot/v1.04b.for.dms.6.2.1.synoboot-ds918.zip 4) 下载DS918+的DSM 6.2.3 pat文件 下载地址:https://global.download.synology.com/download/DSM/release/6.2.3/25426/DSM_DS918%2B_25426.pat 5) 下载补丁文件(此补丁只针对DS918+的DSM 6.2.3-25426版本,其他版本并不适用,请谨慎操作!!!!) 下载链接: https://pan.baidu.com/s/1ZJRxZY8WBGa92MuwrAqE0w提取码:3zaw 6) 安装IDA 下载地址:https://www.hex-rays.com/ 7) 安装haneWIN NFS Server 下载地址:http://r.hanewin.net/nfs1252.exe 8) 下载putty 下载地址:https://the.earth.li/~sgtatham/putty/latest/w64/putty.exe 9) 下载pscp 下载地址:https://the.earth.li/~sgtatham/putty/latest/w64/pscp.exe 10) 安装WinHex 下载地址:http://www.x-ways.net/winhex.zip 1、安装DSM 新建一个虚拟机 选择【自定义(高级)】 选择【Workstation15.x】 选择【稍后安装操作系统】 选择【Llinux】系统,版本选择【其他 Linux 2.6.x 内核 64 位】 设置虚拟机名称和虚拟机的位置 根据实际情况配置处理器,此处为群晖系统分配2个处理器核心 根据实际情况配置群晖系统内存大小,此处为群晖系统分配1GB内存 网络使用桥接方式 I/O控制器使用推荐设置 磁盘类型选择SATA 使用现有的虚拟磁盘 选择前面制作好的用于引导系统的启动磁盘文件synoboot.vmdk 在上面步骤点击下一步的时候如果提示转换磁盘格式,则选择【保持现有格式】 点击【完成】 至此,已成功创建了一个虚拟机 然而,现在只有一个用于引导系统的虚拟磁盘,我们需要另外再添加一个空间更大的磁盘才能安装群晖系统 点击【编辑虚拟机设置】 点击【添加】 选择【硬盘】,然后点击【下一步】 磁盘类型选择SATA,如果选择别的,似乎在安装DSM的时候会提示无法格式化磁盘... 选择【创建新虚拟磁盘】 为避免虚拟磁盘文件在日后使用过程中不断增大,此处选择立即分配磁盘空间的方式。 因为此虚拟机系统将来是通过挂载NFS的方式访问照片视频等资源,这些资源一般不储存在虚拟磁盘文件中,所以虚拟磁盘文件不需要设置得大太,此处设置为16GB,也可以根据你的实际情况进行调整。 设置虚拟磁盘文件名称,默认即可 等待几分钟为虚拟磁盘分配空间 新硬盘创建完毕,点击【确定】 此时在虚拟机信息里可以看到创建的16GB的虚拟磁盘 在对应的虚拟机文件里也能看到相应的16GB大小的虚拟磁盘文件 点击【开启此虚拟机】启动虚拟机 如果顺利的话,虚拟机将一直停留在如下界面,再稍等一两分钟应该就可以使用群晖的Synology Assistant工具搜索此设备 打开SynologyAssistant工具搜索设备 在浏览器输入设备的IP地址192.168.1.139登录到设备安装DSM的页面,点击【设置】按钮 选择【手动安装】 选择事先下载了的DSM_DS918+_25426.pat文件,然后点击【立即安装】按钮 确认虚拟磁盘数据被删除,然后点击【确定】 开始安装DSM,需要几分钟时间 安装完成后等待虚拟机系统重启 数分钟后自动重新登录到此页面,根据你的需要配置服务器名称、用户名和密码,然后点击下一步 此处配置服务器名称为DiskStation、用户名为admin、密码为123456 由于是黑群晖,不能使用QuickConnect,因此此处选择【跳过此步骤】 在弹出提示框选择【是】按钮 配置完毕,点击【前往】进入群晖系统桌面 群晖系统成功安装完毕! 为避免DSM的IP地址被路由器重新分配而导致变化,我们可以在控制面板的网络设置里把IP地址设置为固定IP 我这里把IP地址设置为192.168.1.28,以后都通过此IP地方访问此DSM 2、开启SSH 打开控制面板,选择【高级模式】 打开【终端机和SNMP】 勾选【启动SSH功能】 3、打补丁支持NFS索引 测试发现: 1、如果先配置磁盘存储空间,文件系统类型选择【Btrfs】,然后再打补丁,会导致使用File Station上传文件时出现【你的个人资料已超过使用限额】的上传错误提示!!! 2、如果先配置磁盘存储空间,文件系统类型选择【ext4】,然后再打补丁,并不会出现File Station上传文件出错的问题。 3、如果先打补丁,然后再配置磁盘存储空间,文件系统类型选择【Btrfs】或【ext4】,都不会出现File Station上传文件出错的问题。 为避免一些这些问题的发生,最好先打补丁,后面才配置磁盘存储空间 使用pscp工具把ds918+_DSM6.2.3-25426_libs_patch.tar.gz补丁包上传到DSM的/tmp目录。 pscp工具下载地址:https://the.earth.li/~sgtatham/putty/latest/w64/pscp.exe 上传文件命令:(文件路径视实际情况自行修改) pscp -P 22 "D:\DSM\ds918+_DSM6.2.3-25426_libs_patch.tar.gz"admin@192.168.1.28:/tmp/ 使用PuTTY通过SSH方式登录到DSM系统,目的是把刚才上传的补丁文件应用到群晖系统里 PuTTY下载地址:https://the.earth.li/~sgtatham/putty/latest/w64/pscp.exe 设置PuTTY的连接信息,点击Open 输入安装DSM时设置的用户名和密码,用户名为admin,密码为123456。(注:输入密码时没有是回显的,别输错) 输入sudo -i 命令,并输入密码123456,提升到root权限。(注:输入密码时没有是回显的,别输错) 进入/tmp目录查看补丁包文件 解压补丁包,得到ds918+_DSM6.2.3-25426_libs_patch文件夹 进入ds918+_DSM6.2.3-25426_libs_patch文件,修改里面文件的文件权限 命令: chmod644 * chown-R root:root * 把补丁文件拷贝到/lib目录,此动作会覆盖/lib目录里对应的libsynoindex.so、libsynosdk.so.6和libhwcontrol.so.1,并且会暂时造成web服务不可用,也就是说暂时无法通过浏览器登录到群晖系统。 注意:此操作存在一定风险,毕竟是替换系统的重要文件,不排除可能会引起不可预料的异常情况发生,因此如果是白群用户或者对系统稳定性要求非常高的同学,请谨慎操作,后果自负 在ds918+_DSM6.2.3-25426_libs_patch文件夹下执行命令 cp -rp * /lib/ 此时网页端也被强迫退出 虽然此时网页端可以重新登录进去,但是会发现关机、重启等功能失效了。不过不要紧,只要在SSH端重启系统就恢复正常了 输入reboot回车,重启群晖系统,SSH连接也随之被断开,然后等待系统重启完毕即可 4、配置磁盘 点击【主菜单】按钮,然后点击【存储空间管理员】图标 选择【存储空间】,点击【新增】按钮 选择【自定义】模式 创建新存储池 存储池类型选择【性能改善】 RAID类别选择【Basic】 选择先前创建的16G虚拟磁盘 确认擦除数据 执行硬盘检查 文件系统选择【ext4】。注:选择【ext4】的话,无论是先配置磁盘还是先打补丁,使用File Station上传文件时都不会出现【你的个人资料已超过使用限额】的错误提示。 存储空间容量使用默认设置,直接点击下一步 检查信息无误后点击【应用】 成功创建了存储空间,可用空间约11GB 至此,存储空间配置完毕,接着可以愉快地安装各种套件了 5、半洗白 如果黑群晖没有经过洗白或者半洗白,那么就会出现Photo Station、Video Station的视频不能产生缩略图、不能转码之类的问题。 半洗白的方法比较简单,只要在docker里创建一个DDSM,启动DDSM后在控制面板就可以查看用于半洗白的MAC和SN,把MAC和SN写入到synoboot.img即可。 不过18.x版本的docker套件已经取消了DDSM,所以需要用17.x版本的docker才行。 docker17.05套件下载地址:https://archive.synology.com/download/Package/spk/Docker/17.05.0-0401/Docker-x64-17.05.0-0401.spk 注意:前面打过补丁的DSM系统是无法启动DDSM的,所以如果获取用于半洗白的MAC和SN,可以另外重新创建虚拟机后,磁盘存储空间文件系统类型选择【Btrfs】(注:DDSM需要依赖Btrfs文件系统),然后再按下面步骤获得 因为DDSM需要依赖Open vSwitch,所以先配置Open vSwitch 打开控制面板的【网络】属性页,在【网络界面】那一页点击【管理】按钮,选择【Open vSwitch 设置】菜单项 勾选【启动 OpenvSwitch】,然后【确定】 耐心等待一会儿,等待OpenvSwitch生效 打开套件中心,选择【手动安装】,在弹出窗口选择下载的docker17.05套件,然后点击【下一步】进行安装 安装完毕后打开docker 选择DSM页,并点击【新增】按钮 CPU和内存,使用默认设置即可 网络设置同样使用默认设置即可 存储设置也使用默认设置 DSM安装文件选择【手动上传】,这个文件可以事先下载,下载地址 https://archive.synology.com/download/DSM/release/6.2.3/25426/DSM_DDSM_25426.pat 当然,你也可以选择【从Synology下载】,直接在线下载安装 点击【应用】按钮创建容器 等待DDSM启动 DDSM启动完毕 在浏览器输入上面那个IP地址登录DDSM,并且设置用户名和密码 打开【控制面板】->【信息中心】的【常规】选项卡,把产品序列号记下 再转到【网络】选项卡,把MAC地址记下 这里得到的SN为DINN017EKMQ2C;MAC为02-11-32-1B-C1-DF 修改引导文件synoboot.img前,必须保证虚拟机是关闭状态。这里用一种比较简单粗暴的方法修改synoboot.img文件里的SN和MAC,用WinHex打开synoboot.img文件,按Ctrl+F查找文本mac= 光标自动定位到此处 把此处的sn和mac1替换成刚才在DDSM记下的SN和MAC即可 修改后 点击保存后,再启动虚拟机,DSM系统则处于半洗白状态 6、安装PhotoStation 在【套件中心】找到PhotoStation安装即可,此处不再详细赘述 7、配置NFS NFS服务器使用haneWIN NFS Server,版本号1.2.35,安装比较简单,此处不再赘述,按下图配置即可。注:红框里的都是比较重要的选项 Exports属性页这个表项的添加方法 点击【Editexports file】,在弹出的窗口里面适当位置加入一行 D:\PhysicalDisk\photo -name:photo-umask:133 192.168.1.28 其中: D:\PhysicalDisk\photo为物理机上windows的文件夹路径 -name:photo为对应的文件夹映射到NFS的名称 -umask:133为文件和文件夹默认权限掩码。这里值得一提的是,NFS挂载后文件默认权限为755,而windows和linux的文件属性权限并不能一一对应,因此到时如果通过Photo Station上传照片视频到NFS目录或者索引NFS目录的话,当linux把文件权限设置成755的时候,反映到windows那边就变成文件带有隐藏属性。如果用户没有在windows那边把隐藏文件显示出来的话,可能会以为文件全部丢失了。为避免这个问题,此处把umask设置为133,即默认权限为777-113,也就是默认权限为644,这样文件在windows那边就显示正常,而不会变成隐藏文件。 192.168.1.28为群晖系统对应的IP地址,只有这个IP地址才有权限访问此NFS资源。当然,如果你有多台群晖访问这个NFS资源的话,你也可以把IP地址设置成一个范围,比如下面这样: D:\PhysicalDisk\photo-name:photo -umask:133 -range 192.168.1.1 192.168.1.255 配置完成后,点击【RestartServer】重启NFS服务。 8、解决Photo Station无法删除NFS上的相册 如果此时挂载NFS目录使用的话,你会发现Photo Station的创建相册、上传图片、上传视频、生成缩略图,这些功能都没问题,但是删除相册的时候你会发现虽然Photo Station上的相册是被删除了,然而NFS上对应的文件却没有真正从磁盘上被删除。 根据分析,怀疑是权限问题造成的,我没有再深究具体是哪个环节引起的。 然而,既然是权限问题,那么我随便尝试了一个骚操作,居然可以解决这个问题,虽然我也不知道为什么... 使用PuTTY再次通过SSH登录到群晖系统,并获取root权限。(不记得如何操作的,请查阅前面打补丁的章节) 复制/volume1/@appstore/PhotoStation/bin/synophotoio文件到/bin/目录,命令: cp/volume1/@appstore/PhotoStation/bin/synophotoio /bin/synophotoio 修改/bin/synophotoio文件的权限,命令 chmod777 /bin/synophotoio chown-R root:root /bin/synophotoio 删除/volume1/@appstore/PhotoStation/bin/目录下的synophotoio文件,并重新创建软连接指向/bin/ synophotoio,命令: rm/volume1/@appstore/PhotoStation/bin/synophotoio ln-s /bin/synophotoio /volume1/@appstore/PhotoStation/bin/synophotoio 很显示,执行过此操作后,Photo Station就不能升级了。如果你必须要升级,那需要重新做上面这个步骤!!!! 重启系统 重启完毕后,使用PuTTY通过SSH登录到群晖系统,并获得root权限。(不记得如何操作的,请查阅前面打补丁的章节) 把PhotoStation的相册目录挂载到NFS,命令: mount -t nfs 192.168.1.20:/photo/volume1/photo/ -o rw,hard 当然,你也可以把这命令加入到任务计划里,使得开机后自动执行此命令挂载NFS目录 到这里,你已经可以在NFS上正常使用Photo Station并且支持索引了 9、制作补丁 DSM6以上没有任何方法设置支持NFS索引,因为在系统代码里已经把这个限制死了,系统如果发现路径是NFS之类的远程路径,就直接拒绝建立索引,所以只能通过非常规手段来解决这个问题,通过逆向分析绕过这部分代码。 另外,如果DSM运行在虚拟机里,系统无法读取硬盘的SMART信息,就会丧心病狂的向/var/log/messages输出日志,最终可能会塞爆磁盘空间!!所以我们也需要绕过这部分代码。 经过逆向分析,只需要修改如下函数的返回值即可 IndexIsPathRemoteMount return 0LL; IndexIsPathSupportEAWrite return 1LL; SYNOFSIsRemoteFS return edi == 6; SYNOGetFSType return 2LL; SmartDataRead return -1; SYNODiskTemperatureGet return -1; SYNODiskExceedUncThrCache return -1; 这些函数分别位于/lib/libsynoindex.so、/lib/libsynosdk.so.6和/lib/libhwcontrol.so.1这三个文件中,至于如何提取这三个文件,方法比较简单,这里不再赘述。 使用IDA对这些函数进行修改 注意:此示例只针对ds918+的DSM6.2.3-25426版本。其他版本方法一样,但是反汇编的地址可能有所不同!!! 载入libsynoindex.so,点击Exports页,找到IndexIsPathRemoteMount函数 双击上面找到的IndexIsPathRemoteMount函数,进入到汇编代码,并把光标定位到xor esi, esi这一行 选择菜单Edit->Keypatch->Patcher 选择菜单后将弹出Patcher窗口,把xor esi, esi修改为xor eax, eax,然后点击Patch按钮 Patch后如下图所示 接着把mov rbp,rdi修改为jmp 0xAAA2,然后点击Patch按钮 Patch后如下图所示 找到IndexIsPathSupportEAWrite函数,并把光标定位到xor esi, esi这一行 按照前面说的方法,Patch成下面这样 选择菜单Edit->Patchprogram->Apply patches to input file... 点击OK保存修改后的文件 载入libsynosdk.so.6,找到SYNOFSIsRemoteFS,定位到cmp edi, 0Eh这一行 按前面的方法进行Patch,Patch成如图所示 找到SYNOGetFSType函数,把光标定位到test rdi, rdi这一行 Patch后 选择菜单Edit->Patchprogram->Apply patches to input file...,打开Apply patches to input file窗口,点击OK保存修改后的文件 载入libhwcontrol.so.1文件,找到SmartDataRead函数,并把光标定位到test rdi, rdi这一行 Patch后 找到SYNODiskTemperatureGet函数,并把光标定位到jz short loc_3964D Patch后 找到SYNODiskExceedUncThrCache函数,并把光标定位到mov [rsp+0B8h+var_A8], 0这一行 Patch后 保存修改后的文件 至此总共获得3个Patch后的补丁文件,然后按前面所说的方法打补丁即可 写在最后 DSM6系统没有提供任何设置选项开启NFS索引支持,反而在代码里刻意屏蔽了对远程目录的索引,所以只能使用非常规手段来解决这个问题。本文使用的方法改变了DSM系统的部分行为,虽然暂时没发现有什么问题,但并不排除可能会引起不可预料的问题发生!!! 数据无价,请谨慎操作!!! |
好奇,是怎么找出来这个解决方案的。之前我也猜测过。不过无从入手,要是去看源码,真不是一般人可以看得了
|
skill7899 发表于 2021-9-20 23:37 每次上传完照片后是会触发索引的,可以从这里入手。你可以通过某些手段来监视创建了哪些进程,看看它是通过调用什么命令和参数来对刚上传的文件进行索引的,然后对这个命令的程序进行反汇编分析,看看它执行到哪里会返回失败,(这部分工作是需要点编程能力),最终可以定位到文章里所说的那几个函数。 |
Moments还是不行,报以下错
dsm synophoto-thumb: uncaught thread task exception /source/synophoto/src/lib/filesystem/file.cpp:358 failed to stat /var/services/homes/admin/Drive/Moments/Web/2019-12-18/@eaDir |
photo是能用,但是内核每隔20秒就输出一次 message
2021-09-25T09:42:12+08:00 dsm kernel: [ 1733.759359] nfs: RPC call returned error 13 2021-09-25T09:42:12+08:00 dsm kernel: [ 1733.759380] nfs: RPC call returned error 13 2021-09-25T09:42:32+08:00 dsm kernel: [ 1753.759795] nfs: RPC call returned error 13 2021-09-25T09:42:32+08:00 dsm kernel: [ 1753.759816] nfs: RPC call returned error 13 apparmor.log 2021-09-25T09:41:32+08:00 dsm kernel: [ 1693.758322] audit: type=1400 audit(1632534092.179:156): apparmor="DENIED" operation="sendmsg" profile="/volume*/@appstore/PhotoStation/bin/photostationd" pid=17088 comm="photostationd" laddr=192.168.60.120 lport=931 faddr=192.168.60.100 fport=2049 family="inet" sock_type="stream" protocol=6 |