Hand on gmirror (Was: Re: gmirror bugs, how many?)
João Carlos Mendes Luís
jonny at jonny.eng.br
Fri Nov 26 11:55:54 PST 2004
Pawel Jakub Dawidek wrote:
> All I'm saying is that you first should create a mirror, then create slices
> and partitions on top of mirror provider, because you want to use
> mirror/vol0s1a, not ad0s1a. Note, that mirror/vol0 is one sector shorter
> than ad0 and imagine a situation when gmirror stores metadata in the same
> place where BSD stores it - if you first create a mirror and then
> partitions on ad0 you'll overwrite gmirror metadata. This very painful,
> that in MBR metadata is visible on traffic providers and I don't want to
> repeat that mistake.
>
> +> >+> Now, lets reboot. I could not unload geom_mirror, since it was
> +> >+> preloaded during boot, is this expected? The device could not be
> +> >+> unloaded, but the volume disapeared (gmirror list, ls /dev/mirror).
> +> >
> +> >If there is no mirror configured, you should be able to unload it.
> +>
> +> Before putting it in /boot/loader.conf, unload worked, even with mirror
> +> devices configured, IIRC. Only after loader.conf preloading this
> +> problem appeared.
>
> What error do you get when you try to do this?
Step by step:
- The system has started with a preloaded geom_mirror:
sigesc::root jcmendes [521] kldstat
Id Refs Address Size Name
1 13 0xc0400000 3126c4 kernel
2 1 0xc0713000 10be8 geom_mirror.ko
3 14 0xc0724000 59340 acpi.ko
4 1 0xc106a000 6000 linprocfs.ko
5 1 0xc1070000 18000 linux.ko
6 1 0xc1183000 2000 fade_saver.ko
sigesc::root jcmendes [522] cat /boot/loader.conf
geom_mirror_load="YES"
sigesc::root jcmendes [523]
- There is a running mirror partition:
sigesc::root jcmendes [523] gmirror list
Geom name: vol0
State: COMPLETE
Components: 1
Balance: load
Slice: 4096
Flags: NONE
SyncID: 1
ID: 4105191088
Providers:
1. Name: mirror/vol0
Mediasize: 8447426048 (7.9G)
Sectorsize: 512
Mode: r0w0e0
Consumers:
1. Name: ad1s1
Mediasize: 8447426560 (7.9G)
Sectorsize: 512
Mode: r0w0e0
State: ACTIVE
Priority: 0
Flags: NONE
SyncID: 1
ID: 4260835530
Geom name: vol0.sync
sigesc::root jcmendes [524]
- Now let's try to remove (disable was my intention, a bad idea):
sigesc::root jcmendes [524] gmirror unload
Could not unload module: Device not configured.
sigesc::root jcmendes [525] gmirror list
sigesc::root jcmendes [526] gmirror load
Command 'load' not available.
sigesc::root jcmendes [527] gmirror list
sigesc::root jcmendes [528] kldstat
Id Refs Address Size Name
1 13 0xc0400000 3126c4 kernel
2 1 0xc0713000 10be8 geom_mirror.ko
3 14 0xc0724000 59340 acpi.ko
4 1 0xc106a000 6000 linprocfs.ko
5 1 0xc1070000 18000 linux.ko
6 1 0xc1183000 2000 fade_saver.ko
sigesc::root jcmendes [529] ls -l /dev/mirror/
total 1
dr-xr-xr-x 2 root wheel 512 Nov 26 12:19 .
dr-xr-xr-x 5 root wheel 512 Nov 26 12:19 ..
sigesc::root jcmendes [530]
- Well, something not good happened. The device did not unload, and do
not list any device anymore. Trying to "reload" it has no effect.
- This used to work before preloading it in loader.conf, but then I
would not be able to boot a mirror partition.
>
> +> The man page says only:
> +>
> +> -h Hardcode providers' names in metadata.
> +>
> +> and does not explain when I should use this.
> +>
> +> Do you mean that if I want it to use ad1s1 as the provider, and not ad1,
> +> -h is what I want?
>
> Only when you share the last sector between those two providers.
> You can still create ad1s1, which is one sector shorter.
Good idea. This should go into the manual also...
Indeed, the -h option is what I wanted and the "bug" is in the
manual. What would happen if I change the disc ID in this case?
> +> And even if gmirror is correct, there's also the problem shown with
> +> disklabel in my previous email.
>
> What problem is there when you use proper order of doing things?
I could not describe how repeat it. Maybe it was a side effect of
not cleaning the disc before.
Let me start from a clean disk. To make sure no previous data
causes any error, I have first zeroed the contents of the test disk.
Then I ran "fdisk -i ad1", "gmirror label -h -b load vol0 ad1s1" and
finally "disklabel -w -B mirror/vol0". After this the /dev and
disklabel state is:
sigesc::root jcmendes [552] ls -l /dev/ad1* /dev/mirror/*
crw-r----- 1 root operator 4, 16 Nov 26 11:46 /dev/ad1
crw-r----- 1 root operator 4, 31 Nov 26 11:50 /dev/ad1s1
crw-r----- 1 root operator 4, 132 Nov 26 11:20 /dev/ad1s1a
crw-r----- 1 root operator 4, 133 Nov 26 11:20 /dev/ad1s1c
crw-r----- 1 root operator 4, 121 Nov 26 11:59 /dev/mirror/vol0
crw-r----- 1 root operator 4, 134 Nov 26 11:20 /dev/mirror/vol0a
crw-r----- 1 root operator 4, 135 Nov 26 11:20 /dev/mirror/vol0c
sigesc::root jcmendes [553] disklabel mirror/vol0
# /dev/mirror/vol0:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 16498864 16 unused 0 0
c: 16498880 0 unused 0 0 # "raw" part,
don't edit
sigesc::root jcmendes [554]
Seems good until now. Except for the offset 16 of the "a" partition.
Is this necessary? The man page says that the only sector reserved
for metadata is the provider's last one.
I've made some tests after this, including changing the disklabel
offset to 0, without no problem until now. I think that using 0 makes
the disk fully compatible with a no-mirror one, and copying is easier.
If I understood correctly your statements, this is your intention too,
so this could be a bug.
Now let me try the off by -1 approach.
sigesc::root jcmendes [509] fdisk -i ad1
...
Information from DOS bootblock is:
1: sysid 165 (0xa5),(FreeBSD/NetBSD/386BSD)
start 63, size 16498880 (8056 Meg), flag 80 (active)
beg: cyl 0/ head 1/ sector 1;
end: cyl 1007/ head 15/ sector 62
2: <UNUSED>
3: <UNUSED>
4: <UNUSED>
Should we write new partition table? [n] y
sigesc::root jcmendes [510]
- Note that the last sector is 62 and not 63, I've changed it, despite
some warnings.
sigesc::root jcmendes [517] disklabel -w -B mirror/vol0
sigesc::root jcmendes [518] disklabel mirror/vol0
# /dev/mirror/vol0:
8 partitions:
# size offset fstype [fsize bsize bps/cpg]
a: 16498863 16 unused 0 0
c: 16498879 0 unused 0 0 # "raw" part,
don't edit
sigesc::root jcmendes [519]
Again, the same problem with offset 16. But the block devices look
like ok:
sigesc::root jcmendes [519] ls -l /dev/ad1* /dev/mirror/*
crw-r----- 1 root operator 4, 16 Nov 26 17:38 /dev/ad1
crw-r----- 1 root operator 4, 59 Nov 26 17:39 /dev/ad1s1
crw-r----- 1 root operator 4, 85 Nov 26 12:19 /dev/ad1s1a
crw-r----- 1 root operator 4, 86 Nov 26 12:19 /dev/ad1s1c
crw-r----- 1 root operator 4, 72 Nov 26 17:41 /dev/mirror/vol0
crw-r----- 1 root operator 4, 87 Nov 26 12:19 /dev/mirror/vol0a
crw-r----- 1 root operator 4, 88 Nov 26 12:19 /dev/mirror/vol0c
sigesc::root jcmendes [520]
Maybe my anxiety to see this working made me panic with the first
problems and I let my mistakes be taken as system bugs.
BTW, this system is using 5.3-stable, from cvsup syncronized at Nov 22.
Thanks for your help.
More information about the freebsd-hackers
mailing list