Unix

Btrfs 테스트 2

ForceCore 2010. 2. 27. 02:07
또 btrfs에 도전. LVM에 대해 분노했음. -_-;;
운영체제는 Ubuntu 9.10에서 하다가 불안정해서 Debian Sid (더 최신 커널)로 옮김.

btrfs로... 괜히 이상한 raid하지 말고, meta data만 raid1, 실제 자료는 raid0로 용량만 크게 확보하기로 함. raid0하다가 디스크 하나 날아가면, 날아가는 자료만 날아가고 멀쩡한 하드의 자료는 살아남는 것이 목표.

가상 컴퓨터가지고 하기 귀찮다. 1G짜리 파일을 생성해서 하기로 했음.
dd if=/dev/zero of=span4 bs=1 count=1 seek=4096M
ls -lh
로 확인하면 순식간에 4기가 파일이 생겼음을 알 수 있다.

span1: 1G
span2: 1G
span3: 2G
span4: 4G
이렇게 생성했다. 얘들이 각각 파티션 하나다.
개발자돌도 가상머신 일일이 하기 솔직히 귀찮으니 이미 이런 식으로 접근 했음.

http://btrfs.wiki.kernel.org/index.php/Using_Btrfs_with_Multiple_Devices
룹백을 열심히 생성.
# losetup /dev/loop1 span1
# losetup /dev/loop2 span2
# losetup /dev/loop3 span3
# losetup /dev/loop4 span4

span1, span2파일을 써서 raid0를 만듦. 용량은 2GB여야함.
# mkfs.btrfs -m raid1 -d raid0 /dev/loop1 /dev/loop2

마온트 하고...
# mount /dev/loop1 /mnt
$ df -h
/dev/loop1            2.0G   28K  2.0G   1% /mnt
으음... 1기가짜리를 두개 붙였으니 당연히 2G로 보여야 하겠다. 정확하네. 디스크를 일단 꽉채워보자.
mech.mp3를 열심히 복사해서 1.mp3 2.mp3 ... 등으로 복제했다. 실제로 2기가를 다 꽉채우진 못하고 1.6기가가 된다. 원래 그게 정상임. ㅇㅇ;;

loop3을 추가하자...
# btrfs-vol -a /dev/loop3 /mnt
$ df -h
/dev/loop1            4.0G  1.7G  2.4G  41% /mnt
용량이 더 추가되었다. +_+;; 그런데 실제로는 파일을 write할 수 없다 OTL


file system의 크기도 늘려줘야 하기 때문임. df -h로 나오는건 아무래도 pool size인듯 싶다.
resizing실험을 하기 전에 디스크 교체 실험을 해보자.
btrfs -r /dev/loop1 /mnt
이러면 용량은 여전히 (아직) 2GB지만 loop1의 자료가 loop3으로 넘어가야 할 것 같다... 만 무한루프. 아직 무한루프 버그가 있는거군!;; (몇개월전 해봤을 때에도 같은 현상. http://forcecore.tistory.com/1059)

/dev/loop1            4.0G  1.5G  2.6G  37% /mnt
root@lullu:~# btrfs-vol -r /dev/loop1 /mnt

Segmentation fault
실망이야 ㅋㅋ;; 용량을 꾹꾹 채우지 않고 좀 비운 상태로 했는데... -_-;; 이번엔 무한푸르는 아니고  segmentation fault가 뜬다...;; 최신버전 (소스에서 컴파일한)은 잘 되려... 나...

역시... 지금까진 ubuntu 9.10에서 했는데, debian sid의
Linux debian 2.6.32-2-amd64 #1 SMP Fri Feb 12 00:01:47 UTC 2010 x86_64 GNU/Linux
이 커널에선 뭔가 약간 다르군.

0.mp3 ~ 378.mp3 까지 마구 만들어지던 ubuntu kernel에 비해 sid에서는 368까지만 만들어지더라...

btrfs-vol -r로 작은 하드를 빼는게 실패하는건 여전하다. 그러나 꾹꾹 채운 다음에라도 무한루프에 빠지진 않는군... 그래도 아직 갈 길이 멀다 ㅡ,.ㅡ;;;;;;;;;;;;;;;;;

꽉 채우진 않고 약간 여유가 있는 상태에서 btrfs-vol -r을 하니, 이번엔 하드가 잘 빠져나온다. 굿. 그러나 용량확장이 도무지 되지 않는다. 1+1+2의 하드를 해도 파일을 단 1mb도 넣을 수 없다. 하드 낭비군! 더 큰 하드를 하나 달고 제일 작은 1G짜리 하드를 완전히 없애니(2+3) 용량확장이 그나마 되었다... 다시 1+1을 달아
1+1+2+3 = 7GB
이렇게 구성하니 6GB까지 쓸 수 있었다. 은근 overhead가 크군.
1g + 1g를 한 뒤 2g를 달고 1g를 빼어도 어쩐지 용량이 늘지 않더라니, overhead탓인듯 하다.

이제 쓰기 시작해도 될것 같... 기는 하다. 앞으로 디스크 포멧이 업데이트 되더라도 호환이 되게 잘 고려를 한다고 하니까 디스크가 뻑나는 버그에 걸리지 않는 한, 데이터를 못 읽게 될 걱정은 없을 듯 싶다.



아직 하나 안 해본 것이 있다. 디스크 하나가 뻑나도... 다른 디스크의 데이터는 쓸 수 있을 것인가? 모든 디스크를 raid0로 묶고, mp3를 여러개 채웠다.

 언마운트 하고... 가장 첫 디스크를 뻑냈다... 아... 이 시점에선 virtual box에서 하고 있었음.
# dd if=/dev/zero of=/dev/sda1 bs=4096
이렇게 해서 디스크 하나를 박살낸다. 그러면..

debian:~# btrfs-show
failed to read /dev/hdc
failed to read /dev/fd0
Label: none  uuid: c5b8d7a2-9de4-492f-8342-44d83866af45
    Total devices 4 FS bytes used 4.90GB
    devid    4 size 3.00GB used 1.93GB path /dev/sdd1
    devid    2 size 1019.72MB used 894.12MB path /dev/sdb1
    devid    3 size 2.00GB used 1.93GB path /dev/sdc1
    *** Some devices missing

Btrfs Btrfs v0.19

missing이라고 당연히 그럴테고...
# mount -o degraded /dev/sdb1 /mnt
sda는 망가졌지만 일단 살아있는 아무거나 같다 대면 된다.
이러면 일단 마운트는 되고, 파일 목록도 일단 보인다. 내용은... ㅋㅋㅋ;;;...
그러나... 실험이 잘 안 되네;; 그 이후 진행이 안 된다.
# btrfs-vol -r missing /mnt
를 시전해줄 차례인데... 그냥 커널에러 무한루프... 혹은 segmentation fault. OTL 재부팅 후 또 해보려고 하면,
debian:/mnt# dmesg | tail
[  138.517356] device fsid 1a47676e02a073b8-842f83e9451a2ab3 devid 3 transid 15 /dev/sdc1
[  138.612154] end_request: I/O error, dev fd0, sector 0
[  141.850258] device fsid 1a47676e02a073b8-842f83e9451a2ab3 devid 2 transid 15 /dev/sdb1
[  141.850839] btrfs: allowing degraded mounts
[  141.851140] btrfs: failed to read chunk root on sdb1
[  141.851243] btrfs: open_ctree failed
[  276.933899] device fsid 1a47676e02a073b8-842f83e9451a2ab3 devid 2 transid 15 /dev/sdb1
[  276.934621] btrfs: allowing degraded mounts
[  276.935117] btrfs: failed to read chunk root on sdb1
[  276.935246] btrfs: open_ctree failed

이런 식이다. (...) 아직 갈 길이 멀군... 이 아니고

재부팅 한 뒤에
# btrfsctl -a
이걸 해줘야 한다. 이 부분이 아직 자동화 되지 않았다. 이것을 해준 뒤 마운트를 시도해보면... 집에 가서 해봐야겠음.

btrfsctl -a
해도 안 먹을 때가 있는데 이런 때은 btrfsctl -a 를 한 뒤 mount를 시도한 뒤 다시 btrfsctl -a 를 해주면 된다 (-_-) ㅎㄷㄷ

근데 missing device 제거는 여전히 안 된다. 이전이랑 비슷한 맥락으로, 용량이 꽉 찬 파티션은 그렇게 되는듯 싶다.