编译的那点事

由于想利用网络的各种服务器,在网络中做了一台openwrt软路由,里面各种功能插件方便好用。最开始是直接从互联网上下载一些玩家共享的固件,也能比较好地使用,但总感觉有时功能配置不是太合适,或者也有点担心,是不是有后门之类。在学习一段时间后开始了自己编译固件,一年多来经过多次实践,说几点心得体会吧,我是直接用群晖NAS来完成所有工作的。

一、在GitHub上开源的几个主要源码肯定都能编译成功

现在GitHub上有多个固件源,很多个的插件源,从使用过的源码看均能编译成功,过程中可能会有冲突之类,但做一定调整之后能够编译,这说明这些共享本身并没有大的问题。如果编译不能通过主要还是要从自身的系统去找问题。

二、可以采用Docker容器做编译平台,减少了搭建编译平台的复杂性和工作量,中间做文件修改和传递也十分方便。

1、在NAS套件中下载ubuntu20.04官方镜像,用ubuntu20.04镜像建立容器,不做任何额外设置。

2、SSH进入容器后台更换为中科大源并安装编辑工具nano,为ubuntu添加普通用户,并增加sudo权限

sed -i ‘s/archive.ubuntu.com/mirrors.ustc.edu.cn/g’ /etc/apt/sources.list

apt-get update

apt-get upgrade

apt-get install nano

由于编译环境要求不使用root用户编译,所以需要增加一个普通用户

useradd -mk /home/openwrt -s /bin/bash openwrt

passwd openwrt

nano /etc/sudoers

3、将硬盘上一个准备用来保存源码的文件夹映射到上述建立的用户主目录中

三、可以在NAS的管理系统中修改源码配置文件,如feeds.conf.default。

四、按各源码官方说明在容器后台进行编译。

五、第一次无法正常编译,提示各种错误

第一次编译很多人会出现无法正常运行,提示各种错误的问题,这个问题主要来自三方面原因

一是编译平台搭建有问题,就是Linux没有正确的编译环境,解决这个比较简单,就是安装运行源码官方的依赖,确保系统提示都已经安装,没有任何错误,只要提示错误就要全部解决。

二是部分插件之间有冲突

三是编译中各种库文件没有按要求下载到本地,看似下载完成,其实有缺失文件。

1、 不要过多添加其他的源,这样基本可以避免插件冲突问题

2、 make menuconfig中尽量选择默认

3、 正式编译前各步骤要基本没有错误提示,否则重新执行,直到无错误提示。

其中 make -j8 download 下载dl库,非常关键,需要反复执行并确认无误,因为网络关系经常无法完全下载好。

在第一次编译时,不能只看每一步的执行结果,要翻查屏幕中执行显示的反馈信息,如果中间有错误或下载超时等提示,肯定是不能通过的。

总之,没有下载好相关文件是编译不正常的主要原因,在编译过程中要从世界各地服务器下载相关文件,由于网络的原因有些人很难下载到这些必要的文件。

六、部分警告提示可以忽略,一般能够正常编译,似乎警告信息都不会产生严重错误。

很有可能编译成功后,再次进行编译又提示错误,这是因为开始编译后,系统仍然要与各源码网站和库文件通讯,有可能会部分更新一些文件,从而与原有系统产生冲突,如无法调试消除错误,可以删除整个编译文件系统重新下载相关文件后再编译。

群晖Docker中的Nextcloud挂载任意本地存储

最近升级到21.0版的Nextcloud,在挂载外部存储时遇到了麻烦,无论是本地还是远程使用效果都不理想。本地挂载时,直接利用文件服务能挂载的只有SMB,FPT或SFTP均不能连接,但SMB有时出现运行资源消耗高的问题,读正常但编辑文件有时会出现不能写入的问题。用FTP挂载同城远程共享时系统反应很慢,而群晖本身挂载同一个共享却可以秒开,这说明Nextcloud的网络配置有严重问题。这也许是新版本的问题或群晖DSM7.0的问题,因为以前版本挂载非常方便,一般用SFTP直接挂共享文件夹,简单方便无需复杂配置。

如果把Nextcloud作为生产力工具来使用,必然要解决频繁生成文件和编辑文件,也就是要连续快速的读取和写入,挂载远程效果差,用文件服务器挂载本地效果也很差。经过大量探索,成功实现不用文件服务器直接挂载群晖NAS上的任意共享文件夹。

实现这个功能的基本原理是,利用Nextcloud的本地挂载功能,挂载一个内部的本地目录,这个目录是容器内的;再利用容器的卷映射将挂载的容器目录映射到要实际存储的目录上;第三步是更新Nextcloud的数据库,让Nextcloud记录实际存储目录的结构信息并关联到自身的文件管理系统中。

1、SSH进入群晖后台,并取得管理员权限。

2、进入Nextcloud容器,建立挂载文件夹。

docker exec -it nextcloud bash

cd /var/www

mkdir file1

3、登录Nextcloud,以管理员身份挂载file1文件夹

其中file是显示在Nextcloud中的名字,可以自定义,将挂载的文件指定给授权的user1用户。

4、关闭Nextcloud容器,建立存储空间映射

4.1 打开群晖的docker套件,关闭Nextcloud容器

4.2 将要使用的目录映射到被挂载的目录

其中target文件就是我们实际要用于工作中存储文件的文件夹,可以是群晖中任意一个文件夹。

5、启动容器,更新数据库

5.1 启动容器,并SSH进入群晖后台

5.2 扫描Nextcloud挂载的所有文件系统

docker exec –user www-data nextcloud php occ files:scan –all

5.3 以普通用户身份user1登录Nextcloud,检查系统是否正确显示并列出target目录下所有的文件,尝试新建文件并编辑保存相关文件。

为避免系统的权限和文件保护问题,target目录尽量不要是NAS的共享根目录,并授于合适的权限。

由于本地挂载的是NAS的文件夹,直接通过映射来读写数据,与直接使用群晖的filestation是一样的,完全没有延迟的问题,只要网络正常体验是所有连接中最好的。

Calibre-web的搭建与使用

昨天完成该服务的搭建调整,今天抓紧记录一下,怕时间长一点忘记,以前很多服务部署没有完整记录文档,一段时间后系统有变化或进行了升级,服务出现问题,再调试有让人疯掉的感觉,特别有一些高难度的系统集成出现问题更没有办法短时间解决好了。如前几天升级了NAS,onlyoffice出问题了,暂时毫无头绪。

采用Docker方式部署该服务。

1、不同镜像的选择

参考网络文章,部署了四种不再镜像,最后选择linuxserver/calibre-web。可能系统是最新的Docker版本的原因,网络推荐的几个镜像都有问题,janeczku/calibre-web无法正常运行,technosoft2000/calibre-web无法在线阅读。

2、搭建

docker方式部署calibre-web需要设置的东西可以非常简单。

2.1 其中容器的8083端口需要映射出来,其次是容器的/books目录需要映射出来,该目录是电子书的存放位置。

2.2 其它参数可以不填,一路默认。但建议增加一个环境变量 -e TZ=Asia/Shanghai 这是设置一下时区为上海,以避免容器中时间显示偏差。

3、使用

3.1 删除guest客户,系统带有这个公共帐户,可以在权限管理中进行删除。

3.2 有的书籍没有封面,可以在网络上找一张图片,然后单独上传封面。