Vielen Dank für die Tipps.
@ rendegast
Ja. Ich muss mal den Offset (62) anpassen. Leider bin ich noch nicht dazu gekommen.
Ich habe das Skript nun wiefolgt angepasst:
Code: Alles auswählen
#!/bin/bash
#Partition to extend.
PART_NR_EXTEND=3
abort()
{
echo "Usage: sudo $0 <image_name> <newsize_megabytes>" >&2
echo "Output: resized_<image_name>" >&2
echo "Example extend to 8GB: sudo $0 <image_name> 8000" >&2
losetup -d $looppartdata $loopraw $looptmp
rm -f tmp.img raw.img
exit 1
}
trap 'abort' 0
set -e
#Copy image
cp -v $1 raw.img
#Check size
rawsize=`stat --printf="%s" raw.img`
targetsize=`echo "${2} * 1000000" | bc`
echo "Oldsize = ${rawsize} Bytes"
echo "Newsize = ${targetsize} Bytes"
if [ $rawsize -ge $targetsize ]; then
echo "Error: Oldsize (${rawsize} Bytes) is grater or equal to newsize (${targetsize} Bytes)"
exit 1
fi
#Create empty image
dd if=/dev/zero of=tmp.img bs=1MB count=$2
#Make loopdevices
loopraw=`losetup -f --show raw.img`
looptmp=`losetup -f --show tmp.img`
#Clone the existing contents into the new image
dd if=$loopraw of=$looptmp
#Remove loopdevice raw
losetup -d $loopraw
#Remove raw image
rm -f raw.img
#Get start offset from the data partition
startoffset=`parted -s tmp.img unit B print | awk '/^Nummer/{p=1;next}; p{gsub(/[^[:digit:]]/, "", $2); print $2}' | sed -n "${PART_NR_EXTEND}p"`
echo "startoffset = ${startoffset} Bytes"
#Resize the partition to the maximum size
parted -s $looptmp -- rm $PART_NR_EXTEND
parted -s $looptmp -- mkpart primary ${startoffset}b -1
#Resize filesystem
looppartdata=`losetup -f --show -o $startoffset tmp.img`
sectors=`parted -s tmp.img unit s print | awk '/^Nummer/{p=1;next}; p{gsub(/[^[:digit:]]/, "", $4); print $4}' | sed -n "${PART_NR_EXTEND}p"`
echo "Sectors = ${sectors}"
blocksize=`blockdev --getbsz ${looppartdata}`
echo "Blocksize = ${blocksize}"
blocks=`echo "${sectors} / (4096 / ${blocksize})" | bc`
echo "Blocks = ${blocks}"
e2fsck -f $looppartdata
resize2fs -p $looppartdata
#Remove loopdevices
losetup -d $looppartdata $looptmp
#Rename
mv tmp.img "resized_${1}"
#Remove tmp image
rm -f tmp.img
trap : 0
echo >&2 '
Done
'
Dann habe ich das 4GB Image mithilfe des Skripts auf 8GB vergrössert:
Code: Alles auswählen
sudo ./resize_image_data_partition.sh image_4GB.img 8000
Danach sieht das Image wiefolgt aus:
Code: Alles auswählen
$ fdisk -l resized.img
Platte resized.img: 8000 MByte, 8000000000 Byte
130 Köpfe, 62 Sektoren/Spur, 1938 Zylinder, zusammen 15625000 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Gerät boot. Anfang Ende Blöcke Id System
resized.img1 * 62 2345459 1172699 83 Linux
resized.img2 2345460 5271239 1462890 83 Linux
resized.img3 5271240 15624999 5176880 83 Linux
Code: Alles auswählen
$ parted resized.img
GNU Parted 2.3
Verwende resized.img
Willkommen zu GNU Parted! Geben Sie 'help' ein, um eine Liste der verfügbaren Kommados zu erhalten.
(parted) print
Modell: (file)
Festplatte resized.img: 8000MB
Sektorgröße (logisch/physisch): 512B/512B
Partitionstabelle: msdos
Nummer Anfang Ende Größe Typ Dateisystem Flags
1 31.7kB 1201MB 1201MB primary ext3 boot
2 1201MB 2699MB 1498MB primary ext3
3 2699MB 8000MB 5301MB primary ext3
So weit so gut. Das Bootflag wird übernommen und die Offsets sind gleich geblieben.
Doch wenn ich auf dem Target Boote bekomme ich eine komische Ausgabe von fdisk (nicht erschrecken, ich habe eine 32GB Karte genommen):
Code: Alles auswählen
$ fdisk -l
Platte /dev/sda: 31.5 GByte, 31488049152 Byte
130 Köpfe, 62 Sektoren/Spur, 7630 Zylinder
Einheiten = Zylinder von 8060 × 512 = 4126720 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Gerät boot. Anfang Ende Blöcke Id System
/dev/sda1 * 1 291 1172699 83 Linux
/dev/sda2 292 654 1462890 83 Linux
/dev/sda3 655 1939 5176880 83 Linux
Der Anfang steht plötzlich auf 1 und auch sonst sind Anfang und Ende zu klein.
Kann das daran liegen, dass ich auf dem Target eine veraltete Version von fdisk habe?
DF sieht so aus:
Code: Alles auswählen
$ df -a
Dateisystem 1K‐Blöcke Benutzt Verfügbar Ben% Eingehängt auf
rootfs 1154260 718316 377312 66% /
/dev/root 1154260 718316 377312 66% /
devtmpfs 1018792 156 1018636 1% /dev
proc 0 0 0 - /proc
sysfs 0 0 0 - /sys
udev 1018792 156 1018636 1% /dev
/dev/sda2 1439848 143648 1223056 11% /opt
/dev/sda3 5097136 35292 4803004 1% /data
devpts 0 0 0 - /dev/pts
Danach habe ich nochmals zum Spass ein 7.8GB grosses Image erstellt. Mit Fdisk bekomme ich ein + am Ende der Anzahl Blöcke der dritten Partition.
Weiss jemand was das bedeutet? So viel ich weiss bedeutet das, dass das Filesystem grösser ist als die Partition.
Code: Alles auswählen
$ fdisk -l resized_7_8.img
Platte resized_7_8.img: 7800 MByte, 7800000000 Byte
130 Köpfe, 62 Sektoren/Spur, 1890 Zylinder, zusammen 15234375 Sektoren
Einheiten = Sektoren von 1 × 512 = 512 Bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Gerät boot. Anfang Ende Blöcke Id System
resized_7_8.img1 * 62 2345459 1172699 83 Linux
resized_7_8.img2 2345460 5271239 1462890 83 Linux
resized_7_8.img3 5271240 15234374 4981567+ 83 Linux