2016年2月3日水曜日

Raspberry pi2にFedora23をインストール

Raspberry pi2にFedora23をインストール



2016年1月 Raspberry piを買った。


モデル Raspberry Pi 2 Model B
デバイスコア Quad-core ARM Cortex-A7 900 MHz
メモリ 1GB LPDDR2

HDMI、USBポートもついて5000円台で買えるのはとても安いと思う。


他にBeagleBone Blackやbananaなんかもあるようだが、Raspberry Pi は情報が多そうなのが良い。




OSはRASPBIANをインストールするのが一般的なのだろうがDebian系なので、普段使っていたRedHat系のFedoraを入れることにした。


RASPBIANのインストールはSDメモリに書き込むだけだが、Fedoraのインストールは少しの手間をかけてイメージファイルを作成する必要がある。

(最初からイメージを置いておいてくれればよいのだが)




手順についてまとめた。


手 順


 1.Fedora用イメージを作成するためのスクリプトを動かす環境の準備の準備

 2.スクリプトの編集と実行

 3.イメージの書き込み


 ※Debian系のRASPBIANで問題ない人は素直にRASPBIANを入れるべきです。



1.Fedora用イメージを作成するためのスクリプトを動かす環境の準備の準備

スクリプトもDebian系で書かれている。

スクリプトを動かせる環境を持っている人はこの項は飛ばして問題ない。


今回はVirtualBoxを使ってFedoraを入れて、Fedoraで実行できるようにスクリプトを一部修正することにした。


今回の環境を整理すると、

物理環境 Windows7 64bit
仮想環境 VirtualBox上のFedora23

インストール先 Raspberry Pi 2 Model B
インストールするOS Fedora-Minimal-armhfp-23-10 (現時点の最新)


1-1.VirtualBoxのインストール

(VirtualBoxのインストールについては詳しく記載したHPが多数あるのでポイントのみ記載)


以下のサイトから「VirtualBox 5.0.14 for Windows hosts  x86/amd64」をダウンロードしてインストールする。

https://www.virtualbox.org/wiki/Downloads



インストールは特に悩むところはないと思う。

インストールが完了したら「新規」からLinux、Fedora23(32-bit)を選択する。
(Windows7 64bit上でも動く)



まずはFedoraをダブルクリックして問題なく起動する事を確認する。


※isoイメージをディスクメディアとしてマウントしたままにしておくと、起動時にまたディスクを読んでしまうのでアンマウントすること。画面下のディスクのアイコンをクリックして強制アンマウントでもよい。



このFedora上でスクリプトのダウンロード、編集、イメージの作成までを実行する。

イメージをSDカードに書き込むことも出来るが、今回はFedoraからWindowsのフォルダをマウントしてイメージをWindows上に置き、WindowsからSDカードに書き込むことにした。
(間違ってWindows上のドライブを消してしまいたくないので)


1-2.VirtualBox上のFedoraからWindows上のフォルダをマウントする

VirtualBoxに用意されている「Guest Additions」を使って実現する。



「デバイス」タブの「Guest Additions CDイメージの挿入」を選択。

右下のディスクのアイコンがグレーから青に変わる。
(マウスカーソルを合わせるとisoイメージがセットされていることが表示される)




Fedoraにgccとkernel-develをインストールしておく。

(root権限で行う。以下、特に断りがない限りrootで行っている)


# yum install kernel-devel
# yum install gcc


続けて「Guest Additions」のインストール作業を行う。

# mkdir /media/VBox
# mount -r /dev/cdrom /media/VBox
# cd /media/VBox
# ./VBoxLinuxAdditions.run



VirtualBoxマネージャの「設定」で「共有フォルダー」を選択して設定をする。

例)
読み書き、永続。
d:\raspberrypi







一旦、Fedoraを再起動してWindows上のファイルが見えるか確認する。

# ls /mdeia/sf_rasberrypi





2.スクリプトの編集と実行


(仮想上のFedoraで実行している)
(https://linux.yebisu.jp/memo/984を参考にしてる)




編集のための下準備をする


# yum -y install git emacs
(emacsは編集するためなのでvi使えばemacsはいらないと思う)



作業フォルダを作成

# mkdir /var/tmp/raspi2
# cd /var/tmp/raspi2


スクリプトとかをもってくる

# git clone https://github.com/spartacus06/rpi2-fedora-image-builder.git



# cd rpi2-fedora-image-builder/
# cp settings.conf.example settings.conf

  #編集する前のファイルは念のため別名でバックアップしておくと後で助かる
  #cp -a xxx.conf xxx.conf.org
  #など。

編集するファイルは2つ。
  ・settings.conf
  ・mkimage.sh

まずは「settings.conf 」の編集を行う。

# vi ./settings.conf
または、
# emacs ./settings.conf


ダウンロード先。Fedora24なら24用に書き換えておくこと。
IMAGEURL="http://mirror.pnl.gov/fedora/linux/releases/23/Images/armhfp/Fedora-Minimal-armhfp-23-10-sda.raw.xz"


8GBのSDカードを買ったのでサイズを少し大きめにした
# size in MB
BOOTSIZE=200
ROOTSIZE=3600
COMPRESS=0


これで一旦保存。






次に「mkimage.sh」の編集を行う。

# vi ./mkimage.sh
または、
# emacs ./mkimage.sh


編集の目的はDebian系のスクリプトをFedoraで実行できるようにすること。
VirtualBoxなどでDebian系を用意している人は特に編集の必要はない。

修正前の行は頭に###をつけておいた。

----
#!/bin/bash

#set -x
set -u

SCRIPTDIR=$(dirname $(readlink -f $0))
export RESOURCEDIR="$SCRIPTDIR/resources"
export MNTDIR="$SCRIPTDIR/mnt"

[[ -d "$RESOURCEDIR" ]] || mkdir "$RESOURCEDIR" || exit 1
[[ -d "$MNTDIR" ]] || mkdir "$MNTDIR" || exit 1

IMAGEURL="http://mirror.pnl.gov/fedora/linux/releases/23/Images/armhfp/Fedora-Minimal-armhfp-23-10-sda.raw.xz"
# ↑setting.confと同じ。
# size in MB
BOOTSIZE=100
ROOTSIZE=1800
COMPRESS=0
# ↑setting.confでは変更したけどこっちはこのままでよいのだろうか?気がつかなかった。

if [[ ! -f settings.conf ]]; then
echo "No settings.conf found, using defaults"
else
echo "Using settings.conf"
. settings.conf
fi

# export settings so subshells can access them
export DISABLE_INITIAL_SETUP

IMAGEFILE=${IMAGEURL##*/}
IMAGEFILE=${IMAGEFILE%.*}
echo "BOOTSIZE is $BOOTSIZE MB"
echo "ROOTSIZE is $ROOTSIZE MB"
echo "IMAGEFILE is $IMAGEFILE"

rm -f root.img boot.img $IMAGEFILE.img

if [[ ! -f $IMAGEFILE.xz ]]; then
echo "Downloading image..."
wget $IMAGEURL || exit 1
fi
if [[ ! -f $IMAGEFILE ]]; then
echo "Extracting image..."
xzdec $IMAGEFILE.xz > $IMAGEFILE || exit 1
fi

###ROOTOFFSET=$(partx --show $IMAGEFILE | tail -n 1 | awk '{print $2}')
ROOTOFFSET=$(kpartx -dl $IMAGEFILE | tail -n 2 | awk ‘{print $6}’)

echo "Extracting rootfs..."
dd if=$IMAGEFILE bs=512 skip=$ROOTOFFSET of=root.img &> /dev/null || exit 1

# create boot partition
echo "Creating boot partition..."
BOOTSIZE_MB="$BOOTSIZE"M
truncate -s $BOOTSIZE_MB boot.img || exit 1
mkfs.vfat boot.img > /dev/null || exit 1
echo "Mounting boot filesystem..."
###sudo mount boot.img $MNTDIR || exit 1
sudo mount -o loop boot.img $MNTDIR || exit 1

echo "Calling boot scripts..."
for i in scripts/boot/*.sh
do
[[ -x "$i" ]] || continue
echo "$i"
bash $i
RET=$?
if [[ $RET -ne 0 ]]; then
echo "script $i returned $RET"
exit 1
fi
done

if [[ $COMPRESS -ne 0 ]]; then
# create large zero file for higher image compression
echo "Zeroing remaining space..."
dd if=/dev/zero of=$MNTDIR/zeroes &> /dev/null
rm -f $MNTDIR/zeroes
fi
echo "Unmounting boot filesystem..."
# wait arbitrary, but usually sufficient, time for some file managers to stop using the volume
sleep 3
sudo umount $MNTDIR || exit 1

# prepare root partition
echo "Preparing root partition..."
if file root.img | grep XFS &>/dev/null; then
echo "Root filesystem is XFS, resize is not supported"
ROOTSIZE="$(du -m root.img | cut -f1)"
ROOTSIZE_MB="$ROOTSIZE"M
echo "ROOTSIZE changed to $ROOTSIZE MB"
else
e2fsck -fp root.img >/dev/null || exit 1
ROOTSIZE_MB="$ROOTSIZE"M
resize2fs root.img $ROOTSIZE_MB >/dev/null || exit 1
truncate -s $ROOTSIZE_MB root.img || exit 1
fi
echo "Mounting root filesystem..."
###sudo mount root.img $MNTDIR || exit 1
sudo mount -o loop root.img $MNTDIR || exit 1
blkid -o export root.img > uuid
. uuid
rm -f uuid
export UUID

echo "Calling root scripts..."
for i in scripts/root/*.sh
do
[[ -x "$i" ]] || continue
echo "$i"
bash $i
RET=$?
if [[ $RET -ne 0 ]]; then
echo "script $i returned $RET"
exit 1
fi
done

if [[ $COMPRESS -ne 0 ]]; then
# create large zero file for higher image compression
echo "Zeroing remaining space..."
dd if=/dev/zero of=$MNTDIR/zeroes &> /dev/null
rm -f $MNTDIR/zeroes
fi
echo "Unmounting root filesystem..."
# wait arbitrary, but usually sufficient, time for some file managers to stop using the volume
sleep 3
sudo umount $MNTDIR || exit 1

# create image
echo "Creating image..."
IMAGESIZE_MB="$((BOOTSIZE + ROOTSIZE + 1))M"
truncate -s $IMAGESIZE_MB $IMAGEFILE.img || exit 1
parted $IMAGEFILE.img mklabel msdos 2>/dev/null || exit 1
parted $IMAGEFILE.img mkpart primary fat16 1MiB $((BOOTSIZE + 1))MiB 2>/dev/null || exit 1
parted $IMAGEFILE.img mkpart primary $((BOOTSIZE + 1))MiB 100% 2>/dev/null || exit 1
dd if=boot.img of=$IMAGEFILE.img obs=1M seek=1 &> /dev/null || exit 1
dd if=root.img of=$IMAGEFILE.img obs=1M seek=$((BOOTSIZE + 1)) &> /dev/null || exit 1

if [[ $COMPRESS -ne 0 ]]; then
echo "Compressing final image (might take a while)..."
xz -f $IMAGEFILE.img || exit 1
fi

echo "$IMAGEFILE.img created successfully."
----



編集が終わったら実行。
./mkimage.sh


スクリプトを実行形式にしていなかった場合は、
# chmod 777 ./mkimage.sh
でもう一度試す。


しばらく実行結果を見ていると、成功して
Fedora-Minimal-armhfp-22-3-sda.raw.img
が作成される。


3.イメージの書き込み

VirtualBox上のFedoraからWindowsPCに差し込んだSDカードをマウントしてddコマンドで書き込んでもよいのだが、フォーマット、書き込みという流れが怖いので、Windows上で行うことにした。

先ほど作ったイメージファイルを1-2項で行った共有フォルダ上にコピーして、WindowsからSDカードに書き込む。

まずはイメージファイルを共有フォルダにコピーする
# cp -a ./Fedora-Minimal-armhfp-22-3-sda.raw.img /mdeia/sf_rasberrypi/


Windows上でファイルが書き込まれていることを確認。



SDカードをフォーマットする
(SDFormatterを使った)

SDカードにイメージファイルを書き込む
(Win32DiskImagerを使った)

出来上がったSDカードをraspberry piに入れて電源を入れ、起動を確認。




4.補足

raspberry piでの起動の確認はディスプレイをつなげるのが一番早い。

SDカードから起動してくるときは緑のLEDが点滅する。


起動しない理由が判断しにくいときは、一旦、SDカードにRASPBIANを入れて起動を確認する。

RASPBIANさえ起動しないようなら、作成したイメージファイルが問題なのではなく、その他の問題の可能性が高い。

たとえば、SDカード自体、電源容量、フォーマットや書き込みの問題など。











0 件のコメント:

コメントを投稿