2012年7月17日 星期二

sfdisk: The Scriptable fdisk

在玩 Beagleboard 時接觸到 sfdisk 這個指令,一開始還沒怎麼弄明白,不過爬了些文章後,試了試發現 sfdisk 這指令真的很有意思。只要將想建立的 partition 資訊「餵」給它,就會將磁碟建立出對應的 partition。所以,可以在腳本裡利用 echo 和 sfdisk 配合,來建立需要的 partition。

在反覆試了幾次,我試著改了一個 mkmmc.sh 的腳本出來:

#!/bin/bash

echo "[Unmounting all existing partitions on the device ]"
umount $1*

echo "[Partitioning $1...]"

DRIVE=$1
SIZE=`fdisk -l $DRIVE | grep Disk | awk '{print $5}'`
  
echo DISK SIZE - $SIZE bytes
 
CYLINDERS=`echo $SIZE/255/63/512 | bc`
 
echo CYLINDERS - $CYLINDERS
{
 echo ,17,0x0C,*
 echo ,130,,-
 echo ,130,,-
 echo ,,0x0C,-
} | sfdisk -D -H 255 -S 63 -C $CYLINDERS $DRIVE &> /dev/null

echo "[Making filesystems...]"

mkfs.vfat -F 32 -n boot "$1"1 &> /dev/null
mkfs.ext3 -L rootfs "$1"2 &> /dev/null
mkfs.ext3 -L extend "$1"3 &> /dev/null
mkfs.vfat -F 32 -n data "$1"4 &> /dev/null 

經過這個腳本,可以建立出如下的 partition:

Disk /dev/sdb: 3965 MB, 3965190144 bytes
255 heads, 63 sectors/track, 482 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *           1          17      136521    c  W95 FAT32 (LBA)
/dev/sdb2              18         147     1044225   83  Linux
/dev/sdb3             148         277     1044225   83  Linux
/dev/sdb4             278         482     1646662+   c  W95 FAT32 (LBA)

延伸閱讀:

  1. sfdisk: The Scriptable fdisk

張貼留言