IPv6無効化アラカルトと副作用

ホビー向けではIPv6無効化はしない方がよさそうというのが結論だが、無効化設定には、いろいろある。
① /etc/sysctl.confで設定

net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1
net.ipv6.conf.lo.disable_ipv6 = 1

② /etc/modprobe.d/ipv6.confで設定(ファイル名は任意)

# Don't load ipv6 by default
alias net-pf-10 off
alias ipv6 off
# https://www.raspberrypi.org/forums/viewtopic.php?t=138899
options ipv6 disable_ipv6=1
blacklist ipv6

②は、Debian9 stretch arm64ではIPv6を無効化できない。それは、Kernel構築時の.configにおいて、CONFIG_IPV6=m → y となり、IPv6モジュールがKernelに埋め込まれたためだ。
一方で、ラズパイのRaspbian stretchでは、ここにある通りKernel外出しのモジュールで定義されており、IPv6をモジュール単位で根こそぎ無効化できるということだと思う。

ラズパイでは②の方が良いかもしれない。理由は、
$ netstat -na | grep tcp6
と打てば分かる。①の設定では、IPv6は確かに無効にはなっているが、アプリレベルではIPv6のポートが開いている。②はアプリレベルでも開いていない。

③ Kernel起動パラメータ ipv6.disable=1
パソコンなら/etc/default/grubに追記してinitrdを再生成、ラズパイなら/boot/cmdline.txtに追記する。


IPv6無効化の副作用:
Windowsや別Linuxホストからxrdp(リモートデスクトップ)でログインしたいケースで、正しく動作しない。Debian9 stretch amd64ではxrdpデーモンが起動しない。Raspbianでは、xrdpログイン画面は出るが、やはりひっかかる。その他のLinux実装については未確認であり、確認でき次第、ここに書く予定。

エアロビじゃなくてエアロ

まずはじめに、エアロ(ビ)の良いイメージを残すため勝手にリンクを貼らせていただきました <(_ _)> 。本当にクールですよね〜。
 動画1:クールなエアロ


先日、バブル入社組のうち気の合う6人で飲みに行った。20年ぶりに再会できた同期もいて、とても懐かしいメンバ。当然、健康維持の話が出る。私が、エアロビで健康維持していると言ったら、20年前テニスで絶対的に強かった同期Aが、『エアロビ ・・・・ フッ w』と鼻で軽く笑い、ビールをすすり始めた。そのとき、Aの頭の中は、きっと20年前のイメージのまま、こんなんだったのだろう。衝撃的なダサさなので動画の埋め込み表示は止めておいた。
 動画2:ダサかっこわるいエアロビ

まぁ、良くてもこのあたりか。
 動画3:オリビア

20年前は、テニスでもまだシャツはズボンにインだったような気もする。その点も含め、弁明しようと思ったが、話題が次に流れて、それっきりだ。そもそも、「エアロビ」と言った私が悪かったのかもしれない。「ビ」を入れるとダサいイメージになる(特にアルコールの席では)。次からは「エアロ」と言ってみることにする。

ラズパイ:シャットダウンフリー tmpfs編

もし、手の届かない離島に電源ブチ切りラズパイを置くなら、私ならばoverlayもfuseも使いたくない。以下、/sbin/initでの対応を示すが、未完成である。シンボリックリンクを嫌う実装が何かあるようで、解決策としては、chrootは使わず、Stateless CentOS7でのやり方(=tmpfsでbind)を検討している。下記でも起動はするし、SSHログインもできるが、現時点ではoverlay方式でのご利用を推奨する。

前提:準備①〜③が完了していること。fuseとoverlayは不要。

~# mkdir /tmpfsroot
~# touch /.tmpfsroot
~# dosfslabel /dev/mmcblk0p1 boot
~# e2label /dev/mmcblk0p2 rootfs

/tmpfsrootにユーザランド(rootfs)を構築し、chrootする。リードオンリーで良い領域はシンボリックリンクで対応する。アプリによっては、シンボリックリンクで対応したために正しく機能しないケースがある。/etc/fstab_tmpfsrootは、/tmpfsroot/etc/fstabにコピーされる。

/etc/fstab_tmpfsroot(rw→ro):

# tmpfsroot用の/etc/fstab
proc         /proc    proc  defaults             0 0
# 軟弱なFAT領域はroマウント
LABEL=boot   /boot    vfat  ro,defaults          0 2
# rootfsを/MicroSDへroマウント
LABEL=rootfs /MicroSD ext4  ro,defaults,noatime  0 1
# LABEL=logを刻印したext4メディアにログ保存するならコメントアウト
#LABEL=log   /var/log ext4  defaults,noatime     0 0


~# rm /sbin/init

Under Construction!
基本動作確認はしているが改善余地があり、後日フォロー予定。

/sbin/init:

#!/bin/sh
## /home, /root, /etcは、総メモリ容量の1/2を超える場合は、事前に調整すること。
## 特に/homeは要注意。確認方法: cd /; du --max-depth 1 -h 
## $DISKは定義しない(rootfsは/boot/cmdline.txtのパラメータでマウントされている)。

ramdisksize=500M
# DISK=/tmpfsroot/MicroSD

if [ -d /tmpfsroot ] && [ -e /.tmpfsroot ]; then

    ## /tmpfsrootに主要構成を構築
    mount -t tmpfs -o size=${ramdisksize} tmpfs /tmpfsroot

    ## フォルダ作成
    echo "Creating directories..."
    for d in boot dev media mnt opt proc run sys tmp usr var MicroSD; do
        mkdir /tmpfsroot/${d}
    done

    ## 微調整
    chmod 1777 /tmpfsroot/tmp
    echo > /tmpfsroot/fastboot

    ## rwエリアをコピー
    ## *** メモリの1/2容量を超えないこと! ***
    echo -n "Copying files, directories..."
    #for d in etc root home srv; do
    for d in etc root srv; do
        echo -n ".. "
        cp -a ${DISK}/${d} /tmpfsroot
    done
    # /etc/fstabを調整
    [ -e /tmpfsroot/etc/fstab_tmpfsroot ] && mv -f /tmpfsroot/etc/fstab_tmpfsroot /tmpfsroot/etc/fstab

    ## roエリアをシンボリックリンク
    for d in bin sbin lib; do
        ln -s /MicroSD/${d} /tmpfsroot/${d}
    done

    ## /usrを処置(/usr/localだけtmpfs)
    for d in bin games include lib man sbin share src; do
        ln -s /MicroSD/usr/${d} /tmpfsroot/usr/${d}
    done
    cp -a ${DISK}/usr/local /tmpfsroot/usr

    ## /varの処置:ディスクの/varの構成のみをコピー
    cd ${DISK}/var
    for d in `ls -l | awk '$1 ~ /d/ {print $9 }' `; do
        DIR_NAME=`basename ${d}`
        if [ ${DIR_NAME} = "lib" ]; then
            #ln -s /MicroSD/var/lib /tmpfsroot/var/lib
            mkdir /tmpfsroot/var/lib
        else
            find ${DIR_NAME} -type d | cpio -pdm /tmpfsroot/var/
            find ${DIR_NAME} -type l | cpio -pdm /tmpfsroot/var/
        fi
    done
    ## /var/libの処置
    cd ${DISK}/var/lib
    for d in `ls -l | awk '$1 ~ /d/ {print $9 }' `; do
        DIR_NAME=`basename ${d}`
        if [ ${DIR_NAME} = "systemd" ] || [ ${DIR_NAME} = "nfs" ]; then
            # rwフォルダはtmpfsrootにコピー
            cp -a ${DISK}/var/lib/${DIR_NAME} /tmpfsroot/var/lib/${DIR_NAME}
        else
            # 他はSymbolic Linkで対応
            ln -s /MicroSD/var/lib/${DIR_NAME} /tmpfsroot/var/lib/${DIR_NAME}
        fi 
    done
    cd

    ## fstabに/var/logの定義があればマウント
    mount -T /tmpfsroot/etc/fstab /var/log

    ## switch_root
    mount -o bind /sys /tmpfsroot/sys
    mount -o bind /dev /tmpfsroot/dev/
    mount -t proc proc /tmpfsroot/proc
    #mount -o bind / /tmpfsroot/MicroSD
    cd /tmpfsroot
    pivot_root . MicroSD
    exec chroot . /lib/systemd/systemd

    #exec switch_root /tmpfsroot /lib/systemd/systemd "$@" </tmpfsroot/dev/console >/tmpfsroot/dev/console
    #exec /usr/lib/klibc/bin/run-init /tmpfsroot /lib/systemd/systemd
    #exec /usr/lib/klibc/bin/run-init /tmpfsroot /lib/systemd/systemd "$@" </tmpfsroot/dev/console >/tmpfsroot/dev/console
    #exec chroot /tmpfsroot /lib/systemd/systemd

else
    ## 元のsystemdを起動する
    exec /lib/systemd/systemd
fi

echo "Something went badly wrong in the /sbin/init."

~# chmod +x /sbin/init

ラズパイ:シャットダウンフリー overlay編(fuse無し)

Linuxで最初に動くプログラムである/sbin/initは、/lib/systemd/systemdへのシンボリックリンクになっているが、これをスクリプトにして調整事項を挟み込んでしまえば、fuseは不要となる。fuse+overlay編よりも調整の手間が少ないので、私はこちらの方が好きだが、こちらも実績は薄いので、自己責任で、ラズパイが手に届く範囲での利用を推奨する。
元の環境でapt updateを実施すると、/sbin/initはシンボリックリンクに戻ることがある。これを避けるには、/sbin/myinitで作成し、/boot/cmdline.txtに「init=/sbin/myinit」を追記すれば良い。
前提:準備①〜③、⑤が完了していること。fuseは不要。

~# mkdir /overlay
~# dosfslabel /dev/mmcblk0p1 boot
~# e2label /dev/mmcblk0p2 rootfs

/etc/fstab(rw→ro):

# overlay用の/etc/fstab
# proc
proc          /proc    proc  defaults             0 0
# 軟弱なFAT領域はroマウント
LABEL=boot    /boot    vfat  ro,defaults          0 2
# rootfsはコメントアウト
#LABEL=rootfs  /        ext4  ro,defaults,noatime  0 1
# /tmpもroになるのでtmpfsにする
tmpfs         /tmp     tmpfs defaults             0 0


~# rm /sbin/init

/sbin/init:

#!/bin/bash
## /.overlayが存在すればoverlayにする。
if [ -e /.overlay ] && [ -d /overlay ] ; then
    ## /var/logのツリー構成だけを退避
    find /var/log/ -type d | cpio -pdm /dev/shm/
    find /var/log/ -type l | cpio -pdm /dev/shm/
    ## overlayのrw実体となるtmpfsを作成
    mount -t tmpfs tmpfs /overlay
    ## 主要フォルダをoverlay化
    for d in usr etc home root var; do
        mkdir -p /overlay/${d} /overlay/${d}_rw
        OPTS="-o lowerdir=/${d},upperdir=/overlay/${d},workdir=/overlay/${d}_rw"
        mount -t overlay ${OPTS} overlay /${d}
    done
    #### Option-A:退避した/var/logをtmpfsに移動
    mount -t tmpfs tmpfs /var/log
    mv /dev/shm/var/log/* /var/log/
    rm -rf /dev/shm/log
    #### Option-B:退避した/var/logをoverlayfsに移動
    ## rm -rf /var/log
    ## mv /dev/shm/var/log /var/
else
    ## rootfsをrw,noatimeに設定
    mount -o remount,rw,noatime /
fi
## Start Systemd
exec /lib/systemd/systemd

~# chmod +x /sbin/init


シャットダウンフリー環境へ移行:
~# touch /.overlay /fastboot
~# reboot
元の環境に戻す:
~# mount -oremount,rw /
~# rm /.overlay
~# reboot

$HOME/.bashrcへの追記(任意):

findmnt /etc | grep overlay > /dev/null
[ $? == 0 ] && printf "\n<<<< The Overlay Environment! >>>>\n\n"



ラズパイ:シャットダウンフリー fuse+overlay編

調整の手間が若干少ないoverlay編(fuse無し)も参照の上、どちらを使うか検討下さい。本編では、overlayとfuseFilesystem in Userspace)を使います。ご利用は自己責任で。

前提:準備①〜⑤が終わっていること。

ここで作成・編集するフォルダ/ファイル:

フォルダ/ファイル名 内容
/etc/fstab デフォルトマウントの定義
/usr/local/bin/mount_ov.sh /etc/fstabから呼び出すシェル
/overlay/
/.overlay
overlayの実体
overlayマウントする時のフラグ


⑥ /etc/fstabの調整

LABELで認識させるのは私の趣味だが、raspbianのkernel起動パラメータ(/boot/cmdline.txt)では対応できない様子で中途半端な対応となる。必要に応じてアレンジすること。

準備:

# バックアップ
mv /etc/fstab /etc/fstab_org
cp -a /etc/fstab_org /etc/fstab
# BLocK device IDを確認(任意)
blkid
# ラベル付与
dosfslabel /dev/mmcblk0p1 boot
e2label /dev/mmcblk0p2 rootfs


/etc/fstabを編集(rw→ro):

# overlayfs/fuse用の/etc/fstab
# proc
proc          /proc    proc  defaults             0 0

# 軟弱なFAT領域はroマウント
LABEL=boot    /boot    vfat  ro,defaults          0 2

# rootfsはコメントアウト
#LABEL=rootfs  /        ext4  ro,defaults,noatime  0 1

# fuse+overlay
mount_ov.sh   /overlay fuse nofail,defaults       0 0

# /tmpもroになるのでtmpfsにする
tmpfs         /tmp     tmpfs defaults             0 0


⑦ /usr/local/bin/mount_ov.shを作成

ここではoverlayでrwとするフォルダは/usr /etc /home /root /varとするが、必要に応じてFHSを確認すること。

#!/bin/bash
## /.overlayが存在すればoverlayにする。
if [ -e /.overlay ]; then
    ## /var/logのツリー構成だけを退避
    find /var/log/ -type d | cpio -pdm /dev/shm/
    find /var/log/ -type l | cpio -pdm /dev/shm/
    ## overlayのrw実体となるtmpfsを作成
    mount -t tmpfs tmpfs /overlay
    ## 主要フォルダをoverlay化
    for d in usr etc home root var; do
        mkdir -p /overlay/${d} /overlay/${d}_rw
        OPTS="-o lowerdir=/${d},upperdir=/overlay/${d},workdir=/overlay/${d}_rw"
        mount -t overlay ${OPTS} overlay /${d}
    done
    #### Option-A:退避した/var/logをtmpfsに移動
    mount -t tmpfs tmpfs /var/log
    mv /dev/shm/var/log/* /var/log/
    rm -rf /dev/shm/log
    #### Option-B:退避した/var/logをoverlayfsに移動
    ## rm -rf /var/log
    ## mv /dev/shm/var/log /var/
else
    ## rootfsをrw,noatimeに設定
    mount -o remount,rw,noatime /
fi
exit 0

念の為:

chmod +x  /usr/local/bin/mount_ov.sh


⑧ シャットダウンフリー起動の設定
mkdir /overlay
touch /.overlay
# ↓ディスクチェック無効設定。rwマウント時には消去される。忘れても問題無い。
touch /fastboot 


⑨ その他

元の環境に戻す時:

mount -oremount,rw /
rm /.overlay
reboot

/boot/config.txt, cmdline.txt 編集 or raspi-config実行時:

mount -oremount,rw /boot

$HOME/.bashrcへの追記(任意):

findmnt /etc | grep overlay > /dev/null
[ $? == 0 ] && printf "\n<<<< The Overlay Environment! >>>>\n\n"


Reference:
Setting up overlayFS on Raspberry Pi - Domoticz
FilesystemHierarchyStandard - Debian Wiki


ラズパイ:シャットダウンフリー 準備

電源ブチ切りしてもファイルシステムが壊れない、シャットダウンフリーなラズパイを構築する。tmpfs,overlayの実体はSDRAMなので、その領域で更新したファイルは電源断で消えることに留意。保存したいデータがあるケースでは、MicroSDの別パーティションUSBメモリをrwマウントして運用する。ここでは下準備まで。

シャットダウンフリー実装 準備
ラズパイ:シャットダウンフリー fuse+overlay編 - Linux放浪紀Ⅲ ①〜⑤
ラズパイ:シャットダウンフリー overlay編(fuse無し) - Linux放浪紀Ⅲ ①〜③、⑤
ラズパイ:シャットダウンフリー tmpfs編 - Linux放浪紀Ⅲ ①〜③
前提:
  • Raspbian のバージョンは stretch (debian9.x)
  • root権限でオペレーション:「sudo su -」 または 「su -」でrootになる。
  • /dev/mmcblk0p2にユーザランド(rootfs)構成物がほぼ全てあるものとする。
① ベースのアップデート
apt update
apt upgrade
rpi-update  # FWアップデートは推奨されてはいないが私はやる主義。
② FAT領域をチェック/リペア

デフォルトでは、軟弱なFAT領域がrwでマウントされている。既に電源ブチ切りで壊れかけていることも多い。

dosfsck -w -r -l -a -v -t /dev/mmcblk0p1

参考:
https://askubuntu.com/questions/147228/how-to-repair-a-corrupted-fat32-file-system
https://explainshell.com/

スワップの無効化
systemctl stop dphys-swapfile.service
systemctl disable dphys-swapfile.service
rm /var/swap  ## ←swapファイルの実体。
④ パッケージ追加 fuse
 apt install fuse
⑤ /etc/modulesに"overlay"を追記

↓ 単に末尾にoverlayを追記しているだけなので、エディタ開けるなら手編集でどうぞ。

grep overlay /etc/modules > /dev/null; [ $? == 0 ]  || echo overlay >> /etc/modules


本件とは無関係だが、/etc/sysctl.confに下記を追記し、IPv6を無効化する。

/etc/sysctl.conf:

・・・
net.ipv6.conf.all.disable_ipv6 = 1
net.ipv6.conf.default.disable_ipv6 = 1



VirtualBox上のCentOS7の更新で拾ったバグ

クリスマスの記念にと思い、VirtualBox上のCentOS7をアップデートしたら、タイムリーな不具合を拾ってしまいました。
0015570: CentOS 7.6.1810 running on a VirtualBox guest with a GUI has a mouse problem - CentOS Bug Tracker
X-Window内の窓をマウスでピックアップできません。最初はキーボードが悪いのかと思いましたが、マウス制御関連の不具合のようです。VirtualBoxでCentOS7をデスクトップ的に使う人も少ないとは思いますが、対処例を以下に示しておきます。

対処例1:
下記のような先行bugfixがあるので、それを適用する。
https://people.centos.org/toracat/kernel/7/plus/bug15570new/

対処例2:
やがて、上記パッチが反映されたKernelが配布されるだろうから、当面、古いKernelで起動する。/boot/grub2/grub.cfgを上書き編集し、デフォルトで古いKernelが起動する設定にする。yum updateでKernelが更新されたら自動的にgrub.cfgも更新されるため、いじった所は元の記述に戻るという目論見である。

/boot/grub2/grub.cfg:

・・・
if [ "${next_entry}" ] ; then
    set default="${next_entry}"
    set next_entry=
    save_env next_entry
    set boot_once=true
else
# set default="${saved_entry}" を
# コメント化or削除し、下記を追記。
# 数値は0オリジン。1なら2番目の
# エントリで起動する。
    set default=1
fi