カーネルとユーザランドの入れ替え

カーネルとユーザランドの入れ替え

Linux のカーネル

OS (Operating System) のもっともコアとなる部分をカーネルと呼びます。 カーネル (= OS) は、アプリケーションプログラムに対して、CPU、メモリ、ディスクなどのリソースの分配や管理、ハードウエアへの抽象化されたアクセスの提供等を行います。

原則として、すべてのデバイスはカーネルが提供するファイルとして抽象化されたドライバ (デバイスファイル) 経由で、アプリケーションプログラムからアクセスされます。

基本的にハードウエアベンダがそのデバイスドライバを提供するWindowsとは異なり、Linuxでは、一般に配布されているカーネルのソースコード内に基本的なすべてのデバイスドライバが含まれています。 デバイスドライバは、カーネル内に静的に組み込まれるドライバと、モジュールとして個別にコンパイルされ、必要になった時点で読み込むモジュール型のデバイスドライバがあります。

linux_kernel_and_driver.png
Linuxカーネルと2種類のドライバ

たいていのドライバは、Static としても Module としてもコンパイル可能で、カーネルの設定時に選択できます。

  • Linuxのドライバはカーネルのソースコードに含まれている
  • Linuxの設定時にドライバを組み込むかどうか決める
  • ドライバには静的に組み込むものとモジュール型のものがある

この2種類のドライバはそれぞれメリット・デメリットがあります。

静的に組み込むドライバ

  • 利点
    • カーネルに含まれているので、モジュールをロードする必要がない
    • モジュール化した時よりメモリ使用量が(ちょっとだけ)少なく済む(かもしれない)
  • 欠点
    • カーネルに組み込まれているので、使わなくてもその分メモリを食う
    • カーネルに何のドライバが組み込まれているのかわかりにくい

モジュール化されたドライバ

  • 利点
    • 必要な時だけ組み込めばいいので、メモリの節約になる
    • 後からモジュールだけコンパイルして組み込むことができる(ことがある)
      • サードパーティーが提供するドライバなど
  • 欠点
    • 使用するときモジュールをロードしなければならない
    • モジュール化することで、メモリ消費量が(ちょっとだけ)増える

Linuxカーネルのコンパイル

最近のほとんどのLinuxディストリビューション (Debian, Ubuntu, Fedora, CentOSなど)

 ではほぼすべてのドライバをはじめからモジュール形式でコンパイルしたものをカーネルと一緒に配布しています。
したがって、新しいデバイスを接続した場合でも、カーネルにドライバを追加して自分でコンパイルしなおす、といったことをする必要はありません。

しかし、かつてPCの速度が遅く、メモリが少なかった時代には、自分の環境にあったカーネルを自分でコンパイルすることはLinuxユーザが行う環境設定の第一歩でした。 Armadilloのような組み込みデバイスにおいては、現在においてメモリもディスクスペースも貴重ですので、自分の用途に合ったカーネルを設定・コンパイルする必要があります。

ユーザランド

ユーザランドとは、OSが動作するのに必要な部分のうち、カーネル以外の部分を言います。

 ユーザランド = OS - kernel

ユーザランドには、

  • /etc: 起動スクリプト群、設定ファイル群
  • /bin, /usr/bin: 基本コマンド群
  • /sbin, /usr/sbin, 基本システムコマンド群
  • /lib, /usr/lib, 基本ライブラリ群
  • /lib/modules, カーネルモジュール群

等があります。 Armadilloでは、ユーザランドを圧縮したイメージの状態でFlashメモリに格納し、起動時にRAMに展開してルートファイルシステムとしてマウントし利用します。 ユーザランドにファイルを追加したい、あるいは削除した場合、ユーザランドのイメージを作り直し、Armadilloにダウンロードする必要があります。 ユーザランドは通常10MB程度あり、シリアルポート経由でArmadilloにダウンロードするため、入れ替えには10分程度かかります。 頻繁に入れ替えるのは大変ですので、ユーザランドの入れ替えを考えている場合は、よく計画して行ったほうがよいでしょう。

BusyBox

Armadilloのような組み込みデバイスでは、ディスクスペースは大変貴重です。 一方で、Linuxシステムは起動するだけでも多くのコマンドが必要となります。 そこで、ディスクおよびメモリスペースを節約するために考え出されたのがBusyBoxです。 BusyBoxは、lsやcp, mvなど/binにインストールされているようなコマンド群の代わりを一つの実行ファイルで行います。

Armadilloでは、ユーザランドのコマンドの多くがBusyBoxにより実現されています。

カーネルモジュール

上で説明したカーネルのドライバのうち、静的に組み込まれるドライバはカーネル内部に存在しますが、モジュールドライバはファイルとしてユーザランドに存在します。 Armadilloでは通常以下のディレクトリ

 /lib/modules/2.6.26-at16/kernel/drivers
 #           ^^^^^^^^^^^^この部分はカーネルのバージョン

に格納されています。モジュールがインストールされていれば、

 $ find /lib/modules/2.6.26-at16/kernel/drivers
 ./
 ./net
 ./net/wireless
 ./net/wireless/rt5370sta.ko
 ./scsi
 ./scsi/scsi_wait_scan.ko

このように、<device名>.ko というファイルがいくつか見つかるはずです。

カーネルモジュール内部にはカーネルのバージョンが保持されていて、異なるバージョンのカーネルにはモジュールをロードできないようになっています。

カーネルとカーネルモジュールは必ずセットで作成します。 したがって、カーネルモジュールを含むユーザランドとカーネルは原則としてセットで作成する必要があります。

Atmark Dist

Armadilloのような組み込みLinux環境では、利用できるメモリやディスクに制限があるため、必要最低限のカーネルやユーザランド(種々のコマンド群やアプリケーションを含めてこう呼ぶ) しかインストールしません。

ArmadilloではカーネルもユーザランドもFlashメモリ上に格納され、起動時にRAMにに展開され利用します。起動後にユーザランドに変更を加えても、Flashメモリ上のユーザランドのイメージには変更は反映されないため、ユーザランドに新たなコマンドを加えたり設定を変更したい場合は、PC上でクロス開発し、ユーザランドをイメージ化しArmadilloのFlashメモリにダウンロードする必要があります。

これを行うための環境が Armark Distです。 Atmark Dist は uClinux という MMU (Memory Management Unit) がない組み込み紺ぴぃーた向けのLinuxのためのソースコードベースのディストリビューション uCLinux distが元になっています。 もちろんArmadilloはMMUを搭載したARM9ベースのCPUボードですので、uCLinuxを使う必要はありませんが、uCLinux distの組み込み向けユーザランドを作成する機能を利用し、Armadillo用のカーネルとユーザランドを作成するよう拡張したものを Atmark Distとしてリリースしています。

Armark Distの一般的な使い方は、上述のアットマークテクノの解説をご覧ください。

この解説では、

  • 北陽電機製レーザ測域センサ: URGシリーズ
  • 無線LAN
  • USBカメラ

を利用するために、カーネルおよびユーザランドの再設定および利用方法について説明します。

Atmark Distとカーネルソースのダウンロード

基本的な手順は atmark-dist 開発者ガイド第3章 に従います。

まずはじめに、Atmark DistとLinuxカーネルをダウンロードします。

アットマークテクノのダウンロードサイトには、全体とデバイスごとのフォルダにAtmark Distとカーネルソースが置かれています。 カーネルソースはデバイス毎に若干異なるようですので、基本的にはデバイス個別のフォルダにおかれているAtmark Distとカーネルソースをセットで利用するとよいでしょう。

Atmark Distとカーネルソースの展開

以下、作業ディレクトリをホームディレクトリ直下の work というディレクトリにします。(ディレクトリ名は任意ですが、以下便宜上workとします。)

 $ cd
 $ mkdir -p work/atmarkdist
 $ cd work/atmarkdist
 $ wget http://download.atmark-techno.com/armadillo-440/source/dist/atmark-dist-20120727.tar.gz
 $ wget http://download.atmark-techno.com/armadillo-440/source/kernel/linux-2.6.26-at16.tar.gz
 $ tar xvzf atmark-dist-20120727.tar.gz
 $ tar xvzf linux-2.6.26-at16.tar.gz

Atmark Distはビルドの過程で、カーネルソースを参照します。Atmark Distがカーネルソースを認識するためには、Atmark Distディレクトリの直下にカーネルのディレクトリが存在する必要があります。 そのため、カーネルソースディレクトリへのシンボリックリンクを張ります。

 $ mv atmark-dist-20120727 atmark-dist # 便宜上ディレクトリ名を変える
 $ cd atmark-dist
 $ ln -s ../linux-2.6.26-at16 linux-2.6.x
 # ln -s ../linux-2.6.26-at16 linux-2.6.26でもよい

ディレクトリ構成はこのようになっているはずです。

 ~/work
   + atmarkdist
     + armark-dist
        + bin
        + config
        + :
        + linux-2.6.x -> ../linux-2.6.26-at16 へのシンボリックリンクをあらかじめ張る
        + :
        + vendors
     + linux-2.6.26-at16
 

make menuconfig

Atmark Distのメニューを起動します。

 $ cd ~/work/atmarkdist
 $ make menuconfig
atmarkdist01.png
図1 make menuconfig 直後の画面

Vendor/Product では ArmarkTechno、ProductではArmadillo-440を選択する。

  1. Vendor/Product Selection --->
    • Vendor: Atmarktechno を選択
    • Product: Armadillo-440 を選択
  2. Kernel/Library/Defaults Selection --->
    • [*] Customize Kernel Settings にチェック
    • [*] Customize Vendor/User Settings (NEW) にチェック

に設定。Exitを2回選択し、設定を保存するかきかれるのでOKを選択すると、次はカーネルの設定画面が起動する。

以降、対象とするドライバ毎に説明する。

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2195
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク