Linux
kernel
Realtime
Xenomai

Ubuntu 16.04 (linux-4.9.90)にXenomaiを入れるまで

Outline

UbuntuのLinux kernelにXenomaiパッチ1を適用するまで.さらにOROCOSとROSを入れる設定に.
Preemptはkernelサポートのsoft lantencyを使います.

Xenomaiの動作要件のチェック

2018/07/11 現在のXenomai1最新版はv3.0.72,I-pipeの最新版3はx86版でLinux kernel 4.9.90に対応.
そこで現行で動かしているLinuxに一度4.9.90を入れて,パッケージの動作要件を似せておくとともに,boot sequenceだけでも以上がないか確認しておきましょう.

Linuxカーネルの変更

dpkgを使ってlinux kernel 4.9.90をboot configに登録.
※できればアップデートが望ましいです (Ubuntu serverの16.04.4はlinux-4.4系)

wget -P ./tmp http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9.90/linux-headers-4.9.90-040990_4.9.90-040990.201803250830_all.deb
wget -P ./tmp http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9.90/linux-headers-4.9.90-040990-generic_4.9.90-040990.201803250830_amd64.deb
wget -P ./tmp http://kernel.ubuntu.com/~kernel-ppa/mainline/v4.9.90/linux-image-4.9.90-040990-generic_4.9.90-040990.201803250830_amd64.deb

sudo dpkg -i ./tmp/linux-headers-4.9.90-*.deb ./tmp/linux-image-4.9.90-*.deb
# sudo update-grub && sudo update-initramfs 4.9.90-040990-generic
sudo reboot

Xenomaiパッチの適用とコンパイル

パッケージのインストール

こっから先は,ほとんど,rtt_lwr4の内容と同じです.
まずはaptで必要パッケージのインストール.終わったら一度再起動推奨.

sudo apt install gcc make -y
sudo apt install git build-essential kernel-package\
 fakeroot libncurses5-dev libssl-dev ccache -y
sudo apt update
sudo apt upgrade -y
sudo reboot

Xenomaiのダウンロード

次に必要となるvanilla kernelとxenomaiおよびI-pipe patchを集める.一旦作業用のディレクトリを作るといいでしょう.
一応自前でshell scriptを書いてみたので,置いておきます →https://github.com/realteck-ky/Xenomai-Script

mkdir workspace && cd workspace
wget https://xenomai.org/downloads/xenomai/stable/xenomai-3.0.7.tar.bz2
tar xvf xenomai-3.0.7.tar.bz2
wget http://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.90.tar.gz
tar xvf linux-4.9.90.tar.gz
wget https://xenomai.org/downloads/ipipe/v4.x/x86/ipipe-core-4.9.90-x86-6.patch

Kernel configurationの設定

kernelのコンパイル5の設定します.
以下,解凍したLinux kernelのディレクトリ下で作業.

cd linux-4.9.90
cp -vi /boot/config-`uname -r` .config
../xenomai-3.0.7/scripts/prepare-kernel.sh --arch=x86_64\
 --linux=./ --ipipe=../ipipe-core-4.9.90-x86-6.patch --verbose

make olddefconfig
make menuconfig

途中のmake menuconfigでは,kernelのコンパイルパラメータをいじるので,以下のように設定します.

ちなみにここでの想定は,Intel系の64bitCPU.加えて,Preemption Modelをlowlatencyにします6.これはカーネル側からも投機的にスケジューラを起動するための設定ですが,効果の程は未検証です.機能の詳細は,少し古いですがNECのPDF7に詳しいです.
さらにIntelのPDF8や電ドラブログ9を見ながら設定します.

余談ですが,rtt_lwr4がOROCOS10導入を意識しているため,メモリ割り当てやRT-net11サポートが念頭にある設定となってます.
デバイス周りや監視にもリアルタイム性を課していくと重くなるので,基本的に余計な機能を切りましょう12
終わったらSaveで.configを書き換えてExitします.

  • General setup
    • Timers subsystem
      • High Resolution Timer Support (Enable)
  • Xenomai/cobalt
    • Sizes and static limits
      • Number of registry slots (set to 4096)
      • Size of system heap (Kb) (set to 4096)
      • Size of private heap (Kb) (set to 256)
      • Size of shared heap (Kb) (set to 256)
      • Maximum number of POSIX timers per process (set to 512)
    • Drivers
      • RTnet
        • RTnet, TCP/IP socket interface (Enable)
        • Drivers
          • New intel(R) PRO/1000 PCIe (Enable)
          • Realtek 8169 (Enable)
          • Loopback (Enable)
        • Add-Ons
          • Real-Time Capturing Support (Enable)
  • Power management and ACPI options
    • CPU Frequency scaling
      • CPU Frequency scaling (Disable)
    • ACPI (Advanced Configuration and Power Interface) Support
      • Processor (Disable)
    • CPU Idle
      • CPU idle PM support (Disable)
  • Pocessor type and features
    • Processor family
      • Core 2/newer Xeon //ex. i-series
      • Generic-x86-64 //ex. Celeron
        // if cat /proc/cpuinfo | grep family returns 6, set as Generic otherwise
    • Preemption Model
      • Preemption Kernel (Low-Latency Desktop)
    • Enable maximum number of SMP processors and NUMA nodes (Disable)
      // Ref : http://xenomai.org/pipermail/xenomai/2017-September/037718.html
    • Maximum number of CPUs (4or8)
      // set a number of CPU cores as cat /proc/cpuinfo | grep "model name"
    • Transparent Hugepage Support (Disable)
    • Allow for memory compaction (Disable)
    • Contiguous Memory Allocation (Disable)
    • Allow for memory compaction
      • Page Migration (Disable)
    • Timer frequency (1000 HZ)
  • Kernel hacking
    • Memory Debugging
      • Check for stack overflows (Disable)
  • Device Drivers
    • Staging drivers
      • Unisys SPAR driver support
        • Unisys visorbus driver (Disable)

Make

いよいよkernelコンパイルことmakeです.コンピュータによりますが,軽く2時間ぐらいかかります.
CONCURRENCY_LEVELはいわゆる-jオプションですので,makeを何プロセスに分割するかになります.
ここではいきなりkernelをインストールするのではなく,一度debファイルを生成させます.

CONCURRENCY_LEVEL=$(nproc) make-kpkg --rootcmd fakeroot\
 --initrd --arch=amd64 --append-to-version=-xenomai-3.0.7\
 kernel-image kernel-headers

こうしてできたdebファイルでXenomaiパッチされたkernelをインストールしましょう.

cd ../
sudo dpkg -i linux-image-*.deb linux-headers-*.deb
sudo reboot

Xenomai kernelでの設定

まずは,uname -aで適用されていることを確認しましょう.
次にuser groupの設定です.

sudo addgroup xenomai --gid 1234
sudo addgroup root xenomai
sudo usermod -a -G xenomai $USER

xenomaiのディレクトリに移って,moduleをインストールします.

cd workspace/xenomai-3.0.7
./configure --with-pic --with-core=cobalt --enable-smp --disable-tls --enable-dlopen-libs --disable-clock-monotonic-raw
make -j`nproc`
sudo make install

rtt_lwr4には,grubへの設定方法も書いてあります.長くなるので割愛.
最後に環境変数の指定です.

echo '
### Xenomai
export XENOMAI_ROOT_DIR=/usr/xenomai
export XENOMAI_PATH=/usr/xenomai
export PATH=$PATH:$XENOMAI_PATH/bin:$XENOMAI_PATH/sbin
export PKG_CONFIG_PATH=$PKG_CONFIG_PATH:$XENOMAI_PATH/lib/pkgconfig
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$XENOMAI_PATH/lib
export OROCOS_TARGET=xenomai
' >> ~/.xenomai_rc

echo 'source ~/.xenomai_rc' >> ~/.bashrc
source ~/.bashrc

お疲れ様でした.sudo -sしたのちにxeno-testでlatencyを確認すると30usぐらいかと思います.
この状態だとsudo xeno-testにPATHが通ってないので,sudoでtestコマンドを実行したいときは,/etc/sudoersのsecret_pathをコメントアウトし,Defaults env_keep += "PATH"を追記しましょう.
一助となれば幸いです.良きrealtime lifeを!

引用リンク


  1. Linux kernelのリアルタイム化パッチツール.hard realtimeな動作を提供する.現在,HPがGitlabに移行中. https://xenomai.org/ 

  2. 2018/07/11現在. https://xenomai.org/downloads/xenomai/stable/latest/ 

  3. 2018/07/11現在. https://xenomai.org/downloads/ipipe/v4.x/x86/ 

  4. http://rtt-lwr.readthedocs.io/en/latest/rtpc/xenomai3.html を参考にしました. 

  5. https://gitlab.denx.de/Xenomai/xenomai/wikis/Installing_Xenomai_3 

  6. http://szmlb.hatenablog.com/entry/2016/11/24/132322 を参考にしました. 

  7. http://www.nec.co.jp/semi/LWCD2004/pdf/LinuxWorld2004_EL2.pdf 

  8. https://www.intel.cn/content/dam/www/public/us/en/documents/white-papers/multicore-real-time-linux-xenomai-paper.pdf 

  9. https://ameblo.jp/x-faust/entry-12157268437.html 

  10. Open Robot Control Software http://www.orocos.org/ 

  11. RTAI準拠なネットワークプロトコル群 http://www.rtnet.org/links.html 

  12. ただしPCI周りは個人的にGPUの使用する可能性があるので保留