Ubuntu 20.04でインストールされるdrbdは8.4なのか9.11なのか?


Ubuntu 20.04でdrbdを使おうとしたら、drbd-utilsのバージョンは9.11.0だが、drbd自体は8.4.11 といういまいちわけがわからない状態になっていた。

2022/04/22追記:Ubuntu 22.04 LTSでも状況はほぼ同じだった。詳しくは最後尾
2023/02/20: 本文を現状にあわせて若干修正

どういうことなのか調査してみた。

なお、drbd 8.4.11として使った場合にいくつか問題点があったが、それについては別記事「Ubuntu 20.04で標準のdrbd 8.4.11を使う場合の注意点」に記載している。


ubuntuのサイトに掲載されている「Ubuntu HA – DRBD」ではバージョンに関する話は特に書いておらず「sudo apt install drbd-utils」だけでインストールは完了し、あとは/etc/drbd.confの編集、という手順になっている。

次にdrbdの開発元であるlinbitが公開している「drbd 8ドキュメント」と「drbd 9ドキュメント」を見るとそれぞれ手順が異なっている。

drbd8では標準レポジトリだけでインストールできる、という趣旨だったものが、drbd9では明示的にPPAレポジトリを使え、と変更されている。

とりあえずは「apt install drbd-utils」でインストールかな?と実行してみると普通に実行できる。

$ sudo -i
# apt install drbd-utils
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  guile-2.2-libs libgc1c2 libgsasl7 libidn11 libkyotocabinet16v5 libmailutils6
  libmysqlclient21 libntlm0 mailutils mailutils-common mysql-common postfix
  ssl-cert
Suggested packages:
  heartbeat mailutils-mh mailutils-doc procmail postfix-mysql postfix-pgsql
  postfix-ldap postfix-pcre postfix-lmdb postfix-sqlite sasl2-bin
  | dovecot-common resolvconf postfix-cdb postfix-doc openssl-blacklist
The following NEW packages will be installed:
  drbd-utils guile-2.2-libs libgc1c2 libgsasl7 libidn11 libkyotocabinet16v5
  libmailutils6 libmysqlclient21 libntlm0 mailutils mailutils-common
  mysql-common postfix ssl-cert
0 upgraded, 14 newly installed, 0 to remove and 0 not upgraded.
Need to get 9,579 kB of archives.
After this operation, 66.5 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
<略>

postfixとdovecotもインストールされるため下記のダイアログも開くので注意が必要。

インストール後、パッケージを調べて見ると、drbd-utilsは9.11.0だけど、drbd-docは8.4というちぐはぐな状態であることに気がつく。

root@ubuntu143:~# apt search drbd
Sorting... Done
Full Text Search... Done
collectd-core/focal 5.9.2.g-1ubuntu5 amd64
  statistics collection and monitoring daemon (core system)

drbd-doc/focal 8.4~20151102-1 all
  RAID 1 over TCP/IP for Linux (user documentation)

drbd-utils/focal,now 9.11.0-1build1 amd64 [installed]
  RAID 1 over TCP/IP for Linux (user utilities)

nagios-plugins-contrib/focal 25.20191015+1ubuntu1 amd64
  Plugins for nagios compatible monitoring systems

prometheus-hacluster-exporter/focal 0.4.0-2 amd64
  Prometheus exporter for HA cluster services

root@ubuntu143:~#

動作させてみると /proc/drbd が返すバージョンは 「version: 8.4.11 (api:1/proto:86-101)」だった。

root@ubuntu143:~# cat /proc/drbd
version: 8.4.11 (api:1/proto:86-101)
srcversion: FC3433D849E3B88C1E7B55C
 0: cs:Connected ro:Primary/Secondary ds:UpToDate/UpToDate C r-----
    ns:6276 nr:0 dw:42864576 dr:5041 al:328 bm:0 lo:0 pe:0 ua:0 ap:0 ep:1 wo:f oos:0
root@ubuntu143:~#

drbdは9.0からauto promoteという機能が追加されたので、それを使いたい場合に、8.4だと困る、ということになる。

このauto promoteは、両ノードが再起動した際に最初にdrbdデバイスにアクセスしてきたノードを自動的にprimaryに設定してくれる、という機能である。(8.xまでは両方ともSecondaryのままで、手動でprimaryに設定する必要があった)

というわけで、drbd9を使いたい場合は、PPAレポジトリを追加してlinbitが提供するdrbd9をインストールする必要がある。

ドキュメントに書かれているPPAレポジトリ情報は誤りがあり、正しくは「https://launchpad.net/~linbit/+archive/ubuntu/linbit-drbd9-stack」だった。

ここにあるように「add-apt-repository ppa:linbit/linbit-drbd9-stack」を実行してPPAレポジトリを追加する。

root@ubuntu143:~# add-apt-repository ppa:linbit/linbit-drbd9-stack
 This PPA contains DRBD9, drbd-utils, LINSTOR (client, python API, server).

This differs from official, production grade LINBIT repositories in several ways, including:
- We push RCs immediately to the PPA
- We don't push hotfixes, these usually have to wait until the next RC/release
- We only keep 2 LTS versions up to date (Bionic and Focal, but not Xenial)

For support and access to official repositories see:
https://www.linbit.com or write an email to: sales AT linbit.com
 More info: https://launchpad.net/~linbit/+archive/ubuntu/linbit-drbd9-stack
Press [ENTER] to continue or Ctrl-c to cancel adding it.

Hit:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
Get:4 http://jp.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Get:5 http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu focal InRelease [24.4 kB]
Get:6 http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu focal/main amd64 Packages [2,344 B]
Get:7 http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu focal/main Translation-en [1,308 B]
Fetched 356 kB in 3s (137 kB/s)
Reading package lists... Done
root@ubuntu143:~#

で・・・linbit提供のdrbdはdkmsモジュールとして提供されるため「apt install drbd-utils drbd-dkms」を実行してインストールすることになる。

今回のテスト環境ではdrbd8が既にインストールされていたので、最初に「apt update;apt upgrade」を実行してapt-utilsのバージョンアップを行った。

root@ubuntu143:~# apt update
Hit:1 http://jp.archive.ubuntu.com/ubuntu focal InRelease
Get:2 http://jp.archive.ubuntu.com/ubuntu focal-updates InRelease [114 kB]
Get:3 http://jp.archive.ubuntu.com/ubuntu focal-backports InRelease [101 kB]
Get:4 http://jp.archive.ubuntu.com/ubuntu focal-security InRelease [114 kB]
Hit:5 http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu focal InRelease
Fetched 328 kB in 1s (538 kB/s)
Reading package lists... Done
Building dependency tree
Reading state information... Done
1 package can be upgraded. Run 'apt list --upgradable' to see it.
root@ubuntu143:~# apt list --upgradable
Listing... Done
drbd-utils/focal 9.19.1-1ppa1~focal1 amd64 [upgradable from: 9.11.0-1build1]
N: There is 1 additional version. Please use the '-a' switch to see it
root@ubuntu143:~# apt upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages will be upgraded:
  drbd-utils
1 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
Need to get 720 kB of archives.
After this operation, 75.8 kB of additional disk space will be used.
Do you want to continue? [Y/n] y
Get:1 http://ppa.launchpad.net/linbit/linbit-drbd9-stack/ubuntu focal/main amd64 drbd-utils amd64 9.19.1-1ppa1~focal1 [720 kB]
Fetched 720 kB in 3s (214 kB/s)
Preconfiguring packages ...
(Reading database ... 72754 files and directories currently installed.)
Preparing to unpack .../drbd-utils_9.19.1-1ppa1~focal1_amd64.deb ...
Unpacking drbd-utils (9.19.1-1ppa1~focal1) over (9.11.0-1build1) ...
Setting up drbd-utils (9.19.1-1ppa1~focal1) ...

Configuration file '/etc/drbd.d/global_common.conf'
 ==> Modified (by you or by a script) since installation.
 ==> Package distributor has shipped an updated version.
   What would you like to do about it ?  Your options are:
    Y or I  : install the package maintainer's version
    N or O  : keep your currently-installed version
      D     : show the differences between the versions
      Z     : start a shell to examine the situation
 The default action is to keep your current version.
*** global_common.conf (Y/I/N/O/D/Z) [default=N] ? y
Installing new version of config file /etc/drbd.d/global_common.conf ...
Installing new version of config file /etc/init.d/drbd ...
Processing triggers for man-db (2.9.1-1) ...
Processing triggers for systemd (245.4-4ubuntu3.13) ...
root@ubuntu143:~#

次に、「apt install drbd-dkms」でdrbd本体をインストールした。

root@ubuntu143:~# apt install drbd-dkms
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following additional packages will be installed:
  autoconf automake autopoint autotools-dev binutils binutils-common
  binutils-x86-64-linux-gnu build-essential cpp cpp-9 dctrl-tools debhelper
  dh-autoreconf dh-strip-nondeterminism dkms dpkg-dev dwz fakeroot g++ g++-9
  gcc gcc-9 gcc-9-base gettext intltool-debian libalgorithm-diff-perl
  libalgorithm-diff-xs-perl libalgorithm-merge-perl libarchive-cpio-perl
  libarchive-zip-perl libasan5 libatomic1 libbinutils libc-dev-bin libc6-dev
  libcc1-0 libcroco3 libcrypt-dev libctf-nobfd0 libctf0 libdebhelper-perl
  libdpkg-perl libfakeroot libfile-fcntllock-perl
  libfile-stripnondeterminism-perl libgcc-9-dev libgomp1 libisl22 libitm1
  liblsan0 libltdl-dev libmail-sendmail-perl libmpc3 libquadmath0
  libstdc++-9-dev libsub-override-perl libsys-hostname-long-perl libtool
  libtsan0 libubsan1 linux-libc-dev m4 make manpages-dev po-debconf
Suggested packages:
  autoconf-archive gnu-standards autoconf-doc binutils-doc cpp-doc
  gcc-9-locales debtags dh-make menu debian-keyring g++-multilib
  g++-9-multilib gcc-9-doc gcc-multilib flex bison gdb gcc-doc gcc-9-multilib
  gettext-doc libasprintf-dev libgettextpo-dev glibc-doc bzr libtool-doc
  libstdc++-9-doc gfortran | fortran95-compiler gcj-jdk m4-doc make-doc
  libmail-box-perl
The following NEW packages will be installed:
  autoconf automake autopoint autotools-dev binutils binutils-common
  binutils-x86-64-linux-gnu build-essential cpp cpp-9 dctrl-tools debhelper
  dh-autoreconf dh-strip-nondeterminism dkms dpkg-dev drbd-dkms dwz fakeroot
  g++ g++-9 gcc gcc-9 gcc-9-base gettext intltool-debian
  libalgorithm-diff-perl libalgorithm-diff-xs-perl libalgorithm-merge-perl
  libarchive-cpio-perl libarchive-zip-perl libasan5 libatomic1 libbinutils
  libc-dev-bin libc6-dev libcc1-0 libcroco3 libcrypt-dev libctf-nobfd0 libctf0
  libdebhelper-perl libdpkg-perl libfakeroot libfile-fcntllock-perl
  libfile-stripnondeterminism-perl libgcc-9-dev libgomp1 libisl22 libitm1
  liblsan0 libltdl-dev libmail-sendmail-perl libmpc3 libquadmath0
  libstdc++-9-dev libsub-override-perl libsys-hostname-long-perl libtool
  libtsan0 libubsan1 linux-libc-dev m4 make manpages-dev po-debconf
0 upgraded, 66 newly installed, 0 to remove and 0 not upgraded.
Need to get 47.8 MB of archives.
After this operation, 208 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
<略>
drbd.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.4.0-90-generic/updates/dkms/

drbd_transport_tcp.ko:
Running module version sanity check.
 - Original module
   - No original module exists within this kernel
 - Installation
   - Installing to /lib/modules/5.4.0-90-generic/updates/dkms/

depmod..........

DKMS: install completed.
Processing triggers for install-info (6.7.0.dfsg.2-5) ...
Processing triggers for libc-bin (2.31-0ubuntu9.2) ...
Processing triggers for man-db (2.9.1-1) ...
root@ubuntu143:~#

これで再起動

すると下記の様にdrbdのバージョンが「version: 9.1.4 (api:2/proto:110-121)」となった。

root@ubuntu143:~# cat /proc/drbd
version: 9.1.4 (api:2/proto:110-121)
GIT-hash: e4de25c3a65811b0fa4733b1c2a000ee322f5cfa build by root@ubuntu143, 2021-11-24 07:10:11
Transports (api:17): tcp (9.1.4)
root@ubuntu143:~#

この状態でdrbd関連パッケージの状態を確認する下記の様になっていた。

root@ubuntu143:~# apt search drbd
Sorting... Done
Full Text Search... Done
collectd-core/focal 5.9.2.g-1ubuntu5 amd64
  statistics collection and monitoring daemon (core system)

drbd-dkms/focal,now 9.1.4-1ppa1~focal1 all [installed]
  RAID 1 over TCP/IP for Linux module source

drbd-doc/focal 8.4~20151102-1 all
  RAID 1 over TCP/IP for Linux (user documentation)

drbd-module-source/focal 9.1.4-1ppa1~focal1 all
  RAID 1 over TCP/IP for Linux module source

drbd-reactor/focal 0.5.0-1ppa1~focal1 amd64
  Monitors DRBD resources via plugins.

drbd-utils/focal,now 9.19.1-1ppa1~focal1 amd64 [installed]
  RAID 1 over TCP/IP for Linux (user utilities)

drbd8-utils/focal 2:9.19.1-1ppa1~focal1 amd64
  transitional dummy package

linstor-common/focal 1.16.0-1ppa1~focal1 all
  DRBD distributed resource management utility

linstor-controller/focal 1.16.0-1ppa1~focal1 all
  DRBD distributed resource management utility

linstor-satellite/focal 1.16.0-1ppa1~focal1 all
  DRBD distributed resource management utility

nagios-plugins-contrib/focal 25.20191015+1ubuntu1 amd64
  Plugins for nagios compatible monitoring systems

prometheus-hacluster-exporter/focal 0.4.0-2 amd64
  Prometheus exporter for HA cluster services

root@ubuntu143:~#

2022/04/22追記

Ubuntu 22.04 LTSが出たので状況を確認してみた。

user$ apt search drbd
Sorting... Done
Full Text Search... Done
drbd-doc/jammy 8.4~20220106-1 all
  RAID 1 over TCP/IP for Linux (user documentation)

drbd-utils/jammy 9.15.0-1build2 amd64
  RAID 1 over TCP/IP for Linux (user utilities)

monitoring-plugins-contrib/jammy 37.20211217ubuntu1 amd64
  Plugins for nagios compatible monitoring systems

prometheus-hacluster-exporter/jammy 1.2.3-2 amd64
  Prometheus exporter for HA cluster services

user@ubuntu2204:~$ modinfo drbd
filename:       /lib/modules/5.15.0-25-generic/kernel/drivers/block/drbd/drbd.ko
alias:          block-major-147-*
license:        GPL
version:        8.4.11
description:    drbd - Distributed Replicated Block Device v8.4.11
author:         Philipp Reisner <phil@linbit.com>, Lars Ellenberg <lars@linbit.com>
srcversion:     C369F58AE19642816B00C81
depends:        lru_cache,libcrc32c
retpoline:      Y
intree:         Y
name:           drbd
vermagic:       5.15.0-25-generic SMP mod_unload modversions
sig_id:         PKCS#7
signer:         Build time autogenerated kernel key
sig_key:        43:DE:0B:33:F7:CF:5A:CE:F6:19:E2:2A:DD:DD:1D:BD:4D:ED:8E:ED
sig_hashalgo:   sha512
signature:      72:7A:0C:A3:E5:31:68:E8:FC:55:61:6F:FF:E1:11:B1:90:9F:8D:DF:
                29:E0:16:9D:C5:6D:0A:D4:A6:48:88:87:E0:5B:46:73:96:24:8A:1D:
                51:1E:39:4B:A4:20:65:42:2F:A7:2B:6A:ED:AE:8B:4E:FD:0F:E5:94:
                7C:03:0D:53:1F:21:C4:09:AF:7A:91:32:23:0E:E2:3A:32:79:FF:0B:
                36:E7:BC:7A:5E:72:A0:6E:05:2C:04:B6:4B:01:77:65:5A:43:EA:AB:
                F0:BE:B0:97:2E:65:81:7B:90:67:76:E5:64:2D:EF:8A:9A:3F:21:DD:
                CF:A6:C8:3B:87:4D:C1:1C:6C:F8:AD:F2:01:C2:DC:BD:CA:3F:85:4C:
                A8:A6:B3:C5:83:C8:13:76:31:77:51:8C:37:3D:D4:77:00:29:8F:BE:
                1A:E3:C4:1F:EE:96:1E:24:24:9A:77:BE:F4:7C:40:4D:BD:34:83:69:
                8D:0C:E6:DA:FC:F0:65:74:52:86:EA:8F:26:2B:71:5B:BB:79:73:0C:
                26:D1:66:4D:FC:71:B2:E4:B3:0B:4D:85:EC:CF:98:CB:E6:83:C6:79:
                28:F1:BF:23:CC:30:68:0E:F4:50:85:04:D1:AF:87:31:E0:4E:A5:1D:
                5B:F7:6F:18:34:17:E9:8D:84:6C:B5:2C:9F:6F:38:DA:4D:9D:4B:3F:
                38:6D:38:5E:02:56:23:DB:B3:F4:06:6E:EE:52:F1:09:62:59:1A:BA:
                57:1E:E7:10:0F:61:E1:86:5C:3E:ED:67:D6:AF:9F:CE:69:F3:38:D4:
                EA:91:30:72:7F:B3:02:08:82:0F:C4:4B:8C:85:86:6E:4A:9F:E3:51:
                78:A7:4D:C2:E1:E2:7D:20:F5:42:F6:A7:6F:76:76:04:B9:93:E7:99:
                53:9A:3F:6D:61:AA:31:B2:04:59:BE:E4:16:E3:8C:4E:D0:58:0A:FE:
                FF:1C:79:D6:5E:72:72:3D:A0:41:47:DC:04:8C:04:04:C6:E7:6A:55:
                5A:E7:FC:B1:C5:B5:CD:C3:D3:03:3A:B8:3E:C1:24:87:93:DD:34:1A:
                4B:97:3B:61:7C:CB:E9:34:90:C2:C5:C5:2A:79:74:D1:49:E6:50:A1:
                9F:35:AA:14:38:1B:0F:01:27:4E:44:F5:0F:7C:28:41:77:0A:AB:A9:
                0A:43:0C:CB:69:27:B8:E4:CA:FA:E9:01:12:A3:57:D2:7B:9F:9F:8E:
                4D:A1:F9:5B:12:AD:F8:87:FA:49:F2:E3:72:D4:2A:A4:6F:EF:C7:13:
                2D:96:BF:E9:7C:3F:63:5B:60:C7:33:7B:5C:FA:9A:3A:66:83:41:63:
                B6:67:18:DC:D4:5F:D6:4B:5F:DA:F2:74
parm:           allow_oos:DONT USE! (bool)
parm:           disable_sendpage:bool
parm:           proc_details:int
parm:           minor_count:Approximate number of drbd devices (1-255) (uint)
parm:           usermode_helper:string
user@ubuntu2204:$

drbd-utilsのバージョンが 9.15.0 にアップデートしているが、kernelに含まれているdrbd は8.4.11 のままとなっていた。

Oracle Linux 8でphp 7.4.19-1にアップデート後からphp-fpmが起動しなくなった


Oracle Cloud上にARMインスタンスをたててOracle Linux 8をインストールしてwordpressサーバの運用を開始した。

ところが今日の朝実行された dnf automaticによる自動更新後、wordpressが「Service Unavailable」となり表示出来ない。

sshログインして確認するとphp-fpmが起動していない。

[root@retoge ~]# systemctl status php-fpm|cat
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: failed (Result: exit-code) since Thu 2021-11-18 09:25:41 JST; 16s ago
  Process: 482320 ExecStart=/usr/sbin/php-fpm --nodaemonize (code=exited, status=127)
 Main PID: 482320 (code=exited, status=127)

Nov 18 09:25:41 retoge systemd[1]: Starting The PHP FastCGI Process Manager...
Nov 18 09:25:41 retoge php-fpm[482320]: /usr/sbin/php-fpm: error while loading shared libraries: cannot restore segment prot after reloc: Permission denied
Nov 18 09:25:41 retoge systemd[1]: php-fpm.service: Main process exited, code=exited, status=127/n/a
Nov 18 09:25:41 retoge systemd[1]: php-fpm.service: Failed with result 'exit-code'.
Nov 18 09:25:41 retoge systemd[1]: Failed to start The PHP FastCGI Process Manager.
[root@retoge ~]#

SELinuxの問題で起動していなさそうなので/var/log/audit/audit.log を確認してみると下記の出力があった。

type=AVC msg=audit(1637195141.234:5827): avc:  denied  { execmod } for  pid=482320 comm="php-fpm" path="/usr/sbin/php-fpm" dev="dm-0" ino=369761 scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:object_r:httpd_exec_t:s0 tclass=file permissive=0

type=SERVICE_START msg=audit(1637195141.238:5828): pid=1 uid=0 auid=4294967295 ses=4294967295 subj=system_u:system_r:init_t:s0 msg='unit=php-fpm comm="systemd" exe="/usr/lib/systemd/systemd" hostname=? addr=? terminal=? res=failed'^]UID="root" AUID="unset"

関連していそうなファイルのセキュリティコンテキストを確認

[root@retoge ~]# ls -lZ /usr/sbin/php-fpm
-rwxr-xr-x. 1 root root system_u:object_r:httpd_exec_t:s0 4656056 Oct 12 18:47 /usr/sbin/php-fpm
[root@retoge ~]# restorecon -R -v /usr/sbin
[root@retoge ~]# ls -lZ /usr/sbin/php-fpm
-rwxr-xr-x. 1 root root system_u:object_r:httpd_exec_t:s0 4656056 Oct 12 18:47 /usr/sbin/php-fpm
[root@retoge ~]# ls -lZ /usr/lib/systemd/systemd
-rwxr-xr-x. 1 root root system_u:object_r:init_exec_t:s0 1528680 Nov 11 09:41 /usr/lib/systemd/systemd
[root@retoge ~]# restorecon -R -v /usr/lib
[root@retoge ~]# ls -lZ /usr/lib/systemd/systemd
-rwxr-xr-x. 1 root root system_u:object_r:init_exec_t:s0 1528680 Nov 11 09:41 /usr/lib/systemd/systemd
[root@retoge ~]#

特に問題はなさそう?

ぐぐった時に出てきた「Bug 1670386 – AVC denied httpd_execmem for php-fpm when php-opcache is installed」が近いかな?と httpdのhttpd_execmemをonに変えてみたけど、これだけではダメな模様(後述のaudit2allowの結果を見ると、これ自体は必要そうでした)

[root@retoge ~]# getsebool httpd_execmem
httpd_execmem --> off
[root@retoge ~]# setsebool -P httpd_execmem on
[root@retoge ~]# getsebool httpd_execmem
httpd_execmem --> on
[root@retoge ~]# 
[root@retoge ~]# systemctl start php-fpm
Job for php-fpm.service failed because the control process exited with error code.
See "systemctl status php-fpm.service" and "journalctl -xe" for details.
[root@retoge ~]# systemctl restart httpd
[root@retoge ~]# systemctl start php-fpm
Job for php-fpm.service failed because the control process exited with error code.
See "systemctl status php-fpm.service" and "journalctl -xe" for details.
[root@retoge ~]#

今回はとりあえずphp-fpmが動けばいいか、ということで、問題となっているものを無視して起動できるようにしてしまうことにした。

まず、ausearchコマンドで関係するものをピックアップして、audit2allowで作成される予定のルールを確認する。

[root@retoge ~]# ausearch -m AVC |grep php| audit2allow


#============= httpd_t ==============

#!!!! This avc is allowed in the current policy
allow httpd_t http_port_t:tcp_socket name_connect;
allow httpd_t httpd_exec_t:file execmod;

#!!!! This avc can be allowed using the boolean 'httpd_unified'
allow httpd_t httpd_sys_content_t:dir write;

#!!!! This avc can be allowed using the boolean 'httpd_unified'
allow httpd_t httpd_sys_content_t:file write;
[root@retoge ~]#

これをモジュール化して組み込みます。

[root@retoge ~]# ausearch -m AVC |grep php| audit2allow -M php-fpm
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i php-fpm.pp

[root@retoge ~]# ls -l php-fpm*
-rw-r--r--. 1 root root 1594 Nov 18 09:51 php-fpm.pp
-rw-r--r--. 1 root root  597 Nov 18 09:51 php-fpm.te
[root@retoge ~]#

[root@retoge ~]# semodule -l |grep php
[root@retoge ~]# semodule -i php-fpm.pp
[root@retoge ~]# semodule -l |grep php
php-fpm
[root@retoge ~]#

php-fpmを起動してみます。

[root@retoge ~]# systemctl start php-fpm
[root@retoge ~]# systemctl status php-fpm
● php-fpm.service - The PHP FastCGI Process Manager
   Loaded: loaded (/usr/lib/systemd/system/php-fpm.service; disabled; vendor preset: disabled)
   Active: active (running) since Thu 2021-11-18 09:53:45 JST; 5s ago
 Main PID: 489019 (php-fpm)
   Status: "Ready to handle connections"
    Tasks: 6 (limit: 36876)
   Memory: 24.1M
   CGroup: /system.slice/php-fpm.service
           tq489019 php-fpm: master process (/etc/php-fpm.conf)
           tq489020 php-fpm: pool www
           tq489021 php-fpm: pool www
           tq489022 php-fpm: pool www
           tq489023 php-fpm: pool www
           mq489024 php-fpm: pool www

Nov 18 09:53:45 retoge systemd[1]: Starting The PHP FastCGI Process Manager...
Nov 18 09:53:45 retoge systemd[1]: Started The PHP FastCGI Process Manager.
[root@retoge ~]#

正常に起動が成功し、wordpressの動作も正常となりました。


2022/01/20追記

放置していたサーバでも発生していたので対処したところ、httpd_execmem有効化とselinuxモジュール追加で動き出しました

[root@retoge ~]# getsebool httpd_execmem
httpd_execmem --> off
[root@retoge ~]# setsebool -P httpd_execmem on
[root@retoge ~]# getsebool httpd_execmem
httpd_execmem --> on
[root@retoge ~]# ausearch -m AVC |grep php |audit2allow


#============= httpd_t ==============
allow httpd_t httpd_exec_t:file execmod;
[root@retoge ~]# ausearch -m AVC |grep php |audit2allow -M php-fpm
******************** IMPORTANT ***********************
To make this policy package active, execute:

semodule -i php-fpm.pp
[root@retoge ~]# semodule -i php-fpm.pp
[root@retoge ~]# systemctl start php-fpm
[root@retoge ~]#

はてなブログからwordpressへぶっこぬきで移行した話


現在はてなブログで運用しているけど、画像付きでのエクスポートができない、とかいう話を聞いた。

ローカルに静的コンテンツとして取り込もう

とりあえず、本文と画像をダウンロードすればいいだろう、と、まずは簡単に下記でコンテンツ取得をかけた。

wget --mirror \
    --page-requisites \
    --quiet --show-progress \
    --no-parent \
    --convert-links \
    --adjust-extension \
    --execute robots=off \
    https://retoge-mag.hatenablog.com/

適当なWebサーバに配置して見てみると、HTMLのみで、そしてサイト内リンクもhttpsからフルで指定されているタイプだったので、URL書き換えを雑に実施。

他にもHTML書き換えが必要だろう、ということでダウンロードしてきたやつではなく、閲覧用のHTMLを別に用意することにして、下記の様に実行した。

cp -r retoge-mag.hatenablog.com viewpage

for file in `find ./viewpage -name \*.html -print`
do
 sed -i -e "s/retoge-mag.hatenablog.com/retoge-mag.websa.jp\/old\/viewpage/g" $file
done

これでまずはHTMLのみがコピーされた状態だが、リンクをいくつかクリックしてみると404 not foundとなるものがある。

日付ごとのまとめはダウンロードされていないが、これについては無視することとした。

個別記事のリンクで、末尾が数字で終わっているものがいくつかあり、それで404が発生していた。それらのコンテンツは数字.htmlという形でダウンロードされていたので .htaccess に下記の設定を行った。

<IfModule mod_rewrite.c>
RewriteEngine On

RewriteCond     %{REQUEST_FILENAME} !-f
RewriteRule     ^(.*)$ $1.html [L]

</IfModule>

次に画像のダウンロードを行った。

HTMLからhttp か httpsで始まるリンクっぽいものを集めてみると画像は st-hatena.com というドメイン名の所に置いてあるようだった。

なので、下記スクリプトを実行して、該当するURLを全てダウンロードしてきた。

for file in `find ./viewpage -name \*.html -print`
do
 grep -oE 'http(s?)://[0-9a-zA-Z?=#+_&:;/.%\-]+' $file >> urllists.txt
done
sort urllists.txt | uniq > urllists2.txt
grep st-hatena.com urllists2.txt > urllists3.txt
wget --mirror     --page-requisites     --quiet --show-progress     --no-parent     --convert-links     --adjust-extension -i urllists3.txt

なお、最初は「grep -oE ‘http(s?)://[0-9a-zA-Z?=#+_&:/.%-]+’ $file >> urllists.txt」だったのだが、縮小処理をかけた画像のURLに;が含まれていたので、追加している。

画像はローカルにダウンロードできたものの、HTMLの方は書き換わっていないため、以下で書き換えを実施した。

for file in `find ./viewpage -name \*.html -print`
do
 sed -i -e "s/b.st-hatena.com/retoge-mag.websa.jp\/old\/b.st-hatena.com/g" $file
 sed -i -e "s/cdn-ak.f.st-hatena.com/retoge-mag.websa.jp\/old\/cdn-ak.f.st-hatena.com/g" $file
 sed -i -e "s/cdn.blog.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.blog.st-hatena.com/g" $file
 sed -i -e "s/cdn.pool.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.pool.st-hatena.com/g" $file
 sed -i -e "s/cdn.profile-image.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.profile-image.st-hatena.com/g" $file
 sed -i -e "s/cdn.user.blog.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.user.blog.st-hatena.com/g" $file
 sed -i -e "s/usercss.blog.st-hatena.com/retoge-mag.websa.jp\/old\/usercss.blog.st-hatena.com/g" $file
done

これで、見栄えは悪いものの画像ファイル含めてローカルにコンテンツ自体はコピーされた。

WordPressに取り込もう

あまりにも見栄えが悪いので、やっぱりWordpressに取り込むべきか、とインポート用XMLファイルを作ることにする。

WordPressのサイトを調べたのだがインポート用XMLファイルの仕様がよくわからなかった。

まず、Wordpressで適当に記事とカテゴリを作成して、それをエクスポートしたXMLを作成した。

結構いらない要素が多い感じがしたので最小限の記述はなにか探したところ「Simple WordPress Import Structure XML Example」を発見。

<?xml version="1.0" encoding="UTF-8" ?>

<rss version="2.0"
	xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:wp="http://wordpress.org/export/1.2/"
>

<channel>
	<wp:wxr_version>1.2</wp:wxr_version>
	<wp:author></wp:author>

	<item>
		<title>Test 1</title>
		<description></description>
		<content:encoded><![CDATA[Test Post 1]]></content:encoded>
		<excerpt:encoded><![CDATA[]]></excerpt:encoded>
		<wp:status>publish</wp:status>
		<wp:post_type>post</wp:post_type>
		<category domain="post_tag" nicename="redy"><![CDATA[redy]]></category>
		<category domain="category" nicename="teory"><![CDATA[Teory]]></category>
		<category domain="category" nicename="tree"><![CDATA[Tree]]></category>
	</item>
	<item>
		<title>Test 2</title>
		<description></description>
		<content:encoded><![CDATA[Test Post 2]]></content:encoded>
		<excerpt:encoded><![CDATA[]]></excerpt:encoded>
		<wp:status>publish</wp:status>
		<wp:post_type>post</wp:post_type>
		<category domain="category" nicename="test-category"><![CDATA[Test Category]]></category>
	</item>
</channel>
</rss>

これをベースに作成することにした。

はてなブログが出力したHTMLから下記の要素を抜き出してXMLタグを出力する test.plを作成した。

#!/bin/perl
#

use strict;
use warnings;

my $sourcefile=$ARGV[0];

if(!-f $sourcefile){
        print "file not found\n";
        exit 1;
}

my $i=0;
my @bodys;

open(FILE,$sourcefile);
while(<FILE>){
        $bodys[$i]=$_;
        $i++;
}
close(FILE);

my $maxline=$i;
my $line;

my ($st,$ed,$tmp);

my $createdate="";
my $modifydate="";
my $title="";
my $categorys="";
my $categoryssub="";
my $categorysterm="";
my $author="";
my $contents="";
my $description="";

$i=0;
while($i<$maxline){
        $line=$bodys[$i];
        if(($line =~ /<time datetime=/)&&($createdate eq "")){
                # 作成日取得
                # 下の方に他のページのdatetimeもあるので1個目だけ採用
                $st=index($line,"datetime=");
                $st=index($line,"\"",$st)+length("\"");
                $ed=index($line,"\"",$st);
                $createdate=substr($line,$st,$ed-$st);
        #}elsif(($line =~ /entry-footer-time/)&&($line =~ /class=\"updated\"/)){
        }elsif($line =~ /dateModified/){
                # 更新日取得
                $st=index($line,"dateModified");
                $st=index($line,":",$st);
                $st=index($line,"\"",$st)+length("\"");
                $ed=index($line,"\"",$st);
                $modifydate=substr($line,$st,$ed-$st);
        }elsif($line =~ /entry-title-link/){
                # タイトル取得
                $st=index($line,">")+length(">");
                $ed=index($line,"</",$st);
                $title=substr($line,$st,$ed-$st);
        }elsif($line =~ /entry-categories/){
                # カテゴリ取得
                my $flag=0;
                while($flag==0){
                        $i++;
                        $line=$bodys[$i];
                        if($line =~/<\/div>/){
                                # カテゴリ終了
                                $flag=1;
                        }elsif($line =~ /entry-category-link/){
                                $st=index($line,">")+length(">");
                                $ed=index($line,"</",$st);
                                $tmp=substr($line,$st,$ed-$st);
                                $categorys.="<category domain=\"category\" nicename=\"".$tmp."\" ><![CDATA[".$tmp."]]></category>";
                        }
                }
        }elsif($line =~ /author vcard/){
                # 作者取得
                $ed=index($line,"</");
                $st=rindex($line,">",$ed)+length(">");
                $author=substr($line,$st,$ed-$st);
        }elsif($line =~ /entry-content/){
                # 本文取得
                my $flag=0;
                while($flag==0){
                        $i++;
                        $line=$bodys[$i];
                        if($line =~/entry-footer/){
                                # 本文終了
                                $flag=1;
                        }else{
                                $contents.=$line;
                        }
                }
        }elsif($line =~ /og:description/){
                # description取得
                $st=index($line,"content=\"")+length("content=\"");
                $ed=index($line,"\"",$st);
                $description=substr($line,$st,$ed-$st);
        }


        $i++;
}
# URL変換処理
$contents =~ s/b.st-hatena.com/retoge-mag.websa.jp\/old\/b.st-hatena.com/g;
$contents =~ s/cdn-ak.f.st-hatena.com/retoge-mag.websa.jp\/old\/cdn-ak.f.st-hatena.com/g;
$contents =~ s/cdn.blog.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.blog.st-hatena.com/g;
$contents =~ s/cdn.pool.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.pool.st-hatena.com/g;
$contents =~ s/cdn.profile-image.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.profile-image.st-hatena.com/g;
$contents =~ s/cdn.user.blog.st-hatena.com/retoge-mag.websa.jp\/old\/cdn.user.blog.st-hatena.com/g;
$contents =~ s/usercss.blog.st-hatena.com/retoge-mag.websa.jp\/old\/usercss.blog.st-hatena.com/g;

#


print "<item>\n";
print "<description>".$description."</description>\n";
print "<excerpt:encoded><![CDATA[]]></excerpt:encoded>\n";
print "<wp:status>publish</wp:status>\n";
print "<wp:post_type>post</wp:post_type>\n";
print "<wp:post_date_gmt>".$createdate."</wp:post_date_gmt>\n";
#print "<wp:post_modified_gmt>".$modifydate."</wp:post_modified_gmt>\n";
print "<wp:post_modified>".$modifydate."</wp:post_modified>\n";
print "<title><![CDATA[".$title."]]></title>\n";
print $categorys."\n";
#print "<dc:creator><![CDATA[".$author."]]></dc:creator>\n";
print "<dc:creator><![CDATA[pc88multi2]]></dc:creator>\n";
#print "<content:encoded><![CDATA[<!-- wp:paragraph -->\n".$contents."<!-- /wp:paragraph -->]]></content:encoded>\n";
print "<content:encoded><![CDATA[".$contents."]]></content:encoded>\n";
print "</item>\n";

このtest.pl は単体ファイルに対してのみ実行されるので、対象ファイル群に対して実行するために下記の別スクリプトを用意して実行した。

echo '<?xml version="1.0" encoding="UTF-8" ?>' > wordpress.xml
echo '<rss version="2.0" xmlns:excerpt="http://wordpress.org/export/1.2/excerpt/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/"  xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:wp="http://wordpress.org/export/1.2/" >' >> wordpress.xml

echo '<channel><wp:wxr_version>1.2</wp:wxr_version>' >> wordpress.xml
echo '<wp:author></wp:author>' >> wordpress.xml

for file in `find retoge-mag.hatenablog.com/entry/* -name \*.html`
do echo --- $file ---
        ./test.pl $file >> wordpress.xml
done

echo '</channel>' >> wordpress.xml
echo '</rss>' >> wordpress.xml

こうして出力されたwordpress.xmlをWordpressにてインポートすることで取り込みは完了した。

なお、画像ファイルについてはXMLへどうかけばいいのかが分からなかったため、ローカルにコピーした際のURLをそのまま利用し、Wordpress管理下には置かなかった。


2021/11/30追記

この手法で取り込むとWordpress上は「クラシック」形式での状態となっていた。

各記事で「ブロックへ変換」を行ったあと

各画像でを選択し「↑」ボタンをクリックすると画像がWordpress管理下にあるwp-contentsディレクトリ内にダウンロードされ、Wordpressで管理できるようになった。

画像

Oracle Cloudで人に仮想マシンを作ってもらうための準備


Oracle CloudのFree Tierで仮想マシン作りたいけど、誰かに最初の設定をお任せしたい、という時の手順。

超絶に簡易的なもので、セキュリティ関連を考慮しない、全権限を渡してしまうタイプの手順になっていますので注意。

その1: Oracle Cloudにアカウントを作る

Oracle公式の「チュートリアル – Oracle Cloud Infrastructure を使ってみよう」を参照しながら実施します。

その2: Oracle Cloudの管理画面にログインする

2023年に管理画面のURL は https://cloud.oracle.com/ に統一されました

また、2023年後半から2段階認証が必須となり、FIDOデバイス連携もしくはモバイルアプリ(Oracle Mobile Authenticator でなくとも、 Microsoft AuthenticatorGoogle Authenticator でも大丈夫です。)を登録する必要がありますので、準備してください。

その3:ユーザー管理画面を開く

2024年3月版手順

「アイデンティティとセキュリティ」の「ドメイン」を開きます。

表示されるドメインから「Default」を選択します。(Defaultがない場合は、”コンパートメント”から(ルート)となっているものを選択します)

Defaultドメインでは「ユーザー」を選択します

開くと現在登録されているユーザー一覧が表示されます。

その4: ユーザー追加

「ユーザーの作成」をクリックして、下記の画面で「名前」としてログインする際に入力するユーザの名前を指定します。

説明はユーザを区別しやすくするためのものを入れて、最後にユーザー作成メールが届くメールアドレスを入力します。

作成すると下記のようなユーザー画面に移動します

電子メールのところが「検証保留中」となっています。

「ユーザーのパスワード作成/リセット」を選択します

ここで「パスワードの作成/リセット」をクリックすると下記の画面になります。

このパスワードは、認証する際に必要となります。ユーザ作成時に指定したメールアドレスのユーザに何らかの手段で伝えてください。

その5: ユーザー権限の追加

「ユーザーをグループに追加」を選択し、「Administrators」を選び、追加します

これでそのユーザに全ての権限を割り当てています。

なので、仮想マシンの削除も出来てしまいます。作業が終わったあとの取り扱いに注意が必要です。

その6: 届いたユーザ側の手続き

指定したメールアドレスには下記の様なメールが届いています。

URLをクリックして、もらったユーザ名とパスワードを入力してログインします。

2024年3月版手順追加

仮パスワードから本パスワードに設定したあと、2段階認証の設定を要求されます。

Oracle Mobile Authenticator でなくとも、 Microsoft AuthenticatorGoogle Authenticator でも大丈夫です。

私は Microsoft Authenticator を使用しています。その場合は、「オフライン・モードまたは別のオーセンティケータ・アプリケーションを使用」にチェックを入れて、QRコードを読み込みます。

登録完了/作業開始

ユーザ登録が完了したら必要な作業をやっていきます。

作業完了後手順

作業が終わったら、ユーザーのグループにある「administrators」の登録を削除します。

各ユーザの「グループ」にあるAdministratorの前にあるチェックボックスにチェックを入れて「削除」をクリックします。

「メンバーの削除」を選択すると下記の様にグループになにも表示されない状態となります。

この状態であればログインは出来るけど、作業はなにもできません。

そこから、さらにユーザーの削除を行う場合は「他のアクション」から「削除」を選択します。

これでログインもできなくなりました。

なお、この手順で削除されるのはOracle Cloudの管理画面だけで、別途wordpressなどの管理画面アクセスについてはそちらの設定で削除する必要がある点に注意してください。

SteamDeck疑似環境の構築方法


(2022/08/04追記:一番後ろに、SteamDeck用LinuxのSteam OSとそれを他機種でも使えるように細工したものの紹介を追加)

Steam Deckという手持ちゲーミング端末がリリースされる予定になっている。

現状は一部の開発者向けに実機の提供が行われているが、それ以外のPCでもSteam Deckで使われるManjaro Linux OSをインストールすることで検証ができるように公式の手順が公開されていた。

Developing for Steam Deck without a Dev-Kit

書いてある内容を要約すると・・・

ハードウェア構成

本体:MINISFORUM Elite Mini UM700 (日本代理店 Linksの製品紹介)の Ryzen 7 3750H 搭載モデル

AmazonのMINIFORUM直販より、日本代理店Links直販が安い場合も・・・


ディスプレイ:7インチで1280*800のカーナビ液晶を流用しているものを適当に調達

コントローラ: PS4コントローラかPS5コントローラが最適。XBOXやスイッチ用も使えなくは無いが、トラックパッドがないためフル機能が使えないことに注意。

以前売ってたSteam純正コントローラについては触れられてない・・・

OS設定について

Manjaro LinuxのKDE Plasmaエディションをインストールする。

注:実際にはGPD Pocketでインストールしてみたが、画面キャプチャが面倒だったので、以降の手順は仮想環境で行ったもので代用している。

インストーラで起動すると、下記の様に表示される

環境に合わせて「tz(タイムゾーン)」「keytable(キーボード配列)」「lang(表示言語)」を選び、「Boot with ~」を選ぶ。どっちがいいかは環境による?

しばらく待つとKDEデスクトップが表示される。

この状態でsteam導入もできなくはないのだが、起動ごとに毎回設定がやり直しになるので推奨しない。(OSアップデートがあると警告が表示されたりするが、再起動すると消えるので毎回表示される)

内蔵ディスクや、さらに別途用意したUSBメモリなどへインストールをした方が良い。

インストールはデスクトップ上の「Install Manjaro Linux」をクリックして、インストーラを進めていく。

標準では「スワップを使用しない」が設定されているが、どちらの方がいいんだろうか?(使用しないで進めた)

ゲーミング用途なら、パスワードなしの自動ログイン想定かなぁ?と

インストールを開始します。

…?

FAT32パーテーションを作成した後のLinuxパーテーション作成に失敗している?

パーテーション容量を最大サイズから少し減らしたらインストールが始まった・・・(パーテーション設定のキャプチャなし)

インストール完了

内蔵ディスクから起動しているのでデスクトップ上にInstallのアイコンが消えています。

つづいて、steamのセットアップを実施

左下の「m」メニューから「ゲーム」の「Steam (Runtime)」を選択するか

デスクトップ上で右クリックメニューにある「Show KRunnner」を選択

表示されるウィンドウに「steam」と入力して「アプリケーション Steam(Runtime)」を選択します。

そうするとデスクトップ上に「Steam (Runtime)」アイコンが追加され、Steam setupが開始されます。

セットアップではいろいろダウンロードが行われていきます。

いろいろ処理しているウィンドウが表示されなくなったらダウンロードが終わりなようで、改めてデスクトップ上の「Steam (Runtime)」をクリックすると、Steamのログイン画面が表示されます。

steamにログインすると、まあ、普通に表示されます。

最初に「Steam」の「Settings」を開きます。

「Interface」のlanguageを「日本語(Japanese)」に変更

「Steam Play」の「Enable Steam Play for all other titles」にチェックを入れて、Windowsエミュレーション機能を有効にします。

この設定でいろんなゲームがインストール可能な状態となります。

インストールを選ぶと選択したゲームの他に「Proton(Windowsエミュレーション機能)」と「Steamworks Common Redistributables」のダウンロードが始まります。

ダウンロードが終わり「プレイ」を選択します。

そうすると、「プラットフォーム互換ツールを使用して、このゲームをSteam Playで起動します」というメッセージが表示されます。

ゲームによっては起動前に Microsoft VC Redist Packageインストールなどの処理も実行されます。

やっかいな事に、こういった共有ライブラリが必須であるにも関わらず、特に設定されていないゲームの場合は、プレイボタンを押しても開始に失敗してしまいます。(そういうゲームで起動失敗した場合は何も表示されず、ただゲーム一覧のプレイボタンが再度押せるように戻っていることで察する、という感じ)

なお、仮想環境上での検証は下記の様な感じでDirectX11が上手く動かずに失敗となりました。

GPD Pocket 1で実験した所、FF3は実用的な速度で動作

A列車でいこう9は、かなり遅いものの動く

ライザのアトリエについては、タイトル画面までは出たものの、それ以後の画面は表示できず、という状態でした。


2022/08/04追記

SteamOSとその類似OS

Steam公式にある「自分だけのSteam Machineを組み立てる」はDebian 8ベースの古いSteam OSを使った説明

SteamOS 2.195 リリースノート(2019/07/18)

SteamDeck用のSteamOS 3.xはリカバリイメージとしての提供となっており「Steam Deckリカバリー手順」から入手可能

SteamOS 3.2リリースノート(2022/05/27)
SteamOS 3.3リリースノート(2022/08/03)

Steam Deckリカバリイメージは8GBのUSBメモリに書き込む形式のものとなっているが、vSphere環境上で起動してみようとしたが、うまくいかなかった。

Steam OSのバグについては https://github.com/ValveSoftware/SteamOS/issues から行える。

Steam Deckの内部構造について「Steam Deck Guide」にまとまっている。また、SteamOS相当の機能を他機種でも使えるようにしたLinuxについても紹介されている。

HoloISO

公式: https://github.com/theVakhovskeIsTaken/holoiso

Steam OS 3.xと同じArch Linuxをベースに作られているもの。

SteamDeckと同じAMD系GPUだけではなく、Intel UHD 630+ iGPUや、NVIDIA GTX 9xx GPUでも動く

Nobara Project

公式: https://gitlab.com/GloriousEggroll/nobara-images

こちらはFedora をベースにSteam OS的な機能を盛り込んだもの

ISO生成スクリプトを配布しているだけであるため、ISOファイルをつくるのは別のFedora OSが起動しているサーバで必要なパッケージをインストールした上でスクリプトを実行する必要がある。

winesapOS

公式: https://github.com/LukeShortCloud/winesapOS

USBメモリで起動して使うことを想定したもので、Intel Macでの動作もするらしい。

PlayStation4でLinuxを起動するプロジェクトと組んでPS4上でSteamゲームで遊ぶなんてこともできるらしい。→「WinesapOS 3, based on SteamOS 3 for PS4 with Mesa 22.0.3: PS4 Distro Release

USBメモリから起動する、というあたりはBatocera Linux を使っているようだ