Ubuntu apparmor 导致的 Unbound DNS 服务日志文件不能读写错误

开启 Apparmor 的 debug ,我们就可以在系统日志里看到如下的记录:

Dec 19 11:56:42 localhost kernel: [45483.551927] audit: type=1400 audit(1576727802.918:1755): apparmor=”DENIED” operation=”mknod” profile=”/usr/sbin/unbound” name=”/var/log/unbound/unbound.log” pid=23316 comm=”unbound” requested_mask=”c” denied_mask=”c” fsuid=115 ouid=115

vim /etc/apparmor.d/usr.sbin.unbound
在 root hints 后添加一行:

/var/log/unbound/** rw,

重启 apparmor,重启 unbound 服务后,就可以看到日志能正确的写入了。

解决问题后关闭 Apparmor 的 debug:

echo 0 > /sys/module/apparmor/parameters/debug

Change name for a vg with rootfs on Ubuntu 1804 onward

In our dev enviroment, we use several KVM desktop machine to create lot VMs to test all kinds of new stuff.
Compared with CentOS 7, Ubuntu 1804 or 1904 are more easy to install any new software just with apt install, don’t even need to update package list.

Though we found Ubuntu had big issue in change the vg name or doing what ever LVM init (aka virt-sysprep) . We already found the solution to it. But for regular Ubuntu VG name change, we still should have a separate way to do. Here it is.

  1. # vgrename oldvg newvg
  2. # perl -p -i -e ‘s/oldvg/newvg/g’ /etc/fstab /boot/grub/grub.cfg /etc/initramfs-tools/conf.d/resume
    if vg name contain dash (“-“), we need to run one more time with this:
    # perl -p -i -e ‘s/oldvg–/newvg–/g’ /etc/fstab /boot/grub/grub.cfg /etc/initramfs-tools/conf.d/resume
  3. # /sbin/update-initramfs -c -k all

Ubuntu 1904 上的 Apache + PHP-FPM

在玩 Nginx 之余, 小伙伴们也要玩下 Apache ,索性就在最新版本的 Ubutu 1904 上玩耍一下。

# apt install apache2 php7.2 php7.2-fpm php7.2-mysql libapache2-mod-php7.2

安装中有几句话是这么说的:
NOTICE: Not enabling PHP 7.2 FPM by default.
NOTICE: To enable PHP 7.2 FPM in Apache2 do:
NOTICE: a2enmod proxy_fcgi setenvif
NOTICE: a2enconf php7.2-fpm

看这两个 a2 开头的脚本, ls -al 查看,原来就是软连接指向一个真正的 Perl 脚本 a2enmod 。

a2query 顾名思义是查询的,例如查询 php 模块是否启用:
# a2query -m php7.2

可以看到 Ubuntu 里面的 Apache 配置和 Web 虚拟机是通过 conf-available 和 sites-available 里的文件软连接到 conf-enabled 以及 sites-enabled 来启动的。

Ubunt1904 virt-sysprep Bug

假设有虚拟机 dns-01, vg Name 为 dns01 克隆到 dns-02,新的 vg Name 为 dns02

由于 virt-sysprep 的 bug,导致 vgid 修改后, grub.cfg 文件指定的 lvmid 没有修改,克隆后的虚拟机启动失败,进入 grub rescue mode.
解决的办法是 直接用 virt-clone 后(实际上只是克隆了卷文件,修改了 Mac地址),不要运行 virt-sysprep 直接手工启动虚拟机,初始化虚拟机内的配置: /etc/hostname, /etc/hosts, /etc/netplan/01-*.yaml ,而磁盘的 vg name 实际上无需修改。


下面是一个复杂一点的版本, 用 vol-clone 的办法来做。
# virsh vol-clone dns-01.qcow2 dns-02.qcow2 vmpool
# virsh dumpxml dns-01 >/var/tmp/dns.xml
# vim /var/tmp/dns.xml 修改 domainname 为 dns-02 去掉 UUID 相关的行, 去掉 Mac 地址,修改 disk 的卷文件名为 dns-02.qcow2
# virsh define /var/tmp/dns.xml (会自动生成新的 Mac 地址)
# virsh start dns-02 (如果 dns-01 是静态分配 IP 的,在克隆卷之前最好修改为动态)
# virsh console dns-02

这个 virt-sysprep 的 Bug 是因为 /boot/grub/grub.cfg 文件里有
set root=’lvmid/d8R9S7-C47Z-UHx1-4tRd-qXcX-sFV1-rC4uG4/x4MwoL-7yfO-03da-e72d-Y0DQ-hBil-vXGplk’
这样的行,格式是 lvmid/vg-UUID/lv-UUID
因为 virt-sysprep 后 vg 的 UUID 修改了,但是 grub.cfg 没有修改导致的。

hostnamectl status 命令还会有一个 machine ID 的概念, 重新生成的办法是
# rm /etc/machine-id && systemd-machine-id-setup

Ubuntu 1904 修改 rootvg 名字需要注意的几个问题

在克隆虚拟机的时候 vg 的名字没有被修改过,事后修改有点诸葛亮,而且充满风险。修改的步骤很简单, vgrename oldvgname newvgname 即可。
Logical Volume 的修改: lvrename vgname old-lvname new-lvname

  1. /etc/initramfs-tools/conf.d/resume 里面包含 swap 的 lv 卷信息
  2. /etc/fstab 这个自然不必说了
  3. /boot/grub/grub.cfg 这个当然也要修改

# update-grub // 这步其实报错了,不能修改,和下面的 update-initramfs 类似
# cp /boot/initrd.img-xxx /boot/initrd.img-xxx.bak // 先做备份
# update-initramfs -c -k all // 这步也报错了,因为旧的 vg 的名字找不到了。

修改完几个文件,运行 update-initramfs -c -k all 以后,虽然报错,但是重启后,系统是可以正常使用的。 这样子, rootvg 的名字就能成功修改了。