cancer's blog

It's a star sign, not disease ;)

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:

dsc00753 300x225 NetBSD + CCD = dużo miejsca z małych dysków

Serwer z dwoma dyskami 70 GB

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:

dsc00758 300x225 NetBSD + CCD = dużo miejsca z małych dysków

kernel zaraportował tylko:

dsc00759 300x225 NetBSD + CCD = dużo miejsca z małych dysków

Komunikaty po włożeniu dysków

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 :)

dsc00765 300x225 NetBSD + CCD = dużo miejsca z małych dysków

Czy na pewno, na 100% jesteś pewny że chcesz lowlevel format zrobić? Tak! A czy aby na pewno?...

dsc00765 300x225 NetBSD + CCD = dużo miejsca z małych dysków

Czy na pewno, na 100% jesteś pewny że chcesz lowlevel format zrobić? Tak! A czy aby na pewno?...

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 :)

dsc00760 300x225 NetBSD + CCD = dużo miejsca z małych dysków

Całość pozapinana

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




VN:F [1.9.17_1161]
Rating: 0.0/10 (0 votes cast)
VN:F [1.9.17_1161]
Rating: 0 (from 0 votes)
pixel NetBSD + CCD = dużo miejsca z małych dysków

Popularity: 71% [?]

© odwiedź stronę http://maciejewski.org po więcej fajnych postów!

Podobne posty

  1. anonymous:

    A można na ccd postawić system, jest sens?
    Mam dwa dyski 20G+40G i chce, żeby system zobaczył mi to jako jeden 60GB ;)

    VA:F [1.9.17_1161]
    Rating: 0.0/5 (0 votes cast)
    VA:F [1.9.17_1161]
    Rating: 0 (from 0 votes)
  2. NetBSD + CCD = dużo miejsca z małych dysków | News NetBSD.pl:

    [...] 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/ [...]

Leave a Response

CommentLuv badge

  • RSS
  • Blip
  • Twitter
  • Facebook
  • GoldenLine
  • LinkedIn
  • Flickr