OpenWrtアーキテクチャ(uci・ubus・procd)を他のLinux OSにインストールする方法
今回は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に書いてあります。)
そのため、①から⑥の順でコンパイルを実行してエラーが起きないことを確認してからスクリプトを作っています。
参考文献
- Clockwork Bird - Install libubox, uci, ubus and procd on Ubuntu https://clockworkbird9.wordpress.com/2020/02/16/install-libubox-and-ubus-on-ubuntu/
- UCI (Unified Configuration Interface) – Technical Reference https://openwrt.org/docs/techref/uci#usage_outside_of_openwrt