nkjmkzk.net

powered by Kazuki Nakajima

Archive for the ‘kernel’ tag

ルートファイルシステムをBtrfsにする方法(Oracle Linux 5.6)

Fedora 16でデフォルトファイルシステムとなることがアナウンスされ、Btrfsはいよいよ本格的に使われはじめることと思います。今回は最新のBtrfsソースコードを用いてLinuxのルートファイルシステムをBtrfsにしてしまう手順を紹介します。
OSは仮想マシンのOracle Linux 5.6 x86_64をベースにして進めていきます。

まずはBtrfsのソースコードを取ってくる必要があります。最新のソースコードはgitで管理されており、gitコマンドでダウンロードする必要がありますのでまずはgitを使えるようにします。

EPELレポジトリを利用可能にし、yumでgitをインストールします。

[root@~]# cd /var/opt
[root@~]# wget http://download.fedoraproject.org/pub/epel/5/i386/epel-release-5-4.noarch.rpm
[root@~]# rpm -ivh epel-release-5-4.noarch.rpm
[root@~]# yum install -y git

git cloneでBtrfsの最新ソースコードをダウンロードします。これによってLinux Kernelを含むコード全体がダウンロードされます。

[root@~]# cd /var/opt
[root@~]# git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-unstable.git

作成されたディレクトリに移動し、現在のKernel設定を継承するために/bootディレクトリからKernelビルド設定ファイルを.configとしてカレントディレクトリ配下にコピーします。

[root@~]# cd btrfs-unstable/
[root@~]# cp /boot/config-2.6.32-100.26.2.el5 ./.config

コピーした設定ファイルを元に新しい設定ファイルを作成します。

[root@~]# make oldconfig

このあと古い設定ファイルと新しいKernelとの機能差の部分について対話的に設定することを求められますが、今回はEnterキーを押し続けてデフォルトを受け入れます。ビルドがうまくいったらその後で自分なりのコンフィグを詰めて下さい。
対話的設定が終わるとコマンドプロンプトが戻ってきます。
一点だけ今作成したKernelビルド設定ファイルを修正します。BtrfsはデフォルトではKernel Moduleとしてビルドされますが、これをKernel本体に組み込むようにします。

[root@~]# vi .config
CONFIG_BTRFS_FS=y

ではここからコンパイルを行っていきます。ちなみに-jオプションに渡す数字はコンパイルの並列度を設定します。お手持ちのCPUコア数の倍の数くらいを目安に与えてください。

[root@~]# make -j8

Kernel Moduleのインストール。

[root@~]# make modules_install

Kernelのインストール。

[root@~]# make install

これでインストールはひとまず完了です。
一度リブートしますが、起動時にgrubのメニュー画面を見れない場合は次のようにgrub.confを編集してデフォルトのKernelを新しいKernelに変更しておきます。

[root@~]# vi /etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle Linux Server (2.6.38+)
        root (hd0,0)
        kernel /vmlinuz-2.6.38+ ro root=/dev/VolGroup00/root rhgb quiet
        initrd /initrd-2.6.38+.img
title Oracle Linux Server (2.6.32-100.26.2.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-100.26.2.el5 ro root=/dev/VolGroup00/root rhgb quiet
        initrd /initrd-2.6.32-100.26.2.el5.img
title Oracle Linux Server (2.6.18-238.1.1.0.1.el5xen)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.1.1.0.1.el5xen ro root=/dev/VolGroup00/root rhgb quiet
        initrd /initrd-2.6.18-238.1.1.0.1.el5xen.img

リブートします。

[root@~]# init 6

起動したら新しいKernelで起動しているか確認します。

[root@~]# uname -r
2.6.38+

次にbtrfsの操作に必要となるツール群と、そのツール群のビルドに必要なe2fsprogs-develをインストールします。

[root@~]# yum install -y e2fsprogs-devel
[root@~]# cd /var/opt
[root@~]# git clone git://git.kernel.org/pub/scm/linux/kernel/git/mason/btrfs-progs-unstable.git
[root@~]# cd btrfs-progs-unstable/
[root@~]# make
[root@~]# make install

これでmkfs.btrfs等のツール群がインストールされました。リブートは必要ありません。

ここからBtrfsのファイルシステム作成と移行をおこなっていきます。
現在のボリュームとファイルシステムのレイアウトを確認します。

[root@~]# df -h
Filesystem                     Size  Used Avail Use% Mounted on
/dev/mapper/VolGroup00-root    20G   9.5G  8.9G  52% /
/dev/xvda1                     99M    34M   60M  37% /boot
tmpfs                          952M     0  952M   0% /dev/shm

現在ルートファイルシステムは20GByte程のLogical Volumeで構成されています。
このファイルシステムを丸ごと同容量のBtrfsにコピーすることで移行を図ります。
さしあたってBtrfs用のボリュームを追加する必要があります。今回は仮想化環境なのでdom0側で20GByteのFile VBDを作成して仮想マシンに割り当てます。

[root@dom0]# cd /OVS/running_pool/btrfs
[root@dom0]# dd if=/dev/zero of=btrfs_root.img bs=1M count=0 seek=20480
[root@dom0]# xm list
Name                                        ID   Mem VCPUs      State   Time(s)
Domain-0                                     0   564     8     r-----   2052.8
btrfs                                        1   256     4     -b----    247.1

[root@dom0]# xm block-attach btrfs file:/OVS/running_pool/btrfs/btrfs_root.img /dev/xvdc w

仮想マシンに戻り、今割り当てられたボリュームをBtrfsでフォーマットして一時的に/mntにマウントします。

[root@~]# mkfs.btrfs /dev/xvc

WARNING! - Btrfs v0.19-35-g1b444cd IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

fs created label (null) on /dev/xvdc
        nodesize 4096 leafsize 4096 sectorsize 4096 size 20.00GB
Btrfs v0.19-35-g1b444cd

[root@~]# mount -t btrfs /dev/xvdc /mnt

次にfstabを編集して/にマウントされるボリュームを現在のLogical Volumeから/dev/xvdcに変更します。

[root@~]# vi /etc/fstab
#/dev/VolGroup00/root   /               ext3    defaults        1 1
/dev/xvdc               /               btrfs   defaults        1 1
LABEL=/boot             /boot           ext3    defaults        1 2
tmpfs                   /dev/shm        tmpfs   defaults        0 0
devpts                  /dev/pts        devpts  gid=5,mode=620  0 0
sysfs                   /sys            sysfs   defaults        0 0
proc                    /proc           proc    defaults        0 0
/dev/xvdb               swap            swap    defaults        0 0

次に現在のルートファイルシステムからデータをコピーします。なお、別ボリュームの/boot、スペシャルファイルを含むディレクトリ等はコピーせず、後ほどディレクトリだけ作成します。

[root@~]# cd /
[root@~]# cp -a {bin,etc,home,lib,lib64,media,misc,opt,root,sbin,selinux,srv,tftpboot,u01,usr,var} /mnt
[root@~]# mkdir /mnt/{boot,dev,mnt,proc,sys,tmp}

次にKernelをビルドしたディレクトリに移り、今一度make installを行います。これは、変更したfstabに基づいてinitrdを再構築するためです。また、同時にgrub.confも適切に編集してくれます。

[root@~]# cd /var/opt/btrfs-unstable/
[root@~]# make install

これでリブートします。起動すると/に/dev/xvdcがマウントされ、Btrfsがルートファイルシステムとなります。

[root@~]# mount
/dev/xvdc on / type btrfs (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
/dev/xvda1 on /boot type ext3 (rw)
tmpfs on /dev/shm type tmpfs (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
sunrpc on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw)

without comments

Written by 中嶋 一樹

6月 21st, 2011 at 9:14 am

Posted in Uncategorized

Tagged with ,

噂のLinux Kernel 3.0.0(インストール手順付き)

Linux Kernelがとうとう2.6.xから3.0.x台になります。

といっても構造的な変化があるわけではなく、20周年記念、とかそういう理由だそうで2.4から2.6になったときよりも変更点は少ないと見ていいでしょう。

今日現在ですでに3.0.0-rc3がリリースされています。抜本的な変化はないものの、新しいKernelはやっぱり魅力的です。僕が個人的に特に気にしているのは次の2点。

  • Xen
  • Btrfs

XenについてはXen HypervisorがKernelに組み込まれた、という話ではありません。Xen Hypervisor上でLinuxを準仮想化のdom0/domUとして稼働させるためのコードがすべてKernelに取り込まれたということです。一般ユーザにはそれほど直接的なインパクトはないのかなと思いますが、とりわけDeveloperにとっては大きな成果だと思いますし、ひいてはそれがこれからのXen関連開発の勢いにつながってくるはずです。Linuxはこれまでも、そしてこれからもXen上での準仮想化モードをサポートされることになるでしょう。準仮想化はドライバまわりだけでなく、古いマシンのサポートやTrancendent Memoryといった独自の拡張を可能にするモードとしてコアデベロッパーは引き続き注力していくという噂です。

BtrfsについてはすでにFedora 16がデフォルトファイルシステムとして採用することをアナウンスしており、つまりはRHELのデフォルトファイルシステムも将来的にBtrfsになる可能性が極めて高いということを示唆しています。Btrfsはコンセプト的にはZFSに似ており、ボリュームマネージャとファイルシステムが一体になった構造です。動的なボリュームの追加やスナップショット等が可能になっており、多くの環境では従来のmdやLVMが不要になるでしょう。

こういうものは我先に試してみたいですよね。ということでOracle Linux 5.6にKernel 3.0.0-rc3をインストールする方法を記載しておきます。

まずはKernel 3.0.0-rc3のソースをダウンロードしてきます。http://www.kernel.orgからFull Sourceを選択すればtar.bz2でダウンロードできます。ダウンロードしたら解凍/展開し、展開したディレクトリに移動します。

[root@~]# cd /var/opt
[root@~]# wget http://www.kernel.org/pub/linux/kernel/v3.0/testing/linux-3.0-rc3.tar.bz2
[root@~]# tar xvfj linux-3.0-rc3.tar.bz2
[root@~]# cd linux-3.0-rc3

現在のカーネルビルド設定を引き継ぐために/bootディレクトリから設定ファイルを.configとしてカレントディレクトリにコピーします。Oracle Linux 5.6の場合はUEKのKernel設定ファイルが存在しますのでそれを使用します。なるべくバージョンが近い方が差異が少ないので。といっても結構ありますが。

[root@~]# cp /boot/config-2.6.32-100.26.2.el5 ./.config

コピーした設定ファイルを用いて新しい設定ファイルを作成します。

[root@~]# make oldconfig

このあと古い設定ファイルと新しいKernelとの機能差の部分について対話的に設定することを求められます。一つずつ見ていると3日くらいかかりますのでひたすらEnterキーを押し続けてデフォルトをあるがままに受け入れます。ビルドがうまくいったらその後で自分なりのコンフィグを詰めていくのが良いでしょう。
対話的設定が終わるとコマンドプロンプトが戻ってきます。

ここからコンパイルを行っていきます。ちなみに-jオプションに渡す数字はコンパイルの並列度を設定します。お手持ちのCPUコア数の倍の数くらいを目安に与えてください。

[root@~]# make -j8

Kernel Moduleのインストール。

[root@~]# make modules_install

Kernelのインストール。

[root@~]# make install

これで完了です。
/bootディレクトリを見てみると新しいKernelがインストールされています。
/lib/modulesには新しいKernel Moduleがインストールされています。
そして/etc/grub.confを見ると新しいカーネル用のエントリーが自動的に追加されています。親切。
ブート時にgrubのメニュー画面を見れない人は今の内に/etc/grub.confのdefault=を今インストールしたカーネルのエントリに合わせておきます。
ちなみに下記エントリは上から、Linux 3.0.0-rc3 Kernel、Unbreakable Enterprise Kernel(UEK)、RHEL互換Oracle Linux PV Kernelです。Linux 3.0.0-rc3とUEKはPvopsなので準仮想化でも完全仮想化でも非仮想化でもこのカーネルで起動できます。

[root@~]# vi /etc/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Oracle Linux Server (3.0.0-rc3)
        root (hd0,0)
        kernel /vmlinuz-3.0.0-rc3 ro root=/dev/VolGroup00/root rhgb quiet
        initrd /initrd-3.0.0-rc3.img
title Oracle Linux Server (2.6.32-100.26.2.el5)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-100.26.2.el5 ro root=/dev/VolGroup00/root rhgb quiet
        initrd /initrd-2.6.32-100.26.2.el5.img
title Oracle Linux Server (2.6.18-238.el5xen)
        root (hd0,0)
        kernel /vmlinuz-2.6.18-238.el5xen ro root=/dev/VolGroup00/root rhgb quiet
        initrd /initrd-2.6.18-238.el5xen.img

リブートすれば新しいKernelで起動してきます。

[root@~]# uname -r
3.0.0-rc3

without comments

Written by 中嶋 一樹

6月 20th, 2011 at 2:01 pm

Posted in Uncategorized

Tagged with

マルチプロセッサー環境でKernelをビルドする

最近Linuxカーネルに傾倒しています。
いろいろ調べているうちにカーネルを何通りかでビルドしてテストすることになりました。カーネルのビルドは一度やってしまえばなんてことはない作業なのですが、調べていると何かと知らなかったことがわんさか出てきます。今回は手短に最近のマルチプロセッサ環境でのカーネルビルドHow Toをまとめてみます。

・カーネルソースをダウンロードする。
当然kernel.orgにあるわけですが、我々日本人は国際回線の帯域幅節約に貢献すべく日本国内のミラーサイトから手に入れるのがよいでしょう。僕はいつも理研さんに御世話になっています。
理研のミラーサイト

・展開

# tar xvfj linux-2.6.22.tar.bz2
# cd linux-2.6.22

・設定
ここはカーネルのバイナリを自分の環境に最適化させる上でもっとも重要な手順です。とはいえここに懲りだすと日が暮れるので今回はデフォルト設定を適用します。
カーネルビルドの設定は展開したトップディレクトリに.configとして用意します。当然自分でガリガリ書くのではなく、用意されている便利なツールを利用します。デフォルト設定の設定ファイル(.config)は以下のようにして作成します。

# make defconfig

ちなみにこの設定はLinusのメイン開発マシンとほぼ同じ設定だそうです。ほんまかな。

・ビルド
さて、カーネルをコンパイルしていきます。通常は以下のようにmakeを実行するだけでOKです。

# make

ここで実はなかなかに便利、というかマルチプロセッサー・オーナーにはもはや必須なオプションがあります。

# make -j2

この-jオプションはコンパイルのスレッド数を指定できるもので、例えばCore 2 Quadが搭載されているマシンであれば、-j4と指定するとマッハでコンパイルできるのではないかと思います。

実際にCore 2 Duoのプロセッサーが搭載されているThinkpad T60でビルド時間を計測してみました。

[-jオプションなし]

real 5m22.791s
user 4m56.123s
sys 0m23.153s

[-j2]

real 3m24.712s
user 5m0.723s
sys 0m24.834s

[-j4]

real 3m20.628s
user 5m3.811s
sys 0m25.606s

-jオプション有と無しでは1.7倍程度の差が出ました。もう-jオプション無しではビルドできません。ちなみにとある書物には「プロセッサ数 x 2」の値を-jオプションに与えるのがよいとされていましたが今回は-j2と-j4ではそれほど差異はありませんでした。

・インストール
あとは以下のようにすれば新しいカーネルのインストールは完了です。

# make modules_install
# make install

上記手順でインストールを行うにはmkinitrdが必要です。最近のディストリビューションにはほぼインストールされていると思います。上記コマンドを実行するとビルドしたカーネルを/bootにコピーし、grubのmenu.lstの追記やinitrdの作成も同時に行ってくれます。何て便利な世の中なのでしょうか。ただ、menu.lstの設定でデフォルトのカーネルにはなっていないと思いますので、menu.lstの「default」の値を編集するか、起動時にメニュー画面で今作成したカーネルを指定して下さい。

without comments

Written by 中嶋 一樹

12月 6th, 2008 at 7:04 pm

Posted in Uncategorized

Tagged with ,