Ubuntu20.04 電源ブチ切り myinit Ver.2

このmyinitは、initrdで地ならしした環境でないと、うまくいかないようです。x86系では問題なく適用できましたが、ARMではダメでした。少なくとも、多重ループを避けた記述をしたり、記述によってはprocのマウントを強いられるなど、難しい対応となるため、ARMではmyinit Ver.1でいいかと思います。initrdの無い環境で/etc/myrwtabを活用する良い方法が無いか模索中です。


Oracle Linux 9/RHEL9での電源ブチ切りでは、メモリに飛ばすfileとdirを定義ファイル(/etc/rwtab)で指定できる汎用性がありました。この仕組みをUbuntu20.04にも取り入れたいと思います。本当はx86_64ではinitramfsのフェーズでメモリに飛ばすべきですが、grubやinitramfsを適用していない組込のケースも視野に入れ、/sbin/myinitで/etc/(my)rwtabを参照しながらメモリに展開することにします。
なお、繰り返しになりますが、この実装でよく起こる初期トラブルは、/homeや/varの下で膨れ上がったユーザデータとキャッシュの処置漏れによるメモリ容量オーバです。ご利用は自己責任でお願いします。OSが起動しなくなったら、リカバリモードで起動して調整すれば復旧できます。

bindマウントとは

既存ファイルシステムツリーの枝葉に、別のツリーを上から被せるイメージです。dirだけでなくfileのbindも可能です。RHEL系Stateless実装では、以下の流れになります。
 ① RWする予定のfileとdirをtmpfs領域(RAMDISK)にコピー。
 ② 元のファイルシステムツリーに①を上から被せる。
bindというよりはoverlayなのですが、overlayfsは別の実装です。Stateless(tmpfsroot)方式は、overlayfs方式での長期運用に懸念を感じる故の実装です。

流用元実装の解析

/etc/rwtabの文法:マニュアル
実行スクリプト: 手元のOracle Linux9でdnf install readonly-root後の/usr/libexec/readonly-rootを見るか、githubを確認します。以下は要所のピックアップであり、##コメントでフォローしました。

MOUNTS=()  ## bindマウントのリストを宣言
if is_true "$READONLY" || is_true "$TEMPORARY_STATE"; then

    add_mount() {
        mnt=${1%/} ## 末尾の「/」を削除
        MOUNTS=("${MOUNTS[@]}" "$mnt")  ## リストにマウントポイントを追加
    }

    cp_empty() {   ## dir先頭のみが空の状態でtmpfs($RW_MOUNT)にコピーされる
        if [ -e "$1" ]; then
            echo "$1" | cpio -p -vd "$RW_MOUNT" &>/dev/null
            add_mount $1  ## 後でbindマウントするためリストに追加
        fi
    }

    cp_dirs() {   ## dirツリー構造全体が空の状態でtmpfs($RW_MOUNT)にコピーされる
        if [ -e "$1" ]; then
            mkdir -p "$RW_MOUNT$1"
            find "$1" -type d -print0 | cpio -p -0vd "$RW_MOUNT" &>/dev/null
            add_mount $1  ## 後でbindマウントするためリストに追加
        fi
    }

    cp_files() {   ## fileやdirがそのままcp -a(全コピー)でtmpfs($RW_MOUNT)にコピーされる
        if [ -e "$1" ]; then
            cp -a --parents "$1" "$RW_MOUNT"
            add_mount $1  ## 後でbindマウントするためリストに追加
        fi
    }

### 中略

    for file in /etc/rwtab /etc/rwtab.d/* /run/initramfs/rwtab ; do
        is_ignored_file "$file" && continue     ## .bakなどの拡張子ファイルは除外
        [ -f $file ] && while read type path ; do    ## /etc/rwtabから順次エントリを読み、処置
            case "$type" in
                empty)
                    cp_empty $path
                    ;;
                files)
                    cp_files $path
                    ;;
                dirs)
                    cp_dirs $path
                    ;;
                *)
                    ;;
            esac
        done < <(cat $file)
    done

    ## 親dirがあるエントリを除外しbindマウント
    for m in "${MOUNTS[@]}"; do
        prefix=0
        for mount_point in "${MOUNTS[@]}"; do
            [[ $m = $mount_point ]] && continue  ## 完全一致は判定スキップ 
            if [[ $m =~ ^$mount_point/.* ]] ; then   ## 親dir有りなら除外
                prefix=1
                break
            fi
        done
        [[ $prefix -eq 1 ]] && continue

        mount -n --bind $bindmountopts "$RW_MOUNT$m" "$m"
        selinux_fixup "$m"
    done

### 以下略


新しい/sbin/myinit (Ver.2)

上記を/sbin/myinitに、ほぼそのままの形で流用します。
/etc/myrwtabを読む所ではforループ不要ですが、汎用性や拡張性を優先するLinuxの文化に習い、あえてそのままとしました。

#!/bin/bash
# myinit Ver 2.0

if [ -e /.tmpfsroot ] && [ -d /tmpfsroot ] \
        && [ -e /etc/fstab_ro ] && [ -e /etc/myrwtab ]; then
    /usr/games/cowsay "TMPFSROOT Start!"

    ## tmpfsを作成
    RW_MOUNT="/tmpfsroot"
    mount -t tmpfs tmpfs $RW_MOUNT

    ## Start
    MOUNTS=()  ## bindマウントのリストを宣言
    add_mount() {
        mnt=${1%/} ## 末尾の「/」を削除
        MOUNTS=("${MOUNTS[@]}" "$mnt")  ## リストにマウントポイントを追加
    }
    cp_empty() {   ## dir先頭のみが空の状態でtmpfs($RW_MOUNT)にコピーされる
        if [ -e "$1" ]; then
            echo "[myinit] cp_empty $1 $RW_MOUNT" 
            echo "$1" | cpio -p -vd "$RW_MOUNT" &>/dev/null
            add_mount $1
        fi
    }
    cp_dirs() {   ## dirツリー構造全体が空の状態でtmpfs($RW_MOUNT)にコピーされる
        if [ -e "$1" ]; then
        echo "[myinit] cp_dirs (include symlink) $1 $RW_MOUNT" 
            mkdir -p "$RW_MOUNT$1"
            find "$1" -type d -print0 | cpio -p -0vd "$RW_MOUNT" &>/dev/null
        ## 改良:シンボリックリンクもコピーする
            find "$1" -type l -print0 | cpio -p -0vd "$RW_MOUNT" &>/dev/null
            add_mount $1
        fi
    }
    cp_files() {   ## fileやdirがそのままcp -a(全コピー)でtmpfs($RW_MOUNT)にコピーされる
        if [ -e "$1" ]; then
            echo "[myinit] cp_files -a --parents $1 $RW_MOUNT" 
            cp -a --parents "$1" "$RW_MOUNT"
            add_mount $1
        fi
    }

    ## /etc/myrwtabから順次エントリを読み、処置
#    for file in /etc/myrwtab ; do
#        [ -f $file ] && while read type path; do
        while read type path; do
            case "$type" in
                empty)   cp_empty $path ;;
                files)   cp_files $path ;;
                dirs)    cp_dirs  $path ;;
                *)       ;;
            esac
#        done < <(cat $file)
#    done
        done < "/etc/myrwtab"

    ## 親dirがあるエントリを除外しbindマウント
    for m in "${MOUNTS[@]}"; do
        prefix=0
        for mount_point in "${MOUNTS[@]}"; do
            [[ $m = $mount_point ]] && continue  ## 完全一致は判定スキップ 
            if [[ $m =~ ^$mount_point/.* ]] ; then   ## 親dir有りなら除外
                prefix=1
                break
            fi
        done
        [[ $prefix -eq 1 ]] && continue

        mount -n --bind "$RW_MOUNT$m" "$m"
        echo $m >> ${RW_MOUNT}/mount_list  ## for debug
    done

    ## tmpfsroot ユーザランド調整
    [ -e /etc/fstab_ro ]        && mv -f /etc/fstab_ro /etc/fstab
    [ -e /etc/issue_tmpfsroot ] && mv -f /etc/issue_tmpfsroot /etc/issue
    [ -e /etc/motd_tmpfsroot  ] && mv -f /etc/motd_tmpfsroot  /etc/motd

    ## Add the sticky bit 
    chmod 1777 /tmp 
    chmod 1777 /var/tmp
else
    echo "[myinit] normal boot ..."
fi
## Start systemd
exec /sbin/init


/etc/myrwtabの例

/var/lib の扱いが難しいのですが、まずは下記コマンドでリストを作ります。
find /var/lib -maxdepth 1 -mindepth 1 | sort | xargs -I{} echo "files {}" >> /etc/myrwtab
次に、容量の大きいdirを下記コマンドで確認します。
du --max-depth 1 -h /var/lib | sort -hr
容量の大きいdirや、ReadOnlyで良いことがわかっているdirは、コメントアウトします。

## /tmp
empty   /tmp
empty   /var/tmp

## /var
dirs    /var/backups
dirs    /var/cache
dirs    /var/crash
#files  /var/lib
dirs    /var/local
files   /var/lock
dirs    /var/log
files   /var/log/xrdp.log
files   /var/log/xrdp-sesman.log
dirs    /var/mail
files   /var/metrics
dirs    /var/opt
files   /var/run
# files /var/snap
fiies   /var/spool

## for Login
files   /etc
files   /root
files   /home

## /var/lib
files   /var/lib/AccountsService
files   /var/lib/BrlAPI
files   /var/lib/NetworkManager
files   /var/lib/PackageKit
files   /var/lib/VBoxGuestAdditions
files   /var/lib/acpi-support
files   /var/lib/alsa
files   /var/lib/app-info
files   /var/lib/apport
#files   /var/lib/apt
files   /var/lib/aspell
files   /var/lib/avahi-autoipd
files   /var/lib/bluetooth
files   /var/lib/boltd
files   /var/lib/colord
files   /var/lib/command-not-found
files   /var/lib/dbus
files   /var/lib/dhcp
files   /var/lib/dictionaries-common
#files   /var/lib/dpkg
files   /var/lib/emacsen-common
files   /var/lib/fprint
files   /var/lib/fwupd
files   /var/lib/gdm3
files   /var/lib/geoclue
files   /var/lib/ghostscript
files   /var/lib/grub
files   /var/lib/hp
files   /var/lib/initramfs-tools
files   /var/lib/ispell
files   /var/lib/libreoffice
files   /var/lib/locales
files   /var/lib/logrotate
files   /var/lib/man-db
files   /var/lib/misc
files   /var/lib/openvpn
files   /var/lib/os-prober
files   /var/lib/pam
files   /var/lib/plymouth
files   /var/lib/polkit-1
files   /var/lib/private
files   /var/lib/python
files   /var/lib/sgml-base
#files   /var/lib/snapd
files   /var/lib/snmp
files   /var/lib/sudo
files   /var/lib/systemd
files   /var/lib/tpm
files   /var/lib/ubiquity
files   /var/lib/ubuntu-advantage
files   /var/lib/ubuntu-drivers-common
files   /var/lib/ubuntu-release-upgrader
files   /var/lib/ucf
files   /var/lib/udisks2
files   /var/lib/unattended-upgrades
files   /var/lib/update-manager
files   /var/lib/update-notifier
files   /var/lib/upower
files   /var/lib/usb_modeswitch
files   /var/lib/usbutils
files   /var/lib/vim
files   /var/lib/whoopsie
files   /var/lib/xfonts
files   /var/lib/xkb
files   /var/lib/xml-core

コマンドでAA

AA(アスキーアート)を作ってくれるWebサイトはたくさんあるが、コマンドでも作成/表示できる。aptでインストールできる。

figlet
toiletをインストールしても適用できるが、単独でインストールした方が/usr/share/figlet以下のフォントライブラリが充実する。フォントにはStarWarsも追加したい。

figlet -f starwars star wars
     _______.___________.    ___      .______      
    /       |           |   /   \     |   _  \     
   |   (----`---|  |----`  /  ^  \    |  |_)  |    
    \   \       |  |      /  /_\  \   |      /     
.----)   |      |  |     /  _____  \  |  |\  \----.
|_______/       |__|    /__/     \__\ | _| `._____|
                                                   
____    __    ____  ___      .______          _______.
\   \  /  \  /   / /   \     |   _  \        /       |
 \   \/    \/   / /  ^  \    |  |_)  |      |   (----`
  \            / /  /_\  \   |      /        \   \    
   \    /\    / /  _____  \  |  |\  \----.----)   |   
    \__/  \__/ /__/     \__\ | _| `._____|_______/    

② toilet
figletよりもデコレーションをさらに深めたいときに使う。

toilet -f starwars -F metal -w 60 STAR WARS

③ cowsay, cowthink
/usr/share/cowsay/cows 以下の.cowをいくつか見れば、ベースの自作も簡単。

cowthink -f turtle May the force be with you. フォースと共に。 This is the way. 我らの道。
 ___________________________________________
( May the force be with you. フォースと共に。  )
( This is the way. 我らの道。                 )
 -------------------------------------------
    o                                  ___-------___
     o                             _-~~             ~~-_
      o                         _-~                    /~-_
             /^\__/^\         /~  \                   /    \
           /|  O|| O|        /      \_______________/        \
          | |___||__|      /       /                \          \
          |          \    /      /                    \          \
          |   (_______) /______/                        \_________ \
          |         / /         \                      /            \
           \         \^\\         \                  /               \     /
             \         ||           \______________/      _-_       //\__//
               \       ||------_-~~-_ ------------- \ --/~   ~\    || __/
                 ~-----||====/~     |==================|       |/~~~~~
                  (_(__/  ./     /                    \_\      \.
                         (_(___/                         \_____)_)



その他の解説:

Ubuntu.ja
Arch Linux

Ubuntu20.04 電源ブチ切り myinit Ver.1

過去記事で総括していますが、普通はoverlayrootを使えば良いと思います。ここでは、組込での実装や長期運用を意識し、ラズパイで実施したtmpfs-bind方式と同じ方法で電源ブチ切り対応にします。
この実装でよく起こる初期トラブルは、/homeや/varの下で膨れ上がったユーザデータとキャッシュの処置漏れによるメモリ容量オーバです。ご利用は自己責任でお願いします。OSが起動しなくなったら、リカバリモードで起動して調整すれば復旧できます。

前提

Ubuntu20.04 LTS デスクトップが下記の構成でインストールされていることとします。
なお、ラベルの適用は任意ですが、ここではfstabはラベルで記載することとします。

NAME   LABEL      MOUNTPOINT
sda                                                                                    
|-sda1  BOOT     /boot
`-sda2  ROOTFS    /

参考:ファイルシステム別のラベル付与方法

1. fstab_roの作成

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
#LABEL=ROOTFS    /               ext4    defaults,ro     0       0
LABEL=BOOT       /boot           ext4    defaults,ro     0       0
#/swapfile       none            swap    sw              0       0

2. snapの処置

snapはtmpfsrootでの扱いが難しいので、まずは根こそぎ削除します。systemctl disableだけでは無効化できず、少し手間がかかります。参考:リンク
=> snapの完全削除は不要としました。 /sbin/myinit で /etc(tmpfs)からsnap起動ファイルを削除することで処置します。

3. grubの調整

① /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULTを調整

#GRUB_CMDLINE_LINUX_DEFAULT="quiet splash"
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash init=/sbin/myinit"

update-grubを実行

4. /etc/systemd/journald.conf

    SystemMaxUse=200M  ## サイズは環境に合わせること

5. /sbin/myinitを作る

作成後、実行権限の付与を忘れずに行ってください。
chmod 755 /sbin/myinit

#!/bin/bash
if [ -e /.tmpfsroot ] && [ -d /tmpfsroot ] && [ -e /etc/fstab_ro ]; then
    [ -x /usr/games/cowthink ] && \
    /usr/games/cowthink "Maybe my TMPFS-ROOT will start."
    ## tmpfsを作成
    mount -t tmpfs tmpfs /tmpfsroot
    ## 主要rwフォルダをtmpfsにコピーし、bindマウントで元位置に戻す。
    ## tmpfs容量(500MB)より小さくなるように調整すること。/varは別処置する。
    echo "[myinit] copying ..."
    for DIR in etc root home; do
        cp -a /${DIR} /tmpfsroot/
        echo "[myinit] mount -obind /tmpfsroot/${DIR} /${DIR}"
        mount -obind /tmpfsroot/${DIR} /${DIR}
    done

    ##
    ## /varは特別に処置する
    ##
    echo "[myinit] adjusting /var"
    mkdir /tmpfsroot/var
    find /var/ -type d | cpio -pdm /tmpfsroot/
    find /var/ -type l | cpio -pdm /tmpfsroot/

    ## /var/lib
    rm -rf /tmpfsroot/var/lib/*
    # /var/libをtmpfsへコピー。/snapdは容量が大きいので除外。
    find /var/lib -maxdepth 1 -mindepth 1 ! -path "*/snapd" -exec cp -a {} /tmpfsroot/var/lib \;

    ## /var override bind
    echo "[myinit] mount -obind /tmpfsroot/var /var"
    mount -obind /tmpfsroot/var /var

    ##
    ## tmpfsroot ユーザランド調整
    ##
    [ -e /etc/fstab_ro ]        && mv -f /etc/fstab_ro /etc/fstab
    [ -e /etc/issue_tmpfsroot ] && mv -f /etc/issue_tmpfsroot /etc/issue
    [ -e /etc/motd_tmpfsroot  ] && mv -f /etc/motd_tmpfsroot  /etc/motd
    ## snap起動ファイルを削除
    find /etc/systemd/system -name "snap*" -exec rm -rf {} \;
    ## xrdpはログファイル必須
    if [ -e /etc/xrdp ]; then
        touch /var/log/xrdp.log
        chmod 666 /var/log/xrdp.log
    fi

    ## /tmp, /var/tmp をtmpfsでマウント
    echo "[myinit] mount -t tmpfs tmpfs /tmp"
    mount -t tmpfs tmpfs /tmp
    chmod 1777 /tmp
    echo "[myinit] mount -t tmpfs tmpfs /var/tmp"
    mount -t tmpfs tmpfs /var/tmp
    chmod 1777 /var/tmp
else
    echo "[myinit] normal boot ..."
fi
## Start systemd
exec /sbin/init

6. デコレーション表示

① cowsayをインストール
apt install cowsay
② /etc/bash.bashrc の末尾に下記を追加

## tmpfsroot環境であることを明示
FS_TYPE=`findmnt -no FSTYPE /etc`
if [ "x${FS_TYPE}" == "xtmpfs" ]; then
    cowsay "This is my TMPFS-ROOT. Your changes will be lost after reboot."
    echo
fi

7. 環境設定と確認

mkdir /tmpfsroot
touch /.tmpfsroot
reboot

成功したら、Terminalログイン時に下記が出力される。

 _____________________________________
/ This is my TMPFS-ROOT. Your changes \
\ will be lost after reboot.          /
 -------------------------------------
        \   ^__^
         \  (oo)\_______
            (__)\       )\/\
                ||----w |
                ||     ||

8. 環境の切り替え

いずれも実行権限を付与して利用して下さい。
① tmpfsrootから元のRW環境に戻すスクリプト
/root/bin/change2rw.sh:

#!/bin/bash
mount -oremount,rw /  
rm /.tmpfsroot  
mount -oremount,ro /  
echo リブート後、RW環境となります。

② RW環境からtmpfsroot環境に移行するスクリプト
/root/bin/change2tmpfsroot.sh:

#!/bin/bash
[ -d /tmpfsroot ] || mkdir /tmpfsroot
touch /.tmpfsroot
echo リブート後、tmpfsroot環境となります。

③ tmpfsrootのまま一時的にRW環境に入るスクリプト
/root/bin/onetime_developer.sh:

#!/bin/bash
FS_TYPE=`findmnt -no FSTYPE /etc`
if [ "x${FS_TYPE}" != "xtmpfs" ]; then
    cowsay "This is not my TMPFS-ROOT, so nothing to do for RW."
    exit
fi
mount -oremount,rw /  
mount /dev/sda2 /mnt  
mount -o bind /dev /mnt/dev  
mount -t proc proc /mnt/proc  
mount -o bind /sys /mnt/sys  
clear
cowsay This is my Onetime Developer\'s Terminal.
chroot /mnt  ## ここでTerminal操作となります。以下はexit後に実行されます。
umount /mnt/sys
umount /mnt/proc
umount /mnt/dev
umount -l /mnt
mount -oremount,ro /



ToDo

  • snap入りでの対応
  • /etc/rwtabでの対応(RHEL Statelessと同様に)
  • 事前のメモリ消費チェック

【失敗】ScreenletsをPython3向けに調整

 

今どきのIT系学生に追いつくべくPythonを少し勉強しました!。while文にelseがあるのはびっくりですが、まぁそれは使わないでしょう。センスを失う前に、古いPythonでコーディングされているScreenletsをPython3対応にしてみます。この作業のきっかけは、RHEL9でPython2を切り捨てたためです。

作業はVirtualBoxで作ったOracle Linux 9で行います。うまくいくかどうかは???

 

オペレーションメモ

 

① 必要物のインストール/入手

② 初期調整

tar xaf screenlets-0.1.7.tar.bz2
cd screenlets-0.1.7/
## Tabを8スペースに変換
find . -name "*.py" | xargs -IFILE sh -c 'expand -t8 FILE > temp;mv temp FILE'
## 2to3でPython3へ変換
find . -name "*.py" | xargs 2to3 -w
## giに関する変換
find . -name "*.py" | xargs <path>/pygi-convert.sh

③ Pango,RSVG,GTKの調整

pygi-convertではやってくれなかった部分の調整

python - Using PangoCairo with PyGObject API - Stack Overflow
migration - migrating from python-gtk2 to python-gi - Stack Overflow


import gi
from gi.repository import Pango

gi.require_version('Rsvg', '2.0')
from gi.repository import Rsvg

gi.require_version('Gtk', '3.0')
from gi.repository import Gtk, GObject

gi.require_version("Wnck", "3.0")
from gi.repository import Wnck
Wnck.set_client_type(Wnck.ClientType.PAGER)

④ BeautifulSoup

## 短い名前になっている

from bs4 import BeautifulStoneSoup

⑤ keyringの調整

## 以前からうまくいっていない様子なので、後日調整する。下記だけではNG。

Use gnomekeyring module with Python and GTK3 on Ubuntu 14.04 - Stack Overflow

⑥ アイコンの調整

cd /usr/share/icons
sudo ln -s hicolor/scalable/apps/screenlets.svg 
sudo ln -s hicolor/scalable/apps/screenlets-tray.svg

 

・・・今の状況

Python2=>3 ではなく、Pythonコードに埋め込まれたGTK2=>3の対応で、はまりました。

  • GTKAPIの変更が多すぎて、力づくでは対応しきれず。
  • GTK2to3 converterを探しましたが、発見できず。
  • GTK2にダウングレード指定しても、他の実装との整合がとれず。

ここで力尽きました ... _| ̄|◯ 

 

似たことにチャレンジしている人は多そうですが、このstackoverflow記事に示されている内容をしっかり理解してとりかからないと難しそうです。dialogやwiptailといったCUI系は得意なんですけど、GUI系はセンスも経験も無く、ちょっと難儀な道のりになっています。
Screenletsに似たConkyというメジャーで安定した実装もあるのですが、私はScreenletsの方がお気に入りです。近日中に再度チャレンジします。とある適用において、これがうまくいけばOracle Linux 9、だめならUbuntu 22.04という感じになります。なお、私のホビーマシンはUbuntu Studio + Xubuntu 22.04 LTSですが、Scrennletsが正常に起動しています。

[2023年3月] ChatGPT先生に相談してみました・・・さすがの見解です。

 

 

Oracle Linux 9 導入前調査(2) 電源ブチ切り対応

 

電源ブチ切りの対応は、Oracle Linux 9でも下記ガイドラインに従うのみです。注意点:

① 最初にdnf install readonly-root を忘れずに行って下さい。
② X-Windowsを起動するなら、下記ファイルも用意した方が良いです。ファイル名は任意です。

/etc/rwtab.d/myrwtab:

# コメントアウトが使えます。
# files /home
files /home/user
files /root

但し、この設定はゴミ箱や.cacheなどの見えない領域にファイルが大量に残留していると、メモリ不足でトラブルになります。この部分は、普段Unix系OSに触れている人でないと処置が難しいところではあるので、後日、ここで予防のためのスクリプトワンライナーでかっこよく示すつもり(未定)です。

SIZE=`cat /etc/rwtab /etc/rwtab.d/* | grep ^files | awk '{ print $2 }' | xargs du -s 2> /dev/null | awk '{s_ += $1} END {print s_}'`

echo "${SIZE} KB消費します。"

 

 

Oracle Linux 9 導入前調査(1)

 

結論を先に書くと、オンプレミス(自前サーバ)でデスクトップの展開が必要な環境(例えばCAD/FPGA開発環境)ならばUbuntuの方がいいです。X-Windowとしては、軽量さとお飾り機能のバランスが良いXFCE4を好んで適用/展開していますが、EPEL(RHELの拡張リポジトリ)のXFCE4は調整が行き届いていない部分が多いと感じます。がんばればXubuntuと同等レベルに持ち上げることは可能ですが、持ち上げた状態を維持するのも困難です。そもそもRHELはX-Window無しのサーバ運用がメインで、デスクトップ向けの対応はUbuntuに比べて劣ります。以下は、あくまでもRHEL9クローンを選択する状況において、その選択のひとつとして記載しています。

CentOS 8の混乱でRHELクローンの選択を強いられる中でも、自由人達からなかなか人気が出ないOracle Linux。ラズパイ向けの対応もあるのですが。。。 技術面では良い選択だと思うのですが、人気が出ない理由は、理研などの主要サーバにミラーリポジトリが無く、有償のイメージ、あるいは有償化されるのでは?という不安がつきまとうためかもしれません。確かに、かつてのJavaMySQLに対する買収後の対応を見ると不安はつきまとうと思いますが、今でも無償提供されているVirtualBoxはとても秀逸です。唯一無二の存在でもない実装については無償提供され続けると思います。また、逆に、もしもの時は有償サポートを(恐らくRHELの半額以下で)受けれるという点は、”ネームバリュー的な” 魅力でもあります。

Oracle LinuxのKernelには2種類あり、選択が可能です。Full ISOからインストールすると両方のKernelが入り、デフォルトがUEK起動となります。

  1. Unbreakable Enterprise Kernel ( UEK ) (デフォルト)
  2. Red Hat Compatible Kernel ( RHCK )

普通はUEKで良いと思います。理由は、古くなっていくKernelに最新状態を反映していく作業というのは近いうちに限界になると思われ、UEKの進め方が正しいと感じるためです。RHEL7/CentOS7は当にその限界を超えていると見られている節があります。

※ なお、私の周囲では、インストーラをポチポチ進めるのではなく、諸悪の根源となるLVMを外してください。デスクトップ系LinuxではデフォルトLVM Offであることが多い中、RedHat系はデフォルトOnです。該当部をYouTube既存投稿から紹介します。

youtu.be

リポジトリURL:
「インストールソース」をhttpで指定する場合のURLです。コピペできませんので、手入力となります。
Installation media copy of Oracle Linux 9 BaseOS GA :

http://yum.oracle.com/​repo/​OracleLinux/​OL9/​0/​baseos/​base/​x86_64

インストーラ
Oracle Linux ISOs | Oracle, Software. Hardware. Complete.

注意事項:
私のホビーマシンのルートファイルシステムとして永年適用しているbtrfsをここでも使いたかったのですが、「/ 」での利用は断念しました。インストール時にリポジトリURLを設定すればbtrfsを選択できるようになりますが、インストール完了後、OSが起動しませんでした。grubかinitramfsにbtrfsの実装が欠けている可能性があり、もしそうならバージョン初期のインストーラによくあるトラブルのひとつと思われます。/optにbtrfsのSSDをマウントし、サブボリュームで細分化する方向で進めます(開発ツール等は/optに入れます)。なお、btrfsはOracleが開発しGPLオープン公開したファイルシステムです

その他:
私がOracle Linuxをスコープに入れたきっかけは、Xilinx社の古い開発環境 ISE14.7 Windows最終版Oracle Linux6 の仮想マシンで配布されていたためでした。それを知るまではOracle Linuxは全くのスコープ外でした。なお、ISEはシングルスレッドアプリなので、コンパイル時間を時短するにはCPUコア増やしても無意味で、別の工夫が必要です。

伏魔殿の女王

ここはの伏魔殿。の呼吸 壱の型 は、のバックニークロス。の断片も随所にちりばめられる。このステップは、ここでしか味わえない。中級未満の新参者は、このステップでバランスを崩し、討ち死にしていく。
勝手に決めたテーマ曲は ほむら 。全集中の呼吸でスタジオに入る。但し、『さようなら♪ ありがとう♪』 というのはまだまだずっと先のこと!

 

スタジオ前に並ぶ人々(・・・魑魅魍魎ちみもうりょうさん達の仮の姿)を見て、これなら勝てる!と完全になめて飛び込んだエアロビクスで、見事なフリーズ地蔵となったのはおおよそ5年前のこと。

  • 最後尾列は地獄・・・とは後で知った私。
  • 魑魅魍魎さん達が一斉にターンしたとき、取り残された私。
  • そこでメデューサに睨まれて石化がはじまり、中盤以降は地蔵となった私。
  • 普段はひっそりと目立たないお地蔵様。伏魔殿では逆に異物のように目立つ。
    はずかしくて更に硬直した私。
  • 全身の筋肉が凍りつき、途中退出することすらできなかった私。 (-_-;)

あの恐怖から5年。コツコツと修行を重ね、今では周囲の魑魅魍魎さん達に助けられ守られながら、伏魔殿エアロを楽しんでいる。ミスヒットプチフリーズはあっても、地蔵にはならない。もう、私も魑魅魍魎の一人だ。

今では自分の成長を感じ取れる唯一の取り組みとなっている。普段は全く進歩を感じることはできないけれど、1年前と比べれば、軸、バランス、ムーブメント、キャッチ力が確実に進化している。私にはまだまだ伸びしろがある!

コロナ禍以前は、ここで汗を流した後、塾帰りの娘と待ち合わせ、いっしょに帰宅していた。娘から「ありがとう」と言われたことは一度も無い(T_T) けれど、そうした平凡な日常のルーチンは今では大切な想い出。いろいろな想いが染み込んだこの伏魔殿、いつまでも、いつまでも、続いてほしいな。


注:念の為ですが、本当に全集中の呼吸を続けると、早死にします。実際には吐く息の方を意識し、女王様から教わった軸(丹田から太もも両足内側の細いU字)に集中します。

 

備考:私が地蔵になった頃はMAX160テンポ(←Youtubeメトロノーム)だったそうで、今はMAX140くらいで抑えていると伺いました。マスク着用であることも考慮されてのことかと思います。このテンポであれば、中級未満の方でも私のような完全フリーズ地蔵になることは無いでしょう。実際にはもっとゆっくりだった気もしますし、参加者のレベルに合わせて徐々にテンポアップされますので、安心してご参加ください!

2023年 年末
永遠に続くと思い込んでいた炎の伏魔殿、2023年をもって終焉一区切りとなりました。女王様曰く、「完全燃焼しました」とのこと。ご引退ではありませんが、本当にお疲れ様でした。私にとっては、体調を崩し死にかけたどん底からの復活を証明する舞台であり、アラフィフの青春の舞台でした。ご指導、ありがとうございました。