私はパーティションを制限いっぱいの16まで切っています。
これで困るのは、grub-updateで作成される/boot/grub/grub.cfgのmenuentryの順序です。
grub2のOS選択画面で/dev/sda2のUbuntuより先に/dev/sda10や/dev/sda11が先に表示されてしまいます。
30_os-proberのセクションではos-proberの出力順にしたがってmenuentryが作成されるので、
修正すべきはos-proberの出力順序です。
os-proberの中をのぞいてみるとpartitionsというシェル関数で"/sys/block/*/*[0-9]"という記述があります。
シェルのグロビングのソートは文字列の昇順なので、ここが原因だとわかります。
コマンドの性質上(障害時などは/usrがマウントされない可能性がある)、
スタティックリンクされた/bin,/sbinの下にあるバイナリだけを使用して処理を記述すべきです。
そうするとsortは使えません。もちろんawkやperlもダメです。
ちょっとしたパズル感覚です。
幸いsh(dash)のビルトインにprintfがあったので、sed,printf,シェルのグロビングのあわせ技でソートしてみました。
パッチはこれ os-prober.patch です。
tail_num_sortは/usr/share/os-prober/common.shに追加することも考えたのですが、 自分しか使わないと思ったのでos-proberに入れてしまいました。
しかし、Lucidになってからmenuentryの文字列が長すぎです。
OS選択画面でパーティションの部分が見えなくなってしまいました。
仕方がないので"e"を押してどのパーティションか確認してからCtrl+xで起動しています。
これで困るのは、grub-updateで作成される/boot/grub/grub.cfgのmenuentryの順序です。
grub2のOS選択画面で/dev/sda2のUbuntuより先に/dev/sda10や/dev/sda11が先に表示されてしまいます。
30_os-proberのセクションではos-proberの出力順にしたがってmenuentryが作成されるので、
修正すべきはos-proberの出力順序です。
os-proberの中をのぞいてみるとpartitionsというシェル関数で"/sys/block/*/*[0-9]"という記述があります。
シェルのグロビングのソートは文字列の昇順なので、ここが原因だとわかります。
コマンドの性質上(障害時などは/usrがマウントされない可能性がある)、
そうするとsortは使えません。もちろんawkやperlもダメです。
ちょっとしたパズル感覚です。
2010/05/22追記
スタティックリンクされたバイナリは/bin/busyboxと/sbin/ldconfig.realだけでした。
しかもbusyboxにはawkやsortも組み込まれています....
スタティックリンクされたバイナリは/bin/busyboxと/sbin/ldconfig.realだけでした。
しかもbusyboxにはawkやsortも組み込まれています....
幸いsh(dash)のビルトインにprintfがあったので、sed,printf,シェルのグロビングのあわせ技でソートしてみました。
パッチはこれ os-prober.patch です。
tail_num_sortは/usr/share/os-prober/common.shに追加することも考えたのですが、 自分しか使わないと思ったのでos-proberに入れてしまいました。
しかし、Lucidになってからmenuentryの文字列が長すぎです。
OS選択画面でパーティションの部分が見えなくなってしまいました。
仕方がないので"e"を押してどのパーティションか確認してからCtrl+xで起動しています。
修正前のos-proberの出力
/dev/sda10:Ubuntu 10.04 LTS (10.04):Ubuntu:linux /dev/sda11:Ubuntu 10.04 LTS (10.04):Ubuntu1:linux /dev/sda2:Ubuntu 9.10 (9.10):Ubuntu2:linux /dev/sda3:Ubuntu 9.10 (9.10):Ubuntu3:linux /dev/sda5:Ubuntu 10.04 LTS (10.04):Ubuntu4:linux /dev/sda6:Ubuntu 10.04 LTS (10.04):Ubuntu5:linux /dev/sda7:Ubuntu lucid (development branch) (10.04):Ubuntu6:linux /dev/sda8:Ubuntu 10.04 LTS (10.04):Ubuntu7:linux /dev/sda9:Ubuntu 10.04 LTS (10.04):Ubuntu8:linux
修正後のos-proberの出力
/dev/sda2:Ubuntu 9.10 (9.10):Ubuntu:linux /dev/sda3:Ubuntu 9.10 (9.10):Ubuntu1:linux /dev/sda5:Ubuntu 10.04 LTS (10.04):Ubuntu2:linux /dev/sda6:Ubuntu 10.04 LTS (10.04):Ubuntu3:linux /dev/sda7:Ubuntu lucid (development branch) (10.04):Ubuntu4:linux /dev/sda8:Ubuntu 10.04 LTS (10.04):Ubuntu5:linux /dev/sda9:Ubuntu 10.04 LTS (10.04):Ubuntu6:linux /dev/sda10:Ubuntu 10.04 LTS (10.04):Ubuntu7:linux /dev/sda11:Ubuntu 10.04 LTS (10.04):Ubuntu8:linux
os-prober.patch
diff -ru a/os-prober b/os-prober
--- a/os-prober 2010-02-11 08:06:58.000000000 +0900
+++ b/os-prober 2010-05-04 21:45:47.261264519 +0900
@@ -24,12 +24,32 @@
return 1
}
+tail_num_sort() {
+ if [ $# -eq 0 ] ; then
+ return 0
+ fi
+
+ if type mktemp >/dev/null 2>&1; then
+ TAILNUMSORT_TMP="$(mktemp -d /tmp/tailnumsort.XXXXXX)"
+ else
+ TAILNUMSORT_TMP=/tmp/tailnumsort.$$
+ fi
+ trap "rm -rf $TAILNUMSORT_TMP" EXIT HUP INT QUIT TERM
+
+ for dev in $@ ; do
+ disk=$(echo $dev | sed -e 's#/##g;s#[0-9]*[0-9]*$##')
+ fname=$(printf '%s%02d' $disk $(echo $dev | sed -e "s#/##g;s#$disk##"))
+ echo $dev > $TAILNUMSORT_TMP/$fname
+ done
+ cat $TAILNUMSORT_TMP/* 2>/dev/null
+}
+
partitions () {
# Exclude partitions that have whole_disk sysfs attribute set.
if [ -d /sys/block ]; then
# Exclude partitions on physical disks that are part of a
# Serial ATA RAID disk.
- for part in /sys/block/*/*[0-9]; do
+ for part in $(tail_num_sort /sys/block/*/*[0-9]); do
if [ -f "$part/start" ] && \
[ ! -f "$part/whole_disk" ] && ! on_sataraid $part; then
name="$(echo "${part##*/}" | sed 's,[!.],/,g')"
0 件のコメント:
コメントを投稿