RedSleeve6をQEMUにインストールし開発環境にする（その１）


# 目的

Fedora12/armベースのオーディオNAS RockDiskNextをRSEL6化した話
http://qiita.com/hkato/items/1b220ac5bf9a6fdf0fd7
http://qiita.com/hkato/items/afa36fdc146f6f6d176f

こいつに追加のRPMなどをビルドするクロス環境を作ろうと思ったが挫折。そこでQEMU/ARMのエミュレーション環境でRSEL6を動かしてみた。

RaspberryPi/RSEL6等の開発環境にもなるはず。

# 参考URL

http://redsleeve.wikia.com/wiki/Install_on_a_QEMU

これをMacでやった感じですが...

# 環境

ホスト環境はMacOSXで行った。LinuxやWindowsの場合は適宜読み替えること。

# 下準備

## ホスト側

私はbrewでqemuとxzを入れた（結局xzはtar.xzの中身をホスト側で調べるために使った、下記手順での展開はエミュレーション環境で行ってるので実際は不要です）

```shell-session
$ brew install qemu
$ brew install xz
```

適当なディレクトリにQEMUのファイルを置く場所を作る。
私は~/QEMUの下に作ることとした。

```shell-session
$ mkdir -p ~/QEMU/rsel6
$ cd ~/QEMU/rsel6
```

## Debian環境の用意
まずDebianを起動させてからRedSleeve化する。
その為、Debian/squeezeのARM/QEMU環境を拾ってくる。
URL: https://people.debian.org/~aurel32/qemu/armel/

```shell-session
$ curl -O https://people.debian.org/~aurel32/qemu/armel/vmlinuz-2.6.32-5-versatile
$ curl -O https://people.debian.org/~aurel32/qemu/armel/initrd.img-2.6.32-5-versatile
$ curl -O https://people.debian.org/~aurel32/qemu/armel/debian_squeeze_armel_standard.qcow2
```

## RedSleeve rootfs ISOイメージ作成

rsディレクトリの下にrselのrootfsを持ってきてISOファイル化する。
ちなみにrsel6-rootfsやrsel6-minimalを試したが動かなかった。

```shell-session
$ mkdir rs
$ cd rs
$ curl -O http://ftp.redsleeve.org/pub/yum/os/rsel6-rootfs-big.tar.xz
$ cd ..
$ hdiutil makehybrid -iso -joliet -o rsel6-rootfs.iso rs/
```

hdiutil makehybrid は MacOSX独自のコマンド、Linux等の場合は、

```shell-session
$ mkisofs -J -R -o rsel6-rootfs.iso rs/
```

## RedSleeve用QEMUイメージ

qemu-img createで作成する方が良いと思うが、debainのイメージをコピーした

```shell-session
$ cp debian_squeeze_armel_standard.qcow2 redsleeve_armel_rootfs.qcow2 
```

# Debian環境からRedSleeveを作る

## 起動

hdbにRedSleeveのqcow2イメージ、cdromに作成したRedSleeveのISOを指定しDebianを起動

```shell-session
$ qemu-system-arm -M versatilepb \
-kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile \
-hda debian_squeeze_armel_standard.qcow2 \
-hdb redsleeve_armel_rootfs.qcow2 \
-cdrom rsel6-rootfs.iso \
-nographic \
-append "root=/dev/sda1 console=ttyAMA0"
```

root/rootでログイン

## RedSleeve QEMUイメージの作成

Debian/ARM上での操作

### ファイルシステム初期化

```shell-session
root@debian-armel:~# mkfs.ext3 /dev/sdb1
root@debian-armel:~# mkswap /dev/sdb5
```

ちなみにext4を試したがのちの処理でコケてダメだった

### RedSleeve関連マウント

ISOとターゲットとなるイメージをマウント

```shell-session
root@debian-armel:~# mkdir -p /mnt/cdrom
root@debian-armel:~# mkdir -p /mnt/disk
root@debian-armel:~# mount -r /dev/cdrom /mnt/cdrom
root@debian-armel:~# mount /dev/sdb1 /mnt/disk
```

### ISOから展開

```shell-session
root@debian-armel:~# cd /mnt/disk/
root@debian-armel:/mnt/disk# tar --strip-components 1 -xvJf /mnt/cdrom/rsel6-rootfs-bigtar.xz 
root@debian-armel:/mnt/disk# cd /
root@debian-armel:/# umount /mnt/disk
```

Ctrl-a x でQEMU終了

## RedSleeveの起動(bash)と調整

まずはinitでなくbashで起動する

```shell-session
$ qemu-system-arm -M versatilepb \
-kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile \
-hda redsleeve_armel_rootfs.qcow2 \
-nographic \
-append "root=/dev/sda1 console=ttyAMA0 init=/bin/bash"
```

### /を再マウント

```shell-session
bash-4.1# mount -o rw,remount /
```

### fstabの修正

```shell-session
bash-4.1# cp -p /etc/fstab /etc/fstab.orig
bash-4.1# vim /etc/fstab
```

```
/dev/sda1       /               ext3    defaults,noatime        1 1
/dev/sda5       swap            swap    defaults                0 0
devpts          /dev/pts        devpts  gid=5,mode=620          0 0
tmpfs           /dev/shm        tmpfs   defaults                0 0
proc            /proc           proc    defaults                0 0
sysfs           /sys            sysfs   defaults                0 0

#tmpfs           /tmp            tmpfs   defaults                0 0
#tmpfs          /var/tmp        tmpfs   defaults                0 0
#tmpfs          /var/cache/yum  tmpfs   defaults                0 0
#tmpfs          /var/lib/yum    tmpfs   defaults                0 0     
```

### 不要なサービスの停止

```shell-session
bash-4.1# chkconfig dnsmasq off
bash-4.1# chkconfig gpm off
bash-4.1# chkconfig haldaemon off
bash-4.1# chkconfig messagebus off
bash-4.1# chkconfig nfslock off
bash-4.1# chkconfig nscd off
bash-4.1# chkconfig rpcbind off
bash-4.1# chkconfig rpcgssd off
bash-4.1# chkconfig rpcidmapd off
```

### MMCとCPU関連のオプション設定の無効化

RaspberryPiの実ハードなら必要なのかな。コメントアウト。

```shell-session
bash-4.1# cp -p /etc/rc.d/rc.local /etc/rc.d/rc.local.orig
bash-4.1# vim /etc/rc.d/rc.local
```

```sh
#!/bin/sh
#
# This script will be executed *after* all the other init scripts.
# You can put your own initialization stuff in here if you don't
# want to do the full Sys V style init stuff.

touch /var/lock/subsys/local

#echo deadline > /sys/block/mmcblk0/queue/scheduler
#echo      256 > /sys/block/mmcblk0/queue/iosched/fifo_batch
#echo      100 > /sys/block/mmcblk0/queue/iosched/read_expire
#echo    10000 > /sys/block/mmcblk0/queue/iosched/write_expire
#echo      256 > /sys/block/mmcblk0/queue/nr_requests

#echo ondemand > /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor
#echo ondemand > /sys/devices/system/cpu/cpu1/cpufreq/scaling_governor

```

### init(Upstart)で使われないもの削除

ちとわからないが参考にしたURLの通り

```shell-session
bash-4.1# mv /etc/init/kexec-disable.conf /etc/init/kexec-disable.conf.orig
bash-4.1# mv /etc/init/serial.conf /etc/init/serial.conf.orig
```

### gettyの設定

ttyAMAってなんだか知らないけど

```shell-session
bash-4.1# vim /etc/init/ttyAMA.conf
```

```sh
#
start on stopped rc RUNLEVEL=[2345]
stop on starting runlevel [016]

respawn

pre-start exec /sbin/securetty ttyAMA0
exec /sbin/agetty -L /dev/ttyAMA0 9600 vt102
```

### 準備完了

Ctrl-a x でQEMUを抜ける。

## RedSleeveの起動

いよいよ本番

```shell-session
$ qemu-system-arm -M versatilepb \
-kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile \
-hda redsleeve_armel_rootfs.qcow2 \
-nographic \
-append "root=/dev/sda1 console=ttyAMA0"
```

エラーは出るがログインできるようになる(root/password)。

なにやらディレクトリが無い様なので掘っておく。

```shell-session
[root@ac100 ~]# mkdir -p /var/lock/subsys
[root@ac100 ~]# mkdir -p /var/run/netreport
```

ネットワークが使えないので、一旦終了。

```shell-session
[root@ac100 ~]# shutdown -h now
```

Ctrl-a x で抜ける。

## ネットワークの有効化

### hdbにDebianイメージを指定して起動

```shell-session
$ qemu-system-arm -M versatilepb \
-kernel vmlinuz-2.6.32-5-versatile \
-initrd initrd.img-2.6.32-5-versatile \
-hda redsleeve_armel_rootfs.qcow2 \
-hdb debian_squeeze_armel_standard.qcow2 \
-nographic \
-append "root=/dev/sda1 console=ttyAMA0"
```

### カーネルモジュールをコピーする

```shell-session
[root@ac100 ~]# mkdir -p /mnt/disk
[root@ac100 ~]# mount /dev/sdb1 /mnt/disk
[root@ac100 ~]# cp -R /mnt/disk/lib/modules/2.6.32-5-versatile /lib/modules/2.6.32-5-versatile
```

### インターフェース設定

DHCPとかQEMUのNATのDNS指定とか

```shell-session
[root@ac100 ~]# vim /etc/sysconfig/network-scripts/ifcfg-eth0
```

```
DEVICE=eth0
BOOTPROTO=dhcp
HWADDR=52:54:00:12:34:56
ONBOOT=yes
TYPE=ethernet
USERCTL=no
PEERDNS=yes
DNS1=10.0.2.3
```

IPv6無効化

```shell-session
[root@ac100 ~]# vim /etc/sysctl.conf
```

最終行に追加

```
# Disable IPv6
net.ipv6.conf.all.disable_ipv6 = 1
```

ホスト名設定

```shell-session
[root@ac100 ~]# vim /etc/sysconfig/network
```

```
NETWORKING=yes
HOSTNAME=rsel6.local
```

インターフェース初期化

```shell-session
[root@ac100 ~]# service network restart
```

## 念のため再起動

```shell-session
# reboot
```

# インストール状況

```shell-session
[root@rsel6 ~]# uname -a
Linux rsel6.local 2.6.32-5-versatile #1 Wed Sep 25 00:01:55 UTC 2013 armv5tejl armv5tejl armv5tejl GNU/Linux
[root@rsel6 ~]# cat /etc/redhat-release 
Red Sleeve Enterprise Linux release 6.1 (Leap)
```

とりあえず動いている様です。

続く
http://qiita.com/hkato/items/43e6b312dd5082c9a8c6