It's a star sign, not disease ;)
In: Job / Praca|NetBSD
9 sty 2009Dzięki za regularne odwiedziny na moim blogu! Jeśli uważasz, że jest on godny polecenia to śmiało wyślij link do niego lub link do kanału RSS albo subskrypcje przez e-mail znajomym. Dzięki !
Dzisiaj zajmiemy się fajną funkcją kernela NetBSD jaką jest CCD czyli Concatenated Disk Device (Powiązane Urządzenie Dyskowe). Służy ona do łączenia kilku fizycznych dysków (wd,sd) w jeden logiczny wolumen (ccd). Całość opiszę na przykładzie własnym wykonanym na serwerze IBM x346 z kontrolerem SCSI AIC-7902. Serwer ten jest dość mocno wykorzystywany ponieważ działa na nim IDS SNORT i niestety bardzo szybko kończy mu się miejsce na /var gdzie przechowywane są alerty. Co nam będzie potrzebne. Oprócz serwera i dysków, CCD w kernelu. Jeśli używasz GENERIC to CCD jest już tam domyślnie. Przed modyfikacją posiadał on dwa dyski SCSI po 70 GB:
1 2 3 4 5 6 | sd0 at scsibus1 target 0 lun 0: <ibm -ESXS, PYH073C3-ETS10FN, RXQN> disk fixed sd0: 70006 MB, 65494 cyl, 3 head, 729 sec, 512 bytes/sect x 143374000 sectors sd0: sync (6.25ns offset 80), 16-bit (320.000MB/s) transfers, tagged queueing sd1 at scsibus1 target 1 lun 0: </ibm><ibm -ESXS, PYH073C3-ETS10FN, RXQN> disk fixed sd1: 70006 MB, 65494 cyl, 3 head, 729 sec, 512 bytes/sect x 143374000 sectors sd1: sync (6.25ns offset 80), 16-bit (320.000MB/s) transfers, tagged queueing </ibm> |
i wyglądał tak:
Dołożyłem 4 dyski (po uprzednim dokupieniu ramek co nie jest takie proste w przypadku dwuletniego serwera) 17 GB, które od jakiegoś czasu leżakowały po wyjęciu z AS400 (lub eserver iseries, a nawet ostatnio i5, IBM i te jego zmiany nazw…). Tutaj drobny offtopic. Akurat to, że dyski uprzednio były w ASie jest dość istotne ponieważ przysparza to trochę kłopotów. Po przygotowaniu i włożeniu dysków:
kernel zaraportował tylko:
Po restarcie dyski niby zostały wykryte, ale przy normalnych komunikatach kernela pojawiło się coś jeszcze:
1 2 3 4 5 6 7 8 9 10 11 12 13 | sd2 at scsibus1 target 2 lun 0: <ibmas400 , DRVS18D, 1606> disk fixed sd2(ahd1:0:2:0): preposterous sector size: 0x20a. Defaulting to 512 bytes. sd2: 16742 MB, 29550 cyl, 2 head, 580 sec, 512 bytes/sect x 34287616 sectors sd2: sync (12.50ns offset 63), 16-bit (160.000MB/s) transfers, tagged queueing ses0 at scsibus1 target 8 lun 0: <ibm , 40K6480a S320 0, 1> processor fixed ses0: SAF-TE Compliant Device ses0: async, 8-bit transfers sd2(ahd1:0:2:0): preposterous sector size: 0x20a. Defaulting to 512 bytes. sd2(ahd1:0:2:0): generic HBA error sd2: dos partition I/O error sd2(ahd1:0:2:0): generic HBA error findroot: unable to read block 64 sd2(ahd1:0:2:0): generic HBA error</ibm></ibmas400> |
I tak x4 dyski. Oczywiście o disklabelowaniu i stworzeniu działającego CCD nie było mowy. Kilka osób sugerowało:
20:10 lama_: mhm, albo jakos specjalnei je trzeba przygotowac, albo netbsd ich nie lubi/tego kontroloera/ cos jeszcze trzeba tam ustawic itp.
15:08 lama_: kontrolera moze? ale watpie, to raczej kwestia firmware lub pogrzebania z nimi w AS ?
13:20 lama_: to jest cos na lini sprzet/kernel z urzadzeniami wedlug mnie, a nie z disklabel
13:17 lama_: to popatrz jeszcze po tasmach itp
13:12 lama_: jest to zdecydowanie problem na innym poziomie niz disklabel
20:08 < @emet> po wnikliwej analizie stwierdzam że coś jest spierdolone.
20:13 < @gavroche> cancer^, MAsz napisane.
20:13 < @gavroche> sd2(ahd1:0:2:0): generic HBA error
20:13 < @gavroche> :)
20:13 < @gavroche> Pewnie kontroler masz spierdolony.
20:14 < @lama_> to by dyski 1-2 nie dzialaly ok
20:14 < @gavroche> Może być jeden kanał spierdolony.
20:14 < @gavroche> Na przykład.
20:15 < @gavroche> Wtedy by działały.
20:18 < @lama_> host bus adapter
20:19 < @lama_> poszukaj jeszcze jakis firmware/bios updatow
20:20 < @lama_> i kable badaj/polaczenia/zworki/ustawienia itp. pierwsze co musisz wlasnie wyeliminowac to na 100% ze to nie jest jakis sprzetowy problem
20:28 < @gavroche> No, chyba, że masz za nowy sprzęt żeby na nim NetBSD uruchomić.
20:28 < @gavroche> To wtedy gorzej. :< 20:33 <@majkel> re
20:44 < @cancer^> gavroche: x346 ibm
20:44 < @cancer^> 2 latek
20:47 < @gavroche> No niestety. Przyjdzie Ci zaczekać na NetBSD 7.0. ;/
20:47 < @gavroche> Nie rozumiem Was, że używacie NetBSD do celów innych niż edukacyjne.
Na szczęście mimo czarnowidztwa kolegów, nic nie okazało się spierdolone, nie musiałem szukać biosów ani firmware do dysków i kontrolera, oszczędzone zostało mi także oczekiwanie na NetBSD 7.0 zwłaszcza, że mój zakład o NetBSD 5.0 vs Windows 7 nadal trwa :) NetBSD oprócz swoich walorów edukacyjnych będzie pełnił także dotychczasową rolę jako IDS oraz kilka innych zadań :)
A wszystko dlatego, że po wywiadzie na grupach dotyczących AS’a400 okazało się, ze IFS (system plików ASowy) modyfikuje dysk na tyle, że NetBSD nie umie sobie z nim poradzić – z tąd też komunikat: sd2(ahd1:0:2:0): preposterous sector size: 0x20a. preposterous = absurdalny :)
Lekarstwem na tą „absurdalną” wielkość sektora był lowlevel format wykonany z poziomu BIOS’a kontrolera. Po kilkunastu minutach i milionie potwierdzeń, dyski odzyskały nie tak absurdalną wielkość sektora jaką jest 512 bajtów zamiast 522 :)
Wracając do sedna postu. Mamy działające dyski i kernel już sobie z nimi radzi. Wszystko pozapinane (literalnie ;) na ostatni zatrzask więc do dzieła :)
Szybka kontrola, wszystko tym razem według oczekiwań, żadnych HBA error, żadnych absurdalnych sektorów (to naprawdę mi się podoba :), oraz żadnych I/O errorów w dosowych partycjach (a to już było wogóle od czapy :).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | sd0 at scsibus1 target 0 lun 0: <ibm -ESXS, PYH073C3-ETS10FN, RXQN> disk fixed sd0: 70006 MB, 65494 cyl, 3 head, 729 sec, 512 bytes/sect x 143374000 sectors sd0: sync (6.25ns offset 80), 16-bit (320.000MB/s) transfers, tagged queueing sd1 at scsibus1 target 1 lun 0: </ibm><ibm -ESXS, PYH073C3-ETS10FN, RXQN> disk fixed sd1: 70006 MB, 65494 cyl, 3 head, 729 sec, 512 bytes/sect x 143374000 sectors sd1: sync (6.25ns offset 80), 16-bit (320.000MB/s) transfers, tagged queueing sd2 at scsibus1 target 2 lun 0: <ibmas400 , DRVS18D, 1606> disk fixed sd2: 17501 MB, 29550 cyl, 2 head, 606 sec, 512 bytes/sect x 35843670 sectors sd2: sync (12.50ns offset 63), 16-bit (160.000MB/s) transfers, tagged queueing sd3 at scsibus1 target 3 lun 0: </ibmas400><ibmas400 , DRVS18D, 1606> disk fixed sd3: 17501 MB, 29550 cyl, 2 head, 606 sec, 512 bytes/sect x 35843670 sectors sd3: sync (12.50ns offset 63), 16-bit (160.000MB/s) transfers, tagged queueing sd4 at scsibus1 target 4 lun 0: </ibmas400><ibmas400 , DRVS18D, 1606> disk fixed sd4: 17501 MB, 29550 cyl, 2 head, 606 sec, 512 bytes/sect x 35843670 sectors sd4: sync (12.50ns offset 63), 16-bit (160.000MB/s) transfers, tagged queueing sd5 at scsibus1 target 5 lun 0: </ibmas400><ibmas400 , DRVS18D, 1606> disk fixed sd5: 17501 MB, 29550 cyl, 2 head, 606 sec, 512 bytes/sect x 35843670 sectors sd5: sync (12.50ns offset 63), 16-bit (160.000MB/s) transfers, tagged queueing </ibmas400></ibm> |
Po pierwsze patrzymy na disklabel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | disklabel sd2 # /dev/rsd2d: type: SCSI disk: DRVS18D label: fictitious flags: bytes/sector: 512 sectors/track: 606 tracks/cylinder: 2 sectors/cylinder: 1212 cylinders: 29550 total sectors: 35843670 rpm: 10040 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 |
1 2 3 4 5 6 | 4 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 35843670 0 4.2BSD 0 0 0 # (Cyl. 0 - 29573*) d: 35843670 0 unused 0 0 # (Cyl. 0 - 29573*) disklabel: boot block size 0 disklabel: super block size 0 |
Tak wygląda standardowy disklabel czystego dysku, modyfikujemy go do użycia przez CCD. Potrzebujemy jeden cały slice c (d w nomenklautrze NetBSD to cały dysk, a c to wszystkie slice NetBSD) minus 1x sectors/cylinder oraz typ systemu ccd. Czyli po szybkim przeliczeniu
1 2 3 | bc 35843670-1212 35842458 |
disklabel dla pierwszego dysku użytego w ccd będzie wyglądał tak:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | disklabel sd2 # /dev/rsd2d: type: SCSI disk: DRVS18D label: fictitious flags: bytes/sector: 512 sectors/track: 606 tracks/cylinder: 2 sectors/cylinder: 1212 cylinders: 29550 total sectors: 35843670 rpm: 10040 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 |
1 2 3 | 4 partitions: # size offset fstype [fsize bsize cpg/sgs] c: 35842458 1212 ccd # (Cyl. 1 - 29573*) |
Do edycji disklabela używamy komendy
1 | disklabel |
z opcją
1 | -e |
. Całą operację powtarzamy tyle razy ile mamy dysków odpowiednio przeliczając offset (no chyba, że macie wszystkie dyski takie same).
Dopisujemy nasze slice do konfiga ccd:
1 2 3 | cat /etc/ccd.conf #ccd ileave flags component devices ccd0 0 none /dev/sd2c /dev/sd3c /dev/sd4c /dev/sd5c |
oraz inicjujemy ccd:
1 2 | ccdconfig -C -f /etc/ccd.conf ccdconfig: /dev/sd5c: No such file or directory |
Tutaj jeszcze drobna poprawka, trzeba stworzyć urządzenia w /dev bo jakoś same się nie zrobiły:
Tworzymy i sprawdzamy czy jest ok:
1 | ./MAKEDEV sd5 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ll /dev/sd5* brw-r----- 1 root operator 4, 40 Jan 9 10:43 /dev/sd5a brw-r----- 1 root operator 4, 41 Jan 9 10:43 /dev/sd5b brw-r----- 1 root operator 4, 42 Jan 9 10:43 /dev/sd5c brw-r----- 1 root operator 4, 43 Jan 9 10:43 /dev/sd5d brw-r----- 1 root operator 4, 44 Jan 9 10:43 /dev/sd5e brw-r----- 1 root operator 4, 45 Jan 9 10:43 /dev/sd5f brw-r----- 1 root operator 4, 46 Jan 9 10:43 /dev/sd5g brw-r----- 1 root operator 4, 47 Jan 9 10:43 /dev/sd5h brw-r----- 1 root operator 4, 524328 Jan 9 10:43 /dev/sd5i brw-r----- 1 root operator 4, 524329 Jan 9 10:43 /dev/sd5j brw-r----- 1 root operator 4, 524330 Jan 9 10:43 /dev/sd5k brw-r----- 1 root operator 4, 524331 Jan 9 10:43 /dev/sd5l brw-r----- 1 root operator 4, 524332 Jan 9 10:43 /dev/sd5m brw-r----- 1 root operator 4, 524333 Jan 9 10:43 /dev/sd5n brw-r----- 1 root operator 4, 524334 Jan 9 10:43 /dev/sd5o brw-r----- 1 root operator 4, 524335 Jan 9 10:43 /dev/sd5p |
Wygląda na ok. Inicjujemy ccd jeszcze raz. Po poprawnym zainicjowaniu nie dostajemy żadnego komunikatu, ale za to w /dev pojawiaja nam się urządzenia ccd :)
1 | ccdconfig -C -f /etc/ccd.conf |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | ls -la /dev/ccd* brw-r----- 1 root operator 16, 0 Feb 22 2008 /dev/ccd0a brw-r----- 1 root operator 16, 1 Feb 22 2008 /dev/ccd0b brw-r----- 1 root operator 16, 2 Feb 22 2008 /dev/ccd0c brw-r----- 1 root operator 16, 3 Feb 22 2008 /dev/ccd0d brw-r----- 1 root operator 16, 4 Feb 22 2008 /dev/ccd0e brw-r----- 1 root operator 16, 5 Feb 22 2008 /dev/ccd0f brw-r----- 1 root operator 16, 6 Feb 22 2008 /dev/ccd0g brw-r----- 1 root operator 16, 7 Feb 22 2008 /dev/ccd0h brw-r----- 1 root operator 16, 524288 Feb 22 2008 /dev/ccd0i brw-r----- 1 root operator 16, 524289 Feb 22 2008 /dev/ccd0j brw-r----- 1 root operator 16, 524290 Feb 22 2008 /dev/ccd0k brw-r----- 1 root operator 16, 524291 Feb 22 2008 /dev/ccd0l brw-r----- 1 root operator 16, 524292 Feb 22 2008 /dev/ccd0m brw-r----- 1 root operator 16, 524293 Feb 22 2008 /dev/ccd0n brw-r----- 1 root operator 16, 524294 Feb 22 2008 /dev/ccd0o brw-r----- 1 root operator 16, 524295 Feb 22 2008 /dev/ccd0p |
Skoro już mamy ccd jako urządzenie, sprawdzamy jego disklabel:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | # rccd0d: type: ccd disk: ccd label: fictitious flags: bytes/sector: 512 sectors/track: 2048 tracks/cylinder: 1 sectors/cylinder: 2048 cylinders: 70004 total sectors: 143369832 rpm: 3600 interleave: 1 trackskew: 0 cylinderskew: 0 headswitch: 0 # microseconds track-to-track seek: 0 # microseconds drivedata: 0 |
1 2 3 4 | 4 partitions: # size offset fstype [fsize bsize cpg/sgs] a: 143369832 0 4.2BSD 0 0 0 # (Cyl. 0 - 70004*) d: 143369832 0 unused 0 0 # (Cyl. 0 - 70004*) |
Że tak powiem, automagicznie idealnie. Size jest sumą czterech dysków z ccd.conf. Po przeliczeniu mamy 67 GB do wykorzystania. Pozostało jeszcze tylko założyć system plików:
1 2 3 4 5 6 | newfs /dev/rccd0a /dev/rccd0a: 70004.8MB (143369832 sectors) block size 16384, fragment size 2048 using 380 cylinder groups of 184.23MB, 11791 blks, 23296 inodes. super-block backups (for fsck_ffs -b #) at: 32, 377344, 754656, 1131968, 1509280, 1886592, 2263904, 2641216, 3018528, 3395840, 3773152, 4150464, 4527776, 4905088, ...... |
i podmontować w wybranym miejscu:
1 2 | mkdir /usr/home/storage mount /dev/ccd0a /usr/home/storage/ |
Sprawdzamy czy wszystko gra:
1 2 3 4 5 6 7 8 9 10 11 | df -h Filesystem Size Used Avail Capacity Mounted on /dev/sd0a 1.9G 37M 1.8G 1% / /dev/sd0f 29G 12G 15G 44% /var /dev/sd0e 19G 16G 2.0G 89% /usr /dev/sd0g 13G 3.6G 9.2G 27% /usr/home tmpfs 781M 48K 781M 0% /tmp kernfs 1.0K 1.0K 0B 100% /kern procfs 4.0K 4.0K 0B 100% /usr/pkg/emul/linux/proc /dev/sd1e 67G 49G 15G 76% /backup /dev/ccd0a 67G 2.0K 64G 0% /usr/home/storage |
Wygląda na to, że wszystko w jak najlepszym porządku, możemy przetestować wydajność naszego nowego ccd:
1 2 3 4 | dd if=/dev/zero of=file_1GB bs=1m count=1k 1024+0 records in 1024+0 records out 1073741824 bytes transferred in 19.476 secs (55131537 bytes/sec) |
Imponujące :)
Jeśli jesteś zadowolony ze swojego setupu, ostatnią rzeczą jest dopisanie ccd=YES do rc.conf oraz do fstaba punktu montowania:
1 2 | echo ccd=YES >> /etc/rc.conf echo "/dev/ccd0a /usr/home/storage ffs rw,softdep 1 1" >> /etc/fstab |
Ostatni restart, aby zobaczyć czy wszystko gra i jeśli po restarcie masz podmontowany ccd tam gdzie powinien być to gratulacje – ccd skonfigurowany i działa :)
Jeszcze uwaga na koniec – FFS w NetBSD obsługuję partycję do wielkości 2 TB. Zatem jeśli chcesz połączyć dyski w więcej niż 2 TB, niestety trzeba zrobić kilka ccd, np, mój serwer backupowy dla userów posiada 4 TB w dwóch ccd:
1 2 | /dev/ccd0a 1.8T 1.5T 189G 89% /usr/home/bacula /dev/ccd1a 1.8T 1.0T 683G 60% /usr/home/bacula2 |
Popularity: 71% [?]
Viewed 261 times by 57 viewers
Witaj czytelniku! Nazywam się Bartosz Maciejewski i jestem Administratorem sieci oraz systemów UNIX/Windows. Na moim blogu znajdziesz zatem wpisy dotyczące głównie tej tematyki. Od czasu do czasu pisuję też bardziej prywatnie zwłaszcza o mojej córce Tosi Miłego Czytania! EOF ;)
2 Komentarzy to NetBSD + CCD = dużo miejsca z małych dysków
anonymous
Styczeń 28th, 2010 at 3:26 pm
A można na ccd postawić system, jest sens?
Mam dwa dyski 20G+40G i chce, żeby system zobaczył mi to jako jeden 60GB ;)
NetBSD + CCD = dużo miejsca z małych dysków | News NetBSD.pl
Marzec 19th, 2010 at 3:52 pm
[...] Bartosz “cancer” Maciejewski zamieścił na swoim blogu ilustrowaną relację z uruchomienia ccd: http://maciejewski.org/2009/01/09/netbsd-ccd-duzo-miejsca-z-malych-dyskow/ [...]