ubuntu 16.04/18.04/20.04/21.10配置远程桌面访问

远程桌面在 Linux 中一般使用 VNC ,下面我们总结一下 ubuntu 16.04/18.04 下的配置总结:

设置开机启动

里面内容如下:

配置 systemd 启用服务

如果登录之后,只出现一个桌面背景,没有任何菜单,如下:

参考 Intel NUC(NUC6i3SYH)在不接显示器的情况下VNC不显示桌面(Ubuntu 18.04) 解决,网上搜索相关问题的时候可以使用关键词 HEADLESS X11 查找解决方案,其实就是不插入显示器的情况下,如何强制显卡渲染。

如果系统是ubuntu 21.10版本,则需要编辑

然后在文件尾部,增加如下配置:

完成后,重启系统。

注意:如果系统上使用nvidia显卡,需要首先通过nvidia-xconfig生成默认配置,如果没有默认配置,会导致 nvidia-smi找不到显卡,一些使用显卡的计算任务或者机器学习框架会出现问题。

参考命令如下:

可能会生成类似如下配置内容:

然后在配置文件的尾部增加

最后修改Section "ServerLayout"字段里的Screen 0为新增的屏幕(Section "Screen" 字段中的 Identifier定义的名字)。

修改参考如下:

修改后的完整内如如下:

尽管经过上面的设置,可以正确使用VNC,但是更推荐使用RDP协议,功能更丰富,性能更高,安全性更好。参考 VNC 还是 RDP? 云上的远程桌面究竟该如何选

参考链接


ubuntu 16.04.5升级到ubuntu 18.04启动时出现"No symbol table found."

ubuntu 16.04.5 升级到 ubuntu 18.04.1 启动时出现 "Error: no symbol table"

重启之后,出现错误信息

不做任何操作,过几秒之后,能跳过。

解决方法如下:

参考链接


ubuntu 16.04.5升级到ubuntu 18.04出现systemd-shim升级失败

ubuntu 16.04.5 升级到 ubuntu 18.04.1 出现 systemd-shim 升级失败,重启系统之后,继续执行软件升级,出现如下错误信息:

如果语言是英文的,可能会出现如下信息:

解决方案如下:

参考链接


在Ubuntu 16.04/18.04/20.04 LTS上安装OpenGrok-1.3.11/1.3.16/1.5.12/1.7.25浏览Android源码

更加推荐通过 Podman/Docker 方式进行部署,参考链接 Ubuntu 22.04使用Podman部署OpenGrok的详细教程

OpenGrok 是一个快速,便于使用的源码搜索引擎与对照引擎,它能够帮助我们快速的搜索、定位、对照代码树。接下来就具体讲解 Ubuntu 16.04/18.04/20.04 LTS 环境下 OpenGrok 的安装及使用。

OpenGrok 1.3.11/1.3.16 依赖 Java 1.8 , Tomcat 8

OpenGrok 1.5.12 依赖 Java 11 , Tomcat 9

OpenGrok 1.6.0开始依赖 Java 11 , Tomcat 10

1.依旧参照 UBUNTU 13.10 APACHE 2.2 通过 AJP 整合 TOMCAT 7 中讲述的方法,进行 Tomcat 8/9Apache 2.4的配置安装,只不过路径中的 Tomcat7 目录替换成 Tomcat8 (ubuntu 20.04 默认 Tomcat9)。

2.安装 Tomcat 8 (ubuntu 18.04)

安装 Tomcat 9 (ubuntu 20.04)

3.安装 universal-ctags 用于对 C\C++ 代码的支持

给代码建立索引时,要使用到universal-ctags工具,但是一般通过apt-get安装的都是exuberant-ctags,所以要先删除原有的ctags版本,然后安装universal-ctags.

4.下载并安装OpenGrok

可以到"https://oracle.github.io/opengrok/"手工下载文件,然后上传到服务器,也可以直接用wget命令来下载,一般选择安装在"/opt"目录下面。

解压缩文件到当前目录"/opt"

创建一个软链接,方便后续的修改

链接"/opt/opengrok/lib/source.war"到 Tomcat8 的工程目录"/var/lib/tomcat8/webapps/",比如我们有多个源代码工程,建议进行链接操作。

如下:

访问"http://localhost:8080/source/"确认OpenGrok是否已经安装成功,如果安装成功,出现下面的界面:OpenGrok

5.出于安全原因,禁止外网访问Tomcat的8080端口

只允许Tomcat在本地的8080端口监听即可,修改

添加 address="127.0.0.1"

重启Tomcat8

6.配置Apache2对Tomcat通过AJP进行反向代理

Apache2 的配置文件“ /etc/apache2/sites-enabled/000-default.conf” (如果开启了HTTPS,则需要同步修改 /etc/apache2/sites-enabled/000-default-le-ssl.conf 或者 /etc/apache2/sites-enabled/default-ssl.conf) 中,增加如下配置:

Tomcat8 的配置文件/var/lib/tomcat8/conf/server.xml中增加如下配置<Context path="/Android_4.2.2" docBase="Android_4.2.2/"/>,解决跳转404问题。ProxyPass后面必须携带“/”,否则就会出现404问题。

7.配置OpenGrok对源代码进行解析

设置要建立索引的源代码目录的位置,以存储在"/data/OpenGrok/Android_4.2.2"上的Android代码为例子:

注意:

由于我们使用了Apache2的反向代理才需要设置 OPENGROK_WEBAPP_CONTEXT,如果没有设置反向代理,请不要设置。

OPENGROK_WEBAPP_CONTEXT 内容就是在 Apache2 中设置的 ProxyPassReverse 指定的参数。

在使用反向代理的时候如果不设置OPENGROK_WEBAPP_CONTEXT会导致在点击具体的变量定义的时候,出现404。

不使用反向代理的时候请只设置OPENGROK_INSTANCE_BASE

这个变量的本质功能就是在建立文件索引的时候,在链接头部增加 OPENGROK_WEBAPP_CONTEXT 指定的路径,比如原来的路径是 https://www.mobibrw.com/a.html ,那么指定路径后,就变成了 https://www.mobibrw.com/ Android_4.2.2/a.html

创建源代码索引

执行时间在40分钟左右,执行完成 。(如果通过SSH远程登录,可能会出现中途连接断开的情况,原因为某项操作比较耗时,导致长时间没有数据通信,网络超时断开。 参考 Linux SSH保持连接(解决Broken pipe))生成的索引文件在源代码的"data"目录下面,重建索引的时候需要执行如下操作,才能再次建立索引

注意,请务必删除源代码中的"prebuilts"目录,这个目录下面存储的是一系列的编译工具,在浏览代码的时候,完全用不上,但是占据的磁盘空间确是巨大的。

注意,如果服务器上面的内存比较有限,请使用如下命令进行内存限制,否则建立索引的时候,会触发内存不足的情况:

修改OpenGrok配置文件

修改其中的

为具体的工程目录"/data/OpenGrok/Android_4.2.2",修改后的配置如下:

刷新浏览器,可以看到Android_4.2.2的源码可以搜索出来了。

参考链接


Ubuntu架设OpenVPN实现内网穿透

前言

家里的网络因为没有公网 IP,有时候想要连接到家里的树莓派或者电脑就无法实现。这个时候可以采用内网穿透的方法远程连接家中的机器,内网穿透的方案有很多,下面介绍一种采用 OpenVPN 实现内网穿透的方案。


配置

主机:腾讯云/阿里云
操作系统:Ubuntu 16.04/18.04/20.04

教程

安装 OpenVPN

首先,我们需要在服务器安装 OpenVPN。在 Ubuntu 系统中我们可以通过 apt 简单的进行安装。同时我们也需要安装 easy-rsa,它可以帮助我们生成 VPN 使用过程中所需的 CA 证书。

设置 CA 目录

OpenVPN 是使用 TLS/SSL 的 VPN。这意味着它利用证书来加密服务器和客户端之间的通信。为了发布受信任的证书,我们需要建立一个自己的简单的证书颁发机构(CA)。 使用 make-cadir 命令复制 easy-rsa 模板到 home 目录。

接着进入刚刚新建的目录准备配置 CA:

配置 CA 变量

进入 ~/openvpn/openvpn-ca 目录后,我们需要修改 vars 文件,以便于生成需要的 CA 值。

在文件底部找到以下配置:

将这些变量修改为任意你喜欢的值,但是不要为空:

然后,我们还要修改紧接着出现的 KEY_NAME 的值,为了简单起见,我们改为 server  (这个不要修改成其他名字,后续的配置文件中默认是这个名字), 默认是 EasyRSA:

构建 CA 证书

针对 ubuntu 16.04 LTS/ubuntu 18.04 LTS 执行如下操作

首先进入你的 CA 目录,然后执行 source vars :

接着会有以下输出:

执行下列操作确保操作环境干净:

现在我们可以构建根 CA:

这将会启动创建根证书颁发密钥、证书的过程。由于我们刚才修改了 vars 文件,所有值应该都会自动填充。所以,一路回车就好了:

现在,我们就有了创建以下步骤需要的 CA 证书。

针对 ubuntu 20.04.6 LTS, 由于OpenVPN版本升级,已经没有上面的命令了,需要调整脚本为如下:

创建服务器端证书、密钥和加密文件

通过下列命令生成服务器端证书和秘钥:

注:server 就是刚才在 vars 文件中修改的 KEY_NAME 变量的值。请不要使用别的名字! 然后一直回车选择默认值即可,不要设置 challenge password ,直接回车即可。到最后,你需要输入两次 y 注册证书和提交。

然后还需要生成一些其他东西。我们可以在密钥交换过程中生成一个强大的 Diffie-Hellman 密钥:

这个操作大约会花费几分钟不等。 然后,我们可以生成 HMAC 签名加强服务器的 TLS 完整性验证功能:

配置 OpenVPN 服务

首先将刚刚生成的各类文件复制到 OpenVPN 目录下:

然后,解压并复制一个 OpenVPN 配置文件到 OpenVPN 目录:

接着更改配置,注释掉 udp 更改协议为 tcp :

找到 tls-auth 位置,去掉注释,并在下面新增一行:

去掉 usergroup 行前的注释:

去掉 client-to-client 行前的注释允许客户端之间互相访问:

开启客户端固定 IP 配置文件夹:

去掉注释后的完整配置如下:

去掉注释之后,精简的关键信息如下:

调整服务器网络配置
调整 UFW 规则

首先,确认UFW防火墙状态,如果状态为开启,则调整。如果防火墙是关闭的,则不需要调整。

如果输出是Status: inactive, 那么不需要进行下面的调整。

注意,下面的调整如果中间出现问题,可能导致防火墙拦截SSH进而无法进行恢复操作。如果出现问题,可以使用阿里云或者腾讯云提供的远程控制台在网页端进行恢复操作。

注意,如果服务器是从早期版本的ubuntu 14.04升级到ubunt 16.04的,那么可能会出现如下警告信息:

原因为存在两个版本的防火墙配置文件 apache2-utils.ufw.profileubunt 16.04) , apache2.2-commonubuntu 14.04) ,这两个配置文件。

我们需要删除早期的防火墙配置文件,如下:

如果服务器上UFW首次启用, 需要手工许可若干常用服务,否则无法远程访问:

当然,也可以直接配置需要开放的端口,但是不推荐,如下:

如果需要删除特定的规则,那么参考如下命令:

打开 OpenVPN 端口并使变化生效

启动OpenVPN

执行:

设置开机自启:

创建客户端配置

生成客户端证书、密钥对

client-mobibrw 为密钥对名称,生成过程中回车选择默认选项即可。

注意,下面这一步一定要输入 y 否则会跳过最后一步,导致生成证书的时候会缺少部分信息。

注意,如果有多个客户端的话,建议为每个客户端生成一份配置文件。

创建客户端配置

执行下列命令,生成客户端配置的基础文件:

然后打开 ~/client-configs/base.conf 文件,修改 remote my-server-1 1194 为服务器公网IP或者域名。 然后更改客户端协议为 tcp:

去掉 usergroup 前的注释:

找到 ca/cert/key,注释掉:

在文件中新增一行:

保存退出文件。

去掉注释后的完整配置为:

创建配置生成脚本

新建 ~/client-configs/make_config.sh 文件,复制如下内容:

针对 ubuntu 20.04.6 LTS,由于OpenVPN版本升级,已经没有上面的命令了,需要调整脚本为如下:

保存并赋予执行权限:

生成客户端配置

执行:

使用此脚本生成一个配置文件方便客户端使用。 注:需要生成客户端密钥后才可使用脚本生成配置文件,client-mobibrw.ovpn 为刚刚生成的客户端密钥名称 生成后的脚本储存在 ~/client-configs/files 目录下,名称为 client-mobibrw.ovpn。将文件下载到本地即可使用了。

为客户端设置固定IP

首先在OpenVPN所在的文件夹内创建ccd文件夹:

然后进入该文件夹并创建与客户端密钥同名的文件:

文件内容如下:

此内容意为固定client-mobibrw客户端的OpenVPN内网IP10.8.0.8

注意,上面的配置在客户端是Windows系统的时候,会报告如下错误:

导致这个错误的原因是 TAP-WIN32 使用默认子网掩码 255.255.255.252 因此一个网段之内只能有两个相邻IP,一个是网关,一个是子网设备。

这个问题在 Linux/macOS 系统上是不存在的,这个是 TAP-WIN32 驱动的限制。

因此,如果系统是 Windows 并且使用 TAP-WIN32 驱动,那么配置的地址只能是如下情况:

或者

或者

前面为设备地址,后面为网关IP. 规律就是 设备地址是 网关地址 +1
继续阅读Ubuntu架设OpenVPN实现内网穿透

解决Btrfs文件系统ext2_saved文件磁盘占用异常

最近在 OpenMediaVault 4.1.22-1(Arrakis) 进行磁盘文件占用分析的时候,发现磁盘空间异常占用问题,如下:

这个 1.3T ./ext2_saved  文件是不存在的,并且没办法通过常规命令删除。

这个文件产生的原因是,执行过 从 EXT3/4 转换转化分区到 Btrfs :

完成转换需要删除备份的 ext2_saved 子卷,否则空间会不能释放。 请注意,如果没了它(备份子卷),你将没办法还原回 EXT3/4 文件系统。

可能会报错:

无视这个报错即可。

完成后再次查询文件占用空间:

可以看到空间已经被释放了。

参考链接


解决undefined reference to pthread_atfork/pthread_detach/pthread_create/pthread_join

在编译陈硕github上面的代码时,遇到了链接错误:

在编译时已经加了-lpthread,还是有这个问题。

在这里找到了答案:http://stackoverflow.com/questions/2373109/what-library-to-be-to-be-used-to-avoid-undefined-reference-to-pthread-atfork

pthread_atfork是POSIX标准,在编译时要加上-pthread
-lpthread是老版本的gcc编译器用的,在新版本中应该用-pthread取代-lpthread

参考链接


解决undefined reference to pthread_atfork/pthread_detach/pthread_create/pthread_join

解决ubuntu 16.04下更改MySQL的数据库位置

ubuntu 16.04下使用APT安装的MySQL的数据库,目录同时接受apparmor的管理,因此在修改数据库目录的时候,需要同步更新apparmor的配置文件。如果只是迁移数据库的话

对于日志文件一起迁移的情况

如果依旧启动失败,并且 MySQL 是从低版本升级上来的,并且目前正在使用的版本大于或者等于 MySQL 5.7 ,执行 journalctl -xe 观察到类似如下内容:

那么,此时的MySQLapparmor 配置文件可能还没有更新,这个时候,我们需要手工在/etc/apparmor.d/usr.sbin.mysqld 增加几个文件目录的权限,如下:

另外,注意到我这边出现

此时,如果检查目录权限,出现如下现象:

那么需要变更用户的所有者,早期版本支持所有者为 adm 用户组,新版本需要 mysql ,我们执行如下命令:

参考链接


解决ubuntu 16.04下adb shell报错"error: insufficient permissions for device"

最近在ubuntu 16.04下执行adb shell,时候报告如下错误:


原因为当前用户的权限不能调用系统底层的一些权限,需要提权,使用sudo执行即可解决此问题。

修正ubuntu 16.04.5系统上vsftpd服务无法启动的问题

一直使用的服务器使用的是ubuntu 16.04.5,默认启用了vsftpd服务。但是最近在执行软件更新之后,出现vsftpd服务无法启动的问题。

当时是按照 Centos/Ubuntu FTP服务器的架设和配置 进行配置的。

具体的错误信息如下:

从错误信息中,我们可以看到返回的错误信息如下:

错误代码为2,查询Linux的系统错误代码,错误信息为"errno2 : No such file or directory"。

打开/etc/vsftpd.conf,可以看到,里面的配置文件中

我们发现已经找不到这个SSL证书了。

解决方法如下:

1.首先移除已经安装好的服务,并且删除配置文件

然后按照 Centos/Ubuntu FTP服务器的架设和配置 重新配置一遍。安装的时候,会自动搜寻系统已经安装的有效证书,如果找不到,会自己生成一份证书。

2.也可以手工生成一份自签名的证书,推荐这个方法

参考链接


How to secure VSFTPD FTP Server using a self-signed SSL/TLS certificate in CentOS 7 – FTPS