でびあんの initrd (9)

scripts/local-top/mdrun をさくっと眺めてるんですが、mdadm というか raid 関連疎くてどうしたものやら、と。
# スルーするかどうか、というあたりが微妙。
ざっくり流れのみ以下に。

  • /scripts/local-top/mdadm が存在したら exit
  • hd[a-z][0-9]* な存在するデバイスファイルについて
    • mdadm --examine した結果を level で grep して 'Raid Level : ?' な ? を取り出して raidlvl にセット
      • examine な mdadm はデバイスファイルを指定する必要がある模様。
      • 出力は "Raid Level : raid5" な形式みたい
    • test "$raidlvl" が真なら modprobe -q ${raidlvl} して gotraild に y を代入
      • test "" は偽。test "raid5" は真だった。
  • ${gotraid} が y なら exit
  • /conf/mdrun.conf を source する
    • デフォルトではこのファイルはありません
  • mdadm コマンド発行
  • /sbin/mdrun コマンド発行

通常は mdadm --examine でデバイスが見つかるんでしょうね。最後らへんはある意味微妙な措置であるように見えます。
software raid もなかなか面白そうな theme ではありますが (ry
コードも以下に。

#!/bin/sh

PREREQ="udev_helper"

prereqs()
{
	echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
	prereqs
	exit 0
	;;
esac

if [ -e /scripts/local-top/mdadm ]; then
	exit 0
fi

unset raidlvl
gotraid=n

# Detect raid level
for x in /dev/hd[a-z][0-9]* /dev/sd[a-z][0-9]*; do
	if [ ! -e ${x} ]; then
		continue
	fi
	raidlvl=$(mdadm --examine ${x} 2>/dev/null | grep "Level" | sed -e 's/.*Raid Level : \(.*\)/\1/')
	if [ "$raidlvl" ]; then
		modprobe -q ${raidlvl} 2>/dev/null
		gotraid=y
	fi
done

[ "${gotraid}" = y ] || exit

# source the presumed root md and it's info
. ./conf/mdrun.conf

# assemble root raid first due to initrd-tools compatibility
mdadm -A ${rootraiddev} -R -u $uuid $devices

# assemble all raid devices
/sbin/mdrun /dev

lvm も

見ておきます。ざっくりな流れを以下に。

  • /scripts/local-top/lvm2 があったら exit
  • /sbin/vgchange が無かったら exit
  • modprobe -q で必要なモジュールを load
    • dm-mod
    • dm-snapshot
    • dm-mirror
  • activate_vg の呼び出し
    • $ROOT を引数に呼び出し
    • $resume を引数に呼び出し

activate_vg は lvm にて定義されてます。これもざっくりベースで処理の流れを以下に。

  • 引数指定が略された場合 return
  • 引数文字列が
    • fe[0-9]* なら vgchange -ay して exit
    • /dev/root なら vgchange -ay して exit
  • 引数文字列から /dev/mapper/ の後の文字列を取り出す
    • 取り出した文字列と引数文字列が同じ (マッチしなかった) 場合は return
  • 引数文字列に "-" (dash) がない場合 return
  • コメントによれば logical volume から volume group を取り出して vgchange -ay する

最後のソレは微妙です。ちなみに RHL 系列なソレに持ってった時には引数文字列が /dev/VolGroup00/LogVol* なら、という分岐を追加しましたな。これもコードを以下に。

#!/bin/sh

PREREQ="mdadm mdrun lvm2"

prereqs()
{
	echo "$PREREQ"
}

case $1 in
# get pre-requisites
prereqs)
	prereqs
	exit 0
	;;
esac

activate_vg()
{
	local vg="$1"

	# Make sure that we have a non-empty argument
	if [ -z "${vg}" ]; then
		return 1
	fi

	# Take care of lilo boot arg, risky activating of all vg
	case $vg in
	fe[0-9]*)
		vgchange -ay
		exit 0
		;;
	# FIXME: check major
	/dev/root)
		vgchange -ay
		exit 0
		;;
	esac

	# Make sure that we have a d-m path
	vg=${vg#/dev/mapper/}
	if [ "$vg" = "$1" ]; then
		return 1
	fi

	# Make sure that the device includes at least one dash
	if [ "$(echo -n "$vg" | tr -d -)" = "$vg" ]; then
		return 1
	fi

	# Split volume group from logical volume.
	vg=$(echo ${vg} | sed -e 's#\(.*\)\([^-]\)-[^-].*#\1\2#')
	# Reduce padded --'s to -'s
	vg=$(echo ${vg} | sed -e 's#--#-#g')

	vgchange -ay ${vg}
}

if [ -e /scripts/local-top/lvm2 ]; then
	exit 0
fi

if [ ! -e /sbin/vgchange ]; then
	exit 0
fi

modprobe -q dm-mod
modprobe -q dm-snapshot
modprobe -q dm-mirror

activate_vg "$ROOT"
activate_vg "$resume"

exit 0

この後

同じ調子で

  • /scripts/local-premount 配下の確認
  • /scripts/local-bottom 配下の確認

の後、どうなるんでしょ。init に戻って mountroot 呼び出し以降のソレを確認、という方向でしょうか。ほぼ終息なんですがいっちゃん最後の run-init がナニ。