bhyve vm の centos7。
ファイルとして確保した領域に zero を書くと、ホスト型の zfs の REFER は下がるのか。
結論からすれば、下がった。

# ゲストはインデント

host# zfs get compression zroot/vm/centos7_shred
NAME                   PROPERTY     VALUE     SOURCE
zroot/vm/centos7_shred  compression  lz4       inherited from zroot

host# zfs list zroot/vm/centos7 zroot/vm/centos7_shred    
NAME                      USED  AVAIL  REFER  MOUNTPOINT
zroot/vm/centos7          2.72G   876G  2.60G  /vm/centos7
zroot/vm/centos7_shred    4.98M   876G  1.83G  /vm/centos7_shred

    # BlueOnyx-5209R-CentOS-7.8-20200520.iso/ks/kick_ext4.cfg インストール直後
    guest# df -m /home
    Filesystem                  1M-blocks  Used Available Use% Mounted on
    /dev/mapper/VolGroup00-home      5129    88      4759   2% /home

    guest# time dd if=/dev/urandom of=/home/big bs=1M count=4759
    4759+0 records in
    4759+0 records out
    4990173184 bytes (5.0 GB) copied, 31.6832 s, 158 MB/s

    real    0m31.686s
    user    0m0.004s
    sys     0m24.158s

    guest# df /home (-m 付け忘れた)
    Filesystem                  1K-blocks    Used Available Use% Mounted on
    /dev/mapper/VolGroup00-home   5251176 4962400         0 100% /home

host# zfs list zroot/vm/centos7 zroot/vm/centos7_shred    
NAME                      USED  AVAIL  REFER  MOUNTPOINT
zroot/vm/centos7          2.72G   872G  2.60G  /vm/centos7
zroot/vm/centos7_shred    4.68G   872G  6.47G  /vm/centos7_shred

    guest# time shred -n 3 -z /home/big

    real    2m8.844s
    user    0m6.503s
    sys     0m11.173s

    guest# df /home
    Filesystem                  1K-blocks    Used Available Use% Mounted on
    /dev/mapper/VolGroup00-home   5251176 4962400         0 100% /home

    guest# rm /home/big
    guest# df
    Filesystem                  1K-blocks    Used Available Use% Mounted on
    /dev/mapper/VolGroup00-home   5251176   89180   4872204   2% /home

host# zfs list zroot/vm/centos7 zroot/vm/centos7_shred    
NAME                    USED  AVAIL  REFER  MOUNTPOINT
zroot/vm/centos7        2.72G   876G  2.60G  /vm/centos7
zroot/vm/centos7_shred  32.5M   876G  1.82G  /vm/centos7_shred

を変更するには。

# ack mailreplyintro /usr/local/www/roundcube/program/localization/en_US/labels.inc /usr/local/www/roundcube/program/localization/ja_JP/labels.inc
/usr/local/www/roundcube/program/localization/en_US/labels.inc
275:$labels['mailreplyintro'] = 'On $date, $sender wrote:';

/usr/local/www/roundcube/program/localization/ja_JP/labels.inc
243:$labels['mailreplyintro'] = '$date に $sender さんは書きました:';

FreeBSD の panic 時にログを残す仕組みが上手く動いているか確認。
デフォルトでも rc.conf に dumpdev=AUTO とあって有効になっていると思う。

panic時 ufs の swap だと自動で書いてくれて
ブート時にそれを見付けてここらあたりに保存してくれて

    -rw-------  1 root  wheel       383 May 19 00:00 /var/crash/info.0       
    -rw-------  1 root  wheel       384 May 19 00:02 /var/crash/info.1
    -rw-------  1 root  wheel  11386849 May 19 00:00 /var/crash/vmcore.0.zst <- -Z の圧縮が効いてる場合
    -rw-------  1 root  wheel  76423168 May 19 00:02 /var/crash/vmcore.1

その後 /usr/sbin/crashinfo が起動して

    # wc /var/crash/core.txt.0 
    1563    7986   63139 /var/crash/core.txt.0

ぐらいのファイルにテキストのサマリを纏めてくれる。

調べたこと。

  • zvol の swap は未対応。
  • gmirror の場合は man の通りなのだが
    balance algorithm ( -b round-robin や -b prefer など ) によるようで
    書くときは -b によらず高い priority のもに書かれるようだが
    読むとき (/usr/sbin/crashinfo) は -b prefer でないと読めない。
    man には /etc/rc.early で一時的に調整する方法が載っているが、今は動かない?
    -b prefer にしていれば dumpdev=AUTO のままでも動くことは確認した。
    なお 2台の mirror で両方とも priority 0 でも動作した。何回か試したが失敗しなかった。
  • -Z の圧縮の効果は高いので dumpon_flags="-Z" はオススメ。
  • netdumpd も動く。
    サーバーで netdumpd_enable="YES" しておいて (ファイヤーウォールも確認してね)
    クライアント側は sysrc dumpdev=vtnet0 dumpon_flags="-c client_ip -s server_ip" などとするだけでよい。
    だた /usr/sbin/crashinfo はカーネルが一致しないと動かないので注意。もちろん panic したマシンに scp すれば動く。

また、-b round-robin でも dumpdev="片側" としておけば DEGRADED にはなるが動作はするようだ。(要 gmirror forget & insert)

参考になりました。ありがとうございます。

というのは出来ないっぽい。

linux には ip token set ::35 dev eth0 というのがあるようだ。
https://wiki.gentoo.org/wiki/IPv6_Static_Addresses_using_Tokens

prefixの変更をフックしたいのだけれど、定期的に見にいくしかないのかな。。。

とりあえずIPが変更されたときにログに吐くkmod。rsyslogやswatch的なやつで。ip moniterとか使えるのかなぁ。。。

Makefile
.PATH: ${SRCTOP}/sys/libkern

KMOD=log_ifaddr_event

SRCS+=log_ifaddr_event.c
SRCS+=inet_ntop.c

.include <bsd.kmod.mk>
log_ifaddr_event.c
#include <sys/param.h>
#include <sys/kernel.h>
#include <sys/module.h>
#include <sys/conf.h>
#include <sys/time.h>
#include <sys/socket.h>
#include <net/if.h>
#include <net/if_var.h>
#include <netinet/in.h>
#include <netdb.h>

static void
log_ifaddr_event_hook(void *arg, struct ifnet *ifp, struct ifaddr *ia_ifa, int add_or_del)
{
    char addr_buf[NI_MAXHOST];

    if (ia_ifa->ifa_addr->sa_family == AF_INET) {
        inet_ntop(AF_INET,  &((struct sockaddr_in  *)ia_ifa->ifa_addr)->sin_addr,  addr_buf, sizeof(addr_buf));
        printf("log_ifaddr_event.ko ifaddr_event %s %s %s \n", ifp->if_xname, addr_buf, add_or_del ? "DEL" : "ADD");
    }
    else if (ia_ifa->ifa_addr->sa_family == AF_INET6) {
        inet_ntop(AF_INET6, &((struct sockaddr_in6 *)ia_ifa->ifa_addr)->sin6_addr, addr_buf, sizeof(addr_buf));
        printf("log_ifaddr_event.ko ifaddr_event %s %s %s \n", ifp->if_xname, addr_buf, add_or_del ? "DEL" : "ADD");
    }

    return;
}

static int
module_load(module_t mod, int cmd, void *arg)
{
    static eventhandler_tag tag;
    switch (cmd) {
        case MOD_LOAD:
            printf("log_ifaddr_event.ko loaded.\n");
            tag = EVENTHANDLER_REGISTER(ifaddr_event_ext, log_ifaddr_event_hook, 0, EVENTHANDLER_PRI_ANY);
            if (tag == NULL) {
                printf("log_ifaddr_event.ko EVENTHANDLER_REGISTER failed.\n");
            }
            else {
                printf("log_ifaddr_event.ko EVENTHANDLER_REGISTER successed.\n");
            }
            break;
        case MOD_UNLOAD:
            if (tag != NULL) {
                EVENTHANDLER_DEREGISTER(ifaddr_event_ext, tag);
                printf("log_ifaddr_event.ko EVENTHANDLER_DEREGISTER done.\n");
            }
            printf("log_ifaddr_event.ko unloaded.\n");
            break;
        default:
            return EOPNOTSUPP;
    }

    return 0;
}

DEV_MODULE(log_ifaddr_event, module_load, NULL);
/var/log/message
May 16 18:49:54 host100 kernel: log_ifaddr_event.ko loaded.
May 16 18:49:54 host100 kernel: log_ifaddr_event.ko EVENTHANDLER_REGISTER successed.
May 16 18:50:04 host100 kernel: log_ifaddr_event.ko ifaddr_event igb0 24XX:XX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX DEL
May 16 18:50:13 host100 kernel: log_ifaddr_event.ko ifaddr_event igb0 192.168.1.XXX ADD
May 16 18:50:15 host100 kernel: log_ifaddr_event.ko ifaddr_event igb0 192.168.1.XXX DEL
May 16 18:50:19 host100 kernel: log_ifaddr_event.ko EVENTHANDLER_DEREGISTER done.
May 16 18:50:19 host100 kernel: log_ifaddr_event.ko unloaded.

何かのフックで /etc/httpd/conf/httpd.conf が壊れることがあり httpd が起動しないようだ。

[root@bots2 conf]# systemctl status httpd
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since 金 2020-05-15 08:00:03 JST; 5min ago
     Docs: man:httpd(8)
           man:apachectl(8)
  Process: 23410 ExecStart=/usr/sbin/httpd $OPTIONS -DFOREGROUND (code=exited, status=1/FAILURE)
 Main PID: 23410 (code=exited, status=1/FAILURE)
    
 5月 15 08:00:03 bots2.localdomain systemd[1]: Starting The Apache HTTP Server...
 5月 15 08:00:03 bots2.localdomain httpd[23410]: AH00534: httpd: Configuration error: No MPM loaded.
 5月 15 08:00:03 bots2.localdomain systemd[1]: httpd.service: main process exited, code=exited, status=1/FAILURE
 5月 15 08:00:03 bots2.localdomain systemd[1]: Failed to start The Apache HTTP Server.
 5月 15 08:00:03 bots2.localdomain systemd[1]: Unit httpd.service entered failed state.
 5月 15 08:00:03 bots2.localdomain systemd[1]: httpd.service failed.

[root@bots2 conf]# httpd -X
AH00534: httpd: Configuration error: No MPM loaded.

失敗している環境
[root@bots2 conf]# ls -al /etc/httpd/conf/httpd.conf
-rw-r--r-- 1 root root 553  5月 15 07:52 /etc/httpd/conf/httpd.conf

[root@bots2 conf]# cat httpd.conf (こんなシンプルなのになっちゃう)
# Supplemental configuration
PerlConfigRequire /etc/httpd/conf.perl/00-default-vsite.pl
#
Include /etc/httpd/conf/vhosts/preview
<IfModule log_config_module>
    #
    # The following directives define some format nicknames for use with
    # a CustomLog directive (see below).
    #
    LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%h %l %u %t \"%r\" %>s %b" common
    LogFormat "%{Referer}i -> %U" referer
    LogFormat "%{User-agent}i" agent
    
    ErrorLog "/var/log/httpd/error_log"
    
</IfModule>

問題ない環境
[root@bots2 httpd]# ls -al /etc/httpd/conf/httpd.conf
-rw-r--r-- 1 root root 11272  5月 15 08:02 /etc/httpd/conf/httpd.conf

復旧してみた
[root@bots2 httpd]# rpm -q --whatprovides /etc/httpd/conf/httpd.conf
httpd-2.4.6-93.el7.centos.x86_64

[root@bots2 conf]# rm /etc/httpd/conf/httpd.conf
[root@bots2 conf]# yum reinstall httpd-2.4.6-93.el7.centos.x86_64
[root@bots2 conf]# ls -al /etc/httpd/conf/httpd.conf
-rw-r--r-- 1 root root 11757  5月 15 08:26 /etc/httpd/conf/httpd.conf
[root@bots2 conf]# systemctl start httpd

下部が戻らないので手動で。
[root@bots2 httpd]# tail conf/httpd.conf (問題ない環境)

# Supplemental configuration
PerlConfigRequire /etc/httpd/conf.perl/00-default-vsite.pl
#
# Load config files in the "/etc/httpd/conf.d" directory, if any.
IncludeOptional conf.d/*.conf
Include conf.modules.d/*.conf             <-- このへんが無いはず
Include /etc/httpd/conf/vhosts/site1      <-- このへんが無いはず
Include /etc/httpd/conf/vhosts/site2      <-- このへんが無いはず
Include /etc/httpd/conf/vhosts/preview

httpd.conf に重ねていってるパッチが当たりきってるかは不明だけど、動いているようだ。

一応、環境。

base-blueonyx-capstone-5209R-5.20200310BX012.el7.noarch
base-blueonyx-glue-5209R-5.20200310BX012.el7.noarch
blueonyx-cd-installer-7.7-20200116.x86_64

The Art of Graceful ReloadinguWSGI graceful Python code deploy を参考に試していて、ごく単純な例のメモ。

  • http -> zerg-server
  • http -> zerg-pool
  • http -> subscription

をそれぞれ試したい。http も uwsgi で用意する。master は確認用に含めているだけ。

http://192.168.12.34:8080/ で確認する。

http -> zerg-server

# http proto -> uwsgi proto
[uwsgi]
master          = true
http            = 192.168.12.34:8080
http-to         = uwsg-zerg-server.sock
#http-modifier1 = 5 # worker の route でやることにする

# uwsgi proto -> zerg-server
[uwsgi]
master          = true
socket          = uwsg-zerg-server.sock
zerg-server     = uwsg-zerg-server

# worker -> zerg-server
[uwsgi]
master          = true
workers         = 1
zerg            = uwsg-zerg-server
#psgi           = hello.psgi # http-modifier1 = 5 の場合
mount           = app0=hello.psgi
#mount          = app1=hello.psgi # 複数可
route           = ^/ uwsgi:,5,0,app0

http -> zerg-pool

# http proto -> uwsgi proto
[uwsgi]
master          = true
http            = 192.168.12.34:8080
http-to         = uwsg-zerg-pool.sock

# zerg-pool server
[uwsgi]
master          = true
zerg-pool       = uwsg-zerg-pool:uwsg-zerg-pool.sock

# uwsgi proto -> worker -> zerg-pool server
[uwsgi]
master          = true
workers         = 1
socket          = uwsg-zerg-pool.sock
zerg            = uwsg-zerg-pool
mount           = app0=hello.psgi
route           = ^/ uwsgi:,5,0,app0

http -> subscription

# http proto -> uwsgi proto
master          = true
http            = 192.168.12.34:8080
http-to         = 192.168.12.34:8081

# uwsgi proto -> subscription
[uwsgi]
master          = true
fastrouter      = 192.168.12.34:8081
fastrouter-subscription-server = 192.168.12.34:8082

# subscription <-> worker 
[uwsgi]
master          = true
subscribe-to    = 192.168.12.34:8082:192.168.12.34:8080
socket          = 192.168.12.34:8100
mount           = app0=hello.psgi
route           = ^/ uwsgi:,5,0,app0
perl adv
perl adv