--- cdrom.image/updates/raidconvert 2005/09/17 02:01:29 1.2 +++ cdrom.image/updates/raidconvert 2008/03/15 18:11:42 1.6.2.1 @@ -1,80 +1,46 @@ #!/bin/sh -set -x - -# exec 2>&1 >/tmp/raidconvert.out +set -x exec 2>&1 -# let's assume it's a SCSI system -if grep -q 'sda$' /proc/partitions; then - disk=sda -else - # No SCSI Drives is must be IDE - media=`cat /proc/ide/hda/media` - if [ $media == "disk" ] ; then - disk=hda - fi -fi +device=$(sed -n 's|.*[0-9]\s\+\([^ ]\+[^0-9]\)$|\1|p;s#.*[0-9]\s\+\(\(rd\|ida\|cciss\|i2o\)/.*[^0-9p][0-9]\+\)$#\1#p' /proc/partitions | head -1) + +if [ -n "$device" ] +then + sfdisk -d /dev/$device > /tmp/oldparts + sed 's/Id=8[32]/Id=fd/' /tmp/oldparts > /tmp/newparts + + mkdir -p /mnt/tmp + for part in $(awk '/^\/dev\/.*Id=8[23]/{ print $1 }' /tmp/oldparts) + do + md=/dev/md$(echo $part | sed 's|^.*[^0-9]||') + + if grep -q "^$part .*Id=83" /tmp/oldparts + then + e2fsck -f -C0 $part + partsize=$(resize2fs -f $part 2>&1| sed -n 's|.* \([0-9]\+\) blocks long.*|\1|p') + resize2fs -fp $part $(($partsize-72)) + fi + + mdadm -C $md -l 1 -n 2 -R $part missing + + if grep -q "^$part .*Id=83" /tmp/oldparts + then + e2fsck -f -C0 $md + resize2fs -fp $md + + mount $md /mnt/tmp + [ -r /mnt/tmp/etc/fstab ] && sed -i "s|/dev/$device\([0-9]\+\)|/dev/md\1|" /mnt/tmp/etc/fstab + umount /mnt/tmp + + + elif grep -q "^$part .*Id=82" /tmp/oldparts + then + mkswap $md + fi + done + rmdir /mnt/tmp -set $disk -found=`echo $#` -if [ $found -gt "0" ] ; then - # Dump out current partitions - sfdisk -d /dev/$disk > /tmp/oldparts - - # Check if we have any ext2/3 or swap partitions - if grep -q 'Id=8[23]' /tmp/oldparts; then - echo -en "\n\nConverting partitions to RAID..." >/dev/tty3 - # Convert ext2/3 and swap partitions to raid autodetect - sed 's/Id=8[32]/Id=fd/' /tmp/oldparts > /tmp/newparts - - # Find swap partition for future checks - swap=`grep 'Id=82' /tmp/oldparts | sed "s/$disk\([0-9]\+\) :.*/md\1/"` - - # Loop throught partitions and convert to degraded raid1 - for part in `grep 'Id=8[23]' /tmp/oldparts | sed 's/ :.*//'`; do - mdpart=`echo $part | sed "s/$disk\([0-9]\+\)/md\1/"` - - echo -n "$part..." >/dev/tty3 - mdadm --create $mdpart --run --level=1 --raid-devices=2 $part missing - if [ "$mdpart" == "$swap" ]; then - # Recreate swap partition - mkswap $swap - else - # Resize ext2/3 partitions (fix superblock - part 1) - resize2fs -f $mdpart - fi - done - - echo "done" >/dev/tty3 - - # Write out new converted partition table - sfdisk --force /dev/$disk < /tmp/newparts - - echo -e "\nChecking filesystems on converted partitions. This may take a while." >/dev/tty3 - - mkdir /mnt/tmp - for part in `grep 'Id=fd' /tmp/newparts | sed "s/$disk\([0-9]\+\) :.*/md\1/"`; do - if [ "$part" != "$swap" ]; then - # Resize ext2/3 partitions (fix superblock - part 2) - echo -e "\n\nChecking $part..." >/dev/tty3 - e2fsck -f -C0 $part >/dev/tty3 - - # Check for /etc/fstab on partitions and convert entries - mount $part /mnt/tmp - if [ -r /mnt/tmp/etc/fstab ]; then - # XXX - FIXME - unportable hack for fstab. - # Only works for 6.x I suspect - cat /mnt/tmp/etc/fstab | sed "s/$disk\([0-9]\+\)/md\1/" | \ - sed -e "s:LABEL=/boot1:/dev/md1:" | \ - sed -e "s:LABEL=/:/dev/md3:" \ - > /mnt/tmp/etc/fstab.tmp - mv /mnt/tmp/etc/fstab.tmp /mnt/tmp/etc/fstab - fi - umount /mnt/tmp - fi - done - rmdir /mnt/tmp - mdadm --stop --scan - fi + mdadm --stop --scan + sfdisk --force /dev/$device < /tmp/newparts fi