Orange Pi 5 が届いた


2022年11月12日に発注し2022年12月5日に発送連絡があった Orange PI 5が12月19日に届いた。

Orange Pi のいつもの箱に入って届いた

中身もいつものごとく

ラズパイ2BとOrange Pi 5を並べて見る

裏面にM.2 コネクタがありますが、止めるためのネジが付属してないのでどうにか調達する必要があります。

私の場合はたまたま別件で買ったM.2 SSDにネジが添付されていたのでそれを流用しました。

さて、ここからは実際に使う為の資料について・・・

資料について

公式のマニュアルはOrange Pi 5 Downloadページ にあるUser Manualリンク にあるOrangePi_5_RK3588S_User Manual_v0.2.pdf となる。(2022/12/08版)

電源について

Orange Pi 5の注意点として電源はType-Cコネクタ形状だけれども、USB PD非対応で、5V4Aのみを受け付けるだけの単機能コネクタである、ということ。

このため、ノートパソコンなど用のType-C PD電源ををつなげても動作しません。

私の場合、秋月でラズパイ4用として売ってる「スイッチングACアダプター(USB ACアダプター) Type-Cオス 5.1V3.8A 」を買って使っています。

まお、マニュアルの上記記述にあるように、USB Type-Cとして使えるコネクタの方は電源供給には使えません。

裏面にあるM.2 コネクタには2242サイズのNVMeストレージを取り付けることができますが、固定する為のネジが添付されていません。

Orange Pi 5の基盤自体を固定する為の四隅の穴は3.0mmですが、M.2用の2230/2242用の固定穴は3.5mmとのこと。

また、GPIO端子から電源を供給することは可能ですが、推奨されていません。

GPIO端子に逆接続防止措置はないので、誤って逆に接続してしまうと基板が死ぬので注意してください。

OS書き込みについて

Linuxの場合

microSDの起動ディスクをつくる場合、Linuxを書き込む場合はddやrufus,etcher,win32diskimagerで書き込みます。

NVMe SSD起動にしたい場合は、一度microSDで起動させた後、NVMe SSDへのインストール処理を行う形となります。

使用できるNVMe SSDは、2230サイズもしくは2242サイズのものです。

NVMe SSD用に確保されている帯域は PCIe2.0x1 となっており、理論上は500MB/sまでとなります。PCIe3.0やPCIe4.0のSSDを使用しても、PCIe2.0x1で止まります。

NVMe SSDへのインストールは、Orange Pi公式配布のDebian/Ubuntuの場合「sudo nand-sata-install」を実行することでSPI Flashへブートローダを書き込み、NVMe SSDから起動できるような設定を行った上で、Linux用ディスクイメージファイルをddコマンドで/dev/nvme0n1に書き込みを行います。

書き込み後は、Linuxをshutdownし、microSDを抜いて、NVMe SSDのみとして起動します。

起動後、Orange Pi公式配布のDebian/Ubuntuの場合「sudo fix_mmc_ssd.sh」を実行し、ディスクのパーテーション調整を行います。(後述しますが、この手順は不要でした)

なお、初期ユーザは「root」パスワード「orangepi」と、ユーザ「orangepi」パスワード「orangepi」の2つがあります。

また、自動ログインの有効/無効が別途用意されているコマンドで設定できます。

詳細はUser Manualにて。

Androidの場合

Rockchip用のAndroidを起動するためのmicroSDは専用の書き込みソフトSDDiskTool(Windows)を使用する必要があります。

また、NVMe SSDからAndroidを起動したい場合は、Windows+専用ドライバ/書き込みソフト(RKDevTool)を使うことで、microSDを経由せずにType-Cケーブル経由で直接書き込むことが可能です。

ネットワーク設定について

Orange Pi公式が配布しているUbuntu/Debianイメージではネットワーク接続を /etc/network/interfaces ファイルの編集ではなくNetwork Manager経由で行う、ということになっています。

nmcliやnmtuiコマンドで設定します。


実際にセットアップしてみた

M.2 2242サイズのNVMe SSDを取り付けて…

Orangepi5_1.0.6_ubuntu_jammy_desktop_xfce_linux5.10.110.img をmicroSDに書き込んで初回起動すると、X-Windowでログインした状態となる

この際のユーザは「orangepi」

コマンドで「ip a s」などを実行してIPアドレスを確認して、sshでログイン

その際は「orangepi」でパスワードも「orangepi」

  ___  ____  _   ____
 / _ \|  _ \(_) | ___|
| | | | |_) | | |___ \
| |_| |  __/| |  ___) |
 \___/|_|   |_| |____/

Welcome to Orange Pi 1.0.6 Jammy with Linux 5.10.110-rockchip-rk3588

System load:   2%               Up time:       7 min    Local users:   3
Memory usage:  8% of 7.51G      IP:            192.168.1.141
CPU temp:      39°C            Usage of /:    16% of 29G

[ 2 security updates available, 2 updates total: apt upgrade ]
Last check: 2022-12-16 16:17

[ General system configuration (beta): orangepi-config ]

Last login: Fri Dec 16 16:17:44 2022
orangepi@orangepi5:~$

カスタマイズするためのスクリプト群が /usr/local/bin に用意されている

orangepi@orangepi5:~$ ls -l /usr/local/bin
total 1360
-rwxrwxr-x 1 root root    992 Dec  7 09:26 auto_login_cli.sh
-rwxrwxr-x 1 root root   9632 Dec  7 09:26 blink_all_gpio
-rwxrwxr-x 1 root root     47 Dec  7 09:26 cat_serial.sh
-rwxrwxr-x 1 root root    560 Dec  7 09:26 compile_python.sh
-rwxrwxr-x 1 root root    316 Dec  7 09:26 desktop_login.sh
-rwxrwxr-x 1 root root    140 Dec  7 09:26 disable_desktop_autologin.sh
-rwxrwxr-x 1 root root   2036 Dec  7 09:26 drm-hotplug.sh
-rwxrwxr-x 1 root root     86 Dec  7 09:26 enable_docker.sh
-rwxrwxr-x 1 root root    265 Dec  7 09:26 fix_mmc_ssd.sh
-rwxr-xr-x 1 root root    195 Dec 15 18:27 gpu_load.sh
-rwxrwxr-x 1 root root    111 Dec  7 09:26 install_bt_panel.sh
-rwxrwxr-x 1 root root    684 Dec  7 09:26 install_docker.sh
-rwxr-xr-x 1 root root    565 Dec 16 11:41 install_qt.sh
-rwxrwxr-x 1 root root   2364 Dec 16 15:36 install_ros.sh
-rwxrwxr-x 1 root root  76188 Dec  7 09:26 io
-rwxrwxr-x 1 root root  22896 Dec  7 09:26 memtester
-rwxrwxr-x 1 root root 772832 Dec  7 09:26 modetest
-rwxrwxr-x 1 root root  38856 Dec  7 09:26 multivideoplayer
-rwxrwxr-x 1 root root     78 Dec  7 09:26 reset_ssh.sh
-rwxrwxr-x 1 root root    115 Dec 12 09:41 set_device.sh
-rwxrwxr-x 1 root root    242 Dec 12 09:41 set_vnc.sh
-rwxrwxr-x 1 root root  19672 Dec  7 09:26 spidev_test
-rwxrwxr-x 1 root root 254056 Dec  7 09:26 stressapptest
-rwxrw-r-- 1 root root   1197 Dec 14 15:56 test_camera.sh
-rwxrwxr-x 1 root root    175 Dec 12 09:41 test_dec_mpv.sh
-rwxrwxr-x 1 root root    168 Dec  7 09:26 test_rknn_demo.sh
-rwxr-xr-x 1 root root    501 Dec 16 15:36 test_ros.sh
-rwxrwxr-x 1 root root    446 Dec  7 09:26 test_rtsp.sh
-rwxrwxr-x 1 root root  14736 Dec  7 09:26 tinycap
-rwxrwxr-x 1 root root  19448 Dec  7 09:26 tinymix
-rwxrwxr-x 1 root root  14440 Dec  7 09:26 tinypcminfo
-rwxrwxr-x 1 root root  19048 Dec  7 09:26 tinyplay
-rwxrwxr-x 1 root root     65 Dec  7 09:26 typec_usb2.sh
-rwxrwxr-x 1 root root    123 Dec 15 18:41 vpu_debug.sh
-rwxrwxr-x 1 root root  13816 Dec 16 16:23 watchdog_test
orangepi@orangepi5:~$ ls -l /usr/local/sbin
total 0
orangepi@orangepi5:~$

NVMe SSDにインストールするには/dev/nvme0n1に対してインストールイメージを書き込む

まずデバイス名確認。テストに使用したものなのでパーテーションが2つ作られている

orangepi@orangepi5:~$ ls -l /dev/nvme0*
crw------- 1 root root 239, 0 Dec 16 16:17 /dev/nvme0
brw-rw---- 1 root disk 259, 0 Dec 16 16:17 /dev/nvme0n1
brw-rw---- 1 root disk 259, 1 Dec 16 16:17 /dev/nvme0n1p1
brw-rw---- 1 root disk 259, 2 Dec 19 19:30 /dev/nvme0n1p2
orangepi@orangepi5:~$

確認のためM.2 SATA SSDが認識できないかを確認してみる

orangepi@orangepi5:~$ sudo fdisk -l
[sudo] password for orangepi:
Disk /dev/ram0: 4 MiB, 4194304 bytes, 8192 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/zram0: 3.75 GiB, 4031569920 bytes, 984270 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes


Disk /dev/mtdblock0: 16 MiB, 16777216 bytes, 32768 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes


Disk /dev/mmcblk1: 29.9 GiB, 32105299968 bytes, 62705664 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 53AE4D8D-573C-E044-AB71-027F31F37494

Device          Start      End  Sectors  Size Type
/dev/mmcblk1p1  61440   585727   524288  256M Linux extended boot
/dev/mmcblk1p2 585728 62062591 61476864 29.3G Linux filesystem


Disk /dev/zram1: 200 MiB, 209715200 bytes, 51200 sectors
Units: sectors of 1 * 4096 = 4096 bytes
Sector size (logical/physical): 4096 bytes / 4096 bytes
I/O size (minimum/optimal): 4096 bytes / 4096 bytes
orangepi@orangepi5:~$ ls /dev/nv*
ls: cannot access '/dev/nv*': No such file or directory
orangepi@orangepi5:~$

M.2 SATA SSDでは認識しないことを確認

(2022/12/21追記: データディスクとしてならM.2 SATAも動くことを確認しました → 詳細)

まあ、そういう仕様ですしね

さて、NVMe SSDに戻して、マニュアル記載のSPI Flash書き換えコマンドを実行

「sudo nand-sata-install」を実行して以下の画面とします。

「7 Install/Update the bootloader on SPI Flash」を選択してOKします

書き換え警告を[Yes]とします

YES選択後、数分間以下の状態で止まっていますが、正常です。

5分ぐらいすると下記の様になって終了します。

続いて、Orangepi5_1.0.6_ubuntu_jammy_desktop_xfce_linux5.10.110.img を /dev/nvme0n1 に対して書き込むため「sudo dd if=Orangepi5_1.0.6_ubuntu_jammy_desktop_xfce_linux5.10.110.img of=/dev/nvme0n1 status=progress」と実行します。

orangepi@orangepi5:~$ sudo dd if=Orangepi5_1.0.6_ubuntu_jammy_desktop_xfce_linux5.10.110.img of=/dev/nvme0n1 status=progress
6924734976 bytes (6.9 GB, 6.4 GiB) copied, 278 s, 24.9 MB/s
13533184+0 records in
13533184+0 records out
6928990208 bytes (6.9 GB, 6.5 GiB) copied, 279.176 s, 24.8 MB/s
orangepi@orangepi5:~$

現状のパーテーションを確認

orangepi@orangepi5:~$ sudo fdisk -l /dev/nvme0n1
GPT PMBR size mismatch (13533183 != 1000215215) will be corrected by write.
The backup GPT table is not on the end of the device.
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: NXM-512
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 53AE4D8D-573C-E044-AB71-027F31F37494

Device          Start      End  Sectors  Size Type
/dev/nvme0n1p1  61440   585727   524288  256M Linux extended boot
/dev/nvme0n1p2 585728 13533150 12947423  6.2G Linux filesystem
orangepi@orangepi5:~$

この段階では実際のSSD容量にあわせたパーテーション構成になっていないのでmismatchと表示されている。

この段階では、microSD起動を一度停止して、microSDを抜いてから再度電源を入れます

NVMe SSDから起動していることを確認します。

orangepi@orangepi5:~$ df -h
Filesystem      Size  Used Avail Use% Mounted on
tmpfs           769M  9.4M  760M   2% /run
/dev/nvme0n1p2  465G  4.6G  456G   1% /
tmpfs           3.8G     0  3.8G   0% /dev/shm
tmpfs           5.0M  4.0K  5.0M   1% /run/lock
tmpfs           3.8G   12K  3.8G   1% /tmp
/dev/nvme0n1p1  256M   95M  162M  37% /boot
/dev/zram1      188M  2.6M  171M   2% /var/log
tmpfs           769M   80K  769M   1% /run/user/1000
orangepi@orangepi5:~$

問題が起きてたパーテーション構成は起動時に自動修正されています。

orangepi@orangepi5:~$ sudo fdisk -l /dev/nvme0n1
Disk /dev/nvme0n1: 476.94 GiB, 512110190592 bytes, 1000215216 sectors
Disk model: NXM-512
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: gpt
Disk identifier: 53AE4D8D-573C-E044-AB71-027F31F37494

Device          Start       End   Sectors   Size Type
/dev/nvme0n1p1  61440    585727    524288   256M Linux extended boot
/dev/nvme0n1p2 585728 990183423 989597696 471.9G Linux filesystem
orangepi@orangepi5:~$

マニュアル記載にある「sudo fix_mmc_ssd.sh」はmicroSDも使う場合に実行するもので、NVMe SSDのみの場合は実行してみると以下のようなメッセージが出力されていました。

orangepi@orangepi5:~$ sudo fix_mmc_ssd.sh
ls: cannot access '/dev/mmcblk*': No such file or directory
Done
orangepi@orangepi5:~$

その上、NVMeから起動できなくなってしまうので必要無い限りはfix_mmc_ssd.shは実行しないように・・・

もしこの状態にしてしまった場合は、最初のNVMeへのインストール時に使ったmicroSDを入れるとシングルユーザモードで起動できます。

その状態で/etc/fstabにある/boot行を「/dev/nvme0n1p1 /boot vfat defaults 0 2」に書きかえて「mount -a」でマウント

その次に /boot/orangepiEnv.txt にあるroot=行を「rootdev=/dev/nvme0n1p2」に書き換えることで元の状態に戻ります。

あとは普通のUbuntu 22.04として利用できます。

ちょっと興味深かったのは、https://repo.huaweicloud.com/ からファイルを持ってくる初期設定になってるんだなぁ、というところ

カスタマイズ

「sudo orangepi-config」を実行すると設定ユーティリティが起動します。

まずは[System]から[Firmware]を選択してFirmwareアップデートを実行します。

再起動します。

この他、[Personal]にある[Timezone]など、いろいろ設定がありますので、必要に応じ変更します。

youtube(360p)再生中のCPU負荷

youtube(1080p)再生中のCPU負荷

Rockchip RK3588S搭載のOrange Pi 5が送料込み$84.2という格安価格でプレセール開始


2022/12/23追記

Orange Pi 5が届いたので「Linuxを動かす記事」「Androidを動かす記事」と「データディスクとしてM.2 SATA SSDを動かす記事(起動ディスクでは使えない)」を公開中です。


2022年7月に発表になったRockchip RK3588S搭載のOrange Pi 5が2022年12月1日から発売開始、ということで、プレセールが始まりました。

AliexressでRAM8GBモデルが送料込みで$84.2というなかなかに安い価格となっています。

他社動向を考えると安くても$120はするだろう、と思っていただけに、この価格は驚きの一言です。

さて、このOrange Pi 5、実は2022年7月の発表時点から構成に変化が出ています。

出典1:2022年7月15日付けのOrange Pi 5スペックページ
出典2:2022年11月11日付けのOrange Pi 5スペックページ

まずは表面の比較

7月版にあった「Wi-Fi 6 + Bluetooth」と「32GB EMMC Flash」が削除され、「16MB SPI Flash」と裏面に「M.2 NVMe 対応スロット」が追加されました。

7月版では恐らくEIAJ#2(PSPと同じやつ)だと思われる電源だったものが、Type-Cコネクタに変更・・・これはいいような悪いような・・・


続いて裏面

7月版の方だと、「CODEC(ES8388)」と「RTC」が書かれてないけど、配置が同じなのでこれについては変更無し。

7月版との大きな変更点は「M.2 PCIe2.0 (Supports 2242 NVMe SSD」と、M.2スロットが追加されたということ。

これにより、microSDの壊れやすさを気にする必要がなくなる、というのは大きな利点と言えます。

M.2 スロット搭載を$100を下回る価格で投入してきたのは予想外でした。

とりあえず為替レートがいろいろ動いているなか、1ドル151円換算のPayPal決済で発注してみました。

発注後、メッセージが飛んできて、2022年12月1日発送予定になるので、それまでの間「Extend delivery」ボタンを押してキャンセルされないような日数を追加してくれ、とのことです。

つまり、11/11時点で標準では「11 days」、つまり11/22にキャンセル処理がされる、ということになるので「Extend delivery」押して「14」ぐらいを入力して、25daysと12/1を超えるような日数にする、ということです

私の場合、ここで指定する日数が新しい日数なのか追加する日数なのかがわからなかったので、とりあえず「30」と入力してみたところ「41days」になりました。

このExtend delivyer設定を忘れるとAliexpress側の自動処理によって発注がキャンセルされてしまうので注意してください。


2022/11/15追記

16GBモデルの販売がプレセール価格$105(送料$11.31)で開始されました。

たしかに公式製品ページに「4GB/8GB/16GB/32GB(LPDDR4/4x)」って書いてあったけど、ほんとに16GBモデルが出るとは・・・

32GBモデルはいくらになるのかな?


2022/11/17追記

Orange Pi 5が要求しているType-Cコネクタで5V4Aをどうするかなーと秋月電子に行ってみたところ「スイッチングACアダプター(USB ACアダプター) Type-Cオス 5.1V3.8A(M-16293)」が950円だったので買っておきました。まだこれがOrange Pi 5で不足無く使えるかどうかはまだわかりません。

HPE Superdome Flex 280サーバーではLinuxのサポートについて注意が必要(現状RHEL9.0はサポートしない)


2022/12/05追記:2022/11/30にRHEL9.0対応のI/O Service Pack for HPE Superdome Flex Servers Familyがリリースされてました。


HPE Superdome Flex 280サーバーを導入するにあたってLinuxのサポートも必要という話で、RedHat Enterprise Linuxを導入する、という話になった。

ドキュメントを探すと「Installing Operating Systems on HPE Superdome Flex 280 Server」がもっともまとまっている感じだった。

ここの「Supported operating systems」には下記の様に書かれている。

HPE Foundation Software (HFS) version support matrix」を見るとRHEL9.0をサポートしていると読める記述がある。

Software Delivery Repositoryにある「HPE Foundation Software Repository」を見ても指定できるディストリビューションバージョンに9.0が含まれている。

ISOファイルとして入手する場合は「HPE Foundation Software ISO Image for HPE Superdome Flex Servers Family」から入手でき、RHEL9/Oracle Linux 9がサポート対象として記載されている。

上記ページにリンクがある「Running Linux on HPE Superdome Flex 280 Server」は冒頭の「Installing Operating Systems on HPE Superdome Flex 280 Server」を切り出した感じのドキュメントになってようにみえ、特にRHEL9がサポートされない、という認識ではなかった。

しかし!

hpeから、2022年11月2日時点で、HPEがサポートするのはRHEL8.5までで、RHEL8.6とRHEL9.0は現状はサポートしない、との通告を受けた。

なぜ?と聞くと「I/O Service Pack」の対応バージョンが出ていないから、という

確認してみると「Running Linux on HPE Superdome Flex 280 Server」の方には記述がないが、「Installing Operating Systems on HPE Superdome Flex 280 Server」には「HPE Superdome Flex 280 Server I/O Service Pack」という項目がある・・・

しかし、「Customers can use the HPE Superdome Flex 280 Server I/O Service Pack」という表現なので「要求」じゃないはずなのに、要求されている。

ダウンロードリンクは「I/O Service Pack for HPE Superdome Flex Servers Family

firmwareとdriverを新しいものに更新するために使うので、必須ではないはずなのだが、hpeサポートは必須と主張してくる感じです。

じゃあ、RHEL9.0対応版はいつでるの?ときいいてみるものの「不明」という回答。

大丈夫なんか?HPE


2022/11/14追記

RHEL9をサポートするI/O Service Packのリリース見込みがついた、という連絡があったので、とりあえず本件はなんとかなりそう


2022/12/05追記

2022/11/30付けでRHEL8.6とRHEL9.0に対応した「I/O Service Pack for HPE Superdome Flex Servers Family 2022.09」がリリースされていました。

閉鎖環境内でアラートメールの送信ができるだけのためのメールサーバ設定(AlmaLinux8/RHEL8/Oracle Linux8)


閉鎖環境で機器初期セットアップを行う際に、アラートメールの送信先を指定する必要があったりする。

その時に、メール送信テストが行えるような簡易的なLinuxサーバを作るためのメモ書きです。

なお、メールの送信先は「root@adosakana.local」としておいて、Linuxユーザのroot宛にメールが届くような設定です。

メールを読むときは /var/mail/root に届くのを直接見るか、mail/mailx/muttコマンドなどで見る想定です。

(1) AlmaLinux / RHEL / Oracle Linux 8の最小インストールを実施

(2) アップデート

「dnf update -y」でパッケージを最新に

(3) SMTPで使用するポート開け

「firewall-cmd –add-service smtp –permanent」で追加

# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
# firewall-cmd --add-service smtp --permanent
success
# firewall-cmd --reload
success
# firewall-cmd --list-all
public (active)
  target: default
  icmp-block-inversion: no
  interfaces: ens192
  sources:
  services: cockpit dhcpv6-client smtp ssh
  ports:
  protocols:
  forward: no
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:
#

(4) postfixのインストール

「dnf install postfix」でpostfixをインストール

(5) postfixの設定ファイルを編集

まず、テストに使うメールアドレスのドメイン名を「mydomain=~」で定義(myhostname 定義はそのまま使った)

# The mydomain parameter specifies the local internet domain name.
# The default is to use $myhostname minus the first component.
# $mydomain is used as a default value for many other configuration
# parameters.
#
#mydomain = domain.tld
mydomain = adosakana.local

メール送信者にドメイン名指定がない場合に、mydomainで設定した内容を適用するために「myorigin = $mydomain」

# SENDING MAIL
#
# The myorigin parameter specifies the domain that locally-posted
# mail appears to come from. The default is to append $myhostname,
# which is fine for small sites.  If you run a domain with multiple
# machines, you should (1) change this to $mydomain and (2) set up
# a domain-wide alias database that aliases each user to
# user@that.users.mailhost.
#
# For the sake of consistency between sender and recipient addresses,
# myorigin also specifies the default domain name that is appended
# to recipient addresses that have no @domain part.
#
#myorigin = $myhostname
myorigin = $mydomain

どのNICからきたSMTP要求でも受付させるための「inet_interfaces = all」を定義

# RECEIVING MAIL

# The inet_interfaces parameter specifies the network interface
# addresses that this mail system receives mail on.  By default,
# the software claims all active interfaces on the machine. The
# parameter also controls delivery of mail to user@[ip.address].
#
# See also the proxy_interfaces parameter, for network addresses that
# are forwarded to us via a proxy or network address translator.
#
# Note: you need to stop/start Postfix when this parameter changes.
#
inet_interfaces = all
#inet_interfaces = $myhostname
#inet_interfaces = $myhostname, localhost
#inet_interfaces = localhost

受信するメールを決めるために「mydestination =~」を指定。とりあえず全部受け取るような感じの設定にする

# Specify a list of host or domain names, /file/name or type:table
# patterns, separated by commas and/or whitespace. A /file/name
# pattern is replaced by its contents; a type:table is matched when
# a name matches a lookup key (the right-hand side is ignored).
# Continue long lines by starting the next line with whitespace.
#
# See also below, section "REJECTING MAIL FOR UNKNOWN LOCAL USERS".
#
#mydestination = $myhostname, localhost.$mydomain, localhost
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
#mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
#       mail.$mydomain, www.$mydomain, ftp.$mydomain

メール送信側のSSLプロトコル対応が古い場合を考慮して「smtpd_tls_security_level=none」と暗号化の要求レベルをなしにしておく

# Announce STARTTLS support to remote SMTP clients, but do not require that
# clients use TLS encryption (opportunistic TLS inbound).
#
#smtpd_tls_security_level = may
smtpd_tls_security_level = none

なお、「lost connection after STARTTLS from unknown」という形でSMTP接続を拒否される場合は、おそらく標準値の「smtpd_tls_security_level = may」で設定している場合。(TLS1.2以降を必須、とかそんな感じ)

(6) postfixを起動

「systemctl enable postfix」でOS起動時にpostfixも起動するように設定し、

「systemctl start postfix」でいますぐpostfixを起動させている

# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; disabled; vendor pr>
   Active: inactive (dead)
# systemctl enable postfix
Created symlink /etc/systemd/system/multi-user.target.wants/postfix.service → /usr/lib/systemd/system/postfix.service.
# systemctl status postfix
● postfix.service - Postfix Mail Transport Agent
   Loaded: loaded (/usr/lib/systemd/system/postfix.service; enabled; vendor pre>
   Active: inactive (dead)
# systemctl start postfix
#


おまけ: mutt コマンドでメールを送信しようとしたけど、送れない

とあるプロダクトのアラートメールの送信手法がmuttコマンドを利用していた。

「smtpd_tls_security_level = may」設定のpostfixにメールを送ると「lost connection after STARTTLS from unknown」で送れていなかった。

postfix側ではなく、mutt側で対策取れるかを確認したところ /etc/Muttrc.local などの muttの設定ファイル内で「set ssl_starttls = no」と設定して、STARTTLSの使用を取りやめることでメール送信に成功するようになった。

RHEL8.5サーバから mutt コマンドでメール送信する場合、SSL関連の設定を調べると以下の様なものがある

set ssl_verify_host = no
set ssl_verify_dates = no
set ssl_starttls = yes
set ssl_use_tlsv1_3 = yes
set ssl_use_tlsv1_2 = yes
set ssl_use_tlsv1_1 = yes
set ssl_use_tlsv1 = no
set ssl_use_sslv3 = no
set ssl_use_sslv2 = no

ただ、RHEL8.5で試してみたところ「ssl_use_sslv2」というオプションは存在していなかった。

# echo "test mail"  | mutt -F ~/testmuttrc -s "test mail title" 受信者 -d 10
レベル 10 でデバッグ中。
/root/testmuttrc 中の 14 行目でエラー: ssl_use_sslv2 は不明な変数
source: /root/testmuttrc 中でエラー
#

また、opensslコマンドのs_clientでSSLv2 SSLv3の接続ができるかを試験してみたところ、オプション自体が廃止されていた。

# openssl s_client -connect 172.17.44.50:25 -servername 172.17.44.50 -ssl3
s_client: Option unknown option -ssl3
s_client: Use -help for summary.
# openssl s_client -connect 172.17.44.50:25 -servername 172.17.44.50 -ssl2
s_client: Option unknown option -ssl2
s_client: Use -help for summary.
#

検証用にCentOS5を新規インストールしたら面倒だった 2024/01/09版


2024/01/09追記: 2024/01/09にCentOS 5.11のインストールを試み、この記事の内容が引き続き使えることを確認した。(記事自体への修正はない)


検証のため古いOSを2022年にインストールしてみるシリーズ、今回はCentOS5をインストールする必要がありインストールした。(これまで「Windows Server 2008R2編」「Windows 7編」)

久しぶりすぎて忘れていたこととか、2022年の現状だと発生することとか、いろいろあったのでメモ書きとして残す。

vSphere環境上にインストールしたのだが、まず設定でいくつか問題が・・・

NICが認識できない

vSphere仮想マシンを新規作成する際のゲストOSを「CentOS 4/5以降 (64ビット)」で作成すると

ネットワークアダプタが「VMXNET3」として作成される。

しかし、VMXNET3のドライバはCentOS5.11のインストールISOには含まれていないため、ネットワーク接続が行えない

インストール直後からネットワーク接続を行いたい場合はアダプタタイプを「E1000」あたりで設定して作成する。

VMware Toolsが用意されていない

最近のESXiに含まれているVMware Toolsのlinux.iso にはRHEL5/CentOS5で使えるVMware Toolsが入っていない。

RHEL5/CentOS5に対応するのはVMware Tools 10.3.22までで、10.3.23以降は対応していない。

以前と同じように https://packages.vmware.com/tools/releases/10.3.22/ にあるレポジトリRPM をインストールしてyumコマンドでvmware-toolsをインストールしようとしたのですが、packages.vmware.com がTLS1.2のみ許可するWebサーバ設定となっているため、CentOS5からではファイルがダウンロードできない状態となっています。

このため https://www.vmware.com/go/tools から VMware Tools 10.3.22のダウンロードリンク から VMware Tools packages for Linuxをダウンロードして使うこととなる。

CentOS5の更新がダウンロードできない

CentOS5.11をインストールした直後の状態で yum check-update を実行すると下記のエラーとなる。

# yum check-update
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
YumRepo Error: All mirror URLs are not using ftp, http[s] or file.
 Eg. Invalid release/repo/arch combination/
removing mirrorlist with no valid mirrors: /var/cache/yum/base/mirrorlist.txt
Error: Cannot find a valid baseurl for repo: base
#

これはmirrorlistでCentOS5用のファイルが提供されなくなったためのエラーとなる。

これに対してはmirrorlistではなくbaseurlに変更し、URLを「http://mirror.centos.org/centos/$releasever/~」から「http://vault.centos.org/centos/5.11/~」に書き換える、という手法が知られている。

しかし、2022年8月時点ではこの手法で書き換えた場合、「M2Crypto.SSL.SSLError: unknown protocol」というエラーで失敗する

# yum check-update
Loaded plugins: fastestmirror, security
Loading mirror speeds from cached hostfile
Traceback (most recent call last):
  File "/usr/bin/yum", line 29, in ?
    yummain.user_main(sys.argv[1:], exit_code=True)
  File "/usr/share/yum-cli/yummain.py", line 309, in user_main
    errcode = main(args)
  File "/usr/share/yum-cli/yummain.py", line 178, in main
    result, resultmsgs = base.doCommands()
  File "/usr/share/yum-cli/cli.py", line 345, in doCommands
    self._getTs(needTsRemove)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 101, in _getTs
    self._getTsInfo(remove_only)
  File "/usr/lib/python2.4/site-packages/yum/depsolve.py", line 112, in _getTsInfo
    pkgSack = self.pkgSack
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 662, in <lambda>
    pkgSack = property(fget=lambda self: self._getSacks(),
  File "/usr/lib/python2.4/site-packages/yum/__init__.py", line 502, in _getSacks
    self.repos.populateSack(which=repos)
  File "/usr/lib/python2.4/site-packages/yum/repos.py", line 260, in populateSack
    sack.populate(repo, mdtype, callback, cacheonly)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 168, in populate
    if self._check_db_version(repo, mydbtype):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 226, in _check_db_version
    return repo._check_db_version(mdtype)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1226, in _check_db_version
    repoXML = self.repoXML
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1399, in <lambda>
    repoXML = property(fget=lambda self: self._getRepoXML(),
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1391, in _getRepoXML
    self._loadRepoXML(text=self)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1381, in _loadRepoXML
    return self._groupLoadRepoXML(text, ["primary"])
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1365, in _groupLoadRepoXML
    if self._commonLoadRepoXML(text):
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 1201, in _commonLoadRepoXML
    result = self._getFileRepoXML(local, text)
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 974, in _getFileRepoXML
    cache=self.http_caching == 'all')
  File "/usr/lib/python2.4/site-packages/yum/yumRepo.py", line 811, in _getFile
    http_headers=headers,
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 412, in urlgrab
    return self._mirror_try(func, url, kw)
  File "/usr/lib/python2.4/site-packages/urlgrabber/mirror.py", line 398, in _mirror_try
    return func_ref( *(fullurl,), **kwargs )
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 936, in urlgrab
    return self._retry(opts, retryfunc, url, filename)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 854, in _retry
    r = apply(func, (opts,) + args, {})
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 922, in retryfunc
    fo = URLGrabberFileObject(url, filename, opts)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1010, in __init__
    self._do_open()
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1093, in _do_open
    fo, hdr = self._make_request(req, opener)
  File "/usr/lib/python2.4/site-packages/urlgrabber/grabber.py", line 1202, in _make_request
    fo = opener.open(req)
  File "/usr/lib64/python2.4/urllib2.py", line 364, in open
    response = meth(req, response)
  File "/usr/lib64/python2.4/urllib2.py", line 471, in http_response
    response = self.parent.error(
  File "/usr/lib64/python2.4/urllib2.py", line 396, in error
    result = self._call_chain(*args)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/urllib2.py", line 565, in http_error_302
    return self.parent.open(new)
  File "/usr/lib64/python2.4/urllib2.py", line 358, in open
    response = self._open(req, data)
  File "/usr/lib64/python2.4/urllib2.py", line 376, in _open
    '_open', req)
  File "/usr/lib64/python2.4/urllib2.py", line 337, in _call_chain
    result = func(*args)
  File "/usr/lib64/python2.4/site-packages/M2Crypto/m2urllib2.py", line 82, in https_open
    h.request(req.get_method(), req.get_selector(), req.data, headers)
  File "/usr/lib64/python2.4/httplib.py", line 810, in request
    self._send_request(method, url, body, headers)
  File "/usr/lib64/python2.4/httplib.py", line 833, in _send_request
    self.endheaders()
  File "/usr/lib64/python2.4/httplib.py", line 804, in endheaders
    self._send_output()
  File "/usr/lib64/python2.4/httplib.py", line 685, in _send_output
    self.send(msg)
  File "/usr/lib64/python2.4/httplib.py", line 652, in send
    self.connect()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/httpslib.py", line 55, in connect
    sock.connect((self.host, self.port))
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 174, in connect
    ret = self.connect_ssl()
  File "/usr/lib64/python2.4/site-packages/M2Crypto/SSL/Connection.py", line 167, in connect_ssl
    return m2.ssl_connect(self.ssl, self._timeout)
M2Crypto.SSL.SSLError: unknown protocol
#

これは、 vault.centos.org が TLS 1.2を使用したhttpsアクセスしか受け付けなくなったが、CentOS5側ではTLS 1.2に非対応であるため、TLS 1.2が理解できず「unknown protocol」となっている、という状態である。

2022年8月時点では archive.kernel.org は http アクセスを許可してくれているため、URLを「http://archive.kernel.org/centos-vault/5.11/」に書き換えることで、CentOS5のアップデートが行えるようになる。

# CentOS-Base.repo
#
# The mirror system uses the connecting IP address of the client and the
# update status of each mirror to pick mirrors that are updated to and
# geographically close to the client.  You should use this for CentOS updates
# unless you are manually picking other mirrors.
#
# If the mirrorlist= does not work for you, as a fall back you can try the
# remarked out baseurl= line instead.
#
#

[base]
name=CentOS-$releasever - Base
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=os
#baseurl=http://vault.centos.org/centos/$releasever/os/$basearch/
baseurl=http://archive.kernel.org/centos-vault/5.11/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#released updates
[updates]
name=CentOS-$releasever - Updates
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=updates
#baseurl=http://vault.centos.org/centos/$releasever/updates/$basearch/
baseurl=http://archive.kernel.org/centos-vault/5.11/updates/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that may be useful
[extras]
name=CentOS-$releasever - Extras
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=extras
#baseurl=http://vault.centos.org/centos/$releasever/extras/$basearch/
baseurl=http://archive.kernel.org/centos-vault/5.11/extras/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#additional packages that extend functionality of existing packages
[centosplus]
name=CentOS-$releasever - Plus
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://vault.centos.org/centos/$releasever/centosplus/$basearch/
baseurl=http://archive.kernel.org/centos-vault/5.11/centosplus/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

#contrib - packages by Centos Users
[contrib]
name=CentOS-$releasever - Contrib
#mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=contrib
#baseurl=http://vault.centos.org/centos/$releasever/contrib/$basearch/
baseurl=http://archive.kernel.org/centos-vault/5.11/contrib/$basearch/
gpgcheck=1
enabled=0
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5