前言
因为个人原因不再折腾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 千兆网卡全部选中m,退出保存,否则启动会找不到网卡,连不上网
make deb-pkg -j12
我这里开12个线程或者自己改大小,漫长的等待编译完成后,在/home/pcp/GPL_QTS/src/linux-4.14/上级目录生个数个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
红框中改成如下
/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
第二个办法是去
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没有提供完整的内核源码。