お知らせ

  • 利用規約を守って投稿してください。また、よくある質問および投稿の手引きも参照してください。
  • メッセージの投稿にはアカウントが必要です。未登録の方は、ユーザ登録ページからアカウントを作成することができます。

#1 2008-09-08 18:10:35

moz
メンバ
登録日: 2007-01-25

パーティション分割のためのシェルスクリプト

Linux初心者にとって、パーティション分割は厄介な作業の1つですが、これを半自動化してみましょう。
この方法はHDDなど他のstorage-devicesにも応用できます。

ここでは、1例としてUSBメモリに次のような分割を行う場合の簡単なシェルスクリプト「 part.sh」 を提示します。

        接続デバイス         名   称              サイズ      ファイルシステム  
         /dev/sd*1      起動パーティション        約 720Mb         ext2
         /dev/sd*2      データパーティション      残り全部            ext2


1.  ホームディレクトリにスクリプトファイル「 part.sh」を作成し、以下の15行(「exit 0」まで)を書き込んで保存する。

        $ gedit part.sh

#!/bin/sh

num=`sudo parted /dev/$1 print | grep -c '^ [1-9]'`
a=1
while [ "$a" -le "$num" ]; do
    sudo parted /dev/$1 rm "$a"
    a=`expr $a + 1`
done

unit=`sudo sfdisk -l /dev/$1 | grep ユニット | cut -f3 -d" "`
pcy=`expr 720 \* 1000000 / $unit `
sudo sfdisk -q /dev/$1 << EOF
,$pcy,L
,,L
EOF

exit 0


2.  スクリプトファイル part.sh を実行する。 この時、USBメモリの接続デバイスの sd* ( 例:sdb )を引数として半角空白の後に
      付け加える。

        $ sh ./part.sh sd*


これだけでは実際にどのstorage-deviceを分割したか分からず不安ですから、USBメモリのベンダやモデルを確認する段落を適当
に追加します。

なお、sfdiskによるパーティション作成はシリンダ容量を整数指定することになり、Mbに換算すると若干誤差が生じます。
.

最後の編集者: moz (2008-09-20 12:51:44)

オフライン

 

#2 2008-09-17 13:08:02

moz
メンバ
登録日: 2007-01-25

Re: パーティション分割のためのシェルスクリプト

慧眼な多くの読者は、この方法の目的はすでにご存知でしょう。

「 Ubuntu on USB Memory 」 の新規利用者のために、パーティション分割が半自動的に実行出来るシェルスクリプト part.sh
を用意しようというわけです。

USBメモリの容量が大きくなり、便利なfat16の 「 storageパーティション 」 を先頭に作れるようになりました。
従って、そのパーティションの有無で分割法が2つに分かれます。

1.  ホームディレクトリにスクリプトファイル「 part.sh」を作成し、以下の30行(「exit 0」まで)を書き込んで保存する。

        $ gedit part.sh

#!/bin/sh

num=`sudo parted /dev/$1 print | grep -c '^ [1-9]'`
a=1
while [ $a -le $num ]; do
    sudo parted /dev/$1 rm $a
    a=`expr $a + 1`
done

unit=`sudo sfdisk -l /dev/$1 | grep ユニット | cut -f3 -d" "`

if [ -z $2 ]; then
    pcy=`expr 720 \* 1000000 / $unit`
    sudo sfdisk -q /dev/$1 << EOF
,$pcy,83
,,83
EOF
fi
if [ -n $2 ]; then
    pcy1=`expr $2 \* 1000000 / $unit`
    pcy2=`expr 720 \* 1000000 / $unit`
    sudo sfdisk -q /dev/$1 << EOF
,$pcy1,6
,$pcy2,83
,,83
EOF
    sudo umount /dev/${1}1
    sudo /sbin/mkfs.msdos -F 16 -n storage /dev/${1}1
fi
exit 0

そして、次のコマンドを実行します。

  1)  「 storageパーティション 」を作る場合:
      2番目の引数として「 storageパーティション 」の容量 ### Mb を付け加えます。

      $ sudo sh ./part.sh sd* ###

  2)  「 storageパーティション 」を作らない場合:

      $ sudo sh ./part.sh sd*
.

最後の編集者: moz (2008-09-20 10:39:14)

オフライン

 

#3 2008-12-15 22:52:51

moz
メンバ
登録日: 2007-01-25

Re: パーティション分割のためのシェルスクリプト

パーティション分割を自動化するための上の記述は余りに煩雑で気になってはいたのですが、最近 sfdisk の man ページ
ではなく ファイル /usr/share/doc/util-linux/examples/sfdisk.examples.gz を読んで、もっと簡素に記述できることが
分かりました。

既存の全てのパーティションを parted で予め削除する必要はなく、また sfdisk コマンドの uM オプションが有効であることが
確認できたので、上のスクリプトは次の様に簡略化できます。 ( なお、MはMibメビバイトです。)

#!/bin/sh

if [ -z $2 ]; then
    sudo sfdisk -q /dev/$1 -uM << EOF
,680,83
,,83
EOF
fi
if [ -n $2 ]; then
    sudo sfdisk -q /dev/$1 -uM << EOF
,$2,6
,680,83
,,83
EOF
    sudo umount /dev/${1}1
    sudo /sbin/mkfs.msdos -F 16 -n storage /dev/${1}1
fi
exit 0

                       *                                                                       *

UbuntuをUSBメモリに全自動インストールするには ( 8.10 版 )  および
UbuntuをUSBメモリに全自動インストールするには ( 8.04.1 版 )
の シェルスクリプト install_usb.sh では、対応箇所の内、紫色の行が削除され簡略化されます。


yesno "処理を続行してよろしいですか? [Y/n] " || abort
echo ""

num=`parted ${DEVICE_FILE} print | grep -c '^ [1-9]'`
a=1
while [ $a -le $num ]; do
  parted ${DEVICE_FILE} rm $a
  a=`expr $a + 1`
done
sync;  sleep 2

unit=`sfdisk -l ${DEVICE_FILE} | grep ユニット | cut -f3 -d" "`


if [ -z "$1" ]; then
  pcy=`expr 720 \* 1000000 / $unit`
  sfdisk -q ${DEVICE_FILE} << EOF
,$pcy,6
,,83
EOF
  sync;  sleep 5
  PARTITION=${DEVICE_FILE}1;  PARTITION2=${DEVICE_FILE}2;  INDEX=1
  umount ${PARTITION} 2>/dev/null;  umount ${PARTITION2} 2>/dev/null
  sleep 2
fi
if [ -n "$1" ]; then
  pcy1=`expr $1 \* 1000000 / $unit`
  pcy2=`expr 720 \* 1000000 / $unit`

  sfdisk -q ${DEVICE_FILE} << EOF
,$pcy1,6
,$pcy2,6
,,83
EOF
  sync;  sleep 5
  PARTITION=${DEVICE_FILE}2;  PARTITION2=${DEVICE_FILE}3;  INDEX=2
  umount ${DEVICE_FILE}1 2>/dev/null;  umount ${PARTITION} 2>/dev/null;  umount ${PARTITION2} 2>/dev/null
  sleep 2
  mkdosfs -F 16 -n storage ${DEVICE_FILE}1
  sync;  sleep 2
fi
echo "パーティション分割が完了しました。\n"

                          ↓↓↓

yesno "処理を続行してよろしいですか?(yes/no) " || abort
echo ""

if [ -z "$1" ]; then
  sfdisk -q ${DEVICE_FILE} -uM << EOF
,680,6
,,83
EOF
  sync;  sleep 5
  PARTITION=${DEVICE_FILE}1;  PARTITION2=${DEVICE_FILE}2;  INDEX=1
  umount ${PARTITION} 2>/dev/null;  umount ${PARTITION2} 2>/dev/null
  sleep 2
fi
if [ -n "$1" ]; then
  sfdisk -q ${DEVICE_FILE} -uM << EOF
,$1,6
,680,6
,,83
EOF
  sync;  sleep 5
  PARTITION=${DEVICE_FILE}2;  PARTITION2=${DEVICE_FILE}3;  INDEX=2
  umount ${DEVICE_FILE}1 2>/dev/null;  umount ${PARTITION} 2>/dev/null;  umount ${PARTITION2} 2>/dev/null
  sleep 2
  mkdosfs -F 16 -n storage ${DEVICE_FILE}1
  sync;  sleep 2
fi
echo "パーティション分割が完了しました。\n"

                       *                                                                       *

ファイル /usr/share/doc/util-linux/examples/sfdisk.examples.gz はその名の通り非常に具体的に書かれており
参考になりました。

また、sfdisk コマンドの uM オプションが以前筆者のUSBメモリに対して無効だった理由は分かりません。

最後の編集者: moz (2008-12-16 13:46:06)

オフライン

 

#4 2008-12-16 20:12:13

のんき
メンバ
登録日: 2007-03-04

Re: パーティション分割のためのシェルスクリプト

いつもお世話になっております。

>USBメモリの容量が大きくなり、便利なfat16の 「 storageパーティション 」 を
>先頭に作れるようになりました。

1つお願いがあります。
上記storageパーティションをfat32にすることは出来ないでしょうか。
以前ここのフォーラムでこのパーティションがWindowsXP上で認識されないと
指摘を受けたことがあります。
替えられるものでしたらよろしくお願いします。

オフライン

 

#5 2008-12-16 23:37:03

moz
メンバ
登録日: 2007-01-25

Re: パーティション分割のためのシェルスクリプト

のんきさん、御存知の様に FAT32は 「ディスク領域の使用効率・堅牢性・柔軟性」 がFAT16より向上していますから、その点
でも前者を使うのが正しいのです。 小林さんの書かれた シェルスクリプト install_usb.sh をmodifyして利用しており、その
ままFAT16にしていましたが、御指摘のような事情もあり、この際 「起動パーティション」 も含めてFAT32に変更しましょう。

シェルスクリプト install_usb.sh の変更は容易で、2GbのUSBメモリに先頭の500Mbの 「storageパーティション」 と700Mb
の 「起動パーティション」 をFAT32で作成してみました。 勿論何の問題もなく起動、使用できます。

近日中に シェルスクリプト install_usb.sh を編集します。
御指摘ありがとうございました。

オフライン

 

Board footer

Powered by FluxBB