来吧兄弟,一起玩一起讨论!
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 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索引的方法。 如果你不想自己动手制作,可以下载笔者制作好的虚拟机文件直接使用。 注意:请勿升级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、配置NFSNFS服务器使用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系统的部分行为,虽然暂时没发现有什么问题,但并不排除可能会引起不可预料的问题发生!!! 数据无价,请谨慎操作!!!
|