On Sun, 2009-11-29 at 20:56 +0100, Frank Lin PIAT wrote:
> On Sun, 2009-11-29 at 13:56 +0100, Marco d'Itri wrote:
> > On Nov 28, Bastian Blank <wa...@debian.org> wrote:
> > 
> > > The Linux image packages needs to do some modifications to core
> > > configuration files like fstab in the future to allow newer kernels to
> > > work. To do this and the planned further extension I intend to make all
> > > linux image packages depend on python.

FYI

As I were investigating an issue about volumes UUID, I noticed that
Ubuntu already had such transition, with this tool: volumeid[1]

It needed a minor update to use blkid instead of vol_id.

Franklin

[1] https://launchpad.net/ubuntu/gutsy/i386/volumeid/113-0ubuntu17.2
    https://launchpad.net/ubuntu/+source/udev/113-0ubuntu17.2
#!/bin/sh -e
# Rewrite /etc/fstab so that filesystems are mounted by UUID

if [ -e /etc/fstab.pre-uuid ]; then
    echo "/etc/fstab.pre-uuid already exists" 1>&2
    echo "remove this file before running the script again" 1>&2
    exit 1
fi

cp -a /etc/fstab /etc/fstab.pre-uuid
exec 9<&0 8>&1 </etc/fstab >/etc/fstab.new
trap "rm -f /etc/fstab.new" 0

uuids=""

old_IFS="$IFS"
IFS="
"
while read LINE
do
    IFS="$old_IFS"
    set -- $LINE
    IFS="
"
    DEV=$1 MTPT=$2 FSTYPE=$3 OPTS=$4

    # Check the device is sane for conversion
    case "$DEV" in
        ""|\#*)         # Preserve blank lines and user comments
            echo "$LINE"
            continue
            ;;
        LABEL=*|UUID=*) # Already mounting by LABEL or UUID
            echo "$LINE"
            continue
            ;;
        /dev/mapper/*_crypt)# DM-Crypt devices
            echo "$LINE"
            continue
            ;;
        /dev/disk/*)    # Already mounting by particulars
            echo "$LINE"
            continue
            ;;
        /dev/fd[0-9]*)  # Floppy devices, not mounted by filesystem
            echo "$LINE"
            continue
            ;;
        /dev/*)         # Ordinary devices -- we want to convert
            if [ ! -b "$DEV" ]; then
                echo "$LINE"
                continue
            fi
            ;;
        *)                      # Anything else gets left alone
            echo "$LINE"
            continue
            ;;
    esac 
    
    # Don't convert filesystem types that don't make sense
    case "$FSTYPE" in
        auto)           # Auto detection -- implies non-fixed fs
            echo "$LINE"
            continue
            ;;
    esac
    
    # Check filesystem options also
    case "$OPTS" in
        noauto|*,noauto|noauto,*|*,noauto,*)    # Implies non-fixed
            echo "$LINE"
            continue
            ;;
    esac


    # If we reach this point, we think we want to move the fstab
    # entry over to mount-by-UUID.  The first check is that the
    # filesystem on the device *has* a uuid
    UUID=$(/sbin/vol_id -u "$DEV" || true)
    if [ -z "$UUID" ]; then
        # Can we generate one?
        if [ "$FSTYPE" = "swap" ]; then
            REAL_FSTYPE=$(/sbin/vol_id -t "$DEV" || true)
            case "$REAL_FSTYPE" in
                swap)   # is a swap device, add a UUID to it
                    UUID=$(uuidgen)
                    echo -n "$UUID" |
                      perl -ne 's/-//g;chomp;print pack "H*",$_' |
                      dd conv=notrunc "of=$DEV" obs=1 seek=1036 2>/dev/null
                    ;;
                swsusp) # contains a suspended image, mkswap it!
                    if ! mkswap "$DEV" >/dev/null; then
                        echo "Warning: unable to make swap $DEV" 1>&2
                        echo "$LINE"
                        continue
                    fi

                    UUID=$(/sbin/vol_id -u "$DEV" || true)
                    if [ -z "$UUID" ]; then
                        echo "Warning: unable to generate uuid for $DEV" 1>&2
                        echo "$LINE"
                        continue
                    fi
                    ;;
                *)
                    echo "Warning: $DEV is not a swap partition" 1>&2
                    echo "$LINE"
                    continue
                    ;;
            esac
        else
            echo "Warning: unable to find a UUID for $DEV" 1>&2
            echo "$LINE"
            continue
        fi
    fi

    # Check for duplicates
    case "$uuids" in
    "$UUID" | "$UUID "* | *" $UUID" | *" $UUID "*)
        echo "Error: duplicate UUID $UUID detected" 1>&2
        echo "Unable to migrate /etc/fstab to UUID-based mounting" 1>&2

        exec 0<&9 9<&- 1>&8 8>&-
        trap 0

        rm -f /etc/fstab.new
        exit 1
        ;;
    *)
        uuids="${uuids:+$uuids }$UUID"
        ;;
    esac

    # Now write the new line out
    shift
    echo "# $DEV -- converted during upgrade to edgy"
    echo "UUID=$UUID $@"
done
IFS="$old_IFS"

exec 0<&9 9<&- 1>&8 8>&-
trap 0

#mv -f /etc/fstab.new /etc/fstab

exit 0
#!/bin/sh -e
# Rewrite /etc/fstab so that filesystems are mounted by UUID

if [ -e /etc/fstab.pre-uuid ]; then
    echo "/etc/fstab.pre-uuid already exists" 1>&2
    echo "remove this file before running the script again" 1>&2
    exit 1
fi

cp -a /etc/fstab /etc/fstab.pre-uuid
exec 9<&0 8>&1 </etc/fstab >/etc/fstab.new
trap "rm -f /etc/fstab.new" 0

uuids=""

old_IFS="$IFS"
IFS="
"
while read LINE
do
    IFS="$old_IFS"
    set -- $LINE
    IFS="
"
    DEV=$1 MTPT=$2 FSTYPE=$3 OPTS=$4

    # Check the device is sane for conversion
    case "$DEV" in
        ""|\#*)         # Preserve blank lines and user comments
            echo "$LINE"
            continue
            ;;
        LABEL=*|UUID=*) # Already mounting by LABEL or UUID
            echo "$LINE"
            continue
            ;;
        /dev/mapper/*_crypt)# DM-Crypt devices
            echo "$LINE"
            continue
            ;;
        /dev/disk/*)    # Already mounting by particulars
            echo "$LINE"
            continue
            ;;
        /dev/fd[0-9]*)  # Floppy devices, not mounted by filesystem
            echo "$LINE"
            continue
            ;;
        /dev/*)         # Ordinary devices -- we want to convert
            if [ ! -b "$DEV" ]; then
                echo "$LINE"
                continue
            fi
            ;;
        *)                      # Anything else gets left alone
            echo "$LINE"
            continue
            ;;
    esac 
    
    # Don't convert filesystem types that don't make sense
    case "$FSTYPE" in
        auto)           # Auto detection -- implies non-fixed fs
            echo "$LINE"
            continue
            ;;
    esac
    
    # Check filesystem options also
    case "$OPTS" in
        noauto|*,noauto|noauto,*|*,noauto,*)    # Implies non-fixed
            echo "$LINE"
            continue
            ;;
    esac


    # If we reach this point, we think we want to move the fstab
    # entry over to mount-by-UUID.  The first check is that the
    # filesystem on the device *has* a uuid
    UUID=$(/sbin/blkid -o value -s UUID "$DEV" || true)
    if [ -z "$UUID" ]; then
        # Can we generate one?
        if [ "$FSTYPE" = "swap" ]; then
            REAL_FSTYPE=$(/sbin/blkid -o value -s TYPE "$DEV" || true)
            case "$REAL_FSTYPE" in
                swap)   # is a swap device, add a UUID to it
                    UUID=$(uuidgen)
                    echo -n "$UUID" |
                      perl -ne 's/-//g;chomp;print pack "H*",$_' |
                      dd conv=notrunc "of=$DEV" obs=1 seek=1036 2>/dev/null
                    ;;
                swsusp) # contains a suspended image, mkswap it!
                    if ! mkswap "$DEV" >/dev/null; then
                        echo "Warning: unable to make swap $DEV" 1>&2
                        echo "$LINE"
                        continue
                    fi

                    UUID=$(/sbin/blkid -o value -s UUID "$DEV" || true)
                    if [ -z "$UUID" ]; then
                        echo "Warning: unable to generate uuid for $DEV" 1>&2
                        echo "$LINE"
                        continue
                    fi
                    ;;
                *)
                    echo "Warning: $DEV is not a swap partition" 1>&2
                    echo "$LINE"
                    continue
                    ;;
            esac
        else
            echo "Warning: unable to find a UUID for $DEV" 1>&2
            echo "$LINE"
            continue
        fi
    fi

    # Check for duplicates
    case "$uuids" in
    "$UUID" | "$UUID "* | *" $UUID" | *" $UUID "*)
        echo "Error: duplicate UUID $UUID detected" 1>&2
        echo "Unable to migrate /etc/fstab to UUID-based mounting" 1>&2

        exec 0<&9 9<&- 1>&8 8>&-
        trap 0

        rm -f /etc/fstab.new
        exit 1
        ;;
    *)
        uuids="${uuids:+$uuids }$UUID"
        ;;
    esac

    # Now write the new line out
    shift
    echo "# $DEV -- converted during upgrade to edgy"
    echo "UUID=$UUID $@"
done
IFS="$old_IFS"

exec 0<&9 9<&- 1>&8 8>&-
trap 0

#mv -f /etc/fstab.new /etc/fstab

exit 0

Reply via email to