Date: Sat, 18 Jul 1998 12:59:31 -0700 (PDT) From: Julian Elischer <julian@whistle.com> To: Spidey <beaupran@JSP.UMontreal.CA> Cc: Greg Lehey <grog@lemis.com>, Question=answer <freebsd-questions@FreeBSD.ORG> Subject: Howto: UNUSED data on HD, Melting 2 partitions into 1 Message-ID: <Pine.BSF.3.95.980718111821.17992A-100000@current1.whistle.com> In-Reply-To: <Pine.BSF.3.96.980718102149.443B-100000@outpost.nada.org>
next in thread | previous in thread | raw e-mail | index | archive | help
Sorry for taking so long to get back to you.. Some of this should go into the FAQ I think.. Greg is both right and wrong.. It's dangerous and trick, but it can be done.. There are some rather extreme shortcuts that can be made.. I have done far worse stuff than this.. I once shifted the root partition while I was running on it :-) but it's been a couple of years since it tried this so beware.. firstly terminology.. I will ALWAYS refer to the partitions defined by block0 (the MBR) as slices. I will always refer to the partitions defined in a BSD disklabel as partitions.. Slices are defined by a table in the MBR. the program 'fdisk' prints out the contents of this table. (or lets you edit it). There are rows in the table. Each row is capable of defining a portion of disk. This portion becomes the slice of that number.. e.g. the first entry in the table becomes slice 1, the 2nd becomes slice 2 etc. The position of each slice on the disk is totally independent of the order in which they appear in the table. So the last entry in the table may point to the first section of disk and the first may point to a portion of disk beyond that pointed to by the last. If an entry in the table points to nothing (i.e. is all zeroes) it is shown as <UNUSED>. any portion of the disk can be pointed to by 0, 1 ,2 ,3 or 4 entries in the table. it is usually considered an error to have a block included in 2 or more entries, but it can be done.. If the 'type' of a slice is '386BSD' then the system will further look inside that slice to see if there is a 'disklabel' (on block 1 (the second block) of that slice). If there is, it will read that disklabel and extract the "partition table" from it. This is similar in concept to the table I mentioned before. There are 8 rows to the table, each of which defines a partition. You may leave a row empty in which case it wil not appear in the disklabel when printed. the first entry in the table defines partition 'a', the second defines partition 'b', etc. One quirk of the present disklabels is that the 'on disk' format of the disklabels defines those partitions with block numbers relative to the BEGINNING OF THE DISK, rather than relative to the beginning of the slice in which the disklabel resides. (in the future this may change) This is a historical bogosity, which is hidden from you when you look at the disklabel, by a huge programming kludge.. Another thing to remember is that by definition the 3rd row of the table (partition 'c') is magic, and you should always make it equal to the whole slice on which you have the disklabel. In some cases if this is not so, the system might even correct it before showing it to you. I try to discourage people from using the 'c' partiton, because the 'magic' may change some day in which case they would be screwed.. Once again, any block in the slice can be pointed to by 0 , 1, 2 .... 8 tables. The numbers 1, or 2 being legal. A patch of disk bay be pointed to by 0 if it is at the end of the slice and beyond the 'c' part. This should only happen in odd cases. (like there is a bad block out there you want to avoid). If a block is not being used in any real partition, it should still be within the range pointed to by the 'c' part.. This is the '1' case. The normal case is if it is pointed to by a single 'normal' part, and of course is also within the range of the 'c' part. This is the '2' case. Now having said that.. lets look at your questions.. On Sat, 18 Jul 1998, Spidey wrote: > > First, I must ask another question prior to the others. Could somebody > explain these outputs of fdisk and df? > >>>>>>>>>>>>>>prompt>df > Filesystem 1K-blocks Used Avail Capacity Mounted on > /dev/wd0s2a 31775 16238 12995 56% / > /dev/wd0s3 1023856 942944 80912 92% /dos > /dev/wd0s2f 1132103 989859 51676 95% /usr > /dev/wd0s2e 29727 24393 2956 89% /var > procfs 4 4 0 100% /proc > >>>>>>>>>>>>>>>prompt>fdisk > ******* Working on device /dev/rwd0 ******* > parameters extracted from > in-core disklabel are: > cylinders=839 heads=128 sectors/track=63 (8064 blks/cyl) > > parameters to be used for BIOS calculations are: > cylinders=839 heads=128 sectors/track=63 (8064 blks/cyl) > > Media sector size is 512 > Warning: BIOS sector numbering starts with sector 1 > Information from DOS bootblock is: > The data for partition 1 is: > <UNUSED> > The data for partition 2 is: > sysid 165,(FreeBSD/NetBSD/386BSD) > start 3072384, size 3690312 (1801 Meg), flag 80 > beg: cyl 381/ sector 1/ head 0; > end: cyl 838/ sector 24/ head 80 > The data for partition 3 is: > sysid 6,(Primary 'big' DOS (> 32MB)) > start 8064, size 2048256 (1000 Meg), flag 0 > beg: cyl 1/ sector 1/ head 0; > end: cyl 254/ sector 63/ head 127 > The data for partition 4 is: > <UNUSED> > >>>>>>>>>>>>>>>>>>>>>>>>> > > Few mysterieies: > 1) It is said clearly that my FBSD partition is 1801Mb in size. How come > that the sum of my df numbers is only 1193609Kb (?=1.2Gb)???? I miss > about 700Mb here!!!! you didn't show the disklabel output.. You have defined a BSD slice but we can't se what you defined the internal structure of that space to be like.. > > 2) Why isn't fdisk giving the size of <UNUSED> partitions? fdisk only shows the contents of the table.. the unused regions of the disk are unused exactly because they are not in the table.. You can only discover the unused portions by inspection.. they are: sectors 1->8063 (4 MB) Microsoft wastage. sectors 2056320 -> 3072384 (~500MB) sectors 6762696 -> ??? (possibly 0 MB, as I don't know the number of sectors in your drive.) There are also sections of the BSD slice that are not pointed to by any real disklabel entry (at least none that you have mounted.) As you haven't show the output of disklabel I can't give you exact help, but you shoud do 'disklabel -e -r /dev/rwd0s2' and add a table entry on the end that points to the 500MB that you haven't used in that slice. Make sure you also update the 'number of partitions' entry as well or the new entry in the table will not be used.. (maybe this is hte mistake you already made?) > > 2.2) Therefore, how can I identify What are these <UNUSED> partitions? I > know one is 500Mb of free space, but the other???? No you are confused.. these are just empty entries in the table. > > Now back to my reply... > > On Sat, 18 Jul 1998, Greg Lehey wrote: > > > On Friday, 17 July 1998 at 8:00:44 -0400, Spidey wrote: > > > Hi! > > > > 1 GB DOS > > > 500 MB Free > > > 1750 MB FBSD > > > > > > Now I wish to fit in the 500 MB that is before the FBSD. Is it a different > > > procedure? > > > > >From what? > yes it is.. first: do fdisk and disklabel and PRINT THEM OUT you'll need them to recover if we screw up.. TO add space to the FRONT of a FreeBSD slice we need to make use of the fact that the Partition table entries in a disklabel are **based from block0 of the DISK**. (remember I mentioned this before?) This means that no matter where the disklabel is in the disk, it still refers to the same portions of disk. This is actually bad in all cases except this single case.. what you should do is get the 'fixit' floppy and the boot floppy from the 'floppies' directory in the distribution. Boot from them (boot from the boot floppy and select the 'fixit' option and then follow directions.) You could also do this from single-user mode but if you get it wrong you need to be able to fix it :-) in either case the procedure is the same ########## WARNING.. GROSS HACK!! ############################## fdisk -u /dev/rwd0 edit the LAST table entry (presently <UNUSED>) give it the following values: start: 2056320 size: 1016064 ending: 3072383 type 165 this will define a new BSD partition that points to the unused space below the BSD partition. but it is LATER in the table so it won't be the default BSD part.. it will show up after a reboot as /dev/rwd0s4 -reboot- in the same way you just did.. copy the bootblocks and disklabel from the existing BSD partition to the new one. dd if=/dev/rwd0s2 of=/dev/rwd0s4 count=16 this copies the first 8k. you now have a disklabel in that slice. and becasue the blocks are refered to in ABSOLUTE TERMS the table entries for the partitions still point to the starts of the partitions in the other slice. reboot: (may not be needed but......) disklabel -r /dev/rwd0s4 we should get some valid info but it will probably complain mightily. If code has been added to munge the disklabel when we read it from the other partition (since I tried this last), all the offsets would be wrong and the 'a' part would start at 0 instead of 500MB in. CHECK IF THIS IS SO. If so we need to fix the offsets. let me know and we'll ammend the instructions.. TRY use the disklabel -e command below and fix the fields mentionned below, if it won't let you, do the next boot and continue.. Up until this point you should still have a running system....... Now come the part when we pull the carpet out from under our own feet.. do fdisk -u /dev/rwd0 and expand the last part to size 4706376 and set the type, size and start of the old BSD part to 0 reboot again. (if it doesn't boot into single user mode, use the fixit disk/boot disk combo.) disklabel -er /dev/rwd0s4 fix the size of the 'c' partition fix the 'sectors per unit' entry. reboot THEORETICALLY you should now have a single bsd slice, with the existing partitions in it with a bunch of free space before them use dikslabel -e -r /dev/rwd0s4 to add a new partition to use the new 500MB space use newfs to put filesystems on both new partitions (teh noew one at teh front and the new one at the end. add entries in /etc/fstab to use them. IF this fails you can recover by: booting the fixit way, doing fdisk -u /dev/rwd0 and typing in all the entries that were there before.. let me know how it goes! julian To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?Pine.BSF.3.95.980718111821.17992A-100000>