kickstart中%post部分格式化硬盤的問題

做過kickstart或者cobbler的同學應該都知道,在系統安裝結束後可以對系統作一些定製化的配置,比如ip,分區,硬盤,包等。

下面講講我在寫%post時遇到的一些關於硬盤分區的問題。

廢話不多說,先貼上處理硬盤的腳本,這裏只是處理非系統盤的其他硬盤。

echo "Dealing with data disks now..."

NUM=01

DATA_DISK=""

for DEVICE in `awk '$NF ~ /sd/ && $NF !~ /[0-9]$/ {print $NF}' /proc/partitions | sort`; do

        DEVICE="/dev/$DEVICE"

        FSTYPE=""

        LABEL=""

        FSTYPE=`parted -s ${DEVICE}1 print 2>&1 | awk '/^ / {print $5}'`

        LABEL=`e2label ${DEVICE}1 2>/dev/null`

        NEW_LABEL="/hadoop$NUM"


        # Skip swap partition, which wouldn't have a label

        echo $FSTYPE | grep swap > /dev/null

        if [ $? -eq 0 ]; then

                echo "Partition ${DEVICE}1 is a SWAP, skipping..."

                continue

        fi

        # Skip "/" LABEL 

        if [ "$LABEL" = "/" ]; then

                echo "Device ${DEVICE}1 has label '/', skipping..."

                continue

        fi

        # Skip label "/var/log/hadoop" 

        if [ "$LABEL" = "/var/log/hadoop" ]; then

                echo "Device ${DEVICE}1 has label /var/log/hadoop, skipping..."

                continue

        fi


        # If LABEL is null , create partition ,then label and filesystem

        if [ -z "$LABEL" ]; then

                FSTYPE=ext4

                echo "Creating gpt "

                parted -s $DEVICE mklabel gpt

                echo "Creating new partition on $DEVICE with label $NEW_LABEL..."

                parted -s $DEVICE mkpart primary $FSTYPE 0% 100% 2>&1

                echo "Formatting filesystem ${DEVICE}1..."

                partprobe

                sleep 3

                mkfs.$FSTYPE -q -N 61050880 -L $NEW_LABEL -m 1 -O sparse_super ${DEVICE}1 2>&1  &

        # If LABEL is not null , rewrite label 

        else

                echo "Rewrite Label of ${DEVICE}1 to $NEW_LABEL"

                e2label ${DEVICE}1 $NEW_LABEL

        fi



        echo "Adding entry for $NEW_LABEL into /etc/fstab..."

        grep -w "LABEL=$NEW_LABEL $NEW_LABEL" /etc/fstab > /dev/null

        if [ $? -eq 0 ]; then

                perl -pi -e "s|LABEL=$NEW_LABEL $NEW_LABEL .*$|LABEL=$NEW_LABEL $NEW_LABEL $FSTYPE defaults,noatime,nodiratime 0 0|" /etc/fstab 2>&1

        else

                echo "LABEL=$NEW_LABEL $NEW_LABEL $FSTYPE defaults,noatime,nodiratime 0 0" >> /etc/fstab

        fi

        # Create a mount point

        if [ ! -d $NEW_LABEL ]; then

                echo "Creating mount point $NEW_LABEL ..."

                mkdir -p $NEW_LABEL

        fi

        # Increase NUM by 1

        NUM=`expr $NUM + 1 | awk '{printf("%02s",$1)}'`

        # Put all partitions of data disks into string list

        DATA_DISK="$DATA_DISK ${DEVICE}1"


done

echo "Waiting for all mkfs processes to finish (if any)..."

wait


if [ -n "$DATA_DISK" ]; then

echo "Tuning newly formatted filesystems..."

FS=""

for FS in $DATA_DISK; do

tune2fs -i 0 -c 0 $FS 2>&1

done

fi

echo "mount all disks now"

mount -a


解釋1:

parted -s $DEVICE mkpart primary $FSTYPE 0% 100% 2>&1

代表在DEVICE上創建分區,分區的跨度是從0%開始到100%結束,單位默認是MB,也可以用其他寫法,比如百分比的方式:

parted -s $DEVICE mkpart primary $FSTYPE 0 200000 2>&1

或者採用扇區的方式,如下命令表示起始扇區是34sectors

parted -s $DEVICE mkpart primary $FSTYPE 34s 100% 2>&1

解釋2:

上面腳本中有partprobe這個命令,它是用來告訴kernel重新讀取硬盤的扇區信息。

如果不加這條命令,在安裝完系統後你會發現有些硬盤沒有被正確格式化,也就是mkfs命令沒有正確執行。

相關報錯信息如下:

Could not stat/dev/sdi1 --- No such file or directory

The deviceapparently does not exist; did you specify it correctly?

你想知道怎麼看到日誌信息的?

請在你的postinstall腳本中把日誌都打到一個文件中。

以上報錯信息不總是出現,只是有時會出現,原因就是因爲在劃分好扇區後,kernel沒有及時讀取對應硬盤的扇區信息,所以在格式化硬盤的時候就找不到對應的扇區,跑一下partprobe來告訴kernel再重新讀取下硬盤扇區信息,這樣就不會出現上面的報錯信息了。

解釋3:

通常你會在日誌中看到如下信息

Warning: The resulting partition is not properly aligned for best performance.

你不用擔心硬盤性能會受到影響,大部分硬盤的logical size 和physical size都是512B,有些硬盤的physical size是4KB,對於這種硬盤就需要在劃分分區的時候注意下,分區起始要是1MB,parted工具會幫你處理這些的,所以不用擔心,不放心的話,可以用下面介紹的命令查看下分區情況。


附,硬盤操作相關的一些命令

顯示硬盤/dev/sdb的分區情況

parted /dev/sdb print free 2>&1

parted /dev/sdb unit mb print free 2>&1

刪除分區/dev/sdb1

parted /dev/sdb rm 1

創建gpt表

parted -s /dev/sdb mklabel gpt

格式化分區/dev/sdb1

mkfs.ext4 -q -N 61050880 -L /hadoop01 -m 1 -O sparse_super /dev/sdb1 2>&1

IO-limit相關的文章鏈接

http://people.redhat.com/msnitzer/docs/io-limits.txt

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章