시스템이야기2015. 6. 29. 13:16

왜 FreeBSD는 2015년 7월의 윤초(Leap Second)에 대한 얘기가 없을까 싶을 것이다. 얼마전에 쓴 '2015년 윤초(Leap second) 삽입 관련 서버 점검사항'(2015.6.22.)에서도 리눅스(Linux)만 언급했다. 얘기가 없는 건 문제가 없기 때문이다.



2012년 윤초 삽입 때, 저는 FreeBSD서버에서 아무 것도 한 것이 없다.

윤초로 발생하는 문제가 없기 때문에 서버는 단지 1초의 시간차만 맞춰주면 된다.
이미 서버들은 시간동기화가 셋팅되어 있기 때문에 1초는 자동으로 맞춰진다. 따로 할 것이 없는 것이다.


(1) 상위 NTP 서버들(당신의 서버 아님) <-> (2) 내부 NTP서버 (당신이 관리하는 서버) <-> (3) ntpdate를 실행하는 다수의 서버들


위에서 나와 관련된 서버는 2번과 3번.


(2) ntpd 데몬을 돌리는 서버는 자동으로 상위 NTP 서버로 부터 윤초 삽입이 되어 시간동기화된다.
(3) 나머지 서버들은 내부 NTP서버를 통해 자동 동기화된다. (ntpdate 명령)


FreeBSD에서 윤초는 신경쓰지 말고, 편히 운영하세요.

FreeBSD 문서에 윤초를 다룬 'FreeBSD Support for Leap Seconds' 글이 하나 있는데 참고로 읽어보세요.


We believe and expect that FreeBSD, if provided correct and stable NTP service, will work as designed during this leap second, as it did during the previous ones.
... 생략 ...
In practice, leap seconds are usually not a problem on FreeBSD. We hope that this overview helps clarify what to expect and how to make the leap second event proceed more smoothly.



Posted by 좋은진호
시스템이야기2014. 4. 9. 15:19

OpenSSL 1.0.1버전에 TLS heartbeat 취약점(일명 Heartbleed Bug라고 부름. CVE-2014-0160, openssl: information disclosure in handling of TLS heartbeat extension packets)이 있습니다. 

공격자가 https서버의 메모리 64KB 데이터를 볼 수 있습니다. 메모리에는 https서버와 유저간에 주고 받은 데이터들(ID/PW, ... 등의 정보)이 있는데, 공격자는 plain text형태로 볼 수 있습니다. 그리고,SSL 개인키를 얻을 수 있습니다. 반드시 업데이트하세요.


http://a4.aurynj.net/post/82075898166/heartbleed (Heartbleed 이슈에 관해 정리)

http://yisangwook.tumblr.com/post/82056087918/openssl-heartbeat-heartbleed (OpenSSL 취약점 발견. Heartbleed)

http://heartbleed.com/


1. 취약한 버전


OpenSSL 1.0.0과 0.9.8 버전은 취약하지 않으며,

1.0.1은 1.0.1f까지 취약합니다. 1.0.1g에서 패치되었구요.


http://www.openssl.org/news/secadv_20140407.txt



2. RHEL, CentOS


# yum update openssl*

... 생략 ...

=====================================================================

 Package              Arch      Version               Repository        Size

=====================================================================

Updating:

 openssl              x86_64    1.0.1e-16.el6_5.7     updates          1.5 M

 openssl-devel        x86_64    1.0.1e-16.el6_5.7     updates          1.2 M



3. FreeBSD


# freebsd-update fetch

# freebsd-update install

# ls -la /usr/lib*/libssl*

-r--r--r--  1 root  wheel  685846 Apr  9 12:28 /usr/lib/libssl.a

lrwxr-xr-x  1 root  wheel      11 Feb 25 09:24 /usr/lib/libssl.so -> libssl.so.7

-r--r--r--  1 root  wheel  430352 Apr  9 12:28 /usr/lib/libssl.so.7

-r--r--r--  1 root  wheel  713782 Apr  9 12:28 /usr/lib/libssl_p.a

-r--r--r--  1 root  wheel  470850 Apr  9 12:28 /usr/lib32/libssl.a

lrwxr-xr-x  1 root  wheel      11 Feb 25 09:26 /usr/lib32/libssl.so -> libssl.so.7

-r--r--r--  1 root  wheel  363552 Apr  9 12:28 /usr/lib32/libssl.so.7

-r--r--r--  1 root  wheel  480306 Apr  9 12:28 /usr/lib32/libssl_p.a


업데이트 후 openssl사용하는 데몬은 재실행해주세요.



Posted by 좋은진호
시스템이야기2013. 2. 5. 12:50



Dell R620, R720 장비(Dell Rx20시리즈)가 작년 6월 정도에 출시되었다. 그런데 이 최신 장비에 작년말까지 FreeBSD를 사용할 수가 없었다. 크게 2가지 문제가 있었다.

  • RAID카드(MegaRAID) 인식 문제
  • NIC 인식 문제 (Broadcom의 BCM5720C 칩셋)

당시에 RAID카드 인식이 안되어서 설치 자체를 할 수가 없었다. 7월쯤에 SVN으로 RAID카드 관련 최신 커널 소스를 받아 패치하면 인식되어 설치는 문제없었다. 그러나 NIC인식은 여전히 문제였다.

bge0: watchdog timeout -- resetting
bge0: link state changed to DOWN
bge0: link state changed to UP

작년 11월말에 해당문제를 해결한 bge 커널 소스가 올라왔다. (국내 yongari님이 commit한 소스임)

http://svnweb.freebsd.org/base/stable/9/sys/dev/bge/if_bge.c?view=log

  With this change, bge(4) should work on any 5717/5718/5719/5720
  controllers. Special thanks to Mike Hibler at Emulab who setup
  remote debugging on Dell R820. Without his help I couldn't be able
  to address several issues happened on Dell Rx20 systems. And many
  thanks to Broadcom for continuing to support FreeBSD!

  Submitted by:    davidch (initial version)
  H/W donated by:    Broadcom
  Tested by:    many
  Tested on:    Del R820/R720/R620/R420/R320 and HP Proliant DL 360 G8


이 bge 소스는 12월 릴리즈된 FreeBSD 9.1에 포함되지 않았다. NIC인식을 위해서 별도의 수고가 필요하다.
http://svnweb.freebsd.org/base/stable/9/sys/dev/bge/ 에서 if_bge.c과 if_bgereg.h 를
http://svnweb.freebsd.org/base/stable/9/sys/dev/pci/ 에서 pcireg.h 를 받아서
각각 /usr/src/sys/dev/bge/ 와 /usr/src/sys/dev/pci/ 에 복사한다.
그리고 커널 컴파일(/usr/src/에서 make -j8 kernel)하고 리부팅하면 NIC 인식에 문제가 없다.
FreeBSD 8.x 또한 SVN에 해결된 소스가 있으니 최신 SVN 소스를 받은 후 컴파일하면 인식될 것이다. (해보지는 않음)


FreeBSD 9.1 최신 SVN버전의 CD 만드는 방법은 '나만의 FreeBSD ISO 이미지 만들기'에 자세히 적어뒀다.

Posted by 좋은진호
IT이야기2010. 9. 14. 12:30
ZFS 파일시스템은 snapshot(스냅샷) 기능을 제공하여, 원하면 언제든지 snapshot시점으로 복원할 수 있다. 명령어 한줄로 snapshot을 만들고, 명령어 한줄로 복원한다. snapshot 생성을 매일 1회 이상 자동으로 실행되도록 해주면, 데이터 복원에 유용할 것이다.

ZFS 파일시스템

참고로 FreeBSD 8.0은 ZFS v13을, 8.1은 v14를 지원한다. FreeBSD 8.2 또는 9.0에서는 v15를 지원할 예정이다. ZFS v15는 Solaris 10 update 8과 FreeBSD간의 호환성이 좋아졌으며, ZFS파일시스템에 php 코드가 있을 경우에 기존보다 15~20%정도 RPS가 향상되었다.

이 글은 FreeBSD에서 ZFS파일시스템을 운영한 것을 토대로 작성했지만 OS와 상관없이 ZFS파일시스템이라면 동일하게 적용된다.

1. snapshot 만들기

이론적으로 snapshot은 최대 2의 64제곱개까지 만들 수 있다. snapshot은 같은 스토리지 풀(파일시스템, 볼륨)의 공간을 사용한다.

snapshot을 만들어보자. snapshot시에 형식은 '파일시스템@snapshot명' 또는 '볼륨@snapshot명'이다. snapshot 이름은 기존 이름과 중복되지 않으면 임의로 만들면 된다.

# zfs snapshot data/log@2010_0621_1740_Mon

snapshot이름은 개인적으로 '년월일' 형식을 선호한다. snapshot 목록을 볼 때, 별도 속성 옵션(-o creation)을 줘야 생성일자를 볼 수 있는 불편함 때문이다. 좀 더 직관적으로 표기하기위해 요일까지 붙여줘도 좋다.

2. snapshot 확인하기

생성된 snapshot 목록을 살펴보자. 생성일시를 알고 싶다면 -o creation의 추가 옵션이 필요하다.

# zfs list -t snapshot
NAME                          USED  AVAIL  REFER  MOUNTPOINT
... 생략 ...
 data/log@2010_0619_0701_Sat   26K      -  20.9M  -
 data/log@2010_0620_0701_Sun   30K      -  21.5M  -
 data/log@2010_0621_0701_Mon   31K      -  21.5M  -
 data/log@2010_0621_1740_Mon     0      -  28.5M  -

3. snapshot rollback하기

rollback은 snapshot 방법과 동일하다. 특정 시점으로 되돌리고 싶으면 해당 'snapshot명'을 지정하기만 하면 된다.

# zfs rollback data/log@2010_0621_1740_Mon
cannot rollback to 'data/log@2010_0621_1740_Mon': more recent snapshots exist
use '-r' to force deletion of the following snapshots:
data/log@2010_0621_1750_Mon
data/log@2010_0621_1813_Mon

위의 경우는 data/log@2010_0621_1740_Mon 스냅샷 이후(즉, 보다 최근)에 2개의 스냅샷이 존재하기 때문에 나오는 메시지이다. 이를 무시하고 롤백하려면 -r 옵션(Recursively)을 주면 된다.

# zfs rollback -r data/log@2010_0621_1740_Mon

※ 여기서는 snapshot 생성, 확인, 복원에 대해 간단하게 적었으며, 자세한 글은 '커피닉스(coffeenix.net)'에 올려뒀다.

* 관련글
2009/02/26 - [시스템이야기] - FreeBSD 7에서 ZFS 사용 (유연성은 좋으나, 성능은 불만족)

Posted by 좋은진호
IT이야기2010. 1. 13. 12:41
BSD Magazine
작년 4월에 발매되었던 'BSD Magazine' ( http://bsdmag.org/ )이 2월부터 온라인 버전으로 무료 제공된다고 BSD Magazine 편집장이 밝혔다. 또한 현재까지 발매된 잡지를 온라인으로 다운로드 받을 수 있다. 메일주소만 입력하고 -> 메일로 받은 인증URL을 클릭하면 -> pdf파일을 다운로드 받을 수 있다. 2010년 1월 잡지를 받아봤는데, 84페이지의 알찬 내용이 들어있었다.



다음은 BSD Magazine 편집장이 FreeBSD 메일링에 보낸 내용이다.

[FreeBSD-Announce] BSD Magazine goes free!
We are happy to announce that BSD Magazine is transforming into a free
monthly online publication. The online version of BSD Magazine will stay
in the same quality and form. It will look like the BSD magazine one is
familiar and comfortable with. Please sign up to our newsletter at
www.bsdmag.org and get every issue straight to your inbox. Also, you can
now download any of the previous issues from our website. The first
online issue -- 2/2010 -- is coming out in February. Please spread the
word about BSD Magazine.

Best regards,
Michal Gladecki, Editor-in-Chief of BSD Magazine

국내 잡지에서 BSD관련 내용을 보기 힘든데, BSD Magazine의 무료 선언은 단비같은 소식이다. 이제 좀 더 geek하게 놀아볼까?

* 관련글
  - BSD 매거진, 4월에 ( 2008.2.9 )
 
Posted by 좋은진호
IT이야기2009. 7. 24. 09:00
BSDstats.org 에는 BSD 계열 OS의 사용 통계 정보를 볼 수 있다. 이 통계는 BSDStats툴을 통해 이뤄지는데, PC-BSD와 DesktopBSD는 기본적으로 BSDStats툴이 설치된다. 그러나 FreeBSD등을 포함한 나머지 계열은 수동으로 설치해야 한다. 따라서 PC-BSD와 DesktopBSD의 비율이 상대적으로 높을수 밖에 없다. 현실을 그대로 반영한 것이 아니니 그냥 재미삼아 보면 된다. 참고로 FreeBSD는 /usr/ports/sysutils/bsdstats 에서 설치하면 된다.

  • PC-BSD     16,922 (71.96%)
  • FreeBSD      5,336 (22.69%)
  • DesktopBSD 1,087 (4.62%)
  • NetBSD           64 (0.27%)
  • OpenBSD        52 (0.22%)
  • DragonFly       29 (0.12%)
  • MidnightBSD   13 (0.06%)
  • MirBSD            8 (0.03%)
  • Debian GNU/kFreeBSD 6 (0.03%) <-- 오~ Debian GNU/kFreeBSD 사용자도 있다.
freebsd

FreeBSD는 OS 버전별로 어느 정도 사용하는지 i386기준으로 확인해봤다.
http://www.bsdstats.org/bt/releases/os/FreeBSD.html
  • 6.x     2,257 (59.93%)
  • 7.x     1,142 (30.32%) <-- 작년 2월에 나온 7.x대 비율이 생각보다 높다.
  • 5.x     179
  • 4.x     139
  • 8.x     49

그런데 눈에 확 들어오는 릴리즈 정보가 하나 있었다. 7.2-YAHOO-20090507 오~ Yahoo? 그 이전 자료를 검색해보니 7.1-YAHOO-20081204 가 나온다. 야후에서 직접 등록한 것일까? 야후는 FreeBSD 프로젝트를 후원하고, FreeBSD OS도 많이 운영하는 것으로 알려져 있다. 그래서 더욱 궁금해진다.


다음은 Netcraft에서 yahoo.com 으로 확인한 OS 정보.
yahoo의 OS

[ yahoo.com의 OS정보. netcraft에서 확인한 정보 ]



Posted by 좋은진호
IT이야기2009. 4. 27. 18:32
youtube 유튜브
작년말 유튜브(YouTube)에 BSDConferences 채널이 만들어진 이후 지금까지 모인 동영상이 벌써 50개가 되었다. BSD인증시험이 있다는 것을 처음알게 된 것이 여기에 등록된 'MeetBSD 2008'행사 동영상이었다. FreeBSD 임베디드에 대해 더 깊이 알게 된 것도 바로 여기였다.


[ 최근에 올라온 'faster packets: performance tuning in the openbsd network' 동영상 ]

처음에 이 채널에 갈 때는 슈퍼가는 느낌이었다. 이제는 대형마트에 들어선 느낌이다. 혼자 있으면 그저그런 평범한 존재에 불과 했을테지만, 함께 모이니 남다른 가치를 지니게 되었다. 역시 모이면 그 가치는 커진다. 마치 '멧칼프의 법칙'처럼.

Posted by 좋은진호
시스템이야기2009. 2. 26. 09:30

FreeBSD 7.0부터는 오픈솔라리스의 ZFS(Zettabyte File System)을 사용할 수 있다. ZFS는 파일시스템과 볼륨관리자가 통합되어 있는 장점을 최대한 살려 한두개의 과정만으로 파일시스템을 바로 사용할 수 있다. 또한 마치 찰흙을 붙였다 떼었다 하는 듯한 느낌으로 볼륨 관리의 유연성을 맛 볼 수 있다. 그러나 FreeBSD에서는 아직 실험적으로 동작중이며, IO 성능 또한 만족스럽지 못하다. 결국 FreeBSD에서 만큼은 미래를 위해 맛보기용 파일시스템로 즐기면 될 듯 싶다.

간단한 ZFS의 특징을 정리하면.

- 파일시스템 + 볼륨관리자가 통합되었다.
- 128비트 파일시스템이며, 디렉토리와 파일의 갯수에 제한이 없다.
- 미러링, 그리고 RAID기능에 해당하는 raidz를 지원한다.
- 물리적 disk를 쉽게 스토리지 풀에 추가할 수 있다.
- 상태 모니터링이 효과적이다. (iostat, status, history, get 등)
- 스냅샷 기능을 지원한다.

1. ZFS 풀과 파일시스템 생성 (zpool create, zfs create, zpool list, zfs list)

# zpool create data mfid0s1h
# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
data                   31.8G    110K   31.7G     0%  ONLINE     -
# df -t zfs
Filesystem    1K-blocks    Used    Avail Capacity  Mounted on
data           32771968       0 32771968     0%    /data

zpool create 명령만으로 쉽게 '스토리지 풀'을 생성했다. 이 명령 하나만으로 바로 파일시스템을 이용할 수가 있다. 매우 간단하지 않는가?
리눅스의 LVM과 비교해보자. LVM은 PV 생성 -> VG 생성 -> LV 생성의 3과정을 거쳐야 한다. 1) 디스크나 파티션을 LVM으로 사용하겠다고 선언하는 PV(Physical Volume) 생성(pvcreate) 과정. 2) 이후 PV를 하나의 큰 덩어리로 묶는 VG(Volume Group) 생성(vgcreate) 과정. 3) 필요한 만큼만 떼어 내어 실제 사용가능한 파일시스템으로 만드는 LV(Logical Volume) 생성 과정. 이와 비교하면 zfs는 정말 간단하다.

이제 하나의 풀에 여러 파일시스템을 만들어보자.

# zfs create data/backup
# zfs create data/log
# zfs create data/photo
# zfs list
NAME          USED  AVAIL  REFER  MOUNTPOINT
data          182K  31.3G    22K  /data
data/backup    18K  31.3G    18K  /data/backup
data/log       18K  31.3G    18K  /data/log
data/photo     18K  31.3G    18K  /data/photo

data 풀에 data/backup, data/log, data/photo 파일시스템을 생성했다. 그런데 마운트포인트가 모두 /data 아래로 생성되었는데, 다른 곳으로 할 수는 없을까? zfs set 명령 하나면 바로 변경 가능하다. 또는 생성할 때 -o mountmpoint=/backup 옵션으로 지정할 수 있다.
(※ zfs get all 또는 zfs get mountpoint로 속성 정보를 얻을 수 있다.)

# zfs set mountpoint=/backup data/backup
# zfs list /backup
NAME          USED  AVAIL  REFER  MOUNTPOINT
data/backup    18K  31.3G    18K  /backup
# df -h -t zfs
Filesystem    1K-blocks    Used    Avail Capacity  Mounted on
data              31G      0B     31G     0%    /data
data/log          31G      0B     31G     0%    /data/log
data/photo        31G      0B     31G     0%    /data/photo
data/backup       31G      0B     31G     0%    /backup

위의 파티션을 보면 용량이 모두 31GB로 표시되었다. zfs의 각 파티션이 '스토리지 풀'의 최대 용량까지 함께 사용하기 때문이다. data/photo 파티션은 5G만 사용하라고 쿼터를 할당해보자. 이 쿼터는 허용치만큼 늘릴 수도 줄일 수도 있다. 리눅스의 LVM이 확장하는 것만 가능(lvextend)한 것과 비교하면 상당히 유연한 자세를 취하고 있다.

# zfs set quota=5g data/photo
# zfs list data/photo
NAME         USED  AVAIL  REFER  MOUNTPOINT
data/photo    18K  5.00G    18K  /data/photo
#
# zfs set quota=3g data/photo
# zfs list data/photo
NAME         USED  AVAIL  REFER  MOUNTPOINT
data/photo    18K  3.00G    18K  /data/photo
#
# df -h data/photo
Filesystem    Size    Used   Avail Capacity  Mounted on
data/photo    3.0G    128K    3.0G     0%    /data/photo

만약 다른 파티션에서 용량을 사용하게 되면 그 양만큼 다른 파티션은 사용할 공간이 줄게 된다. 아래를 보면 /data/log가 11G를 사용중이다. 그래서 다른 파티션은 31GB-11GB 뺀 용량이 전체 사이즈로 표현된다.

# df -h -t zfs
Filesystem     Size    Used   Avail Capacity  Mounted on
data            20G      0B     20G     0%    /data
data/log        31G     11G     20G    35%    /data/log
data/photo     3.0G    128K    3.0G     0%    /data/photo
data/backup     20G      0B     20G     0%    /backup

ZFS는 자체에 데이터 안정성을 높을 높이는 mirror와 RAID-Z 기능을 제공한다. mirror기능으로 풀을 만들어 보자.

# zpool create backup mirror mfid1 mfid3
# df -h -t zfs
Filesystem    Size    Used   Avail Capacity  Mounted on
backup         66G      0B     66G     0%    /backup

디스크는 SAS 73GB짜리이다. ufs 또는 zfs로 1개의 파일시스템을 만들면 66GB가 나온다. 2개 디스크인데, 132GB가 아닌 66GB로 표시되는 것은 mirror로 생성되었음을 보여준다. mirror로 설정되어 있는지 확인하는 방법은 뒤에서 다시 얘기하겠다.

2. zfs는 당신이 한 일을 모두 알고 있다. (zfs history)

# zpool history
History for 'data':
2009-02-16.18:32:06 zpool create data mfid0s1h
2009-02-16.18:33:23 zfs create data/backup
2009-02-16.18:33:31 zfs create data/log
2009-02-16.18:33:50 zfs create data/photo
2009-02-16.18:35:19 zfs set mountpoint=/backup data/backup
2009-02-16.18:41:17 zfs create -o mountpoint=/work data/work
2009-02-16.18:51:07 zfs set quota=5g data/photo
2009-02-16.19:00:09 zfs set quota=3g data/photo
2009-02-16.19:16:41 zfs set quota=5g data/photo
2009-02-16.19:21:36 zfs set quota=3g data/photo
2009-02-16.19:28:49 zfs destroy data/work

'data' 풀에 적용된 작업이 모두 나왔다.

3. 상태 살펴보기 (zpool iostat, zpool status)

# zpool iostat 2
               capacity     operations    bandwidth
pool         used  avail   read  write   read  write
----------  -----  -----  -----  -----  -----  -----
data        11.4G  20.4G      8     63   881K  1.58M
data        11.6G  20.1G      0  1.75K  32.0K   128M
data        11.9G  19.9G      0  1.88K  64.0K   133M
data        12.1G  19.7G      0  2.09K  32.0K   128M
data        12.3G  19.4G      0  2.17K  64.0K   131M
data        12.6G  19.2G      0  2.20K  32.0K   137M
data        12.8G  18.9G      0  2.33K  32.0K   139M
data        12.9G  18.9G    610  1.49K  75.8M  77.8M
data        12.9G  18.9G    521  1.61K  65.0M  89.7M
data        12.9G  18.9G    615  1.35K  76.5M  71.2M

IO 상태를 2초간격으로 살펴본 것이다. 리눅스나 FreeBSD에서 iostat를 해봤을 것이다. iostat는 디스크별로 IO를 보는 것이며, zpool iostat는 '스토리지 풀'별로 살펴보는 것이다. 'data' 풀의 ONLINE상태를 확인할 수 있다.

# zpool status
  pool: data
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        data        ONLINE       0     0     0
          mfid0s1h  ONLINE       0     0     0

다음은 'backup'풀이 mfid1, mfid3 2개 disk를 사용하여 mirror되어 있는 것을 볼 수 있다.

# zpool status
  pool: backup
 state: ONLINE
 scrub: none requested
config:

        NAME        STATE     READ WRITE CKSUM
        backup      ONLINE       0     0     0
          mirror    ONLINE       0     0     0
            mfid1   ONLINE       0     0     0
            mfid3   ONLINE       0     0     0

errors: No known data errors

4. ZFS 풀과 파일시스템 unmount & 지우기 (zpool destroy, zfs umount, zfs destroy)

파일시스템를 umount하기 위해서는 'zfs umount 파일시스템' 형태로 하며, 완전 제거는 'zfs destroy'로 한다. 파일시스템이 사용중이지 않으면 바로 unmount와 제거가 가능하다.

# cd /data/log
# zfs umount  data/log
cannot unmount '/data/log': Device busy
# cd /
# zfs umount  data/log
# zfs mount   data/log
# zfs destroy data/log

스토리지 풀 전체를 제거할 때도 마찬가지로 zpool destroy로 하면 된다.

# zpool list
NAME                    SIZE    USED   AVAIL    CAP  HEALTH     ALTROOT
data                   31.8G   10.9G   20.9G    34%  ONLINE     -
# zpool destroy data
cannot unmount '/backup': Device busy
could not destroy 'data': could not unmount datasets
# cd /
# zpool destroy data
# zpool list
no pools available

5. FreeBSD에서는 ZFS를 서비스에 적용할 수 있을까? (성능 및 기타 사항)

ZFS는 최소 1GB이상의 메모리를 권장한다. 그러나 ZFS는 실제 많은 메모리를 사용하는 경우가 있다. 파일시스템 성능 체크를 하는 동안 panic: kmem_malloc(16305): kmem_map too small: 332353536 total allocated 같은 메시지를 뿌리면서 몇 번 다운되었다. i386 환경에서는 kmem address space(vm.kmem_size_max)의 최대값이 320M으로 되어 있다. 그러나 이 수치는 ZFS을 사용하기에는 낮은 수치이므로 기본값을 그대로 사용할 경우에는 커널 패닉이 발생할 수 있다고 한다. 그래서 나도 다운이 된 것이었다. vm.kmem_size는 read only값이므로 /boot/loader.conf 에 다음 2줄을 추가한다. 그리고 부팅을 하고, 필요시 이 수치는 더 늘리면 된다.

vm.kmem_size="512M"
vm.kmem_size_max="512M"

[ 부팅 전 ]
# sysctl -a|grep kmem
vm.kmem_size_scale: 3
vm.kmem_size_max: 335544320
vm.kmem_size_min: 0
vm.kmem_size: 335544320

[ 부팅 후 ]
# sysctl -a|grep kmem
vm.kmem_size_scale: 3
vm.kmem_size_max: 536870912
vm.kmem_size_min: 0
vm.kmem_size: 536870912

bonnie++로 Sequential Output/Input/Create, Random, Random Create의 성능 비교를 했다. ufs 파일시스템과 비교했을 때 각 항목별로 대략 2~5배 이하의 만족스럽지 못한 성능이 나왔다. zfs 기본 생성외에 mirror로 이뤄진 풀, raidz 로 이뤄진 풀도 낮은 수치인 것은 마찬가지였다.

그리고, 부팅 후 ZFS를 처음 create할 때는 다음과 같은 메시지가 나온다.

This module (opensolaris) contains code covered by the
Common Development and Distribution License (CDDL)
see http://opensolaris.org/os/licensing/opensolaris_license/
WARNING: ZFS is considered to be an experimental feature in FreeBSD.
ZFS filesystem version 6
ZFS storage pool version 6

'WARNING' 부분이 보이는가? FreeBSD에서는 실험적인 상태이고, 성능 또한 상당히 낮으니, 편리함과 유연함을 높이 산다고 하더라고 서비스에 적용하기는 무리가 있다. 아직 FreeBSD에서는 재밌게 즐기면 된다. 즐기다 보면 미래에 적용해도 괜찮을 때가 오겠지...

6. 참고 자료

* ZFS 시작하기
* ZFS Tuning Guide
* FreeBSD 7.1 달라진 것 몇가지 (2009.1.20, 글 좋은진호)
* FreeBSD 7.0 사용기 (2008.3.7, 글 좋은진호, ZFS 사용기 일부 포함)



Posted by 좋은진호
시스템이야기2009. 1. 19. 19:23

FreeBSD 7.1의 큰 변화는 첫째 기본 스케쥴러의 변경, 두번째 '트레이싱, 디버깅 그리고 모니터링의 강화'라고 할 수 있을 정도로 이부분의 발전이 돋보인다. 달라진 것을 간단히 적어본다.

1. SCHED_ULE 스케쥴러

GENERIC 커널에서 기본 스케줄러가 SCHED_4BSD 에서 SCHED_ULE 으로 변경되었다. 7.0에서는 커널 컴파일을 통해서 SCHED_ULE 로 변경할 수 있었다.

options         SCHED_ULE               # ULE scheduler

2. DTrace

   OpenSolaris의 DTrace가 드디어 FreeBSD에 포팅되었다.  DTrace 사용을 위해서는 커널 설정 파일에 다음을 추가한다.

options         KDTRACE_HOOKS           # Kernel DTrace hooks
options         DDB_CTF

   그리고, 모든 소스는 CTF 옵션을 포함된 상태로 리빌드되어야 한다.

 # cd /usr/src
 # make WITH_CTF=1 kernel

DTrace사용을 위한 자세한 준비 과정은 http://www.freebsd.org/doc/en/books/handbook/book.html#DTRACE 에서

3. 몇가지 명령어의 옵션 추가

   1) top 명령에서 -P 옵션으로 CPU별 통게를 볼 수 있다. 리눅스 top에서 '1'를 눌러을 때와 같은 것으로 보면 되다.
      (이 옵션은 FreeBSD 6.4에서도 사용 가능)

last pid: 96507;  load averages:  0.00,  0.00,  0.00                            up 5+04:46:52  19:08:27
25 processes:  1 running, 24 sleeping
CPU 0:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 1:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 2:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 3:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 4:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 5:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 6:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
CPU 7:  0.0% user,  0.0% nice,  0.0% system,  0.0% interrupt,  100% idle
Mem: 12M Active, 7956K Inact, 37M Wired, 1088K Cache, 13M Buf, 1941M Free
Swap: 4096M Total, 4096M Free

   2) top 명령에서 -a 옵션으로 프로세스의 argument를 볼 수 있다.

  [ 옵션 사용전 ]
  PID USERNAME  THR PRI NICE   SIZE    RES STATE  C   TIME   WCPU COMMAND
39948 coffeenix   1  44    0  8432K  2792K select 0   0:23  0.00% sshd
  857 root        1  44    0  5880K  2372K select 1   0:04  0.00% sendmail
  867 root        1   8    0  3212K  1036K nanslp 2   0:01  0.00% cron

  [ top -a ]
  PID USERNAME  THR PRI NICE   SIZE    RES STATE  C   TIME   WCPU COMMAND
39948 coffeenix   1  44    0  8432K  2792K select 0   0:23  0.00% sshd: coffeenix@ttyp0 (sshd)
  857 root        1  44    0  5880K  2372K select 1   0:04  0.00% sendmail: accepting connections (sendmail)
  867 root        1   8    0  3212K  1036K nanslp 2   0:01  0.00% /usr/sbin/cron -s

   3) vmstat  -P 옵션으로 CPU별 통계를 볼 수 있다. (이 옵션은 FreeBSD 6.4에서도 사용 가능)

# vmstat -P 1
 procs      memory      page                    disks     faults         cpu0     cpu1     cpu2     cpu3    
 r b w     avm    fre   flt  re  pi  po    fr  sr da0 da1   in   sy   cs us sy id us sy id us sy id us sy id
 0 0 0  82940K   891M    29   0   0   0    29   7   0   0   16  100  449  0  0 100 0  0 100 0  0 100 0  0 100
 0 0 0  82940K   891M     1   0   0   0     0   0   0   0    7  117  370  0  1 99  0  0 100 0  3 97  0  0 100

   4) traceroute 명령에서 -a옵션으로 AS number도 함께 볼 수 있다.

   5) arp 명령에서 reject와 blackhole 키워드를 지원한다.

   6) cp 명령에서 -a 옵션(archive mode)을 지원한다. -RpP 옵션과 동일. 리눅스의 GNU cp 옵션과 동일하다고 보면 된다.

4. /etc/sysctl.conf.local 설정 파일

   rc 스크립트(/etc/rc.d/sysctl)에서 /etc/sysctl.conf 로딩한 후에 /etc/sysctl.conf.local 설정도 로딩하도록 되어 있다.
   따라서 서버별 개벌 설정은 sysctl.conf를 수정하지 않고 /etc/sysctl.conf.local에 넣어도 된다.

5. truss 명령

   truss는 리눅스의 strace, 솔라리스의 truss처럼 프로세스의 시스템 콜을 추적한다. FreeBSD 6.x 버전에서는 truss를 사용하기 위해서 아래처럼 process 파일시스템을 /proc에 마운트 해줘야 했다. 그러나 FreeBSD 7.0부터 더이상 procfs 파일시스템에 의존하지 않기 때문에 mount_procfs 명령을 사용할 필요없이 시스템 콜을 추적할 수 있다.

   # mount_procfs /dev/procfs /proc

   사용예) truss ls

   -f 옵션을 사용하면 fock되는 프로세스까지 추적할 수 있다.

6. 부트로더의 변경으로 USB에서 부팅할 수 있고, GPT 레벨 디스크에서 부팅할 수 있다.

* 2008/04/18 - [IT이야기] - FreeBSD 7 관련 도서 2권
* 2008/03/11 - FreeBSD 7.0과 Linux 간의 성능 비교
* 2008/03/07 - [시스템이야기] - FreeBSD 7.0 사용기
* 2008/02/28 - [시스템이야기] - FreeBSD 7.0 릴리즈

Posted by 좋은진호
IT이야기2008. 12. 10. 19:36
골빈해커님의 '역시 아직은 Perl 이 짱이에염~!'  글과 aero님의 'Wanna Kill Perl?'  글을 읽고, FreeBSD 6.4에서 perl 등의 스크립트가 몇개가 되는지 확인해봤다.  체크할 디렉토리는 스크립트에 나온 PATH 환경 변수( grep !m{^/home}, split /:/, $ENV{PATH} )를 그대로 사용했다. /usr/local/etc, /etc/ 등에 shell 스크립트가 다수 존재하지만 제외했다.

* PATH 환경 변수
PATH=/sbin:/bin:/usr/sbin:/usr/bin:/usr/games:/usr/local/sbin:/usr/local/bin:/usr/X11R6/bin:/home/truefeel/bin

* 실행 결과 (FreeBSD)
bin                      885
perl                      47
ruby                      26
sh                        78

역시 FreeBSD에서도 perl이 많다. 그래 'No Perl, No Unix' 맞다. ^^

Posted by 좋은진호