2011年1月6日木曜日

Fedora 14から無線LANが「つながらない」 via bcm43xx

Broadcom STA Wireless Driverを指示どおり入れたのに、無線LANが「つながらない」というか無線LANモジュールが「認識されない」問題についてのまとめ。
結論から言うと、私の特殊事情が原因だった。
ここ(http://www.broadcom.com/docs/linux_sta/README.txt)の指示どおり、RPMパッケージを導入。
$ su
# rpm -Uvh http://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-stable.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-stable.noarch.rpm
これで、non-freeのRPMパッケージのレポジトリが利用可能になるので、
# yum update
# yum install kmod-wl
これで、ドライバの導入は終了。
が、しかし、認識されない。ネットで検索かけて海外フォーラムの記事を読んでも同様の問題はなかった模様。
/lib/modules/2.6.10-74.fc14.i686/extra/wlにwl.koはあるのに…。
で、ちょっとした拍子に、uname -rとタイプすると、
2.6.35.6-45.fc4.i686
と出てきた。原因はこれ。一応、確認すると、2.6.35.6-45.fc4.i686の方にはwl.koはなかった。
要するに、yumでインストールしたのは、カーネルが2.6.35.10-47.fc4.i686の方だけだったみたいで(何となくこれは分かってた)、しかも、私の環境はUbuntuとデュアルブートで、Ubuntu側がメインだから、Fedoraの新しいカーネルが導入されても自動でGrubのメニューは更新されてなかった。新しいカーネルが入ってるのに古いのでずっと起動してたというわけ。
ということで、Ubuntuに戻って、
$ sudo update-grub
で新しいカーネルのinitrdイメージをGrubに追加して、新たに加わったFedoraのカーネルから起動すると、何事もなかったかのように、無事、無線LANが認識された。この記事もFedoraから書いてます。やったね。Fedoraの新しいカーネルがインストールされたら、Ubuntuでupdate-grub。これは忘れてはいけないということでした。まぁ、/bootのパーティションを別にしておけばよかったんだろうけど。

2011年1月5日水曜日

UbuntuでFedoraのLive USBを作る!〜そしてUbuntuとFedoraのデュアルブート

Fedora Live CDから同Live USBをUbuntuでつくろうとして苦労したので、メモっておく。
とりあえず、ISOイメージをダウンロード。

syslinuxをインストールしておく。多分入ってるとは思うけど。(私は入ってた。)

$ sudo aptitude install sysylinux
で、/mntにイメージをマウントする。正直どこでもいいけど。
$ sudo mount <ISOイメージのパス> /mnt -o ro,loop -t iso9660
マウントすると、LiveOSというディレクトリがあるので、そこまで移動。
$ cd /mnt/LiveOS
そしたら、そこにあるあたかもUSBを作ってくれそうなのをroot権限で実行する。
$ sudo ./livecd-iso-to-disk <ISOイメージのパス> /dev/<USBのデバイスファイル(sdc1とか)>
md5がなんたらとか言ってくるけど、無視してEnterすればOK。
USBメモリに対応するデバイスファイルの名前が不明な場合、ポートに差し込むと自動でマウントしてくれるので、そのままで、dfで確認するといい。あとでも使うので、しっかりと。
そして、上のコマンドを実行する前に、USBメモリをアンマウントしないとだめ。
でまぁ、しばらく待ってると、Live USBメモリが完成しましたとか言うけど、差したままリブートかけても起動してくれなかった。正確にはboot:で止まる。vmlinuz0とか入れても、途中でkernel panicで止まる。
これは、syslinuxをやり直したら解消した。
$ sudo syslinux /dev/(USBのデバイスファイル)
これで、Live USB完成!めでたし、めでたし。
知ってたら大したことないんだけどね。知らなかったから、大変だった。Linux(Ubuntu)から他のLinux(Fedora)のLive USBを作るのがこんなに大変だなんて。Winから作ったほうが(Live USB Creatorで)断然楽とか…。

それに引換、デュアルブートは楽でしたよ。
フツーにインストールするだけ。無論、Ubuntuを上書きしちゃダメですよ。
あと、重要なのは、 ブートローダーのインストール先。Fedoraに割り当てたパーティションのパーティションの先頭(PBR)ってやつを選ばないと、Ubuntuが起動できなくなっちゃう。まぁ、戻せるとは思いますけど(下のをFedoraからやって、Ubuntuに戻ってGrubを再インストールするなりすれば)。
インストールを終えて再起動すると、Ubuntuが起動するはずなので、GRUBにFedoraを認識させる。
$ sudo update-grub
これでOK。ちなみに、Fedoraを消すときは、パーティションごと消しちゃって、同じくGRUBをアップデートしたらいけるはず。

参考URL
http://coffeecode.net/archives/223-Using-Fedoras-liveusb-creator-on-Ubuntu-Lucid-Lynx.html

2011年1月4日火曜日

最新のBroadcom STA Wireless DriverをdkmsでUbuntuへ

Ubuntuのレポジトリで配布されているBroadcom STA Wireless Driver(BCM43xx用/S10eの場合、BCM4312用)[5.60.48.36]がBroadcomのオフィシャルで公開されているもの(http://www.broadcom.com/support/802.11/linux_sta.php)[5.100.82.38]より古かったので、練習がてら新しいのに置き換えてみることにした。
とりあえず、ダウンロード。で、適当にディレクトリを作ってその中に展開。
$ tar zxvf hybrid-portsrc_x86_32-v5_100_82_38.tar.gz
とりあえず置き換えてみることにした。
$ make
$ sudo rmmod wl
$ cd /lib/modules/<現在のカーネル>/updates/dkms/
$ mv wl.ko wl.ko.old
$ sudo cp <さっきビルドした、wl.ko> wl.ko
$ sudo insmod wl.ko
うん、動いた。APも認識してくれたし。
だけど、カーネルがアップデートされるたびにこれをしないといけないのか?
そういや、カーネルアップデートするときに自動で組み込んでるよな。そういや、dkmsとかいう名前だったよな。
ってことでググったら、Ubuntu Japanese Wiki(https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo)にあった。これにしたがって作業する。
とりあえず、元の作業ディレクトリに戻って、makeしたのをcleanする。あと、一応いらないもの(README.txt)は消しておく。
$ make clean
$ rm README.txt 
ソースを展開したディレクトリごと、/usr/srcの下にコピーする。
$ sudo cp <ソースを展開したディレクトリ> /usr/src/ -r
古い方のドライバの名前に似せて、リネームしておく。そして、これをきちんと把握しておく。これ重要(後述)。
$ sudo mv <さっきのディレクトリ名> bcmwl-5.100.82.38
古いのはバージョンの後ろに+bdcomとか付いてたけど、もういいやってことで付けなかった。
で、dkms.confを古いのからコピってくる。
$ cd /usr/src
$ sudo cp bcmwl-5.60.48.36+bdcom/dkms.conf bcmwl-5.100.82.38/
dkms.confを編集する。
$ cd bcmwl-5.100.82.38
$ sudo vim dkms.conf
以下のように編集。
PACKAGE_VERSION="5.60.48.36+bdcom" => "5.100.82.38"
PATCHから始まる行をすべて#でコメントアウト(最初、コメントアウトしてなくて、dkmsがエラー吐いた。そりゃ、ないもん参照したってなぁ。)
wikiに従うと、dkms.confではPACKAGE_NAME(ここではbcmwl)とPACKAGE_VERSION(同5.100.82.38)とに一致するディレクトリ(同bcmwl-5.100.82.38)の中を読みに行くらしい。
これ以下の作業でもわかるように、このNAMEとVERSIONがdkmsでの管理情報になるよう。
ここからは、dkmsでの作業。
$ sudo dkms add -m bcmwl -v 5.100.82.38
$ sudo dkms build -m bcmwl -v 5.100.82.38
$ sudo dkms install -m bcmwl -v 5.100.82.38
(mはモジュール名、vはバージョンっぽい。) 
ここで、全部dkms 〜 completed って出たので喜んでwikiにしたがって、古いカーネルを再インストールしたら、dkmsが古い方(5.60.48.36)を自動的にインストールしてくれたorz
よく考えたら、wikiに書いてあるのは、インストールだけだった。更新じゃなかったお。
したがって、manを参考に手探りながら古いドライバをdkmsのツリーから外してやることに。
$ sudo dkms remove -m bcmwl -v 5.60.48.36 --all
インストールしているカーネルそれぞれすべて(--all)から、古いドライバを削除してくれる。
で、改めて、カーネルを再インストール。今度は成功した。
はじめから、dkms使ってやれば、よかったんやん、と自分で思ったのだが、予め展開してみて、ちゃんと動作するか確認するのが重要っぽい。結果的には合ってたそうな。ちゃんちゃん。
参考サイト
https://wiki.ubuntulinux.jp/UbuntuTips/Others/DkmsHowTo

2011年1月1日土曜日

Ubuntu 10.10のカーネル再構築

一時はやめた、カーネルの再構築をやってみた。
(1)下準備
$ aptitude search linux-source
でパッケージ名を検索し、
$ sudo aptitude install linux-source-2.6.35
でソースをインストール、というかダウンロード。
カーネルビルドに必要なパッケージをインストール。
$ sudo aptitude install kernel-package build-essential libncurses5-dev libqt3-mt-dev
これで準備OK
(2)ソースの展開。
$ cd /usr/src
$ sudo tar jxvf linux-source-2.6.35.tar.bz2
/usr/src/linux-source-2.6.35というディレクトリにソースが展開される。
(3).configファイルのコピー
$ sudo cp /boot/config-2.6.35-24-generic .config
これで、現在のカーネルコンフィギュレーションファイルがコピーされる。
(4)カーネルコンフィギュレーション
$ sudo make oldconfig
これは、新しいカーネルコンフィギュレーションとの整合性を取るためのものらしい。本来なら、新しい設定が増えたりすると、質問してくるらしいが、今回はなかった。
$ sudo make menuconfig
ここからが、実際のカーネルコンフィギュレーション。設定項目が多すぎるので、詳細は割愛するが、私のように調子に乗って「関係ねーや」とか言っていろいろ切りすぎると、kernel panicで動かなくなるので要注意。
書いてある説明では、
[*] built-in =カーネルに組み込み
[ ] excluded =カーネルに組み込まない
<M> module =モジュールにする(多分、カーネルには組み込まないけど、必要になったら呼び出すってことだと思う)
<  >が付いてるところはモジュールにすることが可能。
Shift + / 、すなわち、?を入力する要領でキーを押してやれば、その設定項目のヘルプが参照可能。
/ で設定項目のサーチが可能。 
とりあえず、Processor type and features -> Processor familiyをいじったり、Intel CPUならAMDの、AMD CPUならIntelのを切る程度から始めたほうがいいかもしれない。
あと、Networking support -> Amateur Radio support はアマチュア無線のデバイスか何か知らないけど、それがないなら絶対にいらない。
Kernel hackingはすべて切っといてもカーネル開発をしないなら問題ないらしい。
絶対にいらない(他社製で、Dell laptop support)と思えるもの以外は<M>にしておけば、なんとかなる気がする。
(5)Extraversionの変更
$ sudo vim Makefile
で、EXTRAVERSION=の後ろをわかりやすく、かつ、標準のカーネルのそれとは変わるようにしておいたほうがいい。同じ名前にすると、インストール時に当然ややこしくなる。
この部分は、カーネルのバージョンの例えば、2.6.35-24-genericで言えば、「-24-generic」 に相当する。私は、EXTRAVERSION=.original0xにしておいた。
(6)omnibookのMakefileの編集
omnibookというモジュールのMakefileに問題があり、そのため、ビルドが止まってしまうことがあった。簡単に言うと、原因は、変数の扱いがミスってるために、makeが当該のファイル(sections.lds)を参照できないため。ということで、環境によっては大丈夫かもしれないが、一応、修正しておくのが良い。
$ gksudo gedit
でroot権限でgeditを実行し(vimの検索機能の使い方を知らないorzため)、ソースのディレクトリ内のubuntu/omnibook/Makefileを開く。
で、sectionsで検索をかけると、
EXTRA_LDFLAGS += $(PWD)/ubuntu/omnibook/sections.lds
とある。ここが問題の箇所。ちなみに、変数PDWの処理がおかしい(if で分岐すると、elseの時にはソースのパスが代入されないらしい)。
で、他のサイトでは、変数PWDにちゃんと正しい値が代入されるように書き換えていたが、めんどくさいので、汎用性はなくなるが、$(PWD)を消して、絶対パスを記してやればいいと思う。どうせ、他の場所でビルドしないし。
ってことで、この箇所を、
EXTRA_LDFLAGS += /usr/src/linux-source-2.6.35/ubuntu/omnibook/sections.lds
に書き換える。
(7)いよいよビルド。
$ sudo su -
で、rootになって、
# export CONCURRENCY_LEVEL=(CPU、コア、スレッドの数より+1の数)
で、makeに使う、CPUとかの数の上限を高めておくと並列でやってくれるらしい。AtomはHTTだが、どこまでいってもシングル・コアなので、効果は限られていただろうが、一応やった。おまじない程度。
# logout 
でrootを抜け、
$ sudo make-kpkg clean 
$ sudo make-kpkg --initrd --revision=(適当。ここでは日付にしておいた) kernel_image kernel_headers
でビルドが開始される。
(8)新しいカーネルのインストール
ビルドが完成すると、1つ上のディレクトリにdebパッケージが生成されるのでこれをインストール。
$ cd ..
$ sudo dpkg -i linux-image-2.6.35.(EXTRAVERSION)_(revision)_i386.deb linux-headers-2.6.35.(EXTRAVERSION)_(revision)_i386.deb
1組しかパッケージがないなら、めんどくさいから、これでもいい。
$ sudo dpkg -i *.deb 
これでインストールされる。GRUBも自動で更新される。
(9)再起動、そして新しいカーネル(?)
再起動をかければ、自動で新しいカーネルから起動するはず。
起動しない場合(kernel panicとか)、起動時にシフトキーを押してやれば、GRUBからカーネルを選択して起動できるようになるので、きちんと動いていたカーネルを選択して起動してやればいい。
カーネルの削除自体は、aptitudeとかを使ってやれば、普通のアプリと同じように削除できる。

カーネルを再構築して速く、軽くなったかって?分からんわw
ただ、カーネルコンフィギュレーションは面白かったし、いろんなことを処理してるんだなぁってことで、Linuxの仕組みにはちょっと明るくなった。

参照したサイト一覧
http://mwlab.net/2010/07/ubuntu-10-04-rebuild-kernel.html
http://ankyo.blog.so-net.ne.jp/2010-01-05
http://ky-hive.jp/blog/?p=257
http://www.itmedia.co.jp/enterprise/articles/0708/21/news018.html
omnibookのsections.ldsがおかしい原因について記したサイト
(参考にする前に絶対パスをしてしてやる解決策を見出したんだと、自分の臨機応変さについては主張しておきたい(笑))
http://ankyo.blog.so-net.ne.jp/2010-05-04-1

2010年12月29日水曜日

TwidgeをUbuntuで使えるようにする。

Ubuntuのレポジトリに入ってるTwidgeはバージョンが、1.0.2で、9月くらいからTwitterの新しい認証方法、OAuthに対応していないため使えない。
で、公式サイトから、OAuth対応の1.0.6のパッケージをダウンロードしたのだが、今度は、twidge update '(ツイート)' の(ツイート)の部分に日本語が(正確に言えば、UTF8のエンコード文字)入ると、文字化けするんで、TwidgeがUTF8に対応してないくさい。
ってことで、ネットから見つけた情報を元にUTF8に対応出来るよう、ソースコードに修正を加えて、ビルドし、インストールすることに。これが大変だった。

まず、Twidgeの公式サイト(http://hackage.haskell.org/package/twidge)から、ソースをダウンロード、解凍。
コンパイル環境ghcをインストール。
sudo aptitude install ghc6 
解凍したディレクトリに移って、ここ(https://gist.github.com/423901)の情報を元に、以下のファイルを次のとおりに編集する。
twidge.cabal
ConfigFile, directory, HSH, regex-posix, utf8-string, binary,
の部分を
ConfigFile, directory, HSH, regex-posix, utf8-string >= 0.3.5, binary,
 に。

twidge.hs
import Codec.Binary.UTF8.String (decodeString, isUTF8Encoded)
を追加。
argv <- getArgs
の部分を
argv <- return . (map decodeHack) =<< getArgs
に。
optionsの直前に、
where
-- until GHC #3309 is fixed
decodeHack s = if isUTF8Encoded s then decodeString s else s
を追加。

ghc --make -o setup Setup.lhs
 ./setup configure
を実行。多分、依存関係でいろいろ足りないとエラーが出るはず。
なので、ここで、aptitudeを使って、適宜インストール。エラーで出たものをaptitude searchで探してやると、libghc6-*-devってのがよく引っかかるので、それを逐一インストールしていく。ただ、依存関係で1つインストールすると、他のも一緒に引っかかるので、./setup configureをやりながら調子をみると良いかと。
ちなみに、私のやった順(たぶん)。
curl 
libghc6-haxml-dev-1.13.3-37cdb
libghc6-hoauth-dev
libghc6-configfile-dev
libghc6-hsh-dev
で、ここまでやると、最後の最後まで、UTF8-string >=0.3.5が残るはず。しかし、UbuntuのレポジトリではUTF8-stringはインストールできない。
なので、ダウンロードしてコンパイル、インストールするしかないっぽい。(これに気づくのに時間がかなりかかった。)
ここ(http://hackage.haskell.org/packages/archive/utf8-string/)から0.3.5以上をダウンロードし(0.3.6が最新だったので、新しいのを入れた)、展開。
runhaskell Setup.lhs configure
runhaskell Setup.lhs build
sudo runhaskell Setup.lhs install 
でビルド、インストール。
ここまできたら、もうゴールは見える。
twidgeのソースのディレクトリに戻り、
 ./setup configure
 ./setup build
ここで、UTF8-stringのバージョンを、twidgeのコンポーネントが、別々に2つ必要としてて、おかしくなるかもよ、とか言われても、無視。
 sudo ./setup install
で、インストール完了!日本語でtwidgeからツイートできる!ああ、疲れた。

2010年12月25日土曜日

AppArmor Technical Documentation - 3 The Apparmor Security Model

When a file is accessed by name with open(2), mkdir(2), etc., the kernel looks up the location of the object associated with the specified pathname in the file system hierarchy. The lookup is relative to the root directory for pathnames starting with a slash, and to the current working directory otherwise. Different processes can have have different working directories as well as different root directories. See path resolution(2) for a detailed discussion of how pathname resolution works.
Either way, the result of the lookup is a pair of (dentry, vfsmount) kernel-internal objects that uniquely identify the location of the file in the file system
hierarchy. The dentry points to the object if the object already exists, and is a placeholder for the object to be created otherwise.
AppArmor uses the (dentry, vfsmount) pair to compute the pathname of the file within a process's filesystem namespace. The resulting pathname contains no relative pathname components (\." or \.."), or symlinks.
AppArmor checks if the current profile contains rules that match this pathname, and if those rules allow the requested access. Accesses that are not explicitly allowed are denied.

(略)
どちらの方法(各プロセスのルートディレクトリから始まるパスネーム、ないしは、作業ディレクトリからのそれ、からファイルをルックアップすること)でも、ルックアップの結果は(dentry,vfsmount)カーネル内部の、ファイルシステム階層内部のファイルの位置を固有に特定する、オブジェクトのペアです。 dentryは、オブジェクトがすでに存在すればそのオブジェクトを指し、さもなくば、生成される予定のオブジェクトのプレースホルダーです。
AppArmorは(dentry,vfsmountの)ペアを用いて、プロセスのファイルシステムのネームスペース内部のファイルのパスネームを特定します。結果として生じるパスネームには、一切の相対パスネームの部分("."ないしは"..")やシンボリックリンクは含まれません。AppArmorは現在のプロファイルが、このパスネームにマッチするルールを含んでいるかどうか、そして、それらのルールが要求されたアクセスを許可しているかどうかをチェックします。明示的に許可されていないアクセスは拒否されます。

2010年12月19日日曜日

AppArmor Technical Documentation - 2 Overview

AppArmor protects systems from insecure or untrusted processes by running them in con nement, still allowing them to share les with other parts of the system, exercising privilege, and communicating with other processes, but with some restrictions. These restrictions are mandatory; they are not bound to identity, group membership, or object ownership. In particular, the restrictions also apply to processes running with superuser privileges. AppArmor achieves this by plugging into the Linux Security Module (LSM) framework. The protections provided are in addition to the kernel's regular access control mechanisms.
The AppArmor kernel module and accompanying user-space tools are available under the GPL license. (The exception is the libapparmor library, available under the LGPL license, which allows change hat(2) to be used by non-GPL binaries.)
At the moment, AppArmor knows about two types of resources: les, and POSIX.1e (draft) capabilities. By controlling access to these resources, AppArmor can effectively prevent con ned processes from accessing les in unwanted ways, from executing binaries which they are not meant to execute, and from exercising privileges such as acting on behalf of another user (which are traditionally restricted to the superuser).
One use case for this kind of protection is a network daemon: even if the daemon is broken into, the additional restrictions imposed by AppArmor will prevent the attacker from attaining additional privileges beyond what the daemon is normally allowed to do. Because AppArmor controls which files a process can access in which ways down to the individual file level, the potential damage is much limited.
There is work going on for teaching AppArmor about additional resources like ulimits, and interprocess and network communication, but at this time, these resource types are not covered. This is less severe than it might initially seem: in order to attack another process from a broken-into process like a network daemon, that other process has to actively listen. The set of actively listening processes is relatively small, and this sort of interprocess communication is a natural security boundary, so listening processes should be validating all their input already. For protection against bugs in the input validation of those processes, they should also be confined by AppArmor though, thus further limiting the potential damage.
AppArmor protection is selective: it only confines processes for which policies (referred to as profiles) have been de ned. All other processes will continue to run unrestricted by AppArmor.
To confine a process, all it takes is to write a pro le for it, take an existing profile, or automatically generate a profile: for the latter, the process can be run in learning or complain mode in which AppArmor allows all accesses, and logs all accesses that are not allowed by the current profile already. This log can then be used to automatically generate a suitable new profile, or refine an existing one. The application does not need to be modified.
An example pro le together with a complete low-level walk-through of AppArmor can be found in Section 4. The apparmor.d(5) manual page contains further details.
AppArmor is not based on labeling or label-based access and transition rules, so it does not stick a label on each each file in the file system (or more generally, on each object). It identifies files by name rather than by label, so if a process is granted read access to /etc/shadow and the system administrator renames /etc/shadow to /etc/shadow.old and replaces it with a copy (that may have an additional user in it, for example), the process will have access to the new /etc/shadow, and not to /etc/shadow.old.

AppArmorはシステムを安全ではない、あるいは、信頼のされないプロセスから守ります。それは、それらのプロセスを一定の制限のもとで走らせることで行われ、システムの他の部分とのファイルの共有や特権の行使、他のプロセスとのコミュニケーションをそれらのプロセスにいくつかの条件を付して認めます。これらの制限は強制的なもので、個人やグループのメンバーシップ、ないしは、オブジェクトの所有者には結びついていません。とりわけ、これらの制限は、スーパーユーザの権限により実行されるプロセスにも適用されます。[訳注:この2文は、AppArmorがスーパーユーザだから制限を緩くする一方、一般ユーザだと制限をきつくなるという働きはせず、どんなユーザでも(その人がどんなユーザグループに属していても、その人が制限対象のオブジェクトの所有者であっても)制限を強制するという意味でしょう。]AppArmorはこれをLinuxセキュリティモデル(LSM)のフレームワークに接続することで達成します。提供される保護はカーネルの一般的なアクセスコントロールのメカニズムに加えて行われます。
(略)
さて、AppArmorは、ファイルとPOSIX.1e(draft)機能との2つのリソースについて関知します。これらのリソースへのアクセスをコントロールすることにより、AppArmorは効果的に制限されたプロセスが喜ばしくない方法によりアクセスしたり、実行する必要のないバイナリを実行したり、他のユーザとしてアクションを行うような特権を行使(これは伝統的にスーパーユーザに制限されています)したりすることを防ぎます。
(略)
AppArmorの保護は選択的です。AppArmorはそのプロセス用にポリシー(プロファイルとして参照される)の定義されたプロセスを制限するのみです。[ポリシーの定義されていない]すべての他のプロセスは、AppArmorにより制限されないまま走り続けます。
あるプロセスを制限するためにAppArmorの行うことの全ては、そのプロセス用にプロファイルを書くこと、あるいは、すでに存在するプロファイルを適用すること、自動的にプロファイルを生成することです。3つのうち最後のために、そのプロセスは、ラーニングモードないしはコンプレインモードで動作し、そのモードでは、AppArmorはすべてのアクセスを許可し、現在のプロファイルですでに許可されていないすべてのアクセスを記録します。そして、このログは新しくふさわしいプロファイルの自動生成や既存のプロファイルの再定義に利用されます。そのアプリケーションは修正する必要はありません。
(略 大意は、例は第4節で説明するし、もっと細かいことをしりたい人は、apparmor.d(5)manページを参照してね。)
AppArmorはラベリングないしはラベルをベースとしたアクセス及びトランザクションルールには基づいていませんので、ファイルシステム上の各々のファイルに(より一般的に言えば、各々のオブジェクトに)ラベルを付すことはしません[よく分からないけど、AppArmorはこれとは違うらしいから、ここではこの程度で妥協]。AppArmorはラベルではなく、名前によりファイルを識別し、〜(略 例が示される。 大意としては、ファイルをリネームして新しいもので置き換えた場合、新しい方にプロファイルが適用される)