うたカモ技術ブログ

Linux OpenWrt

OpenWrtアーキテクチャ(uci・ubus・procd)を他のLinux OSにインストールする方法   

post:     update: 

今回はOpenWrtではないUbuntuなどのLinux OS上にOpenWrtの主要アーキテクチャ要素である uci、ubus、procdをインストールする方法を紹介します。

具体的にはインストール用のスクリプトを掲載し、それを使ってLinux環境に OpenWrtアーキテクチャを導入する方法について取り上げます。

OpenWrtアーキテクチャの導入によって、OpenWrt専用アプリケーションをLinux環境上でコンパイル&実行することもできる ようになります。

それでは行ってみます。

OpenWrtアーキテクチャのインストールスクリプト

UbuntuなどのLinux環境にOpenWrtの主要アーキテクチャ要素である uci・ubus(ubusd)・procdをインストールするクリプトを以下に掲載します。

※なお、これらのソフトウェアをインストールするために依存関係にあるlibubox、ucode、udebugも 一緒にインストールします。

#!/bin/sh

sudo apt update
sudo apt install -y cmake make git lua5.1 liblua5.1-0-dev libjson-c-dev

for repo in \
    "git://git.openwrt.org/project/libubox.git" \
    "git://git.openwrt.org/project/uci.git" \
    "git://git.openwrt.org/project/ubus.git" \
    "https://github.com/jow-/ucode.git" \
    "https://github.com/openwrt/udebug.git" \
    "https://github.com/openwrt/procd.git"
do
    dir=$(basename "$repo" .git)
    git clone "$repo"
    cd "$dir"

    # ucodeリポジトリの場合、以下のコミットにチェックアウト
    if [ "$dir" = "ucode" ]; then
        git checkout 1901aba90b6841ec1a99a25224a92d2519c603fd
    fi

    cmake ./
    make
    sudo make install
    sudo ldconfig
    cd ..
done

# コンパイルエラーが発生する場合
# 本記事執筆の2024年9月21日時点ではucode以外の他アプリは正常にコンパイルできます。
# しかし、各リポジトリの更新が続くと最新のコミット内容によってはコンパイルに失敗するかもしれません。
# コンパイルが失敗する場合は成功する状態のコミットまでgit checkoutコマンドを使って戻ってください。
#
# ちなみに本記事執筆時点での各アプリの最新コミットハッシュは以下の通りです。
#(これならコンパイルが成功すると思います)
# libubox ... eb9bcb64185ac155c02cc1a604692c4b00368324
# uci ....... 5781664d5087ccc4b5ab58505883231212dbedbc
# ubus ...... 65bb027054def3b94a977229fd6ad62ddd32345b
# udebug .... 6d3f51f9fda706f0cf4732c762e4dbe8c21e12cf
# procd ..... 946552a7b598a0b88db6101e864679554ec4f221

私のWebサイト上にスクリプト本体を管理していますので、 お使いのLinux環境上のコンソールで次のコマンドを実行すればインストールが開始されます。

kamo@kamo:~$ wget https://utakamo.com/article/openwrt/install-archs-on-other-linux/repo/install-openwrt-archs
kamo@kamo:~$ chmod +x install-openwrt-archs
kamo@kamo:~$ ./install-openwrt-archs

インストールが完了すると、各ソフトウェアは以下の階層に配置されます。

kamo@kamo:~$ which uci
/usr/local/bin/uci
kamo@kamo:~$ which ubus
/usr/local/bin/ubus
kamo@kamo:~$ which ubusd
/usr/local/sbin/ubusd
kamo@kamo:~$ which procd
/usr/local/sbin/procd

そのため、各ソフトウェアはコンソール上で次のようにして実行することができます。

kamo@kamo:~$ uci  <--- uci commitコマンドの実行のときだけsudoを付ける必要があります。/etc/config直下に記録するので。
kamo@kamo:~$ sudo ubus <--- ubusdとの連携が必要なのでubusもsudoを付けます。ソケットを使うので。
kamo@kamo:~$ sudo ubusd
kamo@kamo:~$ sudo procd <--- こちらもubusdと連携したいならsudoを付けます。ソケットを使うので。

補足

上記のスクリプトのコメントにも書いてありますが、ucodeは2024年9月21日現在、 最新リポジトリのものでコンパイルすることができません。

なので、コンパイルが成功したコミットまでgit checkoutを使って戻っています。

他のLinux環境にOpenWrtアーキテクチャをインストールする利点

全てに通用するわけではありませんが、そのLinux環境で実行可能なOpenWrt専用アプリケーションのコンパイル・ビルドができることが利点です。

特定のハードウェアやそのドライバーの動作に直結しないアプリケーションであれば、OpenWrtの開発環境として用意したLinux OS上で OpenWrt専用アプリケーションをコンパイルして、そのLinux OS上で動作を直ぐに確かめることができます。

これは各アプリケーションをLinux OSにインストールしたときに、一緒に共有オブジェクト(.so)も取り込まれることでコンパイルができるようになります。 (※libubus.so、libuci.soなど)

例えば、私のリポジトリにあるOpenWrtの環境変数管理システム(UCI)を使ったuci-sample03という サンプルプログラムもLinux OS(例Ubuntu 24.04 LTS)上でコンパイルすることができます。

なお、サンプルプログラムのMakefileではdatacheckターゲットという名前でLinux OS用のコンパイル作業 が実行されるように設定しています。出来上がる実行可能ファイルはdatacheckです。

kamo@kamo:~$ git clone https://github.com/utakamo/UtakamoStudyApps.git
kamo@kamo:~$ cd UtakamoStudyApps/libuci-c/uci-sample03/src
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ make datacheck
gcc -c -o uci-sample03.o uci-sample03.c -Wall
gcc -o datacheck uci-sample03.o -luci -lubox

そして、ちゃんと実行もできます。

この例ではtestコンフィグを作成した後に実行しています。
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ sudo mkdir -p /etc/config
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ sudo touch /etc/config/test
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ uci set test.blog=utakamo
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ uci set test.blog.data1=hello
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ uci set test.blog.data2='Is my blog easy and readable?'
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ uci set test.blog.data3=goodbye
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$ sudo uci commit test
kamo@kamo:~/UtakamoStudyApps/libuci-c/uci-sample03/src$  ./datacheck test.blog.data2

---[Search Results]---
 --package info
   [uci_element] e.list.next     :0x55eb16e652a0
   [uci_element] e.list.prev     :0x55eb16e652a0
   [uci_element] e.name          :test

   [uci_list]    sections.next   :0x55eb16e67aa0
   [uci_list]    sections.prev   :0x55eb16e67aa0

   [uci_context] ctx             :0x55eb16e652a0

   has_delta           :true
   path                :/etc/config/test
   uci_backend address :0x7f5acb41a2a0
   priv                :(nil)
   n_section           :1

   [uci_list] delta.next          :0x55eb16e66750
   [uci_list] delta.prev          :0x55eb16e66750
   [uci_list] saved_delta.next    :0x55eb16e67a50
   [uci_list] saved_delta.prev    :0x55eb16e67d70

 --section info
   [uci_element] e.list.next :0x55eb16e66710
   [uci_element] e.list.prev :0x55eb16e66710
   [uci_element] e.name      :blog

   [uci_list] options.next   :0x55eb16e67b90
   [uci_list] options.prev   :0x55eb16e67de0

   package address :0x55eb16e666f0
   anonymous       :false
   type            :utakamo

 --option info
   [uci_element] e.list.next :0x55eb16e67de0
   [uci_element] e.list.prev :0x55eb16e67b90
   [uci_element] e.name :data2

   section address :0x55eb16e67aa0
   option type     :UCI_TYPE_STRING
   option value      :Is my blog easy and readable?

 --last info
   [uci_element] list.next :0x55eb16e67de0
   [uci_element] list.prev :0x55eb16e67b90
   [uci_element] name :data2

Makefileにライブラリリンクや必要なファイルのコピー処理を正しく記述することが前提でありますが、 これで直ぐにビルドしたアプリケーションの動作確認をすることができます。

UBUSサーバーアプリケーションを実行するには?

UBUSシステムを利用したUBUSサーバーアプリケーションもお使いのLinux環境上で動作を確認することができます。

その場合は以下の手順で実行します。

手順1
1つ目のコンソール画面を表示させ、次のコマンドでubusdをフォアグラウンド実行します。

kamo@kamo:~$ sudo ubusd

手順2
次にもう2つ目のコンソール画面を表示し、今度は対象のUBUSサーバーアプリケーションをsudo付きで起動します。 (例として私のリポジトリにあるUBUSサーバーアプリケーションのサンプルプログラムのubus-sample01をコンパイルして起動してみます。 なお、こちらもフォアグラウンド実行です。)

kamo@kamo:~$ git clone https://github.com/utakamo/UtakamoStudyApps.git
kamo@kamo:~$ cd UtakamoStudyApps/libubus/ubus-sample01/files/src
kamo@kamo:~/UtakamoStudyApps/libubus/ubus-sample01/files/src$ make datacheck
gcc -c -o ubus-sample01.o ubus-sample01.c -Wall -luci -lubus -lubox
gcc -o datacheck ubus-sample01.o -luci -lubus -lubox
kamo@kamo:~/UtakamoStudyApps/libubus/ubus-sample01/files/src$ sudo ./datacheck

手順3
3つ目のコンソール画面を表示し、今度はubusコマンドを使ってubusdにサンプルプログラムが認識されているか確認します。

kamo@kamo:~$ sudo ubus list
sample01 <--- 正しく認識されていると今回の場合ではsample01オブジェクトが表示されます。

UBUSサーバーアプリケーションがUBUSシステム(ubusd)に認識されていることが確認できたら、次のコマンドで実行してみます。

kamo@kamo:~$ sudo ubus -v list sample01
'sample01' @765f03b3
"check_json_format":{}
"show_uci_option":{}
"update_uci_option":{"option":"String","value":"String"}
kamo@kamo:~$ sudo ubus call sample01 check_json_format '{}'
{
        "Description": "[ubus json format]",
        "string": "ABCDEFGHIJKLMNOPQRSTUVWXYZ",
        "bool": true,
        "numeric data": 100,
        "table": {
                "table-element1": "string data",
                "table-element2": true,
                "table-element3": 200
        },
        "Note": "Please read this source code for detailed usage."
}
kamo@kamo:~$ sudo mkdir -p /etc/config <--- 必須のUCIコンフィグ(ubus-sample01)を作成する。C言語ソースのコンパイルだけしたので必須データをここで作成。
kamo@kamo:~$ sudo touch /etc/config/ubus-sample01
kamo@kamo:~$ uci set ubus-sample01.test=sample
kamo@kamo:~$ uci set ubus-sample01.test.data1=Hello
kamo@kamo:~$ uci set ubus-sample01.test.data2='Good Morning'
kamo@kamo:~$ uci set ubus-sample01.test.data2='Bye'
kamo@kamo:~$ sudo uci commit ubus-sample01
kamo@kamo:~$ sudo ubus call sample01 show_uci_option '{}'
{
        "Description": "Output /etc/config/ubus-sample01",
        "data1": "Hello",
        "data2": "Good Morning",
        "data3": "Bye"
}
kamo@kamo:~$ sudo ubus call sample01 update_uci_option '{"option":"data1","value":"こんにちは"}'
{
        "Result": "[UCI SET SUCCESS] Please check ubus-sample01 config!!",
        "Note": "ex) user~# uci show ubus-sample01"
}
kamo@kamo:~$ uci show ubus-sample01
ubus-sample01.test=sample
ubus-sample01.test.data1='こんにちは'
ubus-sample01.test.data2='Good Morning'
ubus-sample01.test.data3='Bye'

こんな感じでUBUSサーバーアプリケーションもOpenWrtとは異なるLinux OS上で実行することができます。

おまけ:インストールスクリプトを作った時に調査した内容

本記事で取り上げたインストールスクリプトを作る際に重要なのが、各アプリケーションの依存関係です。

今回インストールしたlibubox、uci、ubus、ucode、udebug、procdは次の図に示す依存関係がありました。 (依存関係は各アプリケーションのリポジトリに存在するCMakeLists.txtに書いてあります。)

そのため、①から⑥の順でコンパイルを実行してエラーが起きないことを確認してからスクリプトを作っています。

参考文献