twitter icon   twitter icon   rss icon

Linux.com Japan

Home Linux Jp チュートリアル Raspberry PiとMinnowBoard用にLTSI化したKernel Packageを作成する

Raspberry PiとMinnowBoard用にLTSI化したKernel Packageを作成する

raspberry-pi

以前、Raspberry PiとMinnowBoardにLTSI-3.10 Kernelをインストールする (英語は、How to Install the LTSI-3.10 Kernel on Raspberry Pi and MinnowBoard )という文献で、Raspberry PiとMinnowBoardにLTSIパッチを当てたKernelのBuildとInstall方法を紹介しました。そのときは、ソースをダウンロードして、パッチを当て、ビルドしたそのままのイメージをインストールしました。今回は、管理しやすいようにパッケージ化をしましたので、その方法を紹介します。大半の手順が以前と同じですので、今回は、そんなに長くありません。今回は、両方とも、実機の上で作業したので、長いのは、コンパイル時間ですね。

1. Raspberry PiでのKernel Package作成
Baseは、Raspbianを使用しました。これは、Debianベースですので、Kernelのパッケージ作成手順もDebianと同じです。まず、以前と同じ手順で、カーネルのソースを入手します。
Raspberry Pi用カーネルのgithubのページに行き、右下の方にあるDownload ZIPボタンを押下します。すると、linux-rpi-3.10.y.zipというファイル名のカーネルソースが
ダウンロードできます。適当な場所に展開します。私は、/usr/local/srcの下に展開しました。

root@raspberrypi:/usr/local/src $  gunzip linux-rpi-3.10.y.zip

   私がダウンロードした時点で、3.10.33をベースにしたRPi用カーネルでした。次に、LTSIのパッチをhttp://ltsi.linuxfoundation.org/からダウンロードします。私がダウンロードした時点で、patch-3.10.31-LTSI.gzです。先にダウンロードしたカーネルにこのパッチをあてます。

root@raspberrypi:/usr/local/src $ cd  /usr/local/src/linux-rpi-3.10.y
root@raspberrypi:/usr/local/src/linux-rpi-3.10.y  $ gunzip < /usr/local/src/patch-3.10.31-ltsi.gz | patch -p1

   ソースバージョンが、3.10.31と3.10.33と異なるため、Makefile.rejが作成されましたが、修正点は、Versionの部分だけなので、自分でMakefileを編集しておきます。

SUBLEVEL = 33
EXTRAVERSION = -ltsi

   次に.configファイルを用意します。これは、現在実行中のものからいただきます。

root@raspberrypi:/usr/local/src/linux-rpi-3.10.y  $ cat /proc/config.gz | gunzip > .config
root@raspberrypi:/usr/local/src/linux-rpi-3.10.y  $ make oldconfig

   make oldconfigで聞かれる質問は、実行中のバージョンに無い新しいパラメータですので、まずはデフォルトで設定しておきます。

他に変更したいパラメータがあれば、

root@raspberrypi:/usr/local/src/linux-rpi-3.10.y $ make menuconfig

で設定します。

 次から、カーネルパッケージ作成に入ります。 まず、パッケージ作成に必要な道具を準備します。

root@raspberrypi:/usr/local/src $ apt-get install build-essential kernel-package libncurses5-dev bc

  作成開始です。

root@raspberrypi:/usr/local/src/linux-rpi-3.10.y  $ make-kpkg clean
root@raspberrypi:/usr/local/src/linux-rpi-3.10.y  $ make-kpkg --revision 1.0 --initrd kernel-image kernel-headers kernel-source

  さあ、珈琲を飲んで待ちましょうといきたいところですが、多分、もっとかかります。一寝入りしましょう。もし、バックグラウンドで、実行させたい場合は、

root@raspberrypi:/usr/local/src/linux-rpi-3.10.y  $ nohup make-kpkg --revision 1.0 --initrd kernel-image kernel-headers  kernel-source 2>&1 > /tmp/log.txt &

  とすれば、ログアウトしても、実行してくれるはずです。朝、起きたら、以下のパッケージが/usr/local/srcの下に出来ているはずです。

root@raspberrypi:/usr/local/src $ ls
linux-headers-3.10.33-ltsi_1.0_armhf.deb
linux-rpi-3.10.y.tgz
linux-image-3.10.33-ltsi_1.0_armhf.deb
linux-source-3.10.33-ltsi_1.0_all.deb
linux-rpi-3.10.y
patch-3.10.31-ltsi.gz

(ここで、linux-rpi-3.10.y.tgzとなっているのは、なぜか、zipファイルが、raspberry-pi上で、うまく展開できなかったので、別マシンで展開して、tgz化して、raspberry-piに持ってきたのです。皆さんのRaspbery-piでは、うまくいくことを祈ります)

   早速、インストールしてみます。

root@raspberrypi:/usr/local/src $  dpkg -i *.deb

たくさん、メッセージが出ますが、たぶん、問題は無いはずです。/bootの下に、カーネルのブートイメージができますが、名前を変える必要があります。

root@raspberrypi:/boot# ls -l
合計 24160
-rwxr-xr-x 1 root root   18974   9月 26 06:57  LICENSE.oracle
-rwxr-xr-x 1 root root 1433275  3月  22 09:38 System.map-3.10.33-ltsi
-rwxr-xr-x 1 root root   17824   1月  8 04:50 bootcode.bin
-rwxr-xr-x 1 root root     142   1月  8 06:13 cmdline.txt
-rwxr-xr-x 1 root root   87181   3月 22 08:41  config-3.10.33-ltsi
-rwxr-xr-x 1 root root    1237   2月  3 23:21 config.txt
-rwxr-xr-x 1 root root    5783   1月  8 04:50 fixup.dat
-rwxr-xr-x 1 root root    2068   1月  8 04:50 fixup_cd.dat
-rwxr-xr-x 1 root root    8829   1月  8 04:50 fixup_x.dat
-rwxr-xr-x 1 root root 3700976  3月 22 11:16 initrd.img-3.10.33-ltsi
-rwxr-xr-x 1 root root     137   1月  8 08:34 issue.txt
-rwxr-xr-x 1 root root 9789752  1月  8 04:50 kernel_emergency.img
-rwxr-xr-x 1 root root 2514136  1月  8 04:50 start.elf
-rwxr-xr-x 1 root root  480216   1月  8 04:50 start_cd.elf
-rwxr-xr-x 1 root root 3495816  1月  8 04:50 start_x.elf
-rwxr-xr-x 1 root root 3112072  3月 22 15:58 vmlinuz-3.10.33-ltsi
root@raspberrypi:/boot# mv  kernel.img kernel.org
root@raspberrypi:/boot# mv  vmlinuz-3.10.33-ltsi kernel.img

  念のため、syncして、リブートします。

root@raspberrypi:/boot# sync
root@raspberrypi:/boot# reboot

  リブート後、接続して、確認します。

root@raspberrypi:/boot# uname -a
Linux raspberrypi 3.10.33-ltsi #3  PREEMPT Sat Mar 22 08:49:28 JST 2014 armv6l
GNU/Linux

完成です。このパッケージをhttp://ltsi.linuxfoundation.org/downloadsに掲載していますので、必要な方は、持っていってください。ただし、保証は、しませんよ。

2. MinnowBoardでのKernel Package作成
MinnowBoardについてくるSDカードに入っているDistributionは、Angstromです。以前にも告白しましたが、私はAngstromにも、Yoctoにも詳しくないので、Debianを使用することにしました。Debian on MinnowBoardは、次のMinnowboard:Debian Bare Minimum Bootstrappingの手順に従って、USBスティック上に作成しました。これは、MinimumといってもDebianですので、Kernelのパッケージ作成手順もDebianと同じです。

   まず、以前と同じ手順で、カーネルのソースを入手します。Kernel.orgから、ltsiと同じバージョンのソースを入手します。ここでは、linux-3.10.31.tgzをダウンロードしました。私の場合、Kernel Packageのbuildに8Gの領域が必要でした。従って、Debian本体以外にbuild用のUSBスティックを用意しました。build用のUSBスティックを適当な場所にマウントします。私は、/mntにマウントし、先ほどのカーネルソースを展開しました。

root@DebianMinnow:/ $ mount  /dev/sdb1 /mnt
root@DebianMinnow:/ $ cd /mnt
root@DebianMinnow:/mnt $ tar xvzf  /tmp/linux-3.10.31.tgz

   次に、LTSIのパッチをhttp://ltsi.linuxfoundation.org/からダウンロードします。私がダウンロードした時点で、patch-3.10.31-LTSI.gzです。先にダウンロードしたカーネルにこのパッチをあてます。

root@DebianMinnow:/mnt $ gunzip <  /tmp/patch-3.10.31-ltsi.gz | patch -p1

   次に.configファイルを用意します。現在実行中のものからいただきます。

root@DebianMinnow:/mnt $ cp  /boot/config-3.13-1-686-pae > .config
root@DebianMinnow:/mnt $ make  oldconfig

   make oldconfigで聞かれる質問は、実行中のバージョンに無かった、新しいパラメータですので、まずはデフォルトで設定しておきます。他に変更したいパラメータがあれば、

root@DebianMinnow:/mnt $ make  menuconfig

で設定します。

 次から、カーネルパッケージ作成に入ります。パッケージ作成に必要な道具を準備します。

root@DebianMinnow:/mnt $ apt-get  install build-essential kernel-package libncurses5-dev bc

  作成開始です。

root@DebianMinnow:/mnt $ make-kpkg  clean
root@DebianMinnow:/mnt $ make-kpkg  --revision 1.0 --initrd kernel-image kernel-headers kernel-source

  さあ、珈琲を飲んで待ちましょうといきたいところですが、多分、もっとかかります。一寝入りしましょう。ただ、Raspberry Piよりは、速いと思います。
もし、バックグラウンドで、実行させたい場合は、

root@DebianMinnow:/mnt $ nohup make-kpkg --revision 1.0 --initrd kernel-image kernel-headers kernel-source 2>&1 > /tmp/log.txt &

  とすれば、ログアウトしても、実行してくれるはずです。朝、起きたら、以下のパッケージが/mntの下に出来ているはずです。

root@DebianMinnow:/mnt $ ls
linux-3.10.33
linux-headers-3.10.33-ltsi_1.0_i386.deb
linux-image-3.10.33-ltsi_1.0_i386.deb
linux-source-3.10.33-ltsi_1.0_all.deb
patch-3.10.31-ltsi.gz

   早速、インストールしてみます。

root@DebianMinnow:/mnt $ dpkg -i  *.deb

たくさん、メッセージが出ますが、たぶん、問題は無いはずです。/bootの下に、カーネルのブートイメージができます。

root@DebianMinnow:/boot# ls -l
合計 33180
-rw-r--r-- 1 root root  1764023   3月 23 22:00  System.map-3.10.31-ltsi
-rw-r--r-- 1 root root  1842504   3月  6 01:27 System.map-3.13-1-686-pae
-rw-r--r-- 1 root root   149556   3月 23 17:07  config-3.10.31-ltsi
-rw-r--r-- 1 root root   155052   3月  6 01:27 config-3.13-1-686-pae
drwxr-xr-x 2 root root     4096   3月 18 18:15  grub
-rw-r--r-- 1 root root 12166605  1月  1  2001 initrd.img-3.10.31-ltsi
-rw-r--r-- 1 root root 12456051  1月  1  2001 initrd.img-3.13-1-686-pae
-rw-r--r-- 1 root root  2631440   3月 23 22:00  vmlinuz-3.10.31-ltsi
 -rw-r--r-- 1 root root  2735776   3月  6 01:26 vmlinuz-3.13-1-686-pae

  /下にあるvmlinuz(/boot/vmlinuz-3.13-1-686-paeへのシンボリックリンク)をバックアップし、新しいvmlinuz(/boot/vmlinuz-3.10.31-ltsiへのシンボリックリンク)を作成します。

root@DebianMinnow:/# mv vmlinuz  vmlinuz.org
root@DebianMinnow:/# ln -s boot/vmlinuz-3.10.31-ltsi  vmlinuz
root@DebianMinnow:/# ls -l vmlinuz*
lrwxrwxrwx 1 root root 25  1月  1  2001 vmlinuz -> boot/vmlinuz-3.10.31-ltsi
lrwxrwxrwx 1 root root 27  3月 18 17:56 vmlinuz.org -> boot/vmlinuz-3.13-1-686-pae

このまま、リブートしても新しいOSが起動されるはずですが、古いOSと選択できるようにgrub.confを書き換えます。

root@DebianMinnow:/# mount /dev/sda1  /efi
root@DebianMinnow:/# cd  /efi/EFI/BOOT

この下にあるgrub.confを編集します。関係ある部分だけ示します。

#For MBR
menuentry "Debian 7.0 i686 (32-bit, EFI/MBR)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos2)'
linux /vmlinuz.org root=/dev/sda2 ro rootwait console=ttyPCH0,115200 console=tty0 vmalloc=256MB snd-hda-intel.enable_msi=0
initrd /initrd.img.org }

とある部分を、コピーして、vmlinuz.org用のエントリーを追加します。

#For MBR(LTSI)
menuentry "Debian 7.0 i686-ltsi  (32-bit, EFI/MBR)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos2)'
linux /vmlinuz root=/dev/sda2 ro  rootwait console=ttyPCH0,115200 console=tty0 vmalloc=256MB  snd-hda-intel.enable_msi=0
initrd /initrd.img
}
#For MBR
menuentry "Debian 7.0 i686  (32-bit, EFI/MBR)" {
insmod part_msdos
insmod ext2
set root='(hd0,msdos2)'
linux /vmlinuz.org root=/dev/sda2 ro  rootwait console=ttyPCH0,115200 console=tty0 vmalloc=256MB  snd-hda-intel.enable_msi=0
initrd /initrd.img.org
 }

 編集が終わったら、保存し、念のため、syncして、リブートします。

root@DebianMinnow:/# umount  /dev/sda1
root@DebianMinnow:/# sync
root@DebianMinnow:/# reboot

  リブート後、接続して、確認します。

root@DebianMinnow:/boot# uname -a
Linux DebianMinnow 3.10.31-ltsi #4  SMP Sun Mar 23 17:18:20 JST 2014 i686 GNU/Linux

これで、完成です。このパッケージをhttp://ltsi.linuxfoundation.org/downloadsに掲載していますので、必要な方は、持っていってください。ただし、保証は、しませんよ。

3. クロス環境で実行したい方向け
今回は、実機上でビルドしましたが、時間、ストレージ容量の関係でクロス環境で実行したい場合もあると思います。MinnowBoardの場合は、簡単です。実機器が、Atomのため、クロス環境と言っても、そのまま、ビルド、パッケージ化を行えば良いはずです。Raspberry Piの場合は、前回の文献のようにクロス環境を構築し、make-kpkg関係のオプションを設定すれば良いと思いますが、実際にやっていないため、具体的な手順は書けません。挑戦してみてください。

Linux Foundationメンバーシップ

30人のカーネル開発者

人気コンテンツ

  1. Today's Linux 2018/10/09 2018年 10月 08日
  2. Today's Linux 2018/10/10 2018年 10月 09日
  3. Today's Linux 2018/10/12 2018年 10月 11日
  4. Today's Linux 2018/10/17 2018年 10月 16日
  5. Today's Linux 2018/10/18 2018年 10月 17日

Linux Foundationについて

Linux Foundation はLinux の普及,保護,標準化を進めるためにオープンソース コミュニティに資源とサービスを提供しています

 

The Linux Foundation Japan

サイトマップ

問い合わせ先

サイトに関するお問い合わせはこちらまで

Linux Foundation Japan

Linux Foundation

Linux Training

提案、要望

Linux.com JAPANでは広く皆様の提案、要望、投稿を受け付ける予定です。

乞うご期待!