suqianstone 发表于 2013-4-29 03:26:01

为群晖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 archivemountsudo 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.xPart 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   , 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
.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   , 0
.text:000000000000039A 74 D4                                 jz      short loc_370
to
.text:0000000000000395 80 7C 24 17 00                        cmp   , 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 (个人觉得没必要,没测试)sudo umount /mnt/hdd在/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文件,开始打包tar cvf system.tgz *将得的system.tgz文件改名为PAT后缀。

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

suqianstone 发表于 2013-4-29 03:34:36

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 发表于 2013-4-29 11:10:10

凌晨3点啊

feng5064 发表于 2013-4-29 12:21:55

楼主乃真高人,厉害!感谢分享教程!

EverGame 发表于 2013-4-29 13:33:15

比较详细的教程了。

gz_zxq 发表于 2013-4-29 21:22:10

suqianstone 发表于 2013-4-29 21:28:21

gz_zxq 发表于 2013-4-29 21:22 static/image/common/back.gif
非常感谢楼主的无私奉献

不客气,我希望能有闲时间的朋友能把常见的各种HBA卡,各种网卡驱动编译出来,加进rd.gz重新打包跟大家分享。

ccna1111 发表于 2013-4-29 21:37:50

楼主真的是大牛啊

所所思 发表于 2013-4-29 21:56:53

sas卡当硬盘扩展卡很好用 希望lz造福大家 呵呵 我手头上只有m1015和m5015 需要测试的时候通知一声

fyjsy 发表于 2013-4-29 23:36:48

想得太美 不会是ROS和m0n0china里的吧?

EverGame 发表于 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 進去, 但能用嗎? {:7_198:}

suqianstone 发表于 2013-4-30 08:06:14

fyjsy 发表于 2013-4-29 23:36 static/image/common/back.gif
想得太美 不会是ROS和m0n0china里的吧?

恭喜你,答对了,我就是routerclub的另外一个叫zsk2000

wenjuner 发表于 2013-4-30 11:12:54

高手终于现身了,支持

随风飘逝ゞ 发表于 2013-5-1 00:51:14

汇编是一窍不通。楼主乃真高人,厉害!
页: [1] 2 3 4 5 6 7 8
查看完整版本: 为群晖DSM增加自己需要的HBA卡驱动