前因
由于当前所在的单位需要更换openEuler 21.10系统(所谓的国产系统,以下简称欧拉),所以当前的所有服务器都需要迁移,包括ftp、es、mq、k8s等。
起初,我已经有了踩坑的心理准备,没想到迁移过程中,一路坎坷。当开始迁移FTP(vsftp)服务器,开始增加虚拟用户登录的时候,看到了让我头大的报错user_lookup: could not open database /etc/vsftpd/vftpuser: No such file or directory
。经过一顿检查,发现文件确实存在,且文件权限也没有问题,而在pam配置文件里面,我也换成了绝对路径,但它一直就报这个错误。
经过
尝试centos
首先,之前部署ftp服务的系统是基于Centos7的,所有的配置都是正常再用的,所以我直接拿一台Centos7虚拟机来再次验证下配置和我的操作,验证结果是一切正常。
尝试Rockylinux
既然centos7完美通过测试,那么鉴于openeuler 21.10比centos7新,所以我就再拿rockylinux8来进行测试,不出意外,验证结果也是一切正常。
思考
既然常见操作系统都是没有问题的,且一切功能都是正常的,那么就要思考下到底是哪里出了错。 首先想到的是pam引用的so文件版本不是最新的,其次排查vsftp的软件是不是欧拉的,然后看下db_load
工具及其依赖是否是符合要求的。但最后看下来,这些都是没有问题的,这就使我陷入了深深的沉思了。 无奈之下,求助操作系统组的大佬,但是大佬给出的解决方案是让我检查部署的安装包是否是欧拉的。
解决
在折腾了两天之后的一个夜晚,我实在搞不明白了为啥这个vsftp就这个诡异,google了一圈也没发现有价值的解决方法,无奈之举,跑去欧拉的官网、论坛等相关阵地开始search,终于搜索到了相关大神也遇到了我的这个问题。
大佬给出的根因和解决方法如下:
根因是pam软件包切换了gdbm作为数据库 你之前的方法是使用'db_load -T -t hash -f /etc/vsftpd/virtusers.txt /etc/vsftpd/virtusers.db'来生成数据库(libdb方式), 现在需要更改为使用'gdbmtool /etc/vsftpd/login.pag store ftpuser 123456'来生成数据库(gdbm方式)
但实际上,我使用了此方法并没有解决我的问题,反而出现了新的报错:
代码语言:javascript复制Apr 20 22:11:29 bclinux-for-Euler vsftpd[4172]: pam_userdb(vsftpd:auth): user_lookup: could not open database `/etc/vsftpd/login': Bad file descriptor
这个报错更让我疑惑,生成的这个db文件是没有问题的,使用gdbmtool 查看db文件也是可以正常显示的:
代码语言:javascript复制[root@bclinux-for-Euler vsftpd]# gdbmtool login list
ftpuser 123456
随后又看到了一位大佬的解决方法,即把centos系统里面的/lib64/security/pam_userdb.so
放到欧拉里面,重启vsftp之后,一切终于安静了。