• 那是云首页
  • 快捷导航
  • 更多
    设为首页收藏本站
  • |
花生壳

建立一个qnap编译环境系统

威联通 QNAP  / 教程分享  / 只看大图  / 倒序浏览   © 著作权归作者本人所有

#楼主# 2021-6-21 20:26

跳转到指定楼层
前言
  因为个人原因不再折腾qnap的系统了,本来温控驱动算最后一帖了。不过想了下,把不涉及qnap破解的 我的建立qnap编译环境系统的过程 也发给大家,大家可以继续研究下去。当然我也是刚接触Linux不久,也是个小白而已,很多不够专业,方法过程不是非常正确,如果你们有更好的办法或者指出我错误的地方,希望大家指出来,给后人少走弯路。

  先说说当初我为啥要建了一个qnap编译环境系统,不是可以交叉编译qnap的源码吗?交叉编译有很多的局限性,比如我们要移植nvidia amd的官方闭源驱动到qnap上就没办法了,比如要编译个自己定义的ffmpeg交叉编译移植到qnap上就会非常非常的麻烦。这些是我当初 编译移植jellyfin的过程中碰到的问题。我当时想,qnap官方应该有一个编译环境系统,可以在该环境下直接编译各种程序以及内核驱动,然后可以很方便的移植到qnap下,于是我尽量去模仿生成一个qnap编译环境系统。

  主要的思路在于gcc的版本,我记得qnap的gcc的4.9.2,debian8的gcc也是4.9.2,以debian8作为底版来建立。在debian8下编译qnap内核,生成 qnap的4.14..24版本内核bzImage来引导,那么在此基础的系统上编译的程序和驱动都可以无缝移植到qnap下运行了。


主要过程
建了虚拟机安装debian8,编译qnap对应版本源码,用编译好的内核进行引导系统


1.先建立个虚拟机安装debian8

esxi或者pve都可以,推荐用intel网卡和sata接口硬盘,当然你用实体机应该也可以.
在虚拟机上安装debian8,内核版本我记得应该3.6*,有点忘记了。不要安装带桌面的debian8,否则会有点麻烦,自己把桌面系统关了。
注意:Debian系统安装过程,选择分区模式,务必选择单个分区,不要选择其他诸如LVM之类分区模式
Debian8安装完成后自行安装openssh用root shell登陆,以下我全是root用户权限执行的。
修改/etc/apt/sources.list改成163的源
仅仅需要安装以下
apt-get install libncurses5-dev -y
apt-get install libelf-dev -y
apt-get install dpkg-dev -y
apt-get install dialog
apt-get install bc

其他程序尽量不要升级安装先

2.准备工作

2.1下载解压相关文件
我建了个/home/pcp目录
把qnap的x64工具链和对应版本的源码文件,自行下载
Cross Toolchain SDK (x86) 20180115.tgz
GPL_QTS-4.4.3-20201013_Kernel.tar.gz 版本你们随意,这里是4.4.3为例
上传到debian8的/home/pcp目录解压

2.2导入.config文件
然后把对应版本的qnap固件解压比如x72的4.4.3固件,把/lib/modules/.config拷贝出来,或者已经安装好的实体机对应版本的的/lib/modules/.config拷贝出来放入解压后kernel的目录。
我这里比如/home/pcp/GPL_QTS/src/linux-4.14/目录进行覆盖

这里需要特别注明的一点,每个机型每个版本的.config都是不一样的,尽量用该机型该版本的.config进行覆盖编译,否则有可能会这个版本可以使用,下个版本会出问题,qnap的4.4.*以上的版本问题都不大了,以前一个小版本的升级就会造成驱动不能跨级使用了

2.3修改Makefile
把/home/pcp/GPL_QTS/src/linux-4.14/目录里面的cflag_kernel_qnap.mk里面的2行参数传入Makefile文件里面的CFLAGS_MODULE CFLAGS_KERNEL
前面几个参数自己对应机型cpu修正一下
CFLAGS_KERNEL     = -DTSX72 -DQNAP -DX86_COFFEELAKE -DNAS_VIRTUAL -DNAS_VIRTUAL_EX -DQNAP_FNOTIFY*************
CFLAGS_MODULE   = -DTSX72 -DQNAP -DX86_COFFEELAKE -DNAS_VIRTUAL -DNAS_VIRTUAL_EX -DQNAP_FNOTIFY*************
x72机型 cpu类型COFFEELAKE(cpu类型可以参考一下这个目录里面都有/home/pcp/GPL_QTS/src/linux-4.14/QNAP/)
Model文件里面改成TS-X72

2.4设定交叉编译环境变量,路径按你自己的设定

export PATH=$PATH:/home/pcp/x86_64-QNAP-linux-gnu/cross-tools/bin/
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/home/pcp/x86_64-QNAP-linux-gnu/cross-tools/lib/
export CROSS_COMPILE=x86_64-QNAP-linux-gnu-
export ARCH=x86_64
export SUPPORT_FAST_BLOCK_CLONE=yes
export SUPPORT_TPC_CMD=yes

备注:
最后两条设定,export SUPPORT_FAST_BLOCK_CLONE=yes和export SUPPORT_TPC_CMD=yes
其实我当初的解决办法是(如果上述环境变量指定无效导致报错可以一试)
修改/drivers/target/Makefile

# QNAP codes (Fast Block Clone)
ifeq ($(SUPPORT_FAST_BLOCK_CLONE),yes)
target_core_mod-$(CONFIG_MACH_QNAPTS)        += qnap/target_core_qfbc.o
endif

# QNAP codes (ODX)
ifeq ($(SUPPORT_TPC_CMD),yes)
target_core_mod-$(CONFIG_MACH_QNAPTS)        += qnap/target_core_qodx.o \
                                           qnap/target_core_qodx_core.o \
                                           qnap/target_core_qodx_lib.o \
                                           qnap/target_core_qodx_rb.o \
                                           qnap/target_core_qodx_vpd.o
endif
4行红字全部删除或者注释掉,export SUPPORT_FAST_BLOCK_CLONE=yes没测试过,今年有一次偶然在qnap官方论坛看到过,你们可以试试

3。编译
执行
cd /home/pcp/GPL_QTS/src/linux-4.14/
make clean
make menuconfig图形界面
device drivers---network device support-ethernet drvier support

intel网卡

intel网卡


把intel 千兆网卡全部选中m,退出保存,否则启动会找不到网卡,连不上网

make deb-pkg -j12
我这里开12个线程或者自己改大小,漫长的等待编译完成后,在/home/pcp/GPL_QTS/src/linux-4.14/上级目录生个数个deb文件

deb

deb



4。安装deb
回到上级包含deb目录,安装deb前最好做个虚拟机快照或者备份
第一次编译应该是qnap-1_amd64.deb这样文件名
dpkg -i linux-headers-4.14.24-qnap_4.14.24-qnap-3_amd64.deb
dpkg -i linux-libc-dev_4.14.24-qnap-3_amd64.deb
dpkg -i linux-image-4.14.24-qnap_4.14.24-qnap-3_amd64.deb
grub-mkconfig -o /boot/grub/grub.cfg
depmod

完成后千万千万不要重启!!!!!启动必挂。
执行 apt-get -f install
修改/boot/grub/grub.cfg,插入红色部分
        echo        '载入 Linux 4.14.24-qnap ...'
        linux        /boot/vmlinuz-4.14.24-qnap root=/dev/sda1 console=tty0  ro initrd=/install/initrd.gz quiet
        echo        '载入初始化内存盘...'

        initrd        /boot/initrd.img-4.14.24-qnap

保存后重启


5.手动添加swap文件,暂时解决一下。
重启时,滚动代码发现启动过程未找到swap交换分区
sudo swapon -show
free -m

发现swap分区为空,我这里是建个swap文件解决

创建一个8G的swap
sudo dd if=/dev/zero of=/swapfile bs=1024 count=8196k
sudo chmod 600 /swapfile

格式化交换分区
sudo mkswap /swapfile
sudo swapon /swapfile

修改/etc/fstab
把swap修改为

swap

swap

红框中改成如下
/swapfile swap swap defaults 0 0


再次查看
sudo swaposwapn -show
free -m

sudo sysctl vm.swappiness=10

再次reboot后正常。

6.关于glibc版本

进入系统后看一下内核版本已经是qnap-4.14.24,唯一的缺点是
glibc版本是2.19我记得,而qnap系统glibc应该是2.21
因为2.19和2.21直接差异非常小,基本我上我使用下来,几乎没有碰到问题
用低版本的2.19编译的程序和驱动都可以在2.21上运行

然后我就只能用笨办法解决了,只是不建议这么做

第一个是自己手动编译安装glibc2.21,中间过程很艰辛,其实编译不是问题,安装非常麻烦,几乎都是不提倡自己编译升级glibc
最后按照这个连接https://blog.51cto.com/u_13740724/2353937这个教程终于编译安装glibc2.21完成升级.

第二个办法是去
http://old-releases.ubuntu.com/ubuntu/pool/main/g/glibc/下载编译好的glibc-2.21安装

这些只是我瞎折腾的东西,还是建议不要升级glibc。

关于glibc,希望有懂的网友下面补充一下.

7.最后

现在你可以在这个系统里面编译完成的程序都可以直接移植到qnap的4.14.24机型上运行,这个跟机型就无关了
如果有缺失的so库文件同步复制过去就行了,指定一下环境变量就行了。

驱动类的话 这个就要注意了
跟你当时使用的何种机型.config文件就要匹配了

比如你这个系统是用的4.4.3的x72机型的.config文件
你可以在这个编译amd nv等等官方闭源驱动,然后直接移植到4.4.3的x72机型上加载了。
又比如有些驱动是dkms方式的,都只要直接make就行了。
比如我前面的it87.c驱动直接make就行了

当然在编译的时候 如果
make bzImage -j12
生成的/home/pcp/GPL_QTS/src/linux-4.14/arch/x86/boot/bzImage,替换对应qnap机型版本固件2-3分区boot目录里面的bzImage,做自己的定制引导系统,当然还不是很完美,毕竟qnap没有提供完整的内核源码。


以上应该有很多不足或者错误的地方,你们继续吧

评分

参与人数 1云币 +50 贡献 +50 收起 理由
mojelly + 50 + 50 技术才是王道~其他神马都是浮云

查看全部评分

那是云论坛 - 国内知名的NAS交流平台
http://www.nasyun.com
分享淘帖
回复 印象

使用道具

2

精华

46

回帖

4512

积分

技术达人

Rank: 6Rank: 6

云币
301
贡献
320
活跃
2685
精华
2
r-MT 发表于 2021-6-21 20:27 来自 中国江苏无锡
本帖最后由 r-MT 于 2021-6-21 20:49 编辑

amdgpu-pro官方驱动的初步移植
先给以上虚拟机直通一个amd显卡,我用的是rx550测试。
编译参考链接https://wiki.debian.org/AMDGPUDriverOnStretchAndBuster2以19.10为例
下载https://drivers.amd.com/drivers/ ... ubuntu-18.04.tar.xz
(先不打补丁,也不安装mesa libdrm等等,纯测试ko)


一。修改/usr/lib/os-release


先备份/usr/lib/os-release
修改这两行:
VERSION="18.04"
ID=ubuntu
保存

二。编译驱动
tar -xvf amdgpu-pro-19.10-785425-ubuntu-18.04.tar
cd amdgpu-pro-19.10-785425-ubuntu-18.04
dpkg -i amdgpu-core_19.10-785425_all.deb
dpkg -i amdgpu-dkms_19.10-785425_all.deb
完成后恢复/usr/lib/os-release

过程中出错处理
看了下出错log,kcl_fence.c出错
大意是signal_pending函数没定义,百度了一下
Linux 4.11开始,声明signal_pending函数的头文件从<linux/sched.h>变成了<linux/sched/signal.h>

把/usr/src/amdgpu-19.10-785425/amd/amdkcl/kcl_fence.c里面的
<linux/sched.h>改成<linux/sched/signal.h>

然后cd /usr/src/amdgpu-19.10-785425
dpkg-reconfigure --force amdgpu-dkms

三。提取文件
把/var/lib/dkms/amdgpu/19.10-785425/4.14.24-qnap/amd64/module/目录打包,
里面是ko文件
amdgpu_ko.tgz  amdchash.ko  amdgpu.ko        amdkcl.ko  amd-sched.ko  amdttm.ko

firmware文件打包
/lib/firmware/4.14.24-qnap/amdgpu目录打包amdgpu_fireware.tgz

四。关闭虚拟机,amd显卡拔下来装到我的x72机器上

把前面提取的ko文件放入qnap的x72系统上/lib/modules/4.14.24-qnap/
把Firmware文件解压的amdgpu目录放入/lib/firmware/

手动测试挂载驱动
cd /lib/modules/4.14.24-qnap/
insmod ./amdkcl.ko
insmod ./amd-sched.ko
insmod ./amdttm.ko
insmod ./amdchash.ko
insmod ./amdgpu.ko

可以看到amd 驱动已经正常挂载了,如果接显示器的话,明显分辨率上去了。
然后把以上这些步骤加入启动脚本,那么你就完成amd 官方闭源驱动的移植了

当然要注意的,前面的系统是我用x72的.config生成的,所以对应上面的amd 闭源驱动只能在x72上挂载了。

五。如法炮制,nvidia的官方闭源驱动 也可以完成移植。不过nvidia的官方驱动移植比amd就麻烦多了,有兴趣的朋友可以研究一下。




回复 支持 反对 印象

使用道具 举报

0

精华

66

回帖

2039

积分

搞机大神

Rank: 3Rank: 3

云币
0
贡献
2
活跃
1995
精华
0
menstry 发表于 2021-6-21 20:54 来自 中国河北廊坊
厉害,感谢楼主分享
回复 支持 反对 印象

使用道具 举报

0

精华

107

回帖

1262

积分

发烧玩家

Rank: 2

云币
0
贡献
8
活跃
1168
精华
0
lmhtz 发表于 2021-6-22 06:01 来自 中国浙江台州
顶起来。。。。。。。。。。。。。。。。
回复 印象

使用道具 举报

0

精华

39

回帖

288

积分

入门用户

Rank: 1

云币
0
贡献
0
活跃
268
精华
0
QQ
xulouliu 发表于 2021-6-22 09:00 来自 中国江苏南通
太深奥,不懂,但是一定要支持@
回复 支持 反对 印象

使用道具 举报

0

精华

41

回帖

408

积分

入门用户

Rank: 1

云币
0
贡献
7
活跃
352
精华
0
dhec 发表于 2021-6-22 09:12 来自 中国广东广州
厉害,技术贴。菜鸟一个,看了也不会弄。谢谢楼主的技术贴
回复 支持 反对 印象

使用道具 举报

0

精华

201

回帖

2830

积分

搞机大神

Rank: 3Rank: 3

云币
50
贡献
47
活跃
2491
精华
0
zeroqi2008 发表于 2021-6-23 12:00 来自 中国广东韶关
感谢大佬分享                        
回复 支持 反对 印象

使用道具 举报

0

精华

184

回帖

1613

积分

发烧玩家

Rank: 2

云币
0
贡献
134
活跃
851
精华
0
tyy474 发表于 2021-6-23 14:28 来自 中国广东云浮
开始按部就班实践一下
回复 支持 反对 印象

使用道具 举报

0

精华

61

回帖

645

积分

入门用户

Rank: 1

云币
0
贡献
0
活跃
614
精华
0
qyxk 发表于 2021-6-23 20:01 来自 中国广西梧州
大佬如果直接在qnap机子用lxc装debian能不能省掉编译内核的环节直接安装对应版本的gcc版本编译东西行不行呢

点评

编译普通程序 直接移植的 问题不大 普通程序 主要看gcc版本不要超过 qnap的4.92, 但是现在很多新版本程序,指定gcc 5以上了,降级编译的话也是个非常麻烦的事情 glibc不要超过2.21 很多程序往往需要引用gli  详情 回复 发表于 2021-6-23 20:56
回复 支持 反对 印象

使用道具 举报

2

精华

46

回帖

4512

积分

技术达人

Rank: 6Rank: 6

云币
301
贡献
320
活跃
2685
精华
2
r-MT 发表于 2021-6-23 20:56 来自 中国江苏无锡
qyxk 发表于 2021-6-23 20:01
大佬如果直接在qnap机子用lxc装debian能不能省掉编译内核的环节直接安装对应版本的gcc版本编译东西行不行呢

编译普通程序 直接移植的 问题不大

普通程序 主要看gcc版本不要超过 qnap的4.92,
但是现在很多新版本程序,指定gcc 5以上了,降级编译的话也是个非常麻烦的事情

glibc不要超过2.21
很多程序往往需要引用glibc库的很多函数,特别要注意一下。
一旦超过2.21又要想很多办法 才能解决,非常非常的麻烦。

主要是qnap的内核版本低4.14.24,gcc低4.9.2,glibc版本低2.21
很多程序的移植也不是说说这么简单的。
只是相对交叉编译的话,难易程度 简直不知道降低了多少。

如果是驱动类的编译的话,要引用qnap对应内核的头文件。

我这里make deb-pkg生成了包含头文件的deb,安装进去才行。
比如前面的linux-headers-4.14.24-qnap_4.14.24-qnap-3_amd64.deb。


你用lxc也好,qnap的原生系统也好,都不包含qnap头文件的。
所以嘛,你这个办法是不行的
回复 支持 反对 印象

使用道具 举报

123下一页
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 搜索 官方QQ群
懒人地图| 手机版|小黑屋| 智能生活 , 上那是云 |闽ICP备2020018196号-1 |网站地图