第一纳斯网

[分享] 为群晖DSM增加自己需要的HBA卡驱动

2013-4-29 03:26
15434133
本帖最后由 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
  1. 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内核源代码
  1. sudo git clone https://github.com/andy928/xpenology.git linux-3.x
复制代码
Part 2. 编译内核
如果你一些非官方支持的硬件,可以将其编译进内核,用如下命令编辑您需要的硬件配置:(我这里选了我自己的LSI 1068e SAS HBA卡【刷成了IT模式】)
  1. sudo make ARCH=x86_64 CROSS_COMPILE=/usr/local/x86_64-linux-gnu/bin/x86_64-linux-gnu- menuconfig
复制代码
编译内核
  1. 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方式载入。所以这个步骤已经不是必须的了)
  1. 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镜像中. 步骤:
  1.         sudo mkdir /mnt/ramdisk
  2.         sudo gunzip /tmp/rd.gz
  3.         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
看到这里,您应该明白,为什么这个破解的版本,只支持有限的网卡了吧?
  1. sudo umount /mnt/ramdisk
  2. sudo gzip /tmp/rd
复制代码
得到rd.gz备用
将rd.gz复制至USB引导盘的第1跟第2分区
  1. sudo mkdir /mnt/hdd
  2. sudo archivemount /tmp/hda1.tgz /mnt/hdd
复制代码
复制修改过的synobios.ko 到 /mnt/hdd/lib/modules下,复制前面的3个ko文件到/mnt/hdd/lib/modules (个人觉得没必要,没测试)
  1. sudo umount /mnt/hdd
复制代码
在/tmp目录下将hda1.tgz 改名为 hda1,并使用xz压缩
  1. sudo mv /tmp/hda1.tgz /tmp/hda1
  2. xz -z9 /tmp/hda1
复制代码
将hda1.xz文件改名为hda1.tgz
生成cksum校验文件
  1. sudo git clone https://github.com/andy928/synochecksum.git synochecksum
  2. cd synochecksum
  3. sudo make
  4. sudo chmod +x synochecksum-emu1
复制代码
新建一个目录,将我们从破解过的DSM PAT文件包里获得的文件全部集中在一起,用前面得到的rd.gz和hda1.tgz文件替换同名文件。
在当面目录下
  1. 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文件,开始打包
  1. tar cvf system.tgz *
复制代码
将得的system.tgz文件改名为PAT后缀。

这样,您就成功的替换了usb引导分区中的rd.gz,也重新生成了DSM的pat文件包了。
重启群晖后您使用SSH方式登录后,使用命令lsmod检查模块是否正确加载。
希望这篇教程能举一反三,让大家增加自己需要的驱动。您可以以内核方式,也可以按照我的insmod方式载入模式。抛砖引玉,希望大家喜欢,有问题可以提问。在这里感谢大力帮助我试验的"想得太美"同学。
分享到 :
66 人收藏

133 个回复

倒序浏览
suqianstone  高烧40℃ | 2013-4-29 03:34:36
1.jpg
nonzhe  骷髅 | 2013-4-29 06:08:18
沙发啊,顶楼主,终于看到教程了,谢谢啦
COVO  走火入魔 | 2013-4-29 10:43:09
顶楼主 步骤真详细

要好好学习一下
fastgame  纳斯达人 | 2013-4-29 10:56:27
非常感谢楼主啊,hba卡有希望了
vanloon  纳斯达人 | 2013-4-29 10:57:10
很详细的教程 多看几遍 慢慢消化
iori9051  走火入魔 | 2013-4-29 11:08:00
一大早就看到这么给力的教程。。
按照这个方法应该可以把大多数常用硬件的驱动都加进去做一个整合包了
sqxiaofei  高烧40℃ | 2013-4-29 11:10:10 来自手机
凌晨3点啊
feng5064  纳斯达人 | 2013-4-29 12:21:55
楼主乃真高人,厉害!感谢分享教程!
EverGame  正常36.8℃ | 2013-4-29 13:33:15 来自手机
比较详细的教程了。
gz_zxq  发烧38℃ | 2013-4-29 21:22:10 来自手机
提示: 该帖被管理员或版主屏蔽
suqianstone  高烧40℃ | 2013-4-29 21:28:21

不客气,我希望能有闲时间的朋友能把常见的各种HBA卡,各种网卡驱动编译出来,加进rd.gz重新打包跟大家分享。
ccna1111  VIP红钻贵族 | 2013-4-29 21:37:50
楼主真的是大牛啊
所所思  高烧40℃ | 2013-4-29 21:56:53
sas卡当硬盘扩展卡很好用 希望lz造福大家 呵呵 我手头上只有m1015和m5015 需要测试的时候通知一声
fyjsy  高烧40℃ | 2013-4-29 23:36:48
想得太美 不会是ROS和m0n0china里的吧?
EverGame  正常36.8℃ | 2013-4-29 23:51:45 来自手机
suqianstone 发表于 2013-4-29 21:28
不客气,我希望能有闲时间的朋友能把常见的各种HBA卡,各种网卡驱动编译出来,加进rd.gz重新打包跟大家分 ...

LZ,希望你在空闲的时间,编译加上BCM的57788网卡,好些人需要。
万分感谢!
odie82544  纳斯达人 | 2013-4-30 02:57:41
HBA driver insmod 進去, 但能用嗎?
suqianstone  高烧40℃ | 2013-4-30 08:06:14
fyjsy 发表于 2013-4-29 23:36
想得太美 不会是ROS和m0n0china里的吧?

恭喜你,答对了,我就是routerclub的另外一个叫zsk2000
wenjuner  走火入魔 | 2013-4-30 11:12:54
高手终于现身了,支持
随风飘逝ゞ  骷髅 | 2013-5-1 00:51:14
汇编是一窍不通。楼主乃真高人,厉害!
您需要登录后才可以回帖 登录 | 立即注册  

本版积分规则

suqianstone

高烧40℃

积分: 269 帖子: 32 精华: 1

关注我们

官方微信

微信扫一扫,获取注册邀请码!

QQ|Archiver|手机版|小黑屋|第一纳斯网 ( 粤ICP备19046372号-2 )

Powered by Discuz! X3.4 © 2001-2016 Comsenz Inc.

返回顶部