From owner-freebsd-questions Sat Jul 18 14:28:42 1998 Return-Path: Received: (from majordom@localhost) by hub.freebsd.org (8.8.8/8.8.8) id OAA00439 for freebsd-questions-outgoing; Sat, 18 Jul 1998 14:28:42 -0700 (PDT) (envelope-from owner-freebsd-questions@FreeBSD.ORG) Received: from alpo.whistle.com (alpo.whistle.com [207.76.204.38]) by hub.freebsd.org (8.8.8/8.8.8) with ESMTP id OAA00434 for ; Sat, 18 Jul 1998 14:28:41 -0700 (PDT) (envelope-from julian@whistle.com) Received: (from daemon@localhost) by alpo.whistle.com (8.8.5/8.8.5) id OAA17200; Sat, 18 Jul 1998 14:19:12 -0700 (PDT) Received: from current1.whistle.com(207.76.205.22) via SMTP by alpo.whistle.com, id smtpd017197; Sat Jul 18 21:19:03 1998 Date: Sat, 18 Jul 1998 14:18:57 -0700 (PDT) From: Julian Elischer To: Spidey cc: Greg Lehey , Question=answer Subject: Re: Howto: UNUSED data on HD, Melting 2 partitions into 1 In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII Sender: owner-freebsd-questions@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG On Sat, 18 Jul 1998, Julian Elischer wrote: > 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 ^ 4 > 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 . 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 ^ entries > 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: > > > > 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: > > > > >>>>>>>>>>>>>>>>>>>>>>>>> > > > > 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 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 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 ) > 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. > It occurs to me that this may be enough for you.. The new space doesn't need to be part of the existing BSD slice.. we can simply add another. Using disklabel -e you can correct the partitions here so that only partition c and d exist, and both cover the entire SLICE. then newfs the new 'd' partition. newfs /dev/rwd0s4d this would be all you ned to do.. enter it into the /etc/fstab as wd0s4d you should be done.. > 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 > To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-questions" in the body of the message