My Partition Resizing Exercise
By mock on May 06, 2008
The other day I needed to install a non-Solaris operating system onto my Ultra 40 M2. But I still wanted Solaris and/or Nevada as my primary operating system. Even though there are a bunch of virtualization technologies out there including the newly aquired VirtualBox, I wanted to run the operating system on the "iron" as they say.
The only problem, I had allocated 100% of all my disks to Solaris. I needed to decrease the fdisk partition on a couple of disks to make space to install other operating systems on. My disk layout was roughly
c1t0d0s0 - boot environment #1 root (ufs) c1t0d0s1 - boot environment #1 swap c1t1d0s0 - boot environment #2 root (ufs) c1t1d0s1 - boot environment #2 swap
And then a ZFS pool
NAME STATE READ WRITE CKSUM storage ONLINE 0 0 0 mirror ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 c1t3d0 ONLINE 0 0 0 mirror ONLINE 0 0 0 c1t0d0s7 ONLINE 0 0 0 c1t1d0s7 ONLINE 0 0 0
My thought was that since c1t0d0 and c1t1d0 were only partially allocated to the zpool (and the boot disks), that I would target those for repartitioning. Which meant, first step was to rebuild the zpool without them. I didn't really need them for more space in the zpool anyways.
First step, to break the mirror, on the partial space. This would allow me to make a "backup" of the pool while I rebuild it.
zfs detach c1t1d0s7 zpool create dataz c1t1d0s7 zfs snapshot -r storage@migration zfs send -R storage@migration > /dataz/storage.zfs
Now, destroy and recreate the main pool without the partial devices, and restore the data
zpool destroy storage zpool create storage mirror c1t2d0 c1t3d0 zfs receive -Fd storage < /dataz/storage.zfs
Easy enough. My pool no longer has the partial disks
mirror ONLINE 0 0 0 c1t2d0 ONLINE 0 0 0 c1t3d0 ONLINE 0 0 0
Now onto resizing the target disks. The goal was to do this without doing a reinstall at all. I have been using Live Upgrade for a while to continually keep my system up to date with Nevada/SXDE releases, so I figured I could use Live Upgrade while resizing the fdisk partitions to accomplish this.
Boot Environment Is Active Active Can Copy Name Complete Now On Reboot Delete Status -------------------------- -------- ------ --------- ------ ---------- sol-nv-87 yes yes yes no - sol-nv-85 yes no no yes -
So, first disk. First step remove the LU Boot Environment
Now, since nothing is using the disk, format and fdisk aren't going to complain. So, first thing, use fdisk to reduce the size of the Solaris partition. I just reduced it to 90% of the disk
fdisk c1t1d0p0 Total disk size is 36472 cylinders Cylinder size is 16065 (512 byte) blocks Cylinders Partition Status Type Start End Length % ========= ====== ============ ===== === ====== === 1 Solaris 1 32824 32824 90
And then recreated the Solaris layout with format
Current partition table (original): Total disk cylinders available: 32822 + 2 (reserved cylinders) Part Tag Flag Cylinders Size Blocks 0 root wm 132 - 1437 10.00GB (1306/0/0) 20980890 1 swap wu 1 - 131 1.00GB (131/0/0) 2104515 2 backup wu 0 - 32821 251.43GB (32822/0/0) 527285430 3 unassigned wu 0 0 (0/0/0) 0 4 unassigned wu 0 0 (0/0/0) 0 5 unassigned wu 0 0 (0/0/0) 0 6 unassigned wu 0 0 (0/0/0) 0 7 home wm 1438 - 32821 240.41GB (31384/0/0) 504183960 8 boot wu 0 - 0 7.84MB (1/0/0) 16065 9 unassigned wu 0 0 (0/0/0) 0
And finally, recreate the Boot Environment. I just made the new Boot Environment a copy of the current Boot Envionment, which happens to be Nevada/SXDE Build 87
lucreate -m /:/dev/dsk/c1t1d0s0:ufs -m -:/dev/dsk/c1t1d0s1:swap -n sol-nv-87-copy
And activate it and boot into it
luactivate sol-nv-87-copy init 6
All pretty straight forward so far. Now here comes what ends up being the sticky part. You would think that since I was booted into the new Boot Environment, that I could delete the old Boot Environment, and do to the same thing, but...
ludelete sol-nv-87 The boot environment
contains the GRUB menu. Attempting to relocate the GRUB menu. ERROR: No suitable candidate slice for GRUB menu on boot disk: INFORMATION: You will need to create a new Live Upgrade boot environment on the boot disk to find a new candidate for the GRUB menu. ERROR: Cannot relocate the GRUB menu in boot environment . ERROR: Cannot delete boot environment . Unable to delete boot environment.
That's what I was afraid of. The GRUB boot menu is sitting on the disk still. I searched around but could not find any way to move it. I found Slava Leanovich's blog entry which included instructions for moving the GRUB menu, and even though I tried that, ludelete still complained.
Well, gulp, here goes nothing. I decided to try to trick Solaris and not tell it I messed with the Boot Environment. First I made a ufsdump of root on that disk
ufsdump 0f /extra/holding/root.dump /dev/dsk/c1t0d0s0
Now with everything backed up from the disk, a big leap of faith. I went into fdisk and resized the Solaris parition as just before.
And then into format to recreate the disk layout. Of course this time I get the warnings
format c1t0d0 selecting c1t0d0 [disk formatted] /dev/dsk/c1t0d0s0 is in use for live upgrade /. Please see ludelete(1M). /dev/dsk/c1t0d0s1 is in use for live upgrade -. Please see ludelete(1M).
Yeah, You might think so Solaris. I move along and setup the layout.
Then, ufsrestore the data
newfs /dev/rdsk/c1t0d0s0 mount /dev/rdsk/c1t0d0s0 /mnt cd /mnt ufsrestore rf /extra/holding/root.dump
Sensing that this might not be enough, I decide to do a comple of things. First, reinstall GRUB manually, as described in Slava's entry
installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c1t0d0s0 stage1 written to partition 2 sector 0 stage2 written to partition 2, 235 sectors starting at 50
And then, just for grins, update this Boot Environment to the New Boot Environment I created just a little while earlier. I figured this should ensure that anything possible that I missed with ufsdump would be restored correctly
lumake -n sol-nv-87
Well, lumake returned success at least. Here goes nothing. Lets activate the Boot Environment and cross our fingers
luactivate sol-nv-87 init 6
Tah-Dah! Yet another reason why I love Solaris. You flex it in weird ways and it responds logically.