[玩法/技巧] 为群晖DSM增加自己需要的HBA卡驱动 |
本帖最后由 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
从https://github.com/andy928/xpenology复制XPEnology linux 3.x内核源代码
如果你一些非官方支持的硬件,可以将其编译进内核,用如下命令编辑您需要的硬件配置:(我这里选了我自己的LSI 1068e SAS HBA卡【刷成了IT模式】)
生成 bzImage文件:(我这里采用了将驱动以模块insmod方式载入。所以这个步骤已经不是必须的了)
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镜像中. 步骤:
(还记得我们第一步里编译得到的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 看到这里,您应该明白,为什么这个破解的版本,只支持有限的网卡了吧?
将rd.gz复制至USB引导盘的第1跟第2分区
生成cksum校验文件
在当面目录下
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文件,开始打包
这样,您就成功的替换了usb引导分区中的rd.gz,也重新生成了DSM的pat文件包了。 重启群晖后您使用SSH方式登录后,使用命令lsmod检查模块是否正确加载。 希望这篇教程能举一反三,让大家增加自己需要的驱动。您可以以内核方式,也可以按照我的insmod方式载入模式。抛砖引玉,希望大家喜欢,有问题可以提问。在这里感谢大力帮助我试验的"想得太美"同学。 本帖被以下淘专辑推荐:
|
一大早就看到这么给力的教程。。
按照这个方法应该可以把大多数常用硬件的驱动都加进去做一个整合包了 |
sas卡当硬盘扩展卡很好用 希望lz造福大家 呵呵 我手头上只有m1015和m5015 需要测试的时候通知一声
|
suqianstone 发表于 2013-4-29 21:28 LZ,希望你在空闲的时间,编译加上BCM的57788网卡,好些人需要。 万分感谢! |