Browsed by
分类:Linux

日新月异的技术,潮流人士的选择!

Ubuntu 19.04

Ubuntu 19.04

在虚拟机里安装并体验了一下,新界面整体上偏黑色,比以前的界面成熟些。

Ubuntu 19.04 界面截图
Ubuntu 19.04 界面截图

似乎比以前的版本更慢了,不知道是不是因为VirtualBox的原因(已启用硬件虚拟化VT-x/AMD-V),每一次点击后的反应都十分缓慢。简单体验还能忍受,但绝对无法在实际工作中接受这种速度,也许在物理机上会有更好的运行效率。

没有什么惊喜的地方,体验一下后可以删除了。

Debian 8 升级 Debian 9 (DO篇)

Debian 8 升级 Debian 9 (DO篇)

这两天升级几个Debian 8 (jessie)的droplet,屡次失败,后来参考了一篇blog(请点击此处了解),并多次尝试后才最终成功。回过头来看看,其实整个过程很简单,只是被一个点卡住,就来回折腾。本文简要记录一下操作顺序和操作要点,以备日后查看。

修改 /etc/apt/sources.list 文件

这个是通用步骤了,修改成 Debian 9 (stretch) 的源即可。

deb http://deb.debian.org/debian stretch main contrib non-free
deb http://deb.debian.org/debian stretch-updates main contrib non-free
deb http://deb.debian.org/debian stretch-proposed-updates main contrib non-free
deb http://deb.debian.org/debian stretch-backports main contrib non-free
deb http://deb.debian.org/debian-security stretch/updates main contrib non-free

deb-src http://deb.debian.org/debian stretch main contrib non-free
deb-src http://deb.debian.org/debian stretch-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-proposed-updates main contrib non-free
deb-src http://deb.debian.org/debian stretch-backports main contrib non-free
deb-src http://deb.debian.org/debian-security stretch/updates main contrib non-free

这里也可以用 DO 自己的镜像站点的源(http://mirrors.digitalocean.com/)。考虑到我们的droplet都部署在欧洲和美国,因此速度上没太大差别,还是直接取官网的源好了。

备份 /etc/cloud 目录

使用以下命令直接备份即可。这步骤非常重要,实际上是整个升级的关键点!后面操作中,必须要还原这个目录!

cp -r /etc/cloud /etc/cloud-bak

停止所有相关的服务

这也是通用步骤,没什么细讲。有什么服务就停什么服务好了。

systemctl stop apache2
systemctl stop mysql
systemctl stop fail2ban
systemctl stop dovecot

更新并升级

需要注意的是,一般情况下,升级提示是否保留原有配置时,一般都保留原有配置,这个也是默认选项。但是对于fail2ban的jail.conf文件,建议采用系统新的文件,后面手工再改即可。

我在这个更新过程中,没有提示是否保留/etc/cloud的配置,因此后面需要手工还原备份的/etc/cloud目录,如果是系统提示了,务必要保留原有的/etc/cloud配置。

apt update
apt upgrade
apt dist-upgrade

还原 /etc/cloud 目录

完成各项更新后,先不要重启系统,务必先还原 /etc/cloud 目录。这步相当关键!如果没有还原,将采用系统新的/etc/cloud 配置,导致cloud-init 过程失败,系统无法启动!

rm /etc/cloud
cp -r /etc/cloud-bak /etc/cloud

最后,就是重启系统,完成整个升级。

关于 /etc/cloud 目录,只在 DO 的系统中有这个目录,在 Linode 等其他VPS系统没有发现。感觉是 DO 处理上一个不太完善的地方,这个目录似乎没有必要暴露给客机系统,主机系统配置即可。

和 DO 的技术支持人员简单交流了这个问题,平台相关的元数据(metadata)是保留在 /var/lib/cloud 目录下,似乎 /etc/cloud 只是上游云系统的初始化配置(根据 /var/log/cloud-init.log, 系统初始化时需要从这个目录下读取 cloud.cfg 等配置)。

Bitbucket/Mercurial在Debain8上的一点小问题

Bitbucket/Mercurial在Debain8上的一点小问题

由于Debian 7已经被无情地终结了生命周期,因此不得不将部分生产环境升级到Debian 8。总体上还比较顺利,在mercurial库方面遇到点问题,记录如下:

问题1:UnicodeDecodeError: ‘ascii’ codec can’t decode

这是Python脚本编码的问题。一个好的py脚本,应该在脚本起始处就标明编码方式,可惜mercurial的很多脚本没有这么做。Debian 8采用Python 2.7.9,默认是ascii编码,需要修改为默认utf-8编码。注意,Debian 8安装了多个Python版本,首先要确认默认版本号:

python -V

接着修改“/etc/python2.7/sitecustomize.py”文件(如果没有的话,可以手工创建一个),在文件起始处添加以下代码:

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

问题2: [SSL: WRONG_VERSION_NUMBER] wrong version number

Bitbucket网站禁止了有缺陷的TLSv1,TLSv1.1加密方式,奇怪的是mercurial为什么没有根据协商采用SSL或者TLSv1.2? 修改方式也简单,强制mercurial禁止掉TLS。修改“/etc/mercurial/hgrc”,增加以下内容:

[ui]
tls=False
Wheezy被移除了

Wheezy被移除了

Debian 7 (Wheezy)结束了整个生命周期,Debian组织将Wheezy从所有的mirrors站点中删除了,如果仍旧使用apt-get进行更新或者安装软件时,会导致404错误,无法获取相关文件。关于这个问题的信息,请参考这个链接

如果实在要停留在Debian 7版本上,需要修改sources.list文件,将deb库指向“http://archive.debian.org/debian/”。

SSHd使用强加密算法

SSHd使用强加密算法

默认情况下,SSH服务器会启用各种尽可能的加密算法,其中包含一些很弱的加密算法,这确保了客户端广泛的接入,但是的确会引入一些风险。企业环境中设备是可控的,因此可以去掉弱加密算法而只保留特定的强加密算法。

Linux环境中查询以下帮助,可以了解包含算法在内的各项配置信息:

man 5 sshd_config

修改/etc/ssh/sshd_config文件,指定Ciphers采用强加密算法即可,例如,将下列语句直接加入到该文件后面:

Ciphers aes128-ctr,aes192-ctr,aes256-ctr,aes128-cbc,aes256-cbc

当然,最后要重启ssh服务才能使配置生效。

Ubuntu 18.10

Ubuntu 18.10

这个版本更新了外观,基础色调没有变换。图标搞成圆角,有点像手机界面上的图标,deb的图标居然是粉红色的…… 其他似乎变换不大,依然是很慢。

jemalloc

jemalloc

看到一个redis新版本发布的新闻,注意到其中的内存管理采用了jemalloc,替代标准gcc中的malloc。搜索了相关的信息,感觉jemalloc是个相当不错的内存管理模块,尤其在碎片化管理方面很吸引人。作为需要长期运行的服务器软件,内存管理方面的确是需要慎重考虑,jemalloc 有facebook这样的大厂支持,又有redis做背书,值得我们尝试。

在Debian系统中可以直接安装jemalloc的dev库:

sudo apt install libjemalloc-dev

安装后,头文件在以下目录:

/usr/include/jemalloc

库文件在以下目录(X86系统):

/usr/lib/x86_64-linux-gnu

或者以下目录(Raspberry Pi):

/usr/lib/arm-linux-gnueabihf

Linux下的一些命令

Linux下的一些命令

这两天费了老大劲查一个linux系统下的问题,最终查出了原因,其中用到一些日常不太使用的命令,记录一下,以免以后忘记。

strace -e trace=write -p 1234

这个命令是获取进程(进程ID是1234)的输出信息。

cd /proc/1234/fd
ls | wc -l

检查进程1234打开的句柄数。

perror 24

显示errno的提示信息。上述例子显示“errno=24”时的具体提示信息。

ulimit -a

检查用户的各项资源配置,比如句柄数、进程数等。通常这些资源数配置在 /etc/security/limits.conf 文件中。

uname -a

查询内核版本。

另外,Debian 7是在tty7上启动xwindows,而初始信息是输出到tty1上,用组合键 Ctrl+Alt+F1/F7 即可进行切换。

root用户也用sudo

root用户也用sudo

过往在升级Debian (Testing版本)时,总是以root身份进行操作,例如:

apt update
apt upgrade

最近使用同样的命令升级时,总是提示错误,意思大约是“找不到ldconfig”文件或者无权执行。这是很奇怪的问题,毕竟当前用户是root,而且ldconfig显然就在‘/sbin’目录下,肉眼可见。

检查了root用户的env,发现Path的设置为:

PATH=/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games

确实没有包含‘/sbin’目录,因此root用户的确无法直接执行ldconfig命令。再次检查‘/etc/profile’文件,在路径设置时进行了以下判断:

if [ "`id -u`" -eq 0 ]; then
  PATH="/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin"
else
  PATH="/usr/local/bin:/usr/bin:/bin:/usr/local/games:/usr/games"
fi

当然,可以直接修改该文件,或者修改root用户的.bashrc文件,将’/sbin’目录将入路径当中。
然而根据profile文件的判断条件,也可以不做任何修改,只是执行命令时,加上‘sudo’即可。例如上述更新命令修改为:

sudo apt upgrade
手工解除fail2ban封锁的IP地址

手工解除fail2ban封锁的IP地址

首先检查fail2ban的log文件,看是哪一个jail的规则触发了封锁,比如apache的规则。然后可以使用fail2ban-client确认该规则的封锁状态:

root@minisipserver:~$ fail2ban-client status apache
Status for the jail: apache
|- filter
|  |- File list:        /var/log/apache2/error.log
|  |- Currently failed: 0
|  `- Total failed:     21
`- action
   |- Currently banned: 1
   |  `- IP list:       184.15.66.88
   `- Total banned:     3

例如,示例中apache的规则封锁了“184.15.66.88”。接着使用以下命令解除对该IP地址的封锁:

fail2ban-client set apache unbanip 184.15.66.88