最終更新日: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メモリの準備
- Rufus https://rufus.ie/ja/#download をダウンロード、空のUSBメモリを作業用WindowsPCにぶっ刺す。
- AlmaLinux https://almalinux.org/ から Minimal版のISOをDLして、AlmaLinux-9.7-x86_64-minimal.isoを作業用WindowsPCに保存。
- Rufusを起動、↑のisoファイルを[選択]。右の図のようになる。
- [スタート]を押すとセキュリティの警告が出る場合があるが無視して進む。
- [DDイメージモード]を選択して進む。書き込みが終わったら次の手順へ。
2. インストール
- ARCS6制御用PCにさっき作ったUSBメモリをぶっ刺して起動すると、インストーラが立ち上がる。
もしAlmaLinuxのインストーラではないものが立ち上がってきたら、起動順が間違っている。
その場合、UEFIのboot設定から〝USBメモリからの起動〟が1番目に来るように設定する。
- 起動後すぐさま矢印キーを押して "Install" を選択して、あとはAlmaLinuxを普通にインストール。
- 設定の注意点は下記:
- 言語とキーボードを日本語に設定
- rootアカウントを有効化、rootパスワードを設定、[パスワードによるroot SSHログインを許可]にチェック。
- Kdumpを無効化
- ホスト名を設定
- インストール先パーテーションのところで、古い領域が残っていたらすべて消す作業が要る。
SSDの絵を選択→[完了]→[領域の再利用]→[すべて削除]→[領域の再利用]
- 設定が終わったら[インストール開始]
- 何事もなく終わったら再起動して、UEFI起動前にタイミングを見計らってUSBメモリを抜く。以降、rootでloginする。
3. ネットワーク接続の設定

Windows「ターミナル」からの接続
3.1 NICが認識されてるか確認
ip a
loだけでなく enp**s0 が出現していればNICは認識されている。
3.2 ネットワーク設定
nmtui
- [Edit Connection]→[Edit]
- 画面に従って適宜設定
- [x] Automatically connect ←にチェック
- Activateも実行
- ホスト名も未設定であれば適宜設定
もし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の設定
メーカによって設定項目が違いすぎるので具体的な手順は書けないが、基本的には、
- Hyper-Threading(HTT) や Simultaneous Multithreading(SMT) の類を無効にする
- CPU Frequency Scaling などクロック周波数を変動させる類のものを無効にする
- CPU省電力機能の類のものを無効にする
を設定すべし。上記が有効になっていると制御周期がフラつく場合がある。
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
上記のように数字がズラズラ出るが、割り込み回数を示しており、コア選択の指針としては、
- CPU0はLinuxOSが使用するので制御には使わない
- 全体的に数値が少ない傾向にあるコアを選ぶ
- ネットワーク(↑の例だとenp0s31f6)が割り込んでいないコアを選ぶ
であり、ここでは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 = 0x1111 = 全部のCPUに割り込み信号が行くという意味
- 1 = 0x0001 = CPUコア0のみに割り込み信号が行くという意味
- 2 = 0x0010 = CPUコア1のみに割り込み信号が行くという意味
- 4 = 0x0100 = CPUコア2のみに割り込み信号が行くという意味
- 8 = 0x1000 = CPUコア3のみに割り込み信号が行くという意味
デフォルト設定では 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程度の振れ幅で済んでいるのでリアルタイム性はバッチリ!
完了!
SWL - The Side Warehouse Laboratory, 横倉研究室 - 技術倉庫
Copyright(C), The Side Warehouse Laboratory, All rights reserved.