来吧兄弟,一起玩一起讨论!
您需要 登录 才可以下载或查看,没有账号?注册
×
本帖最后由 suqianstone 于 2013-4-29 03:52 编辑
首先,我语言组织能力很差,如果有不明白的,欢迎提问,请勿骂街。另外要感谢已经放出4.1和4.2破解的国外高人,本文仅仅是翻译个补充原文,且用另外投机取巧方式实现驱动加载。适用于任何可以以insmod方式加载驱动的任何硬件,大家有什么网卡,阵列卡的都可以上啦。欢迎大家试验反馈。
Part 1. 准备工作
Linux 系统 x86_64 (架构) (本文采用Ubuntu 12.10)
安装一些必要软件: git, libc6-i386, ncurses, build-essential archivemount- sudo apt-get install git libc6-i386 build-essential libncurses5-dev archivemount
复制代码 从http://sourceforge.net/projects/dsgpl/files/ 下载DSM 4.1 tool chain文件解压至 /usr/local 下. 版本为“Intel x86 Linux 3.2.11 (Bromolow)” ,压缩包文件名为 gcc420_glibc236_x64_bromolow-GPL.tgz.
从https://github.com/andy928/xpenology复制XPEnology linux 3.x内核源代码- sudo git clone https://github.com/andy928/xpenology.git linux-3.x
复制代码 Part 2. 编译内核
如果你一些非官方支持的硬件,可以将其编译进内核,用如下命令编辑您需要的硬件配置:(我这里选了我自己的LSI 1068e SAS HBA卡【刷成了IT模式】)- sudo make ARCH=x86_64 CROSS_COMPILE=/usr/local/x86_64-linux-gnu/bin/x86_64-linux-gnu- menuconfig
复制代码 编译内核- sudo make ARCH=x86_64 CROSS_COMPILE=/usr/local/x86_64-linux-gnu/bin/x86_64-linux-gnu- modules
复制代码 这步过后,在linux-3.x/drivers下有我们刚才第1小步选择过的HBA 卡模块了。总计是3个,分别是mptbase.ko mptscsih.ko mptsas.ko,复制出去备用
生成 bzImage文件:(我这里采用了将驱动以模块insmod方式载入。所以这个步骤已经不是必须的了)- make ARCH=x86_64 CROSS_COMPILE=/usr/local/x86_64-linux-gnu/bin/x86_64-linux-gnu- bzImage
复制代码 当编译完成,会在 “linux-3.x/arch/x86/boot/”目录下生成“bzImage”文件,您需要将其修改名称为“zImage”
Part 3. Synobios 文件破解
首先,您需要从rd.gz 或者 hda1.tgz文件内复制一份synobios.ko 文件出来,他们可以从官方的DSM pat文件内获得,windows环境请将.pat后缀的文件修改为.rar,使用winrar打开即可得到rd.tgz和hda1.tgz文件。
这里需要说明一下,大家现在所安装的黑群晖,实际上synobios.ko文件已经修改过了,所以我就没有再自己去下载官方的pat文件去编辑,而是直接使用了破解过的dsm pat 文件里的rd.gz 和 hda1.tgz,只是将我需要的SAS HBA卡驱动加进上述两个文件的lib/modules目录下。(多说一句,应该只加进rd.gz文件里即可),所以下面这些如果是跟我一样做法的网友就无需再继续修改了。可以跳过这个修改synobios.ko文件,同时忽略下文中任何关于synobios.ko的相关内容.......
Let SetMicropId() function return a valid NAS ID
.text:0000000000002370 public SetMicropId
.text:0000000000002370 SetMicropId proc near ; DATA XREF: .data:synobios_ops_0 o
.text:0000000000002370
.text:0000000000002370 var_18 = qword ptr -18h
.text:0000000000002370
.text:0000000000002370 48 83 EC 18 sub rsp, 18h
.text:0000000000002374 0F B6 15 1D 33 00 00 movzx edx, cs:syno_module+8
.text:000000000000237B 0F B6 05 17 33 00 00 movzx eax, cs:syno_module+9
.text:0000000000002382 48 C7 04 24 00 00 00 00 mov [rsp+18h+var_18], 0
.text:000000000000238A C0 EA 04 shr dl, 4
.text:000000000000238D 83 E0 0F and eax, 0Fh
.text:0000000000002390 48 C1 E0 04 shl rax, 4
.text:0000000000002394 0F B6 D2 movzx edx, dl
.text:0000000000002397 48 09 D0 or rax, rdx
.text:000000000000239A 04 01 add al, 1
.text:000000000000239C 74 15 jz short loc_23B3
.text:000000000000239E 31 D2 xor edx, edx
.text:00000000000023A0 81 3D F2 32 00 00 FF 00+ cmp cs:MpId_20729, 0FFh
.text:00000000000023AA 74 1C jz short loc_23C8
.text:00000000000023AC loc_23AC: ; CODE XREF:
.text:00000000000023AC 89 D0 mov eax, edx
.text:00000000000023AE 48 83 C4 18 add rsp, 18h
.text:00000000000023B2 C3 retn
.text:00000000000023B3 loc_23B3: ; CODE XREF:
.text:00000000000023B3 48 C7 C7 FE 45 00 00 mov rdi, offset aGetMicropFail ; "get microp fail\n"
.text:00000000000023BA 31 C0 xor eax, eax
.text:00000000000023BC E8 9B 42 00 00 call printk
.text:00000000000023C1 BA FF FF FF FF mov edx, 0FFFFFFFFh
.text:00000000000023C6 EB E4 jmp short loc_23AC
.text:00000000000023C8 loc_23C8: ; CODE XREF:
.text:00000000000023C8 48 C7 C6 13 46 00 00 mov rsi, offset aR ; "R"
.text:00000000000023CF 48 89 E2 mov rdx, rsp
.text:00000000000023D2 B9 08 00 00 00 mov ecx, 8
.text:00000000000023D7 48 89 F7 mov rdi, rsi
.text:00000000000023DA E8 81 FE FF FF call ReadUart
.text:00000000000023DF 85 C0 test eax, eax
.text:00000000000023E1 BA FF FF FF FF mov edx, 0FFFFFFFFh
.text:00000000000023E6 75 C4 jnz short loc_23AC
.text:00000000000023E8 0F BE 04 24 movsx eax, byte ptr [rsp+18h+var_18]
.text:00000000000023EC 31 D2 xor edx, edx
.text:00000000000023EE 89 05 A8 32 00 00 mov cs:MpId_20729, eax
.text:00000000000023F4 EB B6 jmp short loc_23AC
.text:00000000000023F4 SetMicropId endp
Code at offset 000023E6 must be changed to
.text:00000000000023E6 48 31 C0 xor rax, rax
.text:00000000000023E9 B0 42 mov al, 042h
.text:00000000000023EB 90 nop
Full list of available NAS ID's is enumerated as SYNO_MICROP_ID and it can be obtained in “linux-3.x/include/linux/synobios.h” file.
Switching off “buzzer stop button pressed” logging message:
.text:0000000000000395 80 7C 24 17 00 cmp [rsp+28h+var_11], 0
.text:000000000000039A 74 D4 jz short loc_370
to
.text:0000000000000395 80 7C 24 17 00 cmp [rsp+28h+var_11], 0
.text:000000000000039A EB D4 jmp short loc_370
Part 4.生成rd.gz和DSM PAT文件
DSM_DS3612xs_2668.pat file, 里大概有如下这些文件,
checksum.syno // files' checksums
grub_cksum.syno // zImage and rd.gz checksums that are used in GRUB
hda1.tgz // system image
rd.gz // ram disk image
updater // WEB version of the installer (instead of Synology Assistent)
VERSION // DSM version
zImage // kernel image
其中rd.gz文件在我们安装的黑群晖引导盘第一分区,第二分区内都有,同时在DSM文件里也会有一份,3个文件完全一样。我们在得到rd.gz后可以复制该文件至引导盘的两个分区,然后再把该文件替换至DSM PAT文件包内。
首先将 synobios.ko 文件替换至RAM disk镜像中. 步骤:- sudo mkdir /mnt/ramdisk
- sudo gunzip /tmp/rd.gz
- sudo mount -t ext2 -o loop rd /mnt/ramdisk
复制代码 复制编辑好的synobios.ko 到 /mnt/ramdisk/lib/modules下
(还记得我们第一步里编译得到的1068e的驱动吗?现在一样复制到上述目录下来)
编辑/mnt/ramdisk下linuxrc.syno文件,在第一个段落里增加几个语句,注意载入顺序,不要问我为什么,请参考您扩展卡的官方驱动说明文件。
if [ "bromolow" = "$UniqueRD" ]; then
insmod /lib/modules/e1000.ko
insmod /lib/modules/r8168.ko
insmod /lib/modules/mptbase.ko
insmod /lib/modules/mptscsih.ko
insmod /lib/modules/mptsas.ko
fi
看到这里,您应该明白,为什么这个破解的版本,只支持有限的网卡了吧?- sudo umount /mnt/ramdisk
- sudo gzip /tmp/rd
复制代码 得到rd.gz备用
将rd.gz复制至USB引导盘的第1跟第2分区- sudo mkdir /mnt/hdd
- sudo archivemount /tmp/hda1.tgz /mnt/hdd
复制代码 复制修改过的synobios.ko 到 /mnt/hdd/lib/modules下,复制前面的3个ko文件到/mnt/hdd/lib/modules (个人觉得没必要,没测试)在/tmp目录下将hda1.tgz 改名为 hda1,并使用xz压缩- sudo mv /tmp/hda1.tgz /tmp/hda1
- xz -z9 /tmp/hda1
复制代码 将hda1.xz文件改名为hda1.tgz
生成cksum校验文件- sudo git clone https://github.com/andy928/synochecksum.git synochecksum
- cd synochecksum
- sudo make
- sudo chmod +x synochecksum-emu1
复制代码 新建一个目录,将我们从破解过的DSM PAT文件包里获得的文件全部集中在一起,用前面得到的rd.gz和hda1.tgz文件替换同名文件。
在当面目录下- sudo ./synochecksum-emu1 *
复制代码 将显示的结果编辑进checksum.syno,删除不必要的行,格式类似如下:
3766610713 196 VERSION 211 258
2107446070 64153468 hda1.tgz 72145747 564
4294967295 2503792 zImage 4062935 356
113736571 5966614 rd.gz 8338569 693
3449851895 3189108 updater 5632471 361
1629449639 23207883 indexdb.tgz 40490275 440
#Synocksum 298516414 388040049 1960
完成后移除synochecksum-emu1文件,开始打包将得的system.tgz文件改名为PAT后缀。
这样,您就成功的替换了usb引导分区中的rd.gz,也重新生成了DSM的pat文件包了。
重启群晖后您使用SSH方式登录后,使用命令lsmod检查模块是否正确加载。
希望这篇教程能举一反三,让大家增加自己需要的驱动。您可以以内核方式,也可以按照我的insmod方式载入模式。抛砖引玉,希望大家喜欢,有问题可以提问。在这里感谢大力帮助我试验的"想得太美"同学。
|
|