Ubuntu上でInfernoのカーネルをコンパイルするときに、
- /bin/sh: Argument list too long
というエラーでmkが完了しなかった。
xargsで分割できればいいんだけど、いまいち使い方がわからない。
というのもmkコマンドでmkfileを使うんだけど、その中身で
どうも、別ファイルを読み込んでその中をまた別のファイルに書かれてるスクリプトで
分割して、それを引数で渡してるみたいなんだけど、この場合どうやってxargsを使えばいいんだ?
仕方ないのでARG_MAX自体の値を増やすことにした。
カーネル再構築に必要なパッケージのインストール
- $sudo apt-get install build-essential
- $sudo apt-get install kernel-package libncurses5-dev libqt3-mt-dev
カーネルソースをインストールして展開
- $sudo apt-get install linux-source-2.6.32
- $cd /usr/src
- $sudo tar xvjf linux-source-2.6.32.tar.bz2
ソースの変更
- /usr/src/linux-source-2.6.32/include/linux/limits.hを開き、ARG_MAXを増やす
.config ファイルの作成
- $cd linux-source-2.6.32
- $sudo cp /boot/config-2.6.32-23-generic .config
- $sudo make oldconfig
パラメータの変更
- $sudo make menuconfig
Processor type and features ---> Processor familly ---> *Coer 2/newer Xeon
Timer frequency ---> *300 HZ
Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> *generic ATA/ATAPI disk support
Device Drivers ---> ATA/ATAPI/MFM/RLL support ---> *ATA disk support
などを変更してSave Configuration to an Alternate Fileで変更を保存。
出来上がった .config ファイルの中を開いて、
以下のものが「M」ではなく「y」になっているか確認する。
- CONFIG_IDE
- CONFIG_SCSI
- CONFIG_EXT3
並列コンパイル設定(CPUは4つなので最大5つまでという設定にする)
- $sudo export CONCURRENCY_LEVEL=5
カーネルリビルド
- $sudo make-kpkg clean
- $sudo make-kpkg –initrd –revision=20100710 kernel_image kernel_headers
.debができるのでdpkgでインストール
- $cd ../
- $sudo dpkg -i linux-image-2.6.32.*****20100710_i386.deb
- $sudo dpkg -i linux-headers-2.6.32.*****20100710_i386.deb
再起動
- $sudo shutdown -r now
起動しない・・・
Kernel Panic:VFS:***
というエラー、とりあえず、再起動後Shiftキーを押しっぱなしにしてGRUB2のメニュー入って、
正常に動いていたバージョンの起動設定と見比べてみるとinitrdの項が無いのが問題っぽい。
initrd作成
- $cd /boot/
- $sudo mkinitramfs -o initrd.img-2.6.32.***** 2.6.32
再起動後Shiftキーを押しっぱなしにして再度GRUB2のメニュー入って、
再構築したカーネルの項で”e”を押下で編集モードに入り末尾に
initrd /boot/initrd.img-2.6.32.*****
を追加して、Ctrl+xでなんとか起動できたっぽい。
GRUB2の変更は手動でやらないとだめなのかなぁ・・・。
そして、目的のARG_MAXの値を確認
$getconf ARG_MAX
で確認してみるも変わらない・・・。
カーネルが新しいのでもしかしてと重い
$sudo ulimit -Ss
を実行したところ、増えた。
結局、カーネルコンパイルしなくてよかったみたいなので、
今回作ったカーネルを削除して、今まで使ってたカーネルを利用。
増やしても、infernoのカーネルコンパイルエラーは発生する。
どうも作業してる方向がすでに間違っているようなので別の方法を探してみる。