Neil Bothwick <[email protected]> [16-01-16 12:44]:
> On Sat, 16 Jan 2016 17:53:18 +0800, Bill Kenworthy wrote:
>
> > It is possible to create a dd image of the whole SD card and mount it in
> > a loopback to repartition etc.
> >
> > Mount it then shrink your existing file system (and probably the
> > partition too) to less than the required size, then recreate the dd
> > image to a size still less than the new sd card.
> >
> > On the new card, dd it across until it errors off, then fix/expand the
> > partition and then the file system. You dont care if the end is missing
> > as long as your data is within the size needed.
>
> I get the impression that Meino is trying to keep it as simple as
> possible for the other user, so fixing after errors is not a good idea.
> Otherwise you could do what you suggest with the original card, shrink the
> filesystem and partition to fit a smaller card then create a dd image
> that will overflow but should work.
>
>
> --
> Neil Bothwick
>
> RISC: Reduced Into Silly Code
Hi,
Neil is completly right here (Neil, you are completly right here! :)
Background: There is a cheap (15$) version of the Raspberry PI, which
is based on a 4core, 1.2GHz Allwinner H3 CPU -- the OrangePI-PC
There are available several firmware images available for this board,
and each images can do a certain thing better than another (for
example hardware accelerated graphic).
You dd the image on a sdcard, put that one in a reader, copy two files
from /boot to /media/boot, put the sdcard into the OrangePI-PC, boot
it, log in via ssh and call a script named "fs_resize", the miniPC
reboots...and VOILA!
Now I want to create such an image from parts of another image
(kernel, firmware) and a bootable Gentoo minimal setup.
For that I need to understand the trick which is used to create such
images.
The script mentioned above is this one:
#!/bin/bash
# ******************************************
# Resize Linux ext4 partition to fill sdcard
# ******************************************
if [ "$(id -u)" != "0" ]; then
echo "Script must be run as root !"
exit 0
fi
_REL=`lsb_release -sc`
_rootpart=`mount | grep "on / " | awk '{print $1}'`
if [ "${_rootpart}" = "/dev/mmcblk0p2" ]; then
rootdrv="mmcblk0p2"
sdcard="/dev/mmcblk0"
elif [ "${_rootpart}" = "/dev/mmcblk1p2" ]; then
rootdrv="mmcblk1p2"
sdcard="/dev/mmcblk1"
else
echo "Root fs mount partition not found!"
exit 1
fi
echo ""
fdisk -l $sdcard | grep $sdcard
echo ""
_btrfs=`mount | grep -o btrfs`
sdcard_part=`fdisk -l $sdcard | grep $rootdrv | awk '{print $1}'`
sdcard_sect=`fdisk -l $sdcard | grep "Disk $sdcard" | awk '{print $7}'`
if [ "${sdcard_sect}" = "" ]; then
sdcard_sect=`fdisk -l $sdcard | grep total | awk '{print $8}'`
fi
sdcard_end=$(expr $sdcard_sect - 1024)
part_start=`fdisk -l $sdcard | grep $rootdrv | awk '{print $2}'`
part_end=`fdisk -l $sdcard | grep $rootdrv | awk '{print $3}'`
echo " Max block: $sdcard_end"
echo " Part end: $part_end"
echo " Part start: $part_start"
if [ ! "${_btrfs}" = "" ]; then
echo " btrfs part: yes"
_resize="btrfs filesystem resize max /"
else
_resize="resize2fs ${sdcard_part}"
fi
echo ""
if [ $part_end -ge $sdcard_end ]; then
echo "Partition allready maximum size !"
rm /usr/local/bin/fs_resize_warning > /dev/null 2>&1
exit 0
fi
echo -n "WARNING: Do you want to resize \"$sdcard_part\" (y/N)? "
read -n 1 ANSWER
if [ ! "${ANSWER}" = "y" ] ; then
echo ""
echo "Canceled.."
exit 0
fi
echo ""
# RESIZE PARTITION
echo -e "p\nd\n2\nn\np\n2\n$part_start\n$sdcard_end\nw" | fdisk ${sdcard} >
/dev/null 2>&1
#if [ $? -ne 0 ]; then
# echo "ERROR resizing partition!"
# exit 1
#fi
echo "PARTITION RESIZED."
mv /etc/rc.local /etc/rc.local.orig
cat > /etc/rc.local << _EOF_
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
# ** Overclock to 1.728 GHz
#echo 1728000 > /sys/devices/system/cpu/cpu0/cpufreq/scaling_max_freq
echo 0 > /proc/sys/kernel/hung_task_timeout_secs
dmesg -n 1
/usr/local/bin/resize_fs &&
_EOF_
echo "exit 0" >> /etc/rc.local
chmod +x /etc/rc.local > /dev/null 2>&1
cat > /usr/local/bin/resize_fs << _EOF_
#!/bin/bash
$_resize
if [ \$? -eq 0 ]; then
rm /usr/local/bin/fs_resize_warning
rm /usr/local/bin/resize_fs
sleep 2
rm /etc/rc.local
mv /etc/rc.local.orig /etc/rc.local
fi
_EOF_
chmod +x /usr/local/bin/resize_fs > /dev/null 2>&1
REBOOT=1
echo "*********************************************"
echo "Rootfs Extended. Please REBOOT to take effect"
echo "*********************************************"
echo ""
Best regards,
Meino