AlmaLinux9.7 Setup for ARCS6 FRONT PAGE
最終更新日:2025/12/01

コレは何?/What is this?

AlmaLinuxでARCS6を動かすためのセットアップ手順。AlmaLinux9.7Minimal導入手順V1。 準リアルタイム性を実現するためのARCS6用の手順書です。
注意:本手順は「端末を安全なネットワークに接続すること」を前提にしています。

手順書の読み方

灰色背景

はコマンドを示し、

Italic斜体文字

は設定ファイルの編集内容を示す。 「ターミナル」などでWindows端末から接続し、コマンドか編集内容をCtrl+Cでコピー、 「ターミナル」の画面上にフォーカスを移して右クリックでペースト、そうするとラクに作業ができる。

使用計算機

この手順書を作成するにあたり使用したハードウェアは下記。 だいぶ古い制御用PCで、研究室で余っていたものを使用。

ハードウェア条件
CPU: Intel Corei5-6600 @ 3.30GHz/4Core
マザーボード: ASRock Z170 Extreme4 / Intel Z170 chipset
ストレージ: Intel SSD 535 Series 120GB
グラフィック: オンボードi915
電源: Corsair CX500M 500W/80PLUS Bronze

0. 時刻合わせ

Rufusからの書き込み

ARCS6制御用PCを起動し、直後に[delete]キーを押してUEFI設定画面に行き、時刻を手動で現在時刻に設定する。 この手順を舐めてはいけない。これをしないとRSA/SHA256の認証に失敗し、インストーラがエラーで止まる。

1. インストーラのイメージが入ったUSBメモリの準備

  1. Rufus https://rufus.ie/ja/#download をダウンロード、空のUSBメモリを作業用WindowsPCにぶっ刺す。
  2. AlmaLinux https://almalinux.org/ から Minimal版のISOをDLして、AlmaLinux-9.7-x86_64-minimal.isoを作業用WindowsPCに保存。
  3. Rufusを起動、↑のisoファイルを[選択]。右の図のようになる。
  4. [スタート]を押すとセキュリティの警告が出る場合があるが無視して進む。
  5. [DDイメージモード]を選択して進む。書き込みが終わったら次の手順へ。

2. インストール

  1. ARCS6制御用PCにさっき作ったUSBメモリをぶっ刺して起動すると、インストーラが立ち上がる。
    もしAlmaLinuxのインストーラではないものが立ち上がってきたら、起動順が間違っている。
    その場合、UEFIのboot設定から〝USBメモリからの起動〟が1番目に来るように設定する。
  2. 起動後すぐさま矢印キーを押して "Install" を選択して、あとはAlmaLinuxを普通にインストール。
  3. 設定の注意点は下記:
    • 言語とキーボードを日本語に設定
    • rootアカウントを有効化、rootパスワードを設定、[パスワードによるroot SSHログインを許可]にチェック
    • Kdumpを無効化
    • ホスト名を設定
    • インストール先パーテーションのところで、古い領域が残っていたらすべて消す作業が要る。
      SSDの絵を選択→[完了]→[領域の再利用]→[すべて削除]→[領域の再利用]
  4. 設定が終わったら[インストール開始]
  5. 何事もなく終わったら再起動して、UEFI起動前にタイミングを見計らってUSBメモリを抜く。以降、rootでloginする。

3. ネットワーク接続の設定

Windows「ターミナル」からの接続

3.1 NICが認識されてるか確認

ip a

loだけでなく enp**s0 が出現していればNICは認識されている。

3.2 ネットワーク設定

nmtui
  1. [Edit Connection]→[Edit]
  2. 画面に従って適宜設定
  3. [x] Automatically connect ←にチェック
  4. Activateも実行
  5. ホスト名も未設定であれば適宜設定

もしMACアドレスを変える場合:
[Ethernet] → → [Cloned MAC Adress] → 指定のMACアドレスを入力。
注意: これは緊急避難的な一時的なもので、常態化すべきでない。

3.3 外に出れるか確認

ping www.google.co.jp

3.4 Windows端末からターミナルを使ってSSHで繋げるか確認

以降、すべてSSH経由でWindows端末から操作する。 コマンドは、[Ctrl+C]でコピーして、Windows側ターミナルの画面上で[右クリック]すると簡単。 (Windows側ターミナルでのSSHの入り方は各自ググるなり、ジェミるなりチャッピーに聞くなりすべし)

4. SElinuxを〝一時的に〟切る

下記を実行。

vi /etc/selinux/config

下記の部分を変更。

SELINUX=enforcing → SELINUX=disabled

([Insert]キー押して編集、[ESC]→[:]→[w][q][Enter]で保存して終了、などviの使い方は各自習熟のこと)

5. 時刻合わせとAlmaLinux最新版へのアップデート

この手順は飛ばしてはいけない。RSA/SHA256の認証失敗やgccのコンパイルが不完全になる可能性がある。

5.1 chronyのインストール

dnf install chrony

5.2 設定ファイルをいじる

vi /etc/chrony.conf

下記の行を探して先頭に#を付けてコメントアウト。

# pool 2.cloudlinux.pool.ntp.org iburst

代わりに以下を追記(これは長岡技大での例)。

server ntps.nagaokaut.ac.jp iburst

5.3 chrony起動

systemctl start chronyd

5.4 時刻をNTPで合わせて同期状態を確認

chronyc makestep 1 -1
chronyc tracking

5.5 タイムゾーン設定

timedatectl set-timezone Asia/Tokyo

5.6 時刻確認

date

5.7 ハードウェアクロックも合わせる

hwclock -w

下記のエラーがでるときはハードウェアクロックを持っていない計算機(ラズパイなど)なので諦める。

hwclock: Cannot access the Hardware Clock via any known method.

5.8. アップデート

dnf update
dnf upgrade

ここで一旦再起動しておく。

reboot

一応バージョン確認。

uname -a
cat /etc/almalinux-release

6. ARCS6環境構築のための各種インストール

6.1 make/gcc/g++/gitのインストールとバージョン確認

dnf install make gcc gcc-c++ git
make --version
gcc --version
g++ --version
git --version

gccが 7.3以上 になっていればC++17が使えるのでおk。

6.2 ncurses/pngのインストール

dnf install ncurses* libncurses* libpng*

6.3 カーネルソースのインストール

dnf install kernel-devel-`uname -r`

6.4 ARCS6と自分用ディレクトリの作成

cd /
mkdir expsrc
cd expsrc
mkdir yoko

↑の yoko は自分のARCS6コード用ユーザ名に読み替えてネ。

7. ARCS6の導入と実行確認

7.1 ARCS6のコードをpull

下記↓を参考にして作業。
ARCS6の導入方法::GitHubから取得する場合

7.2 ARCS6をmakeして正常起動するか一旦ここでテスト

"ARCS6/robot/general/BaseCtrl" もしくは、
"ARCS6/robot/sample/001_空の基本コード/" を試しにコンパイルして実行して動作すればオーケー。

8. 不要なデーモンとカーネルモジュールの停止

8.1 まず、バックグラウンドで動作中のデーモンを見てみる

systemctl list-unit-files -t service

こいつらはリアルタイム性を阻害するので、可能な限り消していくのがここでの目標。

8.2 enabledになっているのを片っ端から可能な限り止めていく

systemctl disable auditd.service
systemctl disable firewalld.service
systemctl disable irqbalance.service
systemctl disable kdump.service
systemctl disable lvm2-monitor.service
systemctl disable rsyslog.service
systemctl disable selinux-autorelabel-mark.service
systemctl disable sssd.service

注意:autovt@.service と dbus-broker.service は止めないこと。正常起動できなくなる。

8.3 disabledになったか確認

systemctl list-unit-files -t service

8.4 起動しているカーネルモジュールを見てみる

lsmod

ズラズラ出てくるが、こいつらも止める。

8.5 ブラックリストへの追加

vi /etc/modprobe.d/blacklist.conf

ファイルが新規作成される。下記をコピペ入力して保存。

# Blacklist for ARCS6 blacklist ledtrig_audio blacklist snd_soc_avs blacklist snd_soc_hda_codec blacklist snd_hda_ext_core blacklist snd_intel_dspcfg blacklist snd_intel_sdw_acpi blacklist snd_soc_core blacklist snd_compress blacklist snd_hda_codec_realtek blacklist snd_hda_codec_generic blacklist snd_hda_codec_hdmi blacklist snd_hda_intel blacklist snd_intel_dspcfg blacklist snd_intel_sdw_acpi blacklist snd_hda_codec blacklist snd_hda_core blacklist snd_hwdep blacklist snd_pcm blacklist snd_timer blacklist snd blacklist soundcore blacklist acpi_cpufreq blacklist intel_rapl_msr blacklist intel_rapl_common blacklist joydev blacklist rfkill blacklist kvm_intel blacklist kvm blacklist intel_tcc_cooling blacklist x86_pkg_temp_thermal blacklist intel_powerclamp blacklist coretemp blacklist iTCO_wdt blacklist iTCO_vendor_support blacklist cec blacklist rapl blacklist intel_cstate blacklist intel_uncore blacklist pcspkr blacklist mxm_wmi blacklist intel_wmi_thunderbolt blacklist acpi_pad blacklist fuse blacklist xfs blacklist sr_mod blacklist cdrom blacklist sg blacklist dm_mirror blacklist dm_region_hash blacklist dm_log blacklist dm_mod blacklist wmi

(しかしなんでsnd系はこんなにやたら乱立しているんだ…?)

8.6 念のための再起動とチェック

reboot

起動画面を見守る。正常起動すれば問題ない。

lsmod

これでだいぶ減ったことを確認。

9. Sambaの設定

9.1 sambaをインストール

dnf install samba

9.2 ARCS6用ディレクトリの権限設定

chmod 664 /expsrc

9.3 設定ファイルの編集

vi /etc/samba/smb.conf

下記の行を探してそれぞれ書き換え。

workgroup = MCLAB load printers = no

[homes] と [printers] と [print$] の部分を全てコメントアウト。 さらに一番最後に以下を追記。

[expsrc] comment = ARCS6 Source Code Files browseable = yes writable = yes path = /expsrc valid users = root directory mode = 0664 create mask = 0664

9.4 sambaの起動

systemctl start smb.service
systemctl start nmb.service
systemctl enable smb.service
systemctl enable nmb.service

9.5 sambaパスワードの設定

smbpasswd -a root

所望のパスワードを入力する。

9.6 動作確認

他のWindows端末から \\ipアドレス で接続でき且つファイルが書き込めるか確認。 ダメそうなときは、大抵セキュリティ関係が悪さをしている。

10. 画面真っ暗対策とプロンプトの色付け

10.1 一定時間経過するとディスプレイの電源が消えちゃうのをやめたいので下記を実行。

vi /etc/profile.d/displayset.sh

下記を書き込み。

#!/bin/bash setterm -blank 0

10.2 プロンプトに色を付けたいので、シェルの設定に書き込む。

vi ~/.bashrc

一番最後に以下を追記

export PS1="\[\e[1;32m\][\u@\h \W]\\$ \[\e[m\]"

ターミナルを再起動するとプロンプトが緑色になる。

11. 設定を追い込まないときの素のリアルタイム性のチェック

11.1 リアルタイム性の測定

まず、ARCS6/robot/sample/011_リアルタイム性の測定/ まで移動。

cd /expsrc/yoko/ARCS6/robot/sample/011_リアルタイム性の測定

その後、make する。

make

コンパイルが始まる。その後「SSH経由ではなく」直接端末まで行ってARCSを起動。

cd /expsrc/yoko/ARCS6/robot/sample/011_リアルタイム性の測定
./ARCS

[START]→10秒間動かす→[STOP]→[SAVE and EXIT] を実施。 右のような画面になる。 1段目のグラフは1回の制御ループ内でどれだけ時間を消費したかを示し、2段目のグラフは計測した制御周期を示している。 これで計測した制御周期がDATA.csvに保存される。

11.2 リアルタイム性の検証

MATLABを起動して "ARCS6/robot/sample/m/RealtimeCheck.m" を読み込んで実行。 ↓下図で示されているようなグラフが表示される。 (a)は毎回の制御ループ内で計算に消費した時間で、 何も制御アルゴリズムが入っていないので理想的にはゼロ秒だが、インタフェースやらオーバーヘッド等々やらで幾らか時間が消費される。 (b)が最も重要で毎回の制御周期の実測値であり、ピッタリ100μsが理想的。 (c)は(b)をヒストグラム化したもので、100μsのところに一本線立つのが理想的。


ARCS6におけるリアルタイム性の実測結果

消費時間は4μs程度でおおよそ一定、制御周期は100μsで一定であり、いわゆる大きな"レイテンシスパイク"が生じていないのでオーケー。 しかしもしスパイクが生じていたら、以下の手順12以降を実施のこと。 (とはいえ、いつレイテンシスパイクが生じるか分からないので、できれば手順12以降の実行を薦める)



-------ここまでで基本的な環境構築は完了。ここから先はリアルタイム性を向上させる手順。-------
-------リアルタイム性はそこそこで良く、急いでいるときは以降は読み飛ばして可。-------

12. BIOS/UEFIの設定

メーカによって設定項目が違いすぎるので具体的な手順は書けないが、基本的には、

を設定すべし。上記が有効になっていると制御周期がフラつく場合がある。

13. リアルタイム制御に使うCPUコア番号の決定

複数あるCPUコアのうち、どのコアをリアルタイム制御ループに使うか決める。 下記を実行。

cat /proc/interrupts
            CPU0       CPU1       CPU2       CPU3
   0:         31          0          0          0  IR-IO-APIC    2-edge      timer
   8:          0          0          0          0  IR-IO-APIC    8-edge      rtc0
   9:          0          4          0          0  IR-IO-APIC    9-fasteoi   acpi
  16:          4          0          0          0  IR-IO-APIC   16-fasteoi   i801_smbus
 120:          0          0          0          0  IR-PCI-MSI-0000:00:1b.0    0-edge      PCIe PME, PCIe bwctrl
 121:          0          0          0          0  IR-PCI-MSI-0000:00:1c.0    0-edge      PCIe PME, PCIe bwctrl
 122:          1          0          0          0  IR-PCI-MSI-0000:00:1c.2    0-edge      PCIe PME, PCIe bwctrl
 123:          0          0          0          0  IR-PCI-MSI-0000:00:1d.0    0-edge      PCIe PME, PCIe bwctrl
 124:          0          0          0          0  IR-PCI-MSI-0000:00:1d.7    0-edge      PCIe PME, PCIe bwctrl
 125:          0          0          0        259  IR-PCI-MSI-0000:00:14.0    0-edge      xhci_hcd
 130:         73          0          0          0  IR-PCI-MSIX-0000:03:00.0    0-edge      xhci_hcd
 135:          0          0       9925          0  IR-PCI-MSI-0000:00:1f.6    0-edge      enp0s31f6
 136:          0          0          0       9548  IR-PCI-MSI-0000:00:17.0    0-edge      ahci[0000:00:17.0]
 137:          0         42          0          0  IR-PCI-MSI-0000:00:16.0    0-edge      mei_me
 138:          0          0       1218          0  IR-PCI-MSI-0000:00:02.0    0-edge      i915
 NMI:          2          1          1          2   Non-maskable interrupts
 LOC:      42450      32935      59748     164586   Local timer interrupts
 SPU:          0          0          0          0   Spurious interrupts
 PMI:          2          1          1          2   Performance monitoring interrupts
 IWI:          0          0         32          0   IRQ work interrupts
 RTR:          3          0          0          0   APIC ICR read retries
 RES:        425        192        122        189   Rescheduling interrupts
 CAL:      10590      36267      39511      34509   Function call interrupts
 TLB:          8          9         11         15   TLB shootdowns
 TRM:          0          0          0          0   Thermal event interrupts
 THR:          0          0          0          0   Threshold APIC interrupts
 DFR:          0          0          0          0   Deferred Error APIC interrupts
 MCE:          0          0          0          0   Machine check exceptions
 MCP:          4          5          5          5   Machine check polls
 ERR:          4
 MIS:          0
 PIN:          0          0          0          0   Posted-interrupt notification event
 NPI:          0          0          0          0   Nested posted-interrupt event
 PIW:          0          0          0          0   Posted-interrupt wakeup event

上記のように数字がズラズラ出るが、割り込み回数を示しており、コア選択の指針としては、

であり、ここではCPU3(=4番目のコア)を制御ループに使うことにする。 ARCS6の設定場所は "ARCS6/robot/*/equip/EquipParams.hh" の36行目付近にあるので、適宜設定のこと。

14. 割り込み先をCPU0(=1番目のコア)に集中

14.1 割り込み先CPUのチェック

cat /proc/irq/default_smp_affinity
cat /proc/irq/*/smp_affinity

f がズラズラ出てくる。 この表示の意味は下記の通り。

デフォルト設定では f になっていて、全部のCPUに割り込み信号が行く。

14.2 割り込み先CPUを1番のコアに変更

vi /etc/profile.d/irqdest.sh

下記を書き込み。

#!/bin/bash (echo 1 > /proc/irq/default_smp_affinity) > /dev/null 2>&1 for j in {0..5}; do for i in {0..127}; do (echo 1 > /proc/irq/$i/smp_affinity) > /dev/null 2>&1 done done

14.3 一旦再起動

reboot

14.4 割り込み先が1番目のコアになってるかチェック

cat /proc/irq/default_smp_affinity
cat /proc/irq/*/smp_affinity

変えられないのもあるが、おおよそ1番目のコアになってれば大丈夫。

15. システムからCPU3(=4番目のコア)をなるべく切り離す

15.1 systemdをCPU0に集中

vi /etc/systemd/system.conf

下記の行をコメントアウトして 0 を追記。

CPUAffinity=0

15.2 割り込みバランサからCPU3を除外

vi /etc/sysconfig/irqbalance

下記の行を探してコメントアウトして 3 を追記。

IRQBALANCE_BANNED_CPUS=3

15.3 CPU3を切り離し

vi /etc/default/grub

下記のようにカーネルパラメータに追記。

GRUB_CMDLINE_LINUX="...前略.../swap isolcpus=3 rcu_nocbs=3"

↑のようにパラメータの最後に追記。 加えて下記をtrueからfalseに変更。

GRUB_ENABLE_BLSCFG=false

以下を実行してブートローダに反映。

grub2-mkconfig -o /boot/grub2/grub.cfg

再起動して反映確認。

reboot
cat /proc/cmdline

上記を実行して表示に "isolcpus=3 rcu_nocbs=3" が含まれていればカーネルパラメータの反映はされている。 さらに下記を実行。

dmesg | grep -iE "isolcpus|rcu_nocbs"

否定的なメッセージが出ていなければ上手く行っているはず。 調べると "nohz_full=3" というカーネルパラメータも追記すると良いという情報も出てくるが、実際にやってみると消費時間が暴れる。 従って、MCLabでは "isolcpus=3 rcu_nocbs=3" のみとしている。

16. 設定を追い込んだ後のリアルタイム性のチェック

手順11と同じ作業を実施、制御周期の測定結果を見る。 下図がパラメータ設定前と設定後の比較。若干改善がみられる。


ARCS6におけるリアルタイム性の実測結果(黒:パラメータ設定前、赤:パラメータ設定後)

消費時間が暴れず、おおよそ100μs周期が守られており、大きなレイテンシスパイクも生じていなければオーケー。 この動作例だと200ns程度の振れ幅で済んでいるのでリアルタイム性はバッチリ!

完了!