게으른 리눅스: 시스템 관리자를 위한 열 가지 트릭
게으른 리눅스: 시스템 관리자를 위한 열 가지 트릭생산적인 리눅스 시스템 관리자가 되는 방법 |
난이도 : 초급 Vallard Benincosa, Certified Technical Sales Specialist, IBM 2008 년 9 월 30 일 열 가지 트릭을 익혀 전 우주에서 가장 강력한 리눅스(Linux®) 시스템 관리자가 되어봅시다. 음, 전 우주가 아닐지도 모르겠네요..., 하지만 큰 물에서 놀려면 이 정도 팁은 익힐 필요가 있답니다. SSH 터널, VNC, 암호 복구, 콘솔 훔쳐보기 등을 익힙시다. 각 트릭에는 예제가 따라오므로 각자 시스템에서 실험해볼 수 있습니다. 최강의 시스템 관리자는 효율성부터 다르다. 일반적인 관리자가 두 시간 만에 마칠 작업을 효율적인 시스템 관리자가 10분 내로 끝낸다면, 회사가 시간을 절약했고, 시간이 돈이니까 효율적인 관리자는 보너스를 받아야 하지 않겠는가? 트 릭은 효율성을 관리층에게 증명하는 데 있다. 이 기사에서 이런 정치적인 트릭을 다루지는 않겠지만 게으른 관리자의 트릭 주머니에 열 가지 핵심적인 보석을 넣어줄 계획이다. 여기서 소개하는 팁은 시간을 절약해주며, 좀 더 효율을 발휘해 돈을 벌지는 못할지라도 최소한 헤일로 게임을 하는 데 더 많은 시간을 확보할 수는 있을 것이다. 신 입 관리자가 레드몬드에서 만든 어떤 운영체제를 돌리는 서버의 DVD에 달려있는 추출 버튼을 눌렀을 때, 즉시 튀어나올 것이라고 말했다. 그러고 나서 대다수 엔터프라이즈 리눅스 서버에서는 이 디렉터리에서 프로세스가 동작하고 있다면 DVD 추출이 불가능하다고 불평했다. 어떤 프로세스가 동작하고 있으며 어떤 이유에서 DVD 드라이브를 놓아주지 않는지 모른다면 리눅스 관리자로서 기다리다 지쳐 기계를 재시동해서 튀어나오는 디스크를 회수할 것이다. 하지만 이런 방법은 효과적이지 못하다. 여기에 DVD 드라이브를 쥐고 있는 프로세스를 찾고 속이 후련해지도록 추출하는 방법을 설명한다. 우선 상황을 흉내내보자. 디스크를 DVD 드라이브에 넣고 터미널을 열어 DVD 드라이브를 마운트하자.
이제 두 번째 터미널을 열어 DVD 드라이브를 추출하려고 시도하자.
다음과 같은 메시지가 나온다.
추출에 앞서 누가 DVD를 사용하고 있는지 찾아보자.
동작 중인 프로세스를 확인했는데, 실제로 디스크를 추출하지 못한 이유는 우리 잘못 때문이다. 이제 루트 권한으로 전지전능한 힘을 빌어 프로세스를 죽이자.
쾅! 이제 자유를 찾았다. 엄숙하게 드라이브 마운트를 해제하자.
트릭 2: 화면이 엉망진창이 되었을 때 정상으로 되돌리기 다음과 같이 명령을 내려보자.
어찌된 영문인가! 터미널이 엉망진창으로 변했다. 입력하는 문자마다 매트릭스를 연상하게 만든다. 어떻게 해야 할까?
안심하자. 재시동은 없다고 확신하면서 reset 명령을 내릴 수 있다. 어서 명령을 내려보자.
이제 화면이 정상으로 돌아온다. 조금 전에 다섯 군데 기계를 거쳐 SSH로 접속했다면, 윈도우를 닫고 다시 한번 로그인하는 경우와 비교해 감지덕지다.
제품 공학 쪽에서 까다로운 사용자인 데이비드가 전화한다. "당신이 배포했던 새로운 기계에서 supercode.c를 컴파일하지 못하는 이유가 궁금합니다." "좋습니다" 당신이 말한다. "작업하고 있는 기계가 어딥니까?" 데이비드는 다음과 같이 말한다. "포쉬"(이 가상 회사는 운영 중인 서버 다섯 대에 대해 스파이스 걸즈를 본따 이름을 붙였다). "좋아요"라고 말하며 전지전능한 루트 위력을 실험하기 위해 또 다른 기계에서 데이비드로 변신한다.
그러고 나서 포쉬로 넘어간다.
포쉬로 들어왔다면 다음과 같은 명령을 실행한다.
그러고 나서 데이비드에게 큰 소리로 말한다. "데이비드, 터미널에서 다음과 같은 명령을 내려봐요. 데 이비드가 명령을 내리면 당신과 데이비드 터미널 세션이 성스러운 리눅스 셸에서 하나로 결합된다. 당신이 글자를 입력할 수도, 데이비드가 글자를 입력할 수도 있지만, 두 사람 모두 상대편이 하는 작업 광경을 볼 수 있다. 이렇게 하면 층을 오가는 수고를 덜어주며 동일한 통제 하에 작업을 공유할 수 있다. 이렇게 했을 경우에 데이비드는 문제 해결 기술을 관찰해 정확하게 문제를 풀어내는 방법을 살펴볼 수 있다. 마지막으로 두 사람은 문제가 무엇인지 알게 되었다. 데이비드가 만든 컴파일 스크립트는 새로운 서버에 존재하지 않는 예전 디렉터리를 포함하고 있었다. 마운트해서 다시 컴파일해 문제를 해결하고 데이비드는 작업을 하러 돌아갔다. 당신도 직전에 수행하고 있었던 게으른 작업으로 돌아간다. 이런 트릭을 쓰려면 두 사람 모두 동일 사용자로 로그인할 필요가 있다는 한 가지 주의 사항이 따라온다.
여기서 다시 한번
루 트 암호를 잊어버렸다. 이제 전체 시스템을 다시 설치해야 한다. 비극적인 이야기지만 몇 사람이 이렇게 하는 광경을 지켜봤다. 하지만 시스템에서 암호를 변경하는 방법은 놀랄 정도로 쉽다. (GRUB 암호를 걸어놓고 이 암호를 잊어버린 경우처럼) 모든 경우에 통하지는 않겠지만, 센트OS 리눅스를 사용하는 일반적인 경우에 어떻게 조치를 취하는지 정리했다. 우선 시스템을 재시동한다. 재시동할 때 그림 1과 같은 GRUB 화면을 보게 된다. 일반 부트를 진행하는 대신 화살표 키를 움직여서 이 화면에 그대로 머문다. 그림 1. 재시동 직후 GRUB 화면 이제 화살표 키를 사용해 부트할 커널을 선택하고 E를 눌러 커널 행을 편집한다. 그림 2와 같은 화면이 나온다. 그림 2. 커널 행 편집 준비 화살표 키를 다시 한번 사용해 그림 3. 숫자 1을 인수에 추가 그러고 나서 엔터와 B를 차례로 누르면 단일 사용자 모드로 커널이 부팅된다. 여기까지 왔다면
이제 리부팅하면 새로운 암호를 사용할 수 있다.
회사 방화벽으로 외부를 막은 누군가를 원격으로 지원할 필요가 있는 사이트에서 일하느라 고생한 적이 여러 번 있었다. 방화벽을 통해 외부로 나갈 수 있는지 눈치챈 사람은 별로 없지만 구멍을 뚫어 세상을 훔쳐보기란 상대적으로 쉽다. 까놓고 말하면 이런 방법을 "방화벽에 구멍뚫기"라고 부른다. 여기서는 이런 기법을 SSH 뒷문이라고 부르겠다. SSH 뒷문을 사용하려면, 중간 매개체로 사용 가능한 인터넷에 물린 기계가 하나 필요하다. 예 제에서, 중간 매개체를 blackbox.example.com이라고 부르자. 회사 방화벽 뒤에 숨어있는 기계를 ginger라고 부르자. 마지막으로 기술 지원팀이 사용하는 기계를 tech라고 부르자. 그림 4는 설정 방법을 보여준다. 그림 4. 방화벽에 구멍 뚫기 여기에 진행 방법을 정리했다.
VNC나 가상 네트워크 컴퓨팅은 오래 전부터 사용되어 왔다. 원격 서버에서만 돌릴 수 있는 특수한 그래픽 프로그램이 있을 때 이를 활용하는 방법을 찾아냈다. 트릭 5에 서 제시한 예처럼 ginger를 저장 서버라고 가정하자. 많은 저장 서버는 저장소 컨트롤러를 관리하기 위한 GUI 프로그램이 따라온다. 종종 이런 GUI 관리 도구는 때때로 내부망에 연결된 네트워크를 통해 직접 연결해야 하는 경우가 있다. 따라서 GUI에 접근하려면 ginger에서 작업하는 방법이 유일하다.
트릭 5에서 소개한 설정과 비슷하다고 가정할 때, tech가 SSH 대신에 VNC에 접속하게 만들기를 원한다. 이 경우 비슷한 설정을 하되, VNC 포트를 대신 사용한다. 여기에 방법을 정리했다.
설정 작업에 노력이 많이 들어가는 듯이 보이지만 나라를 가로질러 저장소 하드웨어를 수리하러 가는 편에 비하면 별거 아니다. 몇 번 연습하면 상당히 쉽게 느껴진다. 트 릭 한 가지를 더 알려주겠다. 윈도 운영체제를 돌리는데, 명령행 SSH 클라이언트가 없다면 tech 쪽에서 putty를 사용하면 된다. putty는 화면 우측에 나온 옵션을 사용해 SSH 포트를 전달하도록 설정이 가능하다. 우리 예에서 5999 대신 5902를 포트 번호로 사용한다면 그림 5와 같이 입력하자. 그림 5. putty도 터널링을 통해 SSH 포트를 전달할 수 있다. 설정이 끝나면 tech는 리눅스 운영체제를 사용하듯이 localhost:2로 VNC를 연결할 수 있다.
다 음과 같은 상황을 상상해보자. 회사 A에는 ginger라는 저장소 서버가 있는데, beckham이라는 클라이언트 노드가 NFS로 마운트해 저장소 서버를 사용한다. 회사 A는 ginger에서 나오는 대역폭을 좀 더 늘리길 원한다고 결정했다. 엄청나게 많은 노드에서 ginger가 공유하는 파일 시스템으로 NFS 마운트를 요청하기 때문이다. 이렇게 하기 위한 가장 흔하고 저렴한 방법으로 기가비트 이더넷 NIC 두 개를 한데 묶어 사용한다. 이렇게 하는 방법이 저렴한 이유는 일반적으로 내장 NIC가 여분으로 남아 있으며, 스위치 어디인가에도 추가 포트가 남아 있기 때문이다. 여기까지는 좋다. 하지만 질문이 떠오른다. 도대체 진짜 가용 대역폭은 어느 정도일까? 기가비트 이더넷에서 이론적인 한계는 128MBps다. 이 숫자는 어디서 왔을까? 다음을 살펴보자. 1Gb = 1024Mb; 1024Mb/8 = 128MB; "b" = "bits," "B" = "bytes" 하지만 실제 측정값은 얼마이며, 대역폭을 측정하는 좋은 방법은 무엇일까? 한 가지 권장하는 도구는 iperf다. 다음과 같이 iperf를 구할 수 있다.
iperf를 ginger와 beckham 양쪽에서 볼 수 있는 공유 파일 시스템에 설치하거나 컴파일해 양쪽 노드에 설치할 필요가 있다. 양쪽 노드에서 볼 수 있는 bob 사용자 홈 디렉터리에서 iperf를 컴파일한다.
ginger 쪽에서 다음 명령을 내린다.
이 기계는 서버로 동작하며, MBps 단위로 속력을 출력한다. beckham 쪽에서 다음 명령을 내린다.
양 쪽 화면에서 속력이 얼마인지 결과를 볼 수 있다. 기가비트 이더넷 어댑터가 달린 일반 서버에서, 대략 112MBps 정도 나온다. 이는 TCP 스택과 물리적인 케이블에서 잃어버리는 대역폭을 고려한 정상적인 값이다. 각각에 이더넷 카드 두 장을 장착한 두 서버를 직접 연결해 테스트하면 220MBps가 나온다. 실제로 네트워크 카드 두 장을 결합한 서버에서 NFS 성능은 대략 150-160MBps 정도 나온다. 이런 결과는 대역폭이 기대치에 근접하고 있다는 훌륭한 증거 자료를 제시한다. 여기서 제시한 결과보다 뭔가 신통치 않으면 문제를 점검해야 한다. 최근에 두 NIC를 묶기 위해 사용한 결합 드라이버가 제각각인 경우가 있었다. 성능은 너무나도 형편없었는데, 대역폭이 이더넷 카드를 묶지 않았을 경우보다도 훨씬 적은 20MBps 정도 나왔다!
리눅스 시스템 관리자는 명령행 스크립트를 사용해 목에 힘을 주면서 좀 더 효율을 발휘하게 된다. 명령행 스크립트는 예 를 들어, 설치 대상 리눅스 클러스터를 위한 새로운 /etc/hosts 파일을 생성할 필요가 있다고 가정하자. 무식한 방법으로 vi나 선호하는 텍스트 편집기를 사용해 IP 주소를 추가한다. 하지만 이미 존재하는 /etc/hosts 파일을 가져다 명령행에서 다음과 같은 명령을 내려 파일 뒤에 필요한 주소를 덧붙일 수도 있다.
n001 부터 n200까지 200개나 되는 호스트 이름이 IP 주소 192.168.99.1부터 192.168.99.200까지 범위에서 만들어진다. 수작업으로 이런 파일을 만들 경우에 무심코 중복되는 IP 주소나 호스트 이름을 생성할 위험이 도사리므로, 호스트 이름 추가는 사용자 오류를 없애는 내장 명령행을 활용하는 좋은 예다. 대다수 리눅스 배포판에 들어있는 배시 셸로 작업해야 함에 주의하자. 또 다른 예제로 리눅스 클러스터를 구성하는 각 계산 노드에 동일한 메모리가 탑재되어 있는지를 점검하기를 원한다고 가정하자. 이런 상황에서 분산이나 병렬 셸이 가장 좋은 해법이겠지만, 예를 설명하기 위해 여기서는 SSH를 사용하는 방법을 제시하겠다. SSH를 암호 없이 인증 가능하도록 설정했다고 가정하자. 다음과 같은 명령을 내리자.
이와 같은 명령행은 상당히 복잡하게 보인다(정규 표현식이라도 넣으면 훨씬 더 복잡해질 것이다). 한조각씩 집어 비밀을 풀어보자. 먼저 001-200까지 반복문을 돌린다.
이 명령어는 다음과 같은 동작을 한다.
이 연산을 각 노드마다 실행한다. 모든 노드에서 명령을 수행했다면 모든 200개 노드의 전체 결과물을 파이프( 마지막으로 uniq 명령을 사용해 중복을 제거한다. 이 명령어 결과는 다음 경우 중 하나다.
이 명령어는 완벽하지 않다. 기대와는 다른 메모리 값을 찾으면, 어떤 노드가 문제를 일으켰으며 얼마나 많은 노드가 문제를 일으켰는지 모른다. 또 다른 명령어를 사용해 이런 의문을 풀어야 한다. 그렇지만 이런 트릭은 뭔가 잘못되었을 때 빠르게 뭔가를 점검하는 최선의 방법이다. 진짜 가치는 다음과 같다. 빠르지만 대충 점검하는 작업 속력을 높인다.
몇몇 소프트웨어는 오류 메시지를 콘솔로 뿌리는 바람에 SSH 세션에서 정보를 놓칠 수 있다. vcs 디바이스를 사용하면 콘솔 출력을 검사할 수 있다. SSH 세션에서 원격 서버에 대 다수 데이터 센터에서는 원격 터미널 서버, KVM 심지어 LAN을 통한 직렬 연결을 사용해 이런 정보를 보는 방법이 최선이다. 이런 물리적인 방법은 콘솔 훔쳐보기에 전용 스트림이라는 추가적인 편의 기능을 제공한다. vcs 디바이스를 활용하면 기계실로 가서 콘솔을 쳐다보는 수고를 줄여주는 빠른 공용 스트림 기능을 제공한다.
트릭 8에서 시스템에 탑재된 전체 메모리에 대한 정보를 얻는 명령행을 사용한 예제를 살펴보았다. 이번 트릭에서는 비교하고 문제를 해결하고 원격 지원을 제공하는 데 필요한 중요한 시스템 정보를 수집하는 다른 방법을 몇 가지 제시한다. 먼저, 프로세서에 대한 정보를 수집하자. 이런 작업은 다음과 같은 방식으로 쉽게 처리할 수 있다.
이 명령어는 프로세서 속력, 개수, 모델에 대한 정보를 제공한다. 많은 경우에 내가 종종 수행하는 점검 내역은 시스템에 있는 프로세서 개수를 확인하는 작업이다. 따라서 듀얼 프로세서에 쿼드 코어 서버를 구매했다면 다음과 같은 명령으로 확인할 수 있다.
결과 값으로 8을 기대하고 있다. 그렇지 않다면 업체에 전화를 걸어 프로세서를 추가로 보내달라고 요청할 것이다. 필요한 또 다른 정보는 디스크 정보다. 마지막으로 시스템 펌웨어를 살펴보는 방법을 소개한다. 바이오스 단계와 NIC에 탑재된 펌웨어 정보를 얻는 방법 말이다. BIOS 버전을 점검하려면,
이런 방법은 기계를 다시 부팅해 POST 결과를 보는 방법보다 훨씬 더 효율적이다. 이더넷 어댑터에서 드라이버와 펌웨어 버전을 검사하려면,
명령행 전문가로부터 수천 가지 트릭을 배울 수 있다. 배움을 향한 지름길은 다음과 같다.
적 어도 이런 트릭 중 한 가지라도 몰랐던 뭔가를 배우는 데 도움이 되었기를 바란다. 여기서 소개하는 핵심적인 트릭을 이용하면 좀 더 효율적으로 작업할 수 있고 경험이 쌓이게 되지만, 더 중요한 것은 비디오 게임과 같이 좀 더 흥미로운 활동을 위한 자유 시간을 제공한다는 점이다. 최상급 관리자가 게으른 이유는 작업을 싫어하기 때문이다. 최상급 관리자는 작업을 하기 위한 지름길을 찾아내어 계속해서 게으름을 추구한다. 교육
제품 및 기술 얻기
토론
|
'리눅스 일반' 카테고리의 다른 글
sudo, sudoers (0) | 2008.12.19 |
---|---|
man page 섹션의 의미 (0) | 2008.12.17 |
vimrc 설정 (0) | 2008.12.10 |
유용한 프로그램들 (0) | 2008.05.30 |
printf color code (0) | 2007.07.13 |