2014年1月28日火曜日

OL6.5 で Btrfs インストールとフォーマット。

ふと Btrfs を使いだそうと思いました。
そこで、Oracle Linux 6.5(64bit)にインストールしてみます。
[root@ovnfs3 ~]# cat /etc/oracle-release
Oracle Linux Server release 6.5
[root@ovnfs3 ~]# uname -r
3.8.13-16.2.1.el6uek.x86_64

今回、btrfs は OL6.5 のインストールメディアに同梱されている RPM を使用します。
今回は、ISOイメージ(DVDと書いていますが) から Yum でインストールします。
YUM リポジトリは、すでに設定済みです。
[root@ovnfs3 ~]# mount /dev/cdrom /media/
mount: ブロックデバイス /dev/sr0 は書き込み禁止です、読込み専用でマウントします
[root@ovnfs3 ~]# cat /etc/yum.repos.d/dvd.repo
[DVD]
name=DVD
baseurl=file:///media/Server/
gpgkey=file:///media/RPM-GPG-KEY-oracle
gpgcheck=1
enabled=1

btrfs を操作するための、btrfs-progs をインストールします。
なにか依存関係があるかもしれないと思って Yum インストールにしましたが、
今回の環境では特に依存 RPM はありませんでした・・・
[root@ovnfs3 ~]# yum install btrfs-progs
Loaded plugins: security
Setting up Install Process
Resolving Dependencies
--> Running transaction check
---> Package btrfs-progs.x86_64 0:0.20-1.5.git7854c8b.el6 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

===============================================================
 Package             Arch           Version                         Repository   Size
===============================================================
Installing:
 btrfs-progs         x86_64         0.20-1.5.git7854c8b.el6         DVD     393 k

Transaction Summary
===============================================================
Install       1 Package(s)

Total download size: 393 k
Installed size: 2.7 M
Is this ok [y/N]: y
Downloading Packages:
警告: rpmts_HdrFromFdno: ヘッダ V3 RSA/SHA256 Signature, key ID ec551f03: NOKEY
Retrieving key from file:///media/RPM-GPG-KEY-oracle
Importing GPG key 0xEC551F03:
 Userid: "Oracle OSS group (Open Source Software group) <build@oss.oracle.com>"
 From  : /media/RPM-GPG-KEY-oracle
Is this ok [y/N]: y
Running rpm_check_debug
Running Transaction Test
Transaction Test Succeeded
Running Transaction
  Installing : btrfs-progs-0.20-1.5.git7854c8b.el6.x86_64                         1/1
  Verifying  : btrfs-progs-0.20-1.5.git7854c8b.el6.x86_64                         1/1

Installed:
  btrfs-progs.x86_64 0:0.20-1.5.git7854c8b.el6

Complete!

下記のようなファイル(btrfs コマンドなど)がインストールされました。
[root@ovnfs3 ~]# rpm -ql btrfs-progs
/sbin/btrfs
/sbin/btrfs-convert
/sbin/btrfs-debug-tree
/sbin/btrfs-find-root
/sbin/btrfs-image
/sbin/btrfs-map-logical
/sbin/btrfs-show
/sbin/btrfs-show-super
/sbin/btrfs-vol
/sbin/btrfs-zero-log
/sbin/btrfsck
/sbin/btrfsctl
/sbin/btrfstune
/sbin/mkfs.btrfs
/usr/share/doc/btrfs-progs-0.20
/usr/share/doc/btrfs-progs-0.20/COPYING
/usr/share/doc/btrfs-progs-0.20/INSTALL
/usr/share/man/man8/btrfs-image.8.gz
/usr/share/man/man8/btrfs-show.8.gz
/usr/share/man/man8/btrfs.8.gz
/usr/share/man/man8/btrfsck.8.gz
/usr/share/man/man8/btrfsctl.8.gz
/usr/share/man/man8/mkfs.btrfs.8.gz

いきなりファイルシステムを作成してみます。
あえて RAID0 です。
まだ試験的ということで Warning が出ますが、ファイルシステムは作成されます。
[root@ovnfs3 ~]# mkfs.btrfs --data raid0 --metadata raid0 /dev/sdd /dev/sde

WARNING! - Btrfs v0.20-rc1 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

failed to open /dev/btrfs-control skipping device registration: No such file or directory
adding device /dev/sdc id 2
fs created label (null) on /dev/sdb
        nodesize 4096 leafsize 4096 sectorsize 4096 size 80.00GB
Btrfs v0.20-rc1

デバイスにはパーティション作成せずにファイルシステムを作成しています。
ソフトウェア RAID が構成できます。
[root@ovnfs3 ~]# fdisk -l /dev/sdb /dev/sdc

ディスク /dev/sdb: 42.9 GB, 42949672960 バイト
ヘッド 255, セクタ 63, シリンダ 5221
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000


ディスク /dev/sdc: 42.9 GB, 42949672960 バイト
ヘッド 255, セクタ 63, シリンダ 5221
Units = シリンダ数 of 16065 * 512 = 8225280 バイト
セクタサイズ (論理 / 物理): 512 バイト / 512 バイト
I/O size (minimum/optimal): 512 bytes / 512 bytes
ディスク識別子: 0x00000000

(ここから先は、いくつかファイル等を作成した後の状態ですが)
RAID0 を構成した片側のデバイス(sdb)を指定してマウントしたら、
df コマンドではそのデバイスが表示されます。
容量は 80GB(40GB + 40GB)です。
[root@ovnfs3 ~]# mount /dev/sdb /mnt
[root@ovnfs3 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  2.7G  5.5G  33% /
tmpfs           498M     0  498M   0% /dev/shm
/dev/sda1       190M   54M  126M  31% /boot
/dev/sr0        3.7G  3.7G     0 100% /media
/dev/sdb         80G  1.1M   78G   1% /mnt

もう一つのデバイス(sdc)でマウントしなおしたら、
df コマンドでも そのデバイスが 80GB あるものとして見えます。
[root@ovnfs3 ~]# umount /mnt
[root@ovnfs3 ~]# mount /dev/sdc /mnt
[root@ovnfs3 ~]# df -h
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda3       8.6G  2.7G  5.5G  33% /
tmpfs           498M     0  498M   0% /dev/shm
/dev/sda1       190M   54M  126M  31% /boot
/dev/sr0        3.7G  3.7G     0 100% /media
/dev/sdc         80G  1.1M   78G   1% /mnt

どこをどう btrfs フォーマットしたかは、下記のように探せます。
今回は設定していませんが、btrfsでは特に
ファイルシステムのラベルを付けておいた方がわかりやすそうです。
[root@ovnfs3 ~]# btrfs filesystem show --all-devices
Label: none  uuid: 3c901c4e-1bb5-44a1-9bd9-1104a679aaa9
        Total devices 2 FS bytes used 1.05MB
        devid    1 size 40.00GB used 2.03GB path /dev/sdb
        devid    2 size 40.00GB used 2.01GB path /dev/sdc

Btrfs v0.20-rc1

そして btrfs にも、専用の df 的コマンドがあります。
ただし、マウントポイントのパスを指定する必要があります。
[root@ovnfs3 ~]# btrfs filesystem df
btrfs filesystem df: too few arguments
usage: btrfs filesystem df <path>

    Show space usage information for a mount point

[root@ovnfs3 ~]# btrfs filesystem df /mnt
Data, RAID0: total=2.00GB, used=1.00MB
Data: total=8.00MB, used=0.00
System, RAID0: total=16.00MB, used=4.00KB
System: total=4.00MB, used=0.00
Metadata, RAID0: total=2.00GB, used=44.00KB
Metadata: total=8.00MB, used=0.00

ちなみに Oracle Linux 6 のドキュメントだとこのあたりです。
Oracle Linux
管理者ソリューション・ガイド for リリース6
5.2. Btrfsファイル・システムの作成
http://docs.oracle.com/cd/E39368_01/b71105/ol_create_btrfs.html

以上、Btrfs のインストール~RAID0 フォーマットでした。

2014年1月21日火曜日

Oracle VM Server をメンテナンスモードにすると・・・

Oracle VM Manager 管理下の Oracle VM Server を
メンテナンスモードにしてみました。

これから、ovs326-4 という OVS をメンテナンスモードにしてみます。
今の状態では、この OVS には VM が3台起動しています。



このサーバプールでは、DRS(Distributed Resource Scheduler) は OFF にしてあります。
ただし、ライブマイグレーションはできる状態にしてあります。



それでは、メンテナンスモードにします。



少し待つと、DRS 無効の状態でも
VM が別の OVS に自動ライブマイグレーションされていきます。



ライブマイグレーションは1台ずつ実行されていきます。



最後の1台もマイグレーションされていきます。



メンテナンスモードにするときも DRS が ON になっていないと
自動マイグレーションされないかと思っていましたが、そんなことありませんでした。


ちなみに、わざと ライブマイグレーションできない構成にした OVS を
メンテナンスモードにしようとしても、VM が停止されたりはしないようです。
VM は何事もなく Running 状態です。



「Maintenance Mode Cannot Evacuate Server」 というイベントがあがり、
OVS のアイコンは 警告なのかメンテナンスモードなのか微妙な状態になりました。



マニュアルでは、VM が停止しそうにも見えたので、念のため試してみましたが
さすがに VM は停止はされませんでした。

マニュアルは下記です。
試したのは Oracle VM Server 3.2.6 ですが・・・
Oracle VM ユーザーズ・ガイド リリース3.2.1
6.10.10 Oracle VM Serverのメンテナンス・モードへの設定
http://docs.oracle.com/cd/E40528_01/b71928/vmusg-servers-manage.html#vmusg-servers-mmode
Oracle VM Serverがメンテナンス・モードに設定されているときに、Oracle VM Serverで実行中の仮想マシンはすべて、サーバー・プール内の他のOracle VM Serverが使用可能な場合は自動的に移行され、そうでなければ停止します

以上、OVS のメンテナンスモード鑑賞でした。

2014年1月20日月曜日

Oracle VM Server 3.2.7 はじめました。


最近、Oracle VM Server 3.2.7 が e-Delivery でダウンロードできるようになりました。

Dom-0 で、UEK と Xen のバージョンを見てみました。

Oracle VM server 3.2.6
[root@ovs326-1 ~]# cat /etc/ovs-release
Oracle VM server release 3.2.6
[root@ovs326-1 ~]# uname -r
2.6.39-300.32.5.el5uek
[root@ovs326-1 ~]# rpm -q xen
xen-4.1.3-25.el5.53
[root@ovs326-1 ~]# head -n 5 /etc/ovs-info
OVS summary
release: 3.2.6
date: 201309082324
build: 729

Oracle VM server 3.2.7
[root@ovs327-1 ~]# cat /etc/ovs-release
Oracle VM server release 3.2.7
[root@ovs327-1 ~]# uname -r
2.6.39-300.32.6.el5uek
[root@ovs327-1 ~]# rpm -q xen
xen-4.1.3-25.el5.88
[root@ovs327-1 ~]# head -n 5 /etc/ovs-info
OVS summary
release: 3.2.7
date: 201312021509
build: 732

Oracle VM 的な修正では、どうしても必要なものがあったわけではないのですが、
せっかくなので 3.2.7 を使い始めようと思います。

Oracle VM What's New
https://wikis.oracle.com/display/oraclevm/Oracle+VM+What's+New#OracleVMWhat%27sNew-OracleVMServer3.2.7


以上、Oracle VM Manager もそろそろバージョンアップしてみようかと思いました。

2014年1月19日日曜日

OVM の「サーバー・プロセッサの互換性グループ」について。

今回は、Oracle VM Manager(OVMM) の
「サーバー・プロセッサの互換性グループ」 についてです。

Oracle VM Server (Xen ハイパーバイザ)のライブマイグレーション は、
異なるモデルの CPU を搭載した OVS の間で実行すると失敗することがあります。
※基本的には CPU の Family と Model がそろっている必要があるようです。

そこで、OVS を 「サーバー・プロセッサの互換性グループ」によって
搭載 CPU の種類ごとにグルーピングすることで
まちがって禁断のライブマイグレーションをしてしまうことを防止できます。
Oracle VM ユーザーズ・ガイドリリース 3.2.1
6.7 サーバー・プロセッサの互換性グループ
http://docs.oracle.com/cd/E40528_01/b71928/vmusg-svrpool-cpu-comp.html

6.7 Server Processor Compatibility Groups(英語)
http://docs.oracle.com/cd/E35328_01/E35332/html/vmusg-svrpool-cpu-comp.html

サーバー・プロセッサの互換性グループ の確認

OVMM のサーバプール ではなく、
サーバプールをまとめる「Server Pools」フォルダの Perspective で
「Server Processor Compatibility」を選択すると確認できます。



互換性グループの設定は、
サーバプール単位ではなく、OVMM 全体で管理されているようです。

OVMM が OVS を検出(Discover Servers...)したときに、
CPU ファミリー&型番(Model)ごとに自動的に互換性グループが作成されます。
そして、検出された OVS は自動的にグループに追加されます。
上の画面にもあるように、検出されたばかりの
まだどこのサーバプールに所属させていない(Unassigned Servers の) OVS も
該当する CPU の互換性グループに自動追加されます。

実際に OVS にログインして CPU 情報を見てみると、
デフォルトで作成される互換性グループ名と Family / Model が一致しています。

「Default_Intel_Family:6_Model:23」グループの4台中の2台
[root@ovs326-1 ~]# cat /proc/cpuinfo | grep -e model -e family | sort -u
cpu family      : 6
model           : 23
model name      : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz

[root@ovs326-2 ~]# cat /proc/cpuinfo | grep -e model -e family | sort -u
cpu family      : 6
model           : 23
model name      : Intel(R) Core(TM)2 Duo CPU     E8400  @ 3.00GHz

「Default_Intel_Family:6_Model:58」グループのOVS
[root@ovs326-5 ~]# cat /proc/cpuinfo | grep -e model -e family | sort -u
cpu family      : 6
model           : 58
model name      : Intel(R) Core(TM) i3-3217U CPU @ 1.80GHz

「Default_Intel_Family:6_Model:69」グループのOVS
[root@ovs326-6 ~]# cat /proc/cpuinfo | grep -e model -e family | sort -u
cpu family      : 6
model           : 69
model name      : Intel(R) Core(TM) i3-4010U CPU @ 1.70GHz

互換性グループが安全装置となるため、
デフォルトでは、OVMM で異なるモデルの CPU 同士ではライブマイグレーションできません。
たとえば下記のような理由で、ライブマイグレーション先として
OVS が選択として表示されなくなります。
Server: ovs326-5, and server: ovs326-1, have CPUs in different compatibility groups: Default_Intel_Family:6_Model:58, Default_Intel_Family:6_Model:23.


ただし、互換性グループは追加作成できます。
異なる CPU 同士でもライブマイグレーション可能なことが確認できた OVS を
新規作成した互換性グループでまとめることができます。

サーバー・プロセッサの互換性グループ の作成

互換性グループ作成での設定項目は、
グループ名(Group Name)と 説明(Description)だけです。
CPU のモデルなどの指定はしません。



そして、その互換性グループに所属させる OVS を選択します。



ちなみに、OVS が所属できる互換性グループは1つだけなので、
別のグループにOVSを所属させた場合、もとのグループからは自動的に外されます。




CPU 種類混在の互換性グループでライブマイグレーション

ためしに、CPU の異なる OVS を 同じサーバプールにまとめて、
一つの互換性グループに所属させてみました。



そうすると、OVMM でライブマイグレーションを実行できるようになります。
下画面では、VM (oel5a-vm04)を、CPU が異なる OVS(ovs326-3、ovs326-5、ovs326-6)
をまたいで ライブマイグレーション してみました。

互換性グループが異なる場合は
そもそもライブマイグレーションが開始できませんでしたが、
同じ互換性グループに含めることでライブマイグレーションを
開始できるようになりました。



ただし、上の例だと「Completed」になっていますが失敗したりもします。
CPUモデルが異なる場合は、ちゃんと検証したうえで
互換性グループの変更をしたほうがよさそうです。


他プロダクトとの違い

VMware vSphere では EVC(Enhanced vMotion Compatibility)という機能があり、
CPU の違いをハイパーバイザで吸収(VM に見せる命令セットを制限)して
ライブマイグレーション(vMotion)しやすくしているようです。
Enhanced vMotion Compatibility (EVC) processor support
http://kb.vmware.com/kb/1003212
今とのところ Oracle VM では EVC のような機能はないようです。
異機種間でのライブマイグレーションに限っては、
挑戦的に利用シーンを増やして運用性を上げるより
安全にライブマイグレーション出来るようにグループ管理したほうがよいように思えます。

以上、互換性グループの話でした。

2014年1月14日火曜日

Oracle VM Server 3.2.6 への NIC ドライバ導入(Intel NUC D34010WYK)


Haswell の Intel NUC D34010WYK に Oracle VM Server 3.2.6 をインストールしたら
残念ながら NIC のドライバが当たりませんでした。
そこで、Intel のサイトから Intel I218-V のドライバをダウンロードして
インストールしてみました。

Intel NUC Kit D34010WYK
http://ark.intel.com/ja/products/76978/

Intel I218 ファミリー (NIC)
http://www.intel.com/content/www/us/en/ethernet-controllers/ethernet-connection-i218-family.html

NIC ドライバをインストールする OVS
[root@ovs326-6 ~]# dmidecode -s baseboard-product-name
# SMBIOS implementations newer than version 2.6 are not
# fully supported by this version of dmidecode.
D34010WYK
[root@ovs326-6 ~]# cat /etc/redhat-release
Oracle VM server release 3.2.6
[root@ovs326-6 ~]# cat /etc/oracle-release
Oracle VM Server release 5.7
[root@ovs326-6 ~]# uname -a
Linux ovs326-6 2.6.39-300.32.5.el5uek #1 SMP Mon Aug 5 11:19:15 PDT 2013 x86_64 x86_64 x86_64 GNU/Linux

NIC ドライバのソースファイル
I218-V のドライバを下記からダウンロードします。
https://downloadcenter.intel.com/Detail_Desc.aspx?agr=Y&DwnldID=15817&lang=jpn
[root@ovs326-6 ~]# ls -l e1000e-2.5.4.tar.gz
-rw-r--r-- 1 root root 269997 Jan 13 08:25 e1000e-2.5.4.tar.gz

RPM ファイル

OVS には gcc、make、man もインストールします。
依存関係のある RPM も含めて Oracle Linux 5.7 x86_64(64bit)の
インストールメディアから持ってきました。
ORACLE の パブリック YUM リポジトリからも入手できます。
http://public-yum.oracle.com/repo/OracleLinux/OL5/7/base/x86_64/
cpp-4.1.2-51.el5.x86_64.rpm
gcc-4.1.2-51.el5.x86_64.rpm
glibc-2.5-65.i686.rpm
glibc-2.5-65.x86_64.rpm
glibc-common-2.5-65.x86_64.rpm
glibc-devel-2.5-65.x86_64.rpm
glibc-headers-2.5-65.x86_64.rpm
groff-1.18.1.1-11.1.x86_64.rpm
libgcc-4.1.2-51.el5.x86_64.rpm
libgomp-4.4.4-13.el5.x86_64.rpm
make-3.81-3.el5.x86_64.rpm
man-1.6d-2.el5.x86_64.rpm
nscd-2.5-65.x86_64.rpm
kernel-uek-devel と kernel-uek-headers は、
OVS 3.2.6 の UEK カーネルバージョンが一致する RPM が
インストールメディアやパブリック YUM サイトに見当たらなかったので
ソース RPM からビルドしました。
kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
kernel-uek-headers-2.6.39-300.32.5.el5uek.x86_64.rpm

0. OVS のインストール

NIC を認識しないマシンには OVS がインストールできないため、
別のマシンを利用して USB メモリにOVSをインストールしておきます。
そして、 NUC を USB メモリで OVS を起動します。
NUC のローカル SSD に別の OS が入っていなければ、
USB メモリを接続して NUC の電源を入れるだけで起動できます。

NIC ドライバ適用前の状態

Intel の Ethernet controller は認識されていますが、使用できませんでした。
[root@ovs326-6 ~]# lspci
00:00.0 Host bridge: Intel Corporation Device 0a04 (rev 09)
00:02.0 VGA compatible controller: Intel Corporation Device 0a16 (rev 09)
00:03.0 Audio device: Intel Corporation Device 0a0c (rev 09)
00:14.0 USB Controller: Intel Corporation Device 9c31 (rev 04)
00:16.0 Communication controller: Intel Corporation Device 9c3a (rev 04)
00:19.0 Ethernet controller: Intel Corporation Device 1559 (rev 04)
00:1b.0 Audio device: Intel Corporation Device 9c20 (rev 04)
00:1d.0 USB Controller: Intel Corporation Device 9c26 (rev 04)
00:1f.0 ISA bridge: Intel Corporation Device 9c43 (rev 04)
00:1f.3 SMBus: Intel Corporation Device 9c22 (rev 04)

bond0 は作成されていますが、MACアドレスは 00:00:00:00:00:00 で
eth0 は作成されていません。
ちなみに /etc/modprobe.conf で eth0 の エイリアスを e1000e にして
モジュールをロードしてもダメでした。
[root@ovs326-6 ~]# ifconfig -a
bond0     Link encap:Ethernet  HWaddr 00:00:00:00:00:00
          inet addr:192.168.4.26  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:0 errors:0 dropped:0 overruns:0 frame:0
          TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:0 (0.0 b)  TX bytes:0 (0.0 b)

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:46 errors:0 dropped:0 overruns:0 frame:0
          TX packets:46 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:6905 (6.7 KiB)  TX bytes:6905 (6.7 KiB)

1. RPM のインストール

ドライバのインストールに必要な RPM をインストールしておきます。
[root@ovs326-6 rpm]# ls
cpp-4.1.2-51.el5.x86_64.rpm
gcc-4.1.2-51.el5.x86_64.rpm
glibc-2.5-65.i686.rpm
glibc-2.5-65.x86_64.rpm
glibc-common-2.5-65.x86_64.rpm
glibc-devel-2.5-65.x86_64.rpm
glibc-headers-2.5-65.x86_64.rpm
groff-1.18.1.1-11.1.x86_64.rpm
kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
kernel-uek-headers-2.6.39-300.32.5.el5uek.x86_64.rpm
libgcc-4.1.2-51.el5.x86_64.rpm
libgomp-4.4.4-13.el5.x86_64.rpm
make-3.81-3.el5.x86_64.rpm
man-1.6d-2.el5.x86_64.rpm
nscd-2.5-65.x86_64.rpm
[root@ovs326-6 rpm]# rpm -Uvh *rpm
warning: cpp-4.1.2-51.el5.x86_64.rpm: Header V3 DSA signature: NOKEY, key ID 1e5e0159
Preparing...              #################### [100%]
   1:libgcc               #################### [  7%]
   2:glibc-common         #################### [ 13%]
   3:glibc                #################### [ 20%]
   4:cpp                  #################### [ 27%]
   5:groff                #################### [ 33%]
   6:libgomp              #################### [ 40%]
   7:kernel-uek-headers   #################### [ 47%]
   8:man                  #################### [ 53%]
   9:make                 #################### [ 60%]
  10:nscd                 #################### [ 67%]
  11:glibc-headers        #################### [ 73%]
  12:glibc-devel          #################### [ 80%]
  13:kernel-uek-devel     #################### [ 87%]
  14:glibc                #################### [ 93%]
  15:gcc                  #################### [100%]


2. ソースファイルの編集

ドライバを make install すると、エラーになってしまいました。
[root@ovs326-6 src]# make install
make -C /lib/modules/2.6.39-300.32.5.el5uek/build SUBDIRS=/root/e1000e-2.5.4/src modules
make[1]: Entering directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
  CC [M]  /root/e1000e-2.5.4/src/netdev.o
In file included from /root/e1000e-2.5.4/src/e1000.h:39,
                 from /root/e1000e-2.5.4/src/netdev.c:55:
/root/e1000e-2.5.4/src/kcompat.h:3446: error: redefinition of typedef ‘netdev_features_t’
include/linux/netdevice.h:985: error: previous declaration of ‘netdev_features_t’ was here
make[2]: *** [/root/e1000e-2.5.4/src/netdev.o] Error 1
make[1]: *** [_module_/root/e1000e-2.5.4/src] Error 2
make[1]: Leaving directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
make: *** [default] Error 2

そこで、今回は下記のようにファイルを編集してしまいました。
[root@ovs326-6 src]# cp -p /usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h ~/netdevice.h_orig
[root@ovs326-6 src]# vi /usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h

/usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h の編集内容

(編集前)
    985 typedef u32 netdev_features_t;
    986 /*
    987  *      The DEVICE structure.
    988  *      Actually, this whole structure is a big mistake.  It mixes I/O
    989  *      data with strictly "high-level" data, and it has to know about
    990  *      almost every data structure used in the INET module.
    991  *
    992  *      FIXME: cleanup struct net_device such that network protocol info
    993  *      moves out.
    994  */
(編集後)
    985 //typedef u32 netdev_features_t;
    986 /*
    987  *      The DEVICE structure.
    988  *      Actually, this whole structure is a big mistake.  It mixes I/O
    989  *      data with strictly "high-level" data, and it has to know about
    990  *      almost every data structure used in the INET module.
    991  *
    992  *      FIXME: cleanup struct net_device such that network protocol info
    993  *      moves out.
    994  */
(差分)
[root@ovs326-6 src]# diff ~/netdevice.h_orig /usr/src/kernels/2.6.39-300.32.5.el5uek/include/linux/netdevice.h
985c985
< typedef u32 netdev_features_t;
---
> //typedef u32 netdev_features_t;

3. NIC ドライバのインストール

ドライバは、ソースからインストールします。
[root@ovs326-6 ~]# tar zxf e1000e-2.5.4.tar.gz
[root@ovs326-6 ~]# cd e1000e-2.5.4/src/
[root@ovs326-6 src]# make install
make -C /lib/modules/2.6.39-300.32.5.el5uek/build SUBDIRS=/root/e1000e-2.5.4/src modules
make[1]: Entering directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
  CC [M]  /root/e1000e-2.5.4/src/netdev.o
  CC [M]  /root/e1000e-2.5.4/src/ethtool.o
  CC [M]  /root/e1000e-2.5.4/src/param.o
  CC [M]  /root/e1000e-2.5.4/src/82571.o
  CC [M]  /root/e1000e-2.5.4/src/ich8lan.o
  CC [M]  /root/e1000e-2.5.4/src/80003es2lan.o
  CC [M]  /root/e1000e-2.5.4/src/mac.o
  CC [M]  /root/e1000e-2.5.4/src/nvm.o
  CC [M]  /root/e1000e-2.5.4/src/phy.o
  CC [M]  /root/e1000e-2.5.4/src/manage.o
  CC [M]  /root/e1000e-2.5.4/src/kcompat.o
  LD [M]  /root/e1000e-2.5.4/src/e1000e.o
  Building modules, stage 2.
  MODPOST 1 modules
  CC      /root/e1000e-2.5.4/src/e1000e.mod.o
  LD [M]  /root/e1000e-2.5.4/src/e1000e.ko.unsigned
  NO SIGN [M] /root/e1000e-2.5.4/src/e1000e.ko
make[1]: Leaving directory `/usr/src/kernels/2.6.39-300.32.5.el5uek'
gzip -c ../e1000e.7 > e1000e.7.gz
# remove all old versions of the driver
find /lib/modules/2.6.39-300.32.5.el5uek -name e1000e.ko -exec rm -f {} \; || true
find /lib/modules/2.6.39-300.32.5.el5uek -name e1000e.ko.gz -exec rm -f {} \; || true
install -D -m 644 e1000e.ko /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
/sbin/depmod -a || true
install -D -m 644 e1000e.7.gz /usr/share/man/man7/e1000e.7.gz
man -c -P'cat > /dev/null' e1000e || true
Formatting page, please wait...
[root@ovs326-6 src]#

4. 設定ファイルの編集

インストールした NIC ドライバをロードする前に
モジュールのエイリアスと、インターフェースの設定ファイルを修正しておきます。

modprobe.conf の修正
(修正前)
[root@ovs326-6 ~]# cat /etc/modprobe.conf | grep e1000
alias eth0 e1000

(修正後)
[root@ovs326-6 src]# cat /etc/modprobe.conf | grep e1000
alias eth0 e1000e

/etc/sysconfig/network-scripts/ifcfg-eth0 の編集

OVS は NIC を認識しないマシンにはインストールできないので
この OVS は、別のマシンで USBメモリにインストールしていました。
その時にインストールした時に認識した NIC の名前と
MACアドレス(HWADDR=XX:XX:XX:XX:XX:XX の部分)を削除 か コメントアウトします。

Intel NUC はオンボード のネットワークポート が 1つしかないため
ifcfg-ethX で MAC アドレスを明記しなくてもなんとか使えます…
(修正前)
# Intel Corporation 82540EM Gigabit Ethernet Controller
DEVICE=eth0
BOOTPROTO=none
HWADDR=08:00:27:F3:4E:16
ONBOOT=yes
MASTER=bond0
SLAVE=yes

(修正後)
DEVICE=eth0
BOOTPROTO=none
#HWADDR=08:00:27:F3:4E:16
ONBOOT=yes
MASTER=bond0
SLAVE=yes

5. e1000e モジュールのロード

modprobe コマンドで、e1000e ドライバをロードします。
[root@ovs326-6 ~]# modprobe e1000e
[root@ovs326-6 ~]# lsmod | grep e1000
e1000e                258218  0
e1000                 164944  0

eth0 が認識されるようになります。
[root@ovs326-6 src]# ifconfig -a
bond0     Link encap:Ethernet  HWaddr EC:A8:6B:FD:6F:63
          inet addr:192.168.4.26  Bcast:192.168.4.255  Mask:255.255.255.0
          UP BROADCAST RUNNING MASTER MULTICAST  MTU:1500  Metric:1
          RX packets:184 errors:0 dropped:0 overruns:0 frame:0
          TX packets:148 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:22686 (22.1 KiB)  TX bytes:80761 (78.8 KiB)

eth0      Link encap:Ethernet  HWaddr EC:A8:6B:FD:6F:63
          UP BROADCAST RUNNING SLAVE MULTICAST  MTU:1500  Metric:1
          RX packets:184 errors:0 dropped:0 overruns:0 frame:0
          TX packets:148 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:1000
          RX bytes:22686 (22.1 KiB)  TX bytes:80761 (78.8 KiB)
          Interrupt:20 Memory:f7c00000-f7c20000

lo        Link encap:Local Loopback
          inet addr:127.0.0.1  Mask:255.0.0.0
          UP LOOPBACK RUNNING  MTU:16436  Metric:1
          RX packets:92 errors:0 dropped:0 overruns:0 frame:0
          TX packets:92 errors:0 dropped:0 overruns:0 carrier:0
          collisions:0 txqueuelen:0
          RX bytes:19928 (19.4 KiB)  TX bytes:19928 (19.4 KiB)
これで OVS がネットワークに接続できるようになります。

おまけ

OVS 3.2.6 がもともと持っている e1000e ドライバの情報
※ これでは NIC が認識しなかった。
[root@ovs326-6 ~]# modinfo e1000e | head
filename:       /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
version:        2.0.0.1-NAPI
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation, <linux.nics@intel.com>
srcversion:     4E1E5D9368E2FAE279A50EE
alias:          pci:v00008086d0000153Bsv*sd*bc*sc*i*
alias:          pci:v00008086d0000153Asv*sd*bc*sc*i*
alias:          pci:v00008086d00001503sv*sd*bc*sc*i*
alias:          pci:v00008086d00001502sv*sd*bc*sc*i*

今回インストール(アップデート)したドライバの情報
[root@ovs326-6 ~]# modinfo e1000e | head
filename:       /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
version:        2.5.4-NAPI
license:        GPL
description:    Intel(R) PRO/1000 Network Driver
author:         Intel Corporation, <linux.nics@intel.com>
srcversion:     14FC0D45EE1DAA1B5E0DBBA
alias:          pci:v00008086d000015A3sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A2sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A1sv*sd*bc*sc*i*
alias:          pci:v00008086d000015A0sv*sd*bc*sc*i*

以上、OVS への NIC ドライバのインストールでした。

2014年1月13日月曜日

UEK の RPM ビルド(失敗談 と リテイク)

前回、Oracle VM Server にインストールすべく UEK の RPM を作成しましたが、
結果が微妙であることに気づきました。
そこで、もう一度 RPM をビルドします。

前回のポストで RPM をビルドしたところ・・・
よく見るとちょっと RPM のリリース番号がおかしいので
SPEC ファイルの修正などがいるのかもしれません。
今回作成されたのは 上の RPM で、本当は下ファイル名の方が・・・
kernel-uek-devel-2.6.39-300.32.5
uek.x86_64.rpm
kernel-uek-devel-2.6.39-300.32.5
.el5uek.x86_64.rpm

微妙だったところ

RPM のリリース表記がおかしかったのですが、
実際にインストールしてみるとソースファイルへのシンボリックリンクが切れていたり
インストールしたドライバのモジュールが意図しないディレクトリに配置されたりしました。

配置されたソースファイルへのシンボリックリンクが切れている・・・
[root@ovs326-6 ~]# ls /lib/modules/2.6.39-300.32.5.el5uek/source/
ls: /lib/modules/2.6.39-300.32.5.el5uek/source/: No such file or directory ★ソース見つからない
[root@ovs326-6 ~]# cd /lib/modules/2.6.39-300.32.5.el5uek/
[root@ovs326-6 2.6.39-300.32.5.el5uek]# ls -l source build
lrwxrwxrwx 1 root root 47 Jan  7 14:48 build -> ../../../usr/src/kernels/2.6.39-300.32.5.el5uek
lrwxrwxrwx 1 root root  5 Jan  7 14:48 source -> build
[root@ovs326-6 2.6.39-300.32.5.el5uek]# ls ../../../usr/src/kernels/2.6.39-300.32.5.el5uek
ls: ../../../usr/src/kernels/2.6.39-300.32.5.el5uek: No such file or directory
[root@ovs326-6 2.6.39-300.32.5.el5uek]# ls ../../../usr/src/kernels/
2.6.39-300.32.5uek ★ディレクトリ名がよくない。
[root@ovs326-6 2.6.39-300.32.5.el5uek]# rm build ★シンボリックリンクの張り直し
rm: remove symbolic link `build'? y
[root@ovs326-6 2.6.39-300.32.5.el5uek]# ln -s ../../../usr/src/kernels/2.6.39-300.32.5uek build
[root@ovs326-6 2.6.39-300.32.5.el5uek]# ls /lib/modules/2.6.39-300.32.5.el5uek/source/
arch     firmware  ipc             kernel    Module.symvers  security    usr
block    fs        kabi_whitelist  lib       net             sound       virt
crypto   include   Kbuild          Makefile  samples         System.map
drivers  init      Kconfig         mm        scripts         tools

★リンク先がみられるようになった・・・
「make install」 でドライバをインストールしても
モジュールが意図しないところに配置されてしまいました。
※下記のように新しいモジュールはディレクトリが変・・・
[root@ovs326-6 ~]# ls -l /lib/modules/2.6.39-300.32.5*/kernel/drivers/net/e1000e/e1000e.ko
-rwxr--r-- 1 root root  390968 Aug  6 03:42 /lib/modules/2.6.39-300.32.5.el5uek/kernel/drivers/net/e1000e/e1000e.ko
-rw-r--r-- 1 root root 4673493 Jan  9 12:01 /lib/modules/2.6.39-300.32.5uek/kernel/drivers/net/e1000e/e1000e.ko
そこで、ちゃんとしたリリース表記(uname -r と一致するような)
になるように RPM をビルドしなおしました。


UEK の RPM ビルドやり直し

今回は、ビルドするマシンも UEK にしました。(今回の失敗とは関係ないですが)
[root@sv2 ~]# cat /etc/oracle-release
Oracle Linux Server release 5.8
[root@sv2 ~]# uname -a
Linux sv2 2.6.32-300.10.1.el5uek #1 SMP Wed Feb 22 17:37:40 EST 2012 x86_64 x86_64 x86_64 GNU/Linux
[root@sv2 ~]# uname -r
2.6.32-300.10.1.el5uek  ★この表記と RPM のリリース表記を合わせたい。

カーネルのビルドをしてしまうと時間がかかるため、
まず ソース RPM だけビルドしてみて、リリース表記を確認してみました。

SPEC ファイルの「dist」という定義が見当たらなかったので
仕方なく rpmbuild コマンド実行時に「--define」で直接指定したところ
RPM リリース表記は期待通りになりました。
※「警告: ホスト名を正式なものにできません」 はホスト名が名前解決できないためです。
[root@sv2 ~]# rpmbuild --help | grep define
  -D, --define='MACRO EXPR'     値 EXPR を持つ MACRO を定義します。
そして…
[root@sv2 redhat]# grep -n "define pkg_release" SPECS/kernel-uek.spec
143:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
158:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
190:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
194:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
[root@sv2 redhat]# rpmbuild -bs SPECS/kernel-uek.spec --define "dist .el5"
警告: ホスト名を正式なものにできません: sv2
書き込み完了: /usr/src/redhat/SRPMS/kernel-uek-2.6.39-300.32.5.el5uek.src.rpm

RPM をビルドしなおします。
今回は途中で rngd (手動での乱数生成)を実行する必要がありませんでした。
(UEKでビルドしたため?)
[root@sv2 redhat]# rpmbuild -ba SPECS/kernel-uek.spec --define "dist .el5"
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.7437
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ patch_command='patch -p1 -F1 -s'
+ '[' -f .shared-srctree ']'
+ '[' '!' -d kernel-2.6.39/vanilla-2.6.39 ']'
+ cd kernel-2.6.39
+ '[' -d linux-2.6.39.x86_64 ']'
+ rm -rf deleteme.x86_64
+ mv linux-2.6.39.x86_64 deleteme.x86_64
+ cp -rl vanilla-2.6.39 linux-2.6.39.x86_64
+ rm -rf deleteme.x86_64
+ cd linux-2.6.39.x86_64
(★4万2000行くらい省略。ビルドに数時間かかる。)
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5.el5uek.debug/virt
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5.el5uek.debug/virt/kvm
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5.el5uek.debug/virt/kvm/Kconfig
ファイルの処理中: kernel-uek-debug-debuginfo-2.6.39-300.32.5.el5uek
伸張ファイルの検査中: /usr/lib/rpm/check-files /var/tmp/kernel-2.6.39-300.32.5.el5uek-root
警告: ホスト名を正式なものにできません: sv2
書き込み完了: /usr/src/redhat/SRPMS/kernel-uek-2.6.39-300.32.5.el5uek.src.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-headers-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debuginfo-common-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debuginfo-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debug-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debug-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debug-debuginfo-2.6.39-300.32.5.el5uek.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.83740
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd kernel-2.6.39
+ rm -rf /var/tmp/kernel-2.6.39-300.32.5.el5uek-root
+ exit 0
[root@sv2 redhat]#

作成された RPM ファイル

期待どおりになりました・・・
[root@sv2 redhat]# pwd
/usr/src/redhat
[root@sv2 redhat]# ls -sh RPMS/x86_64/
合計 930M
 32M kernel-uek-2.6.39-300.32.5.el5uek.x86_64.rpm
 32M kernel-uek-debug-2.6.39-300.32.5.el5uek.x86_64.rpm
403M kernel-uek-debug-debuginfo-2.6.39-300.32.5.el5uek.x86_64.rpm
8.8M kernel-uek-debug-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
403M kernel-uek-debuginfo-2.6.39-300.32.5.el5uek.x86_64.rpm
 43M kernel-uek-debuginfo-common-2.6.39-300.32.5.el5uek.x86_64.rpm
8.8M kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm
1.2M kernel-uek-headers-2.6.39-300.32.5.el5uek.x86_64.rpm
[root@sv2 redhat]# ls -sh SRPMS/
合計 80M
80M kernel-uek-2.6.39-300.32.5.el5uek.src.rpm

以上、UEK の RPM 作成の失敗談とリテイクでした。

2014年1月11日土曜日

OVS3 UEK のソース RPM から kernel-uek-devel と kernel-uek-headers を作成する。

最近、Oracle VM Server 3.2.6 に NIC のドライバをインストールしようとしたところ
「make install」 するために kernel-uek-devel と kernel-uek-headers の
RPMパッケージが必要になりました。
しかし、OVS のインストールメディアやパブリック YUM サイト(public-yum.oracle.com)では
このパッケージが見つけられませんでした。

そこで、kernel-uek のソース RPM から
kernel-uek-devel と kernel-uek-headers のRPMを作成してみました。

今回は、Oracle Linux 5.8 (64bit) の環境でビルドしてみました。
[root@sv2 ~]# cat /etc/oracle-release
Oracle Linux Server release 5.8
[root@sv2 ~]# uname -a
Linux sv2 2.6.18-308.el5 #1 SMP Sat Feb 25 12:40:07 EST 2012 x86_64 x86_64 x86_64 GNU/Linux

ソース RPM のインストール

まず、ソース RPM(kernel-uek-2.6.39-300.32.5.el5uek.src.rpm)を入手します。
e-Delivery から Oracle VM Server 3.2.6 のソースファイルメディアを DL してもよいと思いますが、
容量が大きいので、下記のパブリックYUMリポジトリから DL しました。
http://public-yum.oracle.com/repo/OracleVM/OVM3/latest/x86_64/

UEK のソース RPM をインストールします。
[root@sv2 ~]# rpm -ivh kernel-uek-2.6.39-300.32.5.el5uek.src.rpm
警告: kernel-uek-2.6.39-300.32.5.el5uek.src.rpm: ヘッダ V3 DSA signature: NOKEY, key ID 1e5e0159
   1:kernel-uek             ########################################### [100%]
[root@sv2 ~]# ls /usr/src/redhat/SOURCES/
Makefile.config      config-powerpc-generic    find-provides
Module.kabi_i686     config-powerpc32-generic  genkey
Module.kabi_x86_64   config-powerpc32-smp      kabi_whitelist_i686
check-kabi           config-powerpc64          kabi_whitelist_x86_64
config-arm           config-rhel-generic       kabitool
config-debug         config-s390x              linux-2.6.39.tar.bz2
config-generic       config-sparc64-generic    merge.pl
config-i686          config-x86-generic        perf
config-ia64-generic  config-x86_64-generic
config-nodebug       extrakeys.pub
[root@sv2 ~]# ls /usr/src/redhat/SPECS/
kernel-uek.spec

RPM のビルド

rpmbuild コマンドで SPECファイルを指定して RPM をビルドします。
[root@sv2 ~]# cd /usr/src/redhat/
[root@sv2 redhat]# rpmbuild -ba SPECS/kernel-uek.spec
実行中(%prep): /bin/sh -e /var/tmp/rpm-tmp.96057
+ umask 022
+ cd /usr/src/redhat/BUILD
+ LANG=C
+ export LANG
+ unset DISPLAY
+ patch_command='patch -p1 -F1 -s'
+ '[' -f .shared-srctree ']'
+ '[' '!' -d kernel-2.6.39/vanilla-2.6.39 ']'
+ '[' -d kernel-2.6.39/vanilla-2.6.39 ']'
+ rm -f pax_global_header
+ [[ ! -z '' ]]
+ cd /usr/src/redhat/BUILD
+ rm -rf kernel-2.6.39
+ /bin/mkdir -p kernel-2.6.39
+ cd kernel-2.6.39
+ /usr/bin/bzip2 -dc /usr/src/redhat/SOURCES/linux-2.6.39.tar.bz2
+ tar -xf -
(省略)

ビルド処理の途中で、PGP鍵生成でエントロピーが足らないようなメッセージがでて
処理が止まります。(ビルド環境が VM のせいかもしれません)
+ cp /usr/src/redhat/SOURCES/extrakeys.pub .
+ cat
###
### Now generating a PGP key pair to be used for signing modules.
###
### If this takes a long time, you might wish to run rngd in the background to
### keep the supply of entropy topped up.  It needs to be run as root, and
### should use a hardware random number generator if one is available, eg:
###
###     rngd -r /dev/hwrandom
###
### If one isn't available, the pseudo-random number generator can be used:
###
###     rngd -r /dev/urandom
###
+ gpg --homedir . --batch --gen-key /usr/src/redhat/SOURCES/genkey
gpg: WARNING: unsafe permissions on homedir `.'
gpg: keyring `./secring.gpg' created
gpg: keyring `./pubring.gpg' created
+++++++++++++++.++++++++++++++++++++.+++++++++++++++.++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++>+++++.+++++>+++++....<+++++...............<.+++++...>+++++.............................................................................................................................................................................................................+++++
Not enough random bytes available.  Please do some other work to give
the OS a chance to collect more entropy! (Need 280 more bytes)

上記のようにビルドがとまったら、別のターミナル(SSHのセッションなど)から
下記の乱数生成コマンドを実行すると、ビルド処理が進みます。
[root@sv2 ~]# rngd -r /dev/urandom

4万2000行くらい出力され、ビルド完了します。
ここまで数時間(2VCPUのVMでも5時間以上・・・)かかります。
(省略)
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5uek.debug/usr/Makefile
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5uek.debug/virt
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5uek.debug/virt/kvm
警告: ファイルが2回表記されています: /usr/src/kernels/2.6.39-300.32.5uek.debug/virt/kvm/Kconfig
ファイルの処理中: kernel-uek-debug-debuginfo-2.6.39-300.32.5uek
伸張ファイルの検査中: /usr/lib/rpm/check-files /var/tmp/kernel-2.6.39-300.32.5uek-root
警告: ホスト名を正式なものにできません: sv2
書き込み完了: /usr/src/redhat/SRPMS/kernel-uek-2.6.39-300.32.5uek.src.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-headers-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debuginfo-common-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-devel-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debuginfo-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debug-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debug-devel-2.6.39-300.32.5uek.x86_64.rpm
書き込み完了: /usr/src/redhat/RPMS/x86_64/kernel-uek-debug-debuginfo-2.6.39-300.32.5uek.x86_64.rpm
実行中(%clean): /bin/sh -e /var/tmp/rpm-tmp.22326
+ umask 022
+ cd /usr/src/redhat/BUILD
+ cd kernel-2.6.39
+ rm -rf /var/tmp/kernel-2.6.39-300.32.5uek-root
+ exit 0
[root@sv2 redhat]# 

ビルドで作成されたRPMファイルの確認。

kernel-uek のソース RPM に同梱されている SPECファイルで RPM を作成すると、
kernel-uek-~ のRPM が一式まとめて
(kernel-uek-devel と kernel-uek-headers も)作成されます。
[root@sv2 redhat]# pwd
/usr/src/redhat
[root@sv2 redhat]# ls -l RPMS/
合計 8
drwxr-xr-x 2 root root 4096  2月 24  2012 noarch
drwxr-xr-x 2 root root 4096  1月  7 03:32 x86_64
[root@sv2 redhat]# ls -l RPMS/x86_64/
合計 951480
-rw-r--r-- 1 root root  33143636  1月  7 02:22 kernel-uek-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root  33171772  1月  7 02:59 kernel-uek-debug-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root 421300455  1月  7 03:32 kernel-uek-debug-debuginfo-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root   9159971  1月  7 02:59 kernel-uek-debug-devel-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root 421330234  1月  7 02:55 kernel-uek-debuginfo-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root  44890858  1月  7 02:23 kernel-uek-debuginfo-common-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root   9145631  1月  7 02:23 kernel-uek-devel-2.6.39-300.32.5uek.x86_64.rpm
-rw-r--r-- 1 root root   1164167  1月  7 02:22 kernel-uek-headers-2.6.39-300.32.5uek.x86_64.rpm

ちなみに、ビルドで使用したソースファイルやSPECファイルをもとに、ソース RPM も生成されます。
[root@sv2 redhat]# ls -l SRPMS/
合計 81244
-rw-r--r-- 1 root root 83105131  1月  7 02:19 kernel-uek-2.6.39-300.32.5uek.src.rpm

カーネルのビルドには結構容量が必要です。
/usr/src/redhat ディレクトリ配下の使用容量は今回のビルドによるものなので、
8.5GBぐらいの空き容量があったほうがよさそうです。
[root@sv2 redhat]# pwd
/usr/src/redhat
[root@sv2 redhat]# df -h
Filesystem          サイズ  使用  残り 使用% マウント位置
/dev/sda3             8.5G  3.3G  4.8G  41% /
/dev/sda1             251M   27M  212M  12% /boot
tmpfs                1006M     0 1006M   0% /dev/shm
/dev/sdb1              16G  8.4G  6.7G  56% /usr/src/redhat
[root@sv2 redhat]# du -sh *
7.2G BUILD
930M RPMS
80M SOURCES
828K SPECS
80M SRPMS
16K lost+found

以上、 kernel-uek-devel と kernel-uek-headers のRPM作成でした。


【補足】 2014/01/12

よく見るとちょっと RPM のリリース番号がおかしいので
SPEC ファイルの修正などがいるのかもしれません。
今回作成されたのは 上の RPM で、本当は下ファイル名の方が・・・
kernel-uek-devel-2.6.39-300.32.5uek.x86_64.rpm
kernel-uek-devel-2.6.39-300.32.5.el5uek.x86_64.rpm

そして行儀のよい方法を模索中です。
[root@sv2 redhat]# grep -n "define pkg_release" SPECS/kernel-uek.spec
143:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
158:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
190:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
194:%define pkg_release 300.32.5%{?dist}uek%{?buildid}
[root@sv2 redhat]# rpmbuild -bs SPECS/kernel-uek.spec --define "dist .el5"
警告: ホスト名を正式なものにできません: sv2
書き込み完了: /usr/src/redhat/SRPMS/kernel-uek-2.6.39-300.32.5.el5uek.src.rpm

こんなシェルもありましたが…
[root@sv2 redhat]# /usr/lib/rpm/redhat/dist.sh
.el5[root@sv2 redhat]#
[root@sv2 redhat]# /usr/lib/rpm/redhat/dist.sh --help
Usage: /usr/lib/rpm/redhat/dist.sh [OPTIONS]
 Default mode is --dist. Possible options:
 --el           for RHEL version (if RHEL)
 --fc           for Fedora version (if Fedora)
 --rhl          for RHL version (if RHL)
 --dist         for distribution tag
 --distnum      for distribution number (major)
 --disttype     for distribution type
[root@sv2 redhat]# rpmbuild -bs SPECS/kernel-uek.spec --define "dist `/usr/lib/rpm/redhat/dist.sh`"
警告: ホスト名を正式なものにできません: sv2
書き込み完了: /usr/src/redhat/SRPMS/kernel-uek-2.6.39-300.32.5.el5uek.src.rpm

ちなみに、「警告: ホスト名を正式なものにできません:」は、
この Linux のホスト名が名前解決できていないから警告が出ています。

ビルドやり直しました。2014/01/13



2014年1月10日金曜日

NIC 認識できないマシン への Oracle VM Server 3.x インストール

Oracle VM Server 3.2.6(OVS)は、
NIC がないマシンにインストールしようとすると途中でエラーになってします。

しかし、何とか OVS が非サポートのマシン(新しいHW や、自作PCなど)で
OVS を使いたいケースもあると思います。

たとえば、下記のような場合にエラーになります。

  • インストール対象マシンに NIC がない。(NIC接続不良など)
  • OVS が対応していない。(NICのドライバを持っていない)


通常、インストール処理を開始する画面(下記)までに
IPアドレス等のネットワーク設定画面が表示されます。
しかし、NIC が利用できない場合は表示されません。



NIC が認識できない場合は、
インストール処理が開始された後に下記のようなエラー画面が出ます。



「OK」 をクリックしても下記のようなメッセージが表示されるだけで、
OVS が起動できるようにはなりません。
エンタープライズ向けなハイパーバイザなので
フェイルセーフな発想なのではないかと思います…



そのため、
NIC 認識されないマシンに何とかインストールして
後で NIC ドライバをインストールするにはちょっと工夫が必要です。

このような場合、私は下記のような流れで後からドライバを導入しています。

OVS を NIC ドライバがないマシンで利用する方法

  1. まず VirtualBox の仮想マシンなどを利用して USBメモリに対して OVS を導入する。
  2. その USBメモリでブートして、NIC認識できないマシンで OVS を起動する。
  3. なんとかして OVS に NIC ドライバをインストールする。
  4. NW設定ファイルを、そのマシンの環境に修正(MACアドレス、IPアドレス)
  5. NICのドライバをロードする。


たとえば、Intel NUC D34010WYK(最近の Haswell CPU を搭載しているNUC)だと
NIC(Intel I218V)に Oracle VM Server 3.2.6 のドライバが当たらず、
この方法で対処しました。

※ちなみに、 Intel NUC DC3217IYE は OVS 3.2.6 で普通に NIC 認識しました。



以上、NIC 認識できないマシンで OVS を使用する方法でした。

2014年1月3日金曜日

Oracle Linux 6.5 の YUM リポジトリ設定のカスタム変数 $uek と $uekr3 について。

Oracle Linux 6.5 からは、UEK R3 が同梱されています。
OL 6.5 64bit (x86_64) をインストールしたところ、デフォルトで
UEK R3 がインストールされ、デフォルトの起動カーネルの選択も UEK です。
[root@oel65-base-64 ~]# cat /etc/redhat-release
Red Hat Enterprise Linux Server release 6.5 (Santiago)
[root@oel65-base-64 ~]# uname -a
Linux oel65-base-64 3.8.13-16.2.1.el6uek.x86_64 #1 SMP Thu Nov 7 17:01:44 PST 2013 x86_64 x86_64 x86_64 GNU/Linux

YUM リポジトリ設定ファイルに変な変数を発見。

YUMリポジトリ設定の enabled には、通常 0(無効) か 1(有効)が入ります。
しかし、OL6.5 の /etc/yum.repos.d/public-yum-ol6.repo を見たところ、
「public_ol6_UEK_latest」という最新の UEK のリポジトリでは「$uek」、
「public_ol6_UEKR3_latest」という最新の UEK R3 のリポジトリでは「$uekr3」という
YUMの組み込み変数ではないと思われる 変数が使用されています。
[root@oel65-base-64 yum.repos.d]# cat -n /etc/yum.repos.d/public-yum-ol6.repo
(省略)
    43  [public_ol6_u5_base]
    44  name=Oracle Linux $releasever Update 5 installation media copy ($basearch)
    45  baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/5/base/$basearch/
    46  gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
    47  gpgcheck=1
    48  enabled=0
    49
    50  [public_ol6_UEK_latest]
    51  name=Latest Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch)
    52  baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEK/latest/$basearch/
    53  gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
    54  gpgcheck=1
    55  enabled=$uek
    56
    57  [public_ol6_UEKR3_latest]
    58  name=Unbreakable Enterprise Kernel Release 3 for Oracle Linux $releasever ($basearch)
    59  baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEKR3/latest/$basearch/
    60  gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
    61  gpgcheck=1
    62  enabled=$uekr3
(省略)

これはYUMの カスタム変数 として設定されています。
Redhatのサイトですが・・・
Red Hat Enterprise Linux 6 導入ガイド
6.3.3. Yum 変数の使用

https://access.redhat.com/site/documentation/ja-JP/Red_Hat_Enterprise_Linux/6/html/Deployment_Guide/sec-Using_Yum_Variables.html
カスタム変数の定義、既存の変数値の上書きを行うには、/etc/yum/vars/ ディレクトリ内に変数と同じ名前を持つファイルを作成して (「$」 記号はなし) 、1 行目に希望する値を追加します。 

この変数については、下記にも説明がありました。
Oracle Linux Release Notes for Release 6 Update 5
3.2.2 About Public Yum

http://docs.oracle.com/cd/E37670_01/E50738/html/ol_opkg_rn64.html#ol_pubyum_rn64

このカスタム変数は、下記のファイルで設定されています。
ULN に登録していない状態でのデフォルトは、
$uek が 0 (無効)で、$uekr3 が 1 (有効)でした。
UEK は、R3 のリポジトリの方だけ public-yum.oracle.com に見に行くようになっています。
また、OL を ULN に登録すると、両方とも 0 (無効)になり
公開リポジトリの方は見に行かなくなるようです。
[root@oel65-base-64 ~]# ls -l /etc/yum/vars/
合計 8
-rw-r--r--. 1 root root 2 12月 30 07:34 2013 uek
-rw-r--r--. 1 root root 2 12月 30 07:34 2013 uekr3
[root@oel65-base-64 ~]# cat /etc/yum/vars/uek
0
[root@oel65-base-64 ~]# cat /etc/yum/vars/uekr3
1

ただ、このファイルは RPM パッケージに所属していないように見えます。
[root@oel65-base-64 ~]# rpm -qf /etc/yum/vars/uek
ファイル /etc/yum/vars/uek はどのパッケージにも属していません。
[root@oel65-base-64 ~]# rpm -qf /etc/yum/vars/uekr3
ファイル /etc/yum/vars/uekr3 はどのパッケージにも属していません。

UEK の YUM カスタム変数はいつ設定されているのか

YUM リポジトリの設定をしている、public-yum-ol6.repo ファイルは
rhn-client-tools という RPM パッケージに含まれていました。
パッケージ名は uln-~ではなく rhn-~ ですが、
説明文は「Unbreakable Linux Network」になっています。
[root@oel65-base-64 ~]# rpm -qf /etc/yum.repos.d/public-yum-ol6.repo
rhn-client-tools-1.0.0.1-16.0.2.el6.noarch
[root@oel65-base-64 ~]# rpm -qi rhn-client-tools-1.0.0.1-16.0.2.el6.noarch
Name        : rhn-client-tools             Relocations: (not relocatable)
Version     : 1.0.0.1                           Vendor: Oracle America
Release     : 16.0.2.el6                    Build Date: 2013年11月26日 12時03分04秒
Install Date: 2013年12月30日 07時34分03秒      Build Host: ca-build44.us.oracle.com
Group       : System Environment/Base       Source RPM: rhn-client-tools-1.0.0.1-16.0.2.el6.src.rpm
Size        : 2821874                          License: GPLv2
Signature   : RSA/8, 2013年11月26日 12時03分10秒, Key ID 72f97b74ec551f03
URL         : https://fedorahosted.org/spacewalk
Summary     : Support programs and libraries for Unbreakable Linux Network
Description :
Unbreakable Linux Network Client Tools provides programs and libraries to allow your
system to receive software updates from Unbreakable Linux Network.

このパッケージの SPEC ファイル(RPM の情報や作成するときの処理を記載する)を見てみると、
カスタム変数のファイル作成は %post(ファイルをインストールした後の処理)で記載されていました。
そのため、RPM ではこのファイルが管理されてい(-qf では拾えない)ようです。

SPEC ファイルを見るために、
ソースファイルの RPM (~.src.rpm)を下記からDLしてインストールしてみます。
http://public-yum.oracle.com/repo/OracleLinux/OL6/5/base/x86_64/
root ユーザでインストールすると、/root/rpmbuild 配下に
ソースファイルや、パッチファイル、SPECファイルなどが配置されます。
[root@oel65-base-64 ~]# rpm -ivh rhn-client-tools-1.0.0.1-16.0.2.el6.src.rpm
   1:rhn-client-tools       ########################################### [100%]

下記のパッチで repo ファイルに $uek や $uekr3 の変数を書いていました。
[root@oel65-base-64 ~]# cat /root/rpmbuild/SOURCES/uekr3.patch
diff -ruN rhn-client-tools-1.0.0.1.orig/src/up2date_client/public-yum-ol6.repo rhn-client-tools-1.0.0.1/src/up2date_client/public-yum-ol6.repo
--- rhn-client-tools-1.0.0.1.orig/src/up2date_client/public-yum-ol6.repo        2013-11-14 07:22:39.087090504 -0800
+++ rhn-client-tools-1.0.0.1/src/up2date_client/public-yum-ol6.repo     2013-11-14 07:25:18.197063897 -0800
@@ -52,7 +52,14 @@
 baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEK/latest/$basearch/
 gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
 gpgcheck=1
-enabled=1
+enabled=$uek

+
+[public_ol6_UEKR3_latest]
+name=Unbreakable Enterprise Kernel Release 3 for Oracle Linux $releasever ($basearch)
+baseurl=http://public-yum.oracle.com/repo/OracleLinux/OL6/UEKR3/latest/$basearch/
+gpgkey=http://public-yum.oracle.com/RPM-GPG-KEY-oracle-ol6
+gpgcheck=1
+enabled=$uekr3

 [public_ol6_UEK_base]
 name=Unbreakable Enterprise Kernel for Oracle Linux $releasever ($basearch)
--- rhn-client-tools-1.0.0.1.orig/src/bin/rhn_check.py  2013-11-14 07:22:39.087090504 -0800
+++ rhn-client-tools-1.0.0.1/src/bin/rhn_check.py       2013-11-14 07:25:18.197063897 -0800
@@ -87,6 +87,8 @@
             for file in files:
                 if "public-yum" in file and "disabled" not in file:
                     file = os.path.join(root, file)
+                    os.system("echo 0 > /etc/yum/vars/uek")
+                    os.system("echo 0 > /etc/yum/vars/uekr3")
                     os.system("sed -i 's/enabled=1/enabled=0/' %s" % file)
 # orabug 16979442: do not rename public yum repo file, only disable channels at registration with ULN
 #                    os.system("mv %s %s-disabled" % (file, file))

そしてこのパッチは、適用するパッチとして SPECファイルに記載されています。
[root@oel65-base-64 ~]# cat -n /root/rpmbuild/SPECS/rhn-client-tools.spec | grep -C10 "uekr3.patch"
    31  #Patch14: rhn-client-tools-1.0.0.1-14-el6-to-rhn-client-tools-1.0.0.1-15-el6.patch
    32  #Patch15: rhn-client-tools-1.0.0.1-15-el6-to-rhn-client-tools-1.0.0.1-16-el6.patch
    33
    34  Patch100: uln.patch
    35  Patch101: uln-po.patch
    36  Patch102: public-yum-norename.patch
    37  Patch103: delete-RHNS-CA-CERT.patch
    38  Patch104: uln-file.patch
    39  Patch105: Bug17760765-donot-disapper-subscription-review.patch
    40  Patch106: pubyum-u5.patch
    41  Patch107: uekr3.patch
    42
    43  URL:     https://fedorahosted.org/spacewalk
    44  Name: rhn-client-tools
    45  Version: 1.0.0.1
    46  Release: 16.0.2%{?dist}
    47  BuildRoot: %{_tmppath}/%{name}-%{version}-%{release}-root-%(%{__id_u} -n)
    48  BuildArch: noarch
    49  %if 0%{?suse_version}
    50  BuildRequires: update-desktop-files
    51  %endif

そして、SPEC ファイルの 下記のあたりで YUM のカスタム変数のファイルを作成していました。
/etc/yum/vars/uek と /etc/yum/vars/uekr3 を、環境によって 値を変更して作成しています。
[root@oel65-base-64 ~]# cat -n /root/rpmbuild/SPECS/rhn-client-tools.spec
(省略)
   239  %post -n rhn-setup
   240  arch=`uname -m`
   241  if [ "x${arch}x" == "xx86_64x" ] ; then
   242    echo 0 > /etc/yum/vars/uek
   243    echo 1 > /etc/yum/vars/uekr3
   244  else
   245    echo 1 > /etc/yum/vars/uek
   246    echo 0 > /etc/yum/vars/uekr3
   247  fi
   248  if [ -e /etc/sysconfig/rhn/systemid ];then
   249    for i in `ls /etc/yum.repos.d/public-yum*.repo`;do
   250      sed -i 's/enabled=1/enabled=0/' $i
   251  # do not rename the public-yum*.repo file
   252  #    mv $i $i-disabled
   253    done
   254    echo 0 > /etc/yum/vars/uek
   255    echo 0 > /etc/yum/vars/uekr3
   256  fi
   257  # eventually rename ol6_ channels to public_ol6_ in public_yum*.repo
   258  for i in `ls /etc/yum.repos.d/public-yum*.repo`;do
   259    sed -i 's/^\[ol6_/\[public_ol6_/' $i
   260  done
(省略)

たとえば、YUM のリポジトリ設定をスクリプトなどで変更したいときに、
/etc/yum.repos.d 配下のファイルの中身を編集するよりも
/etc/yum/vars 配下のファイルを編集するだけの方が簡単な気がします。
そんなときは YUM のカスタム変数を使うと便利かもしれないと思いました。

以上、UEK リポジトリ設定の YUM カスタム変数についてでした。