NAS搭建

建立一个qnap编译环境系统

LensNews
前言
  因为个人原因不再折腾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 千兆网卡全部选中m,退出保存,否则启动会找不到网卡,连不上网

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

红框中改成如下

/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没有提供完整的内核源码。

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)

本文由来源 那是云,由 强哥 整理编辑!

LensNews

热评文章

发表回复