#!/bin/sh # Copyright (c) 2012 Alex Bradbury # Copyright (C) 2016 Martin Wimpress # # Permission is hereby granted, free of charge, to any person obtaining a # copy of this software and associated documentation files (the # "Software"), to deal in the Software without restriction, including # without limitation the rights to use, copy, modify, merge, publish, # distribute, sublicense, and/or sell copies of the Software, and to # permit persons to whom the Software is furnished to do so, subject to # the following conditions: # # The above copyright notice and this permission notice shall be included # in all copies or substantial portions of the Software. # # THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS # OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF # MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. # IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY # CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, # TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE # SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. pass_notify() { # 1 = Success # 2 = /dev/root non-existent or not a symlink # 3 = Not an SD card. # 4 = Unsupported layout. # 5 = Not the last partition. echo "${1}" > /tmp/notify_rpi_status # Miscellaneous information to show in notification. echo "${2}" > /tmp/notify_rpi_text } get_init_sys() { if command -v systemctl > /dev/null && systemctl | grep -q '\-\.mount'; then SYSTEMD=1 elif [ -f /etc/init.d/cron ] && [ ! -h /etc/init.d/cron ]; then SYSTEMD=0 else echo "Unrecognised init system" return 1 fi } do_expand_rootfs() { get_init_sys if [ $SYSTEMD -eq 1 ]; then ROOT_PART=$(mount | sed -n 's|^/dev/\(.*\) on / .*|\1|p') else if ! [ -h /dev/root ]; then pass_notify 2 '/dev/root' return 0 fi ROOT_PART=$(readlink /dev/root) fi PART_NUM=${ROOT_PART#mmcblk0p} if [ "$PART_NUM" = "$ROOT_PART" ]; then pass_notify 3 "$ROOT_PART" return 0 fi # NOTE: the NOOBS partition layout confuses parted. For now, let's only # agree to work with a sufficiently simple partition layout if [ "$PART_NUM" -ne 2 ]; then pass_notify 4 '' return 0 fi LAST_PART_NUM=$(parted /dev/mmcblk0 -ms unit s p | tail -n 1 | cut -f 1 -d:) if [ $LAST_PART_NUM -ne $PART_NUM ]; then pass_notify 5 "$ROOT_PART" return 0 fi # Get the starting offset of the root partition PART_START=$(parted /dev/mmcblk0 -ms unit s p | grep "^${PART_NUM}" | cut -f 2 -d: | sed 's/[^0-9]//g') [ "$PART_START" ] || return 1 # Return value will likely be error for fdisk as it fails to reload the # partition table because the root fs is mounted fdisk /dev/mmcblk0 < /etc/init.d/resize2fs_once && #!/bin/sh ### BEGIN INIT INFO # Provides: resize2fs_once # Required-Start: # Required-Stop: # Default-Start: 3 # Default-Stop: # Short-Description: Resize the root filesystem to fill partition # Description: ### END INIT INFO . /lib/lsb/init-functions case "\$1" in start) log_daemon_msg "Starting resize2fs_once" && /sbin/resize2fs /dev/$ROOT_PART && update-rc.d resize2fs_once remove && rm /etc/init.d/resize2fs_once && log_end_msg \$? ;; *) echo "Usage: \$0 start" >&2 exit 3 ;; esac EOF chmod +x /etc/init.d/resize2fs_once && update-rc.d resize2fs_once defaults && touch /.resized && pass_notify 1 '' } do_expand_rootfs