강좌
클라우드/리눅스에 관한 강좌입니다.
리눅스 분류

초보자를 위한 리눅스 팁 I, II, III

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

icon01.giftitle07.gif


저자 : 송 영 문 (songym@cnstech.co.kr)

 

 

지난 호에는 DOS에서 dir과 같은 명령인 ls에 대해 알아 보았다. 이번에는 어떤 명령에 대해 알아볼까? 필자도 고민을 했다.
이유는 이 연재가 초보자를 위한 것이므로 많은 선택이 있기 때문이다. 이번에 좀 더 많은 명령을 알아보도록 하자.
우선은 명령어에 대해 알아보도록 하자. 비유를 위해 DOS를 곁들인다.
DOS에서는 내부 명령어와 외부 명령어가 있다는 사실은 다 알 것이다. 그렇다면 리눅스에는 내부 명령어, 외부 명령어가 나뉘어 있을까? 결론만 말하자면 그렇진 않다.
리눅스는 내부 명령어라는 개념이 없다.
모두 외부 명령어인 것이다. 다만 shell에서 수행되는 명령이 내부 명령어라면 내부 명령어라 할 수 있을 것이다.
이 점을 알고 넘어가도록 하자.

 

(1) 자신의 passwd 바꾸기

passwd를 바꾸어 보자. 리눅스를 사용하는 대부분이 혼자서 사용할 것이다. 혼자 사용하게 되면 시스템 관리까지 같이 해야 한다. 우선은 기본적인 자신의 패스워드를 바꾸어보자.

[root@lovin/]# passwd
New UNIX password: (1)
Retype new UNIX password: (2)
passwd: all authentication tokens updated successfully
[root@lovin/]#

prompt에서 passwd를 입력하면 (1)과 같은 글이 뜬다. 여기서 자신의 새로운 패스워드를 친다. 그럼 다시 (2)가 뜨는데, 여기서는 방금 입력한 passwd를 다시 한번 쳐주면 된다. passwd를 확인하는 절차인 것이다. 그럼, 다른 사람의 passwd를 바꾸어 줄 때는 어떻게 할까? 바로 "passwd usename" 하면 된다.
예)를 보자.

예) [root@lovin/]# passwd songym
New UNIX password:
Retype new UNIX password:
passwd: all authentication tokens updated successfully
[root@lovin/]#

바로 자신의 패스워드를 바꿀 때처럼 나올 것이다. 그러나, 자신의 패스워드가 바뀐게 아니라, songym이라는 계정의 passwd가 바뀐 것이다.

Tip) passwd를 입력할 때, 잘못 입력할 때가 있을 것이다. 초보자들은 잘못 입력하면 엔터를 그냥 치는데, 그러지 말고 CTRL+U를 누르면 보이지 않게 입력된 글자가 다 지워진다. 엔터를 치지 않고 다시 입력할 수 있다. CTRL+U는 프롬프트에서도 가능하다. 아무거나 입력한 후에 CTRL+U를 눌러보라. 깨끗이 지워진다.

초보자라도 cd, rmdir, mkdir은 알 것이다. (도스를 사용해 봤으므로...)
파일을 다루는 것은 아주 중요할 것이다. 리눅스 명령어 강좌이므로 파일을 다루는 명령에 대해 알아보자. 우선은 압축 파일에 대해 알아보자.

 

(2) tar 압축에 대해

tar는 현재의 모든 유닉스나 리눅스에서 가장 많이 쓰이는 압축일 것이다. 리눅스의 tar는 솔라리스나 일반 사용의 tar보다 훨씬 진보적이다. 여러 리눅서들은 확장자가 *.tgz인 것을 많이 보았을 것이다. 이는 리눅스의 tar가 tar압축과 gzip압축을 동시에 할 수 있기 때문에 확장자가 *.tgz인 것이다.
(일반 상용 유닉스는 *.tar.gz이다. 이는 tar를 하고 나서 다시 gzip을 하기 때문이다. 리눅스는 한번에 된다. 얼마나 편리한가?.......^^;)

자! 이제 예제를 들어보면서 알아보자. 이제 tar를 이용해서 압축을 해보고, 그 압축 파일을 보고, 다시 압축 파일을 푸는 것까지 알아보자.

1) tar로 압축하기

[root@lovin/]# cd WindowMaker-0.6.3/
[root@lovin /WindowMaker-0.6.3]# ls 

BINDINGS

LICENSE

Version

configure*

test/

BUGS

LICENSE,LIB

acconfig.h

configure.in

stil

CHANGES

Library/

asclock/

headers/

wmaker*

CREDITS

Makefile

build*

install-sh*

wmlib/

Documentation/Makefile.in

config.cache

mkinstalldirs*

wrlib/

FAQ

NEWS

config.h.in

patches/

 

INSTALL

README

config.log

pixmaps@

 

INTERFACE

TODO

config.status

src/

 

[root@lovin/WindowMaker-0.6.3]#

위는 필자의 windowmaker 디렉토리이다.
압축을 해보자.

[root@lovin /WindowMaker-0.6.3]#tar cvf windowmaker.tar <enter>

하면

BINDINGS
BUGS
CHANGES
CREDITS
Documentation/
Documentation/contributors.texi
Documentation/freedon.texi
Documentation/funding.texi
Documentation/gpl.texi
Documentation/Makefile.in
Documentation/header.tmpl.texi
Documentation/programmer-iface.texi
Documentation/texi2html.in
Documentation/customization.texi
Documentation/faq.texi
Documentation/installation.texi
Documentation/intro.texi
Documentation/related-sw.texi
Documentation/usage.texi
Documentation/wmaker-tmpl.texi
~중간생략~
wrlib/convolve.c
wrlib/config.log
wrlib/raster.o
wrlib/config.status
wrlib/load.o
wrlib/Makefile
wrlib/config.h
wrlib/gradient.o
wrlib/xpm.o
wrlib/png.o
wrlib/convert.o
wrlib/context.o
wrlib/misc.o
wrlib/scale.o
wrlib/libwraster.a
[root@lovin/WindowMaker-0.6.3]#

다하면 프롬프트 상태로 떨어진다.
다시 ls를 해보자.

[root@lovin /WindowMaker-0.6.3]# ls
BINDINGS   LICENSE          Version         config.status* src/
BUGS         LICENSE,KIB    acconfig.h    configure*       test/
CHANGES   Library/            asclock/       configure.in     util/
CREDITS     Makefile           build*           headers/  windowmaker.tar
Documentation/ makefile.in  config.cache install-sh*      wmaker*
FAQ            NEWS             config.h         mkinstalldirs*  wmlib/
INSTALL      README          config.h.in     patches/        wrlig/
INTERFACE  TODO             config.log      pixmaps@
[root@lovin/WindowMaker-0.6.3]#
 

보면 맨 오른쪽에 windowmaker.tar 파일이 보인다. 하나의 파일로 묶은 것이다. 자세히 보자 ls -l을 해보자. tar로 묶은 파일이 보이면서 용량도 보일 것이다. 약 3.2M 이다.

[root@lovin /WindoMaker-0.6.3]#ls -l
   .
   .
   .
   .
   .
drwxr-xr-x  2 root   root   1024        Jan  11:21:17  util/
-rw-r-r-     1 root   root   3256320  Jan  18:14:07   windowmaker.tar
-rwxr-xr-x  1 root   root   219114    Nov   6  14:09   wmaker*
drwxr-xr-x  2 root   root   1024        Jan  11 21:17   wmlib/
drwxr-xr-x  3 root   root   1024        Jan  11 21:17   wrlib/

이는 정확히 압축이 된게 아니다. tar는 여러 파일을 하나의 파일로 묶을 뿐 직접 압축을 하진 않는다. 압축을 하는 것은 나중에 설명하기로 하고 저 windowmaker.tar 파일에 어떤 것들이 들어 있는지 tar 파일을 들여다보자.

[root@lovin /WindowMaker-0.6.3]# tar tvf windowmaker.tar <enter>

하면 화면이 스크롤 되면서 막 지나간다. 파이프와 more를 같이 써서 한 화면을 보자.

root@lovin /WindowMaker-0.6.3]#tar tvf windowmaker.tar |more <enter>
-rw-r-r-root/root   2932   Jul 26 14:29 1997   BINDINGS
-rw-r-r-root/root   693     Jul 26 14:29 1997   BUGS
-rw-r-r-root/root   12945  Jul 26 14:29 1997   CHANGES
-rw-r-r-root/root   761     Jul 26 14:29 1997   Documentation/wmaker_1.html
-rw-r-r-root/root   18910  Jul 26 14:29 1997   Documentation/wmaker_2.html
-rw-r-r-root/root   3118    Jul 26 14:29 1997   Documentation/wmaker_3.html
-rw-r-r-root/root   8132    Jul 26 14:29 1997   Documentation/wmaker_4.html
-rw-r-r-root/root   940     Jul 26 14:29 1997   Documentation/wmaker_5.html
-rw-r-r-root/root   848     Jul 26 14:29 1997   Documentation/wmaker_6.html 
─More─

이렇게 한 화면씩 보여준다.
enter를 누르면서 파일들을 보자.
자, 그럼 이번에 tar 파일을 압축으로 작게 만들어 보자.
우선은 gzip을 이용하자.

[root@lovin /WindowMaker-0.6.3]#gzip windowmaker.tar <enter>
[root@lovin /WindowMaker-0.6.3]#

그냥 프롬프트로 떨어지면 압축이 잘 끝난 것이다. 자, 이제 다시 ls -l을 눌러보자.

[root@lovin /WindowMaker-0.6.3]#ls -l <enter>
drwxr-xr-x   2 root  root   1024   Jul  26  14:30   headers/
-rwxr-xr-x   1 root  root   2186   Jul  26  14:30   install-sh*
-rwxr-xr-x   1 root  root   619     Jul  26  14:30   mkinstalldirs*
drwxr-xr-x   2 root  root   1024   Jul  26  14:30   patches/
lrwxrwxrwx   1 root  root   28       Jan 11  21:13   pixmaps  ->
Library/WindowMaker/Pixmaps/
drwxr-xr-x   4 root  root   2048   Jan  16  20:02   src/
drwxr-xr-x   2 root  root   1024   Jan  11  21:17   test/
drwxr-xr-x   2 root  root   1024   Jan  11  21:17   util/
-rw-r-xr-x   1 root  root 802151 Jan  18 14:07   windowmaker.tar.gz
-rwxr-xr-x   1 root  root 219114 Nov   6  14:30   wmaker*
drwxr-xr-x   2 root  root   1024   Jan  11  21:17   wrlib/
drwxr-xr-x   3 root  root   1024   Jan  11  21:17   wrlib/
[root@lovin /WindowMaker-0.6.3]#

아까는 3.2M였던 파일이 80만 바이트로 줄었다. 파일명은 windowmaker.tar.gz이다. 이젠 tar와 gzip을 함께 이용하는 법에 대해 알아보자. 압축 파일을 지우자.

[root@lovin /WindowMaker-0.6.3]#rm -rf windowmaker.tar.gz <enter>
[root@lovin /WindowMaker-0.6.3]#tar cvfz windowmaker.tgz*

windowmaker.tar.gz 파일을 지우고 나서 tar cvfz windowmaker.tgz* 하면 아까처럼 화면이 스크롤 되면서 올라갈 것이다.
자, 이상 없이 프롬프트로 나왔으면 다시 ls -l을 해보자.

[root@lovin /WindowMaker-0.6.3]#ls -l
~ 중간생략!
-rwxr-xr-x  1 root  root  2186   Jul  26  14:30  install-sh*
-rwxr-xr-x  1 root  root  619     Jul  26  14:30  mkinstalldirs*
drwxr-xr-x  2 root  root  1024   Jul  26  14:30  patches/
lrwxrwxrwx  1 root  root  28      Jan  11  21:13  pixmaps  ->
Library/WindowMaker/Pixmaps/
drwxr-xr-x  4 root  root  2048   Jan  16  20:02  src/
drwxr-xr-x  2 root  root  1024   Jan  11  21:17  test/
drwxr-xr-x  2 root  root  1024   Jan  11  21:17  util/
-rx-r-r-     1 root  root  802196 Jan 18  14:31  windowmaker.tgz
-rwxr-xr-x  1 root  root  219114 Nov 6   14:09  wmaker*
drwxr-xr-x  2 root  root  1024   Jan  11  21:17  wmlib/
drwxr-xr-x  3 root  root  1024   Jan  11  21:17  wrlib/
[root@lovin /WindowMaker-0.6.3]#

아까처럼 tar 따로 gzip 따로 하지 않고 한번에 파일 묶기와 압축을 동시에 한 것이다. 이는 아주 편리한 것이다.
여기까지 압축화일 tar에 대해 간략하게 나마 알아보았다. 더 많은 옵션이 있지만 이 정도만 알아도 자신의 압축 파일은 어느 정도 다룰 수 있을 것이다. 많은 옵션과 명령어의 조합이 정말이지 리눅스를 비롯한 유닉스의 신비로움을 더해주는 것이 아닐까 생각한다.
연재 중에 궁금한 사항은 필자의 E-mail :
songym@cnstech.co.kr 로 보내주기 바란다.




icon01.giftitle10.gif

이성주 / 고려대학교 컴퓨터학과
현재 컴퓨터학과 시스템연구회 회원
linuxlee@hitel.net
nikea@nownuri.net

 

1. bash prompt에서 칼라 사용

보통의 방법은 escape sequence를 사용하는 것이다. 그러나 다음의 shell 함수와 PS1 의 변경을 사용할 수 있다.
 

colourize-prompt () {
   if [ $UID = 0 ]
   then
      echo -n ' ;31'
   fi
}
PS1='\[\033[0$(colourize-prompt)m\]\w\$'

다음도 비슷한 방법이다.

PS1="\[\033[1;31;40m\][BgRH **\u **]:\w#\[\033[0;37;40m\]"
export PS1


만약 터미널 별로 다른 색의 프롬프트를 사용하려면 다음과 같이 한다.
 

case 'tty' in
      /dev/tty1 )
            PS1="\[\033[1;37;40m\][RH4-1\u]:\w\$\[\033[0;37;40m\]" ;;
      /dev/tty2 )
            PS1="\[\033[1;33;40m\][RH4-2\u]:\w\$\[\033[0;37;40m\]" ;;
      /dev/tty3 )
            PS1="\[\033[1;32;40m\][RH4-3\u]:\w\$\[\033[0;37;40m\]" ;;
      /dev/tty4 )
            PS1="\[\033[1;36;40m\][RH4-4\u]:\w\$\[\033[0;37;40m\]" ;;
      /dev/tty5 )
            PS1="\[\033[1;34;40m\][RH4-5\u]:\w\$\[\033[0;37;40m\]" ;;
      /dev/tty6 )
            PS1="\[\033[1;35;40m\][RH4-6\u]:\w\$\[\033[0;37;40m\]" ;;
      * )
            PS1="\[\033[1;37;40m\][RH4-1\u]:\w\$\[\033[0;37;40m\]" ;; 
      esac
      export PS1


 

2. 내장 스피커의 소음 방지

생각보다 내장 스피커의 소음이 시끄럽다고 느낀다면 다음의 방법을 사용하여 소리가 나지 않게 할 수 있다.

X 윈도우 환경이라면 ~/.xsession 이나 ~/.xinitrc에서 다음과 같은 명령을 실행시켜 준다.

xset b off

bash 라면 /etc/inputrc 나 또는 $INPUTRC가 가지고 있는 장소에 다음과 같이 입력한다.

set bell-style none

tcsh 사용자라면 ~/.tcshrc 에 다음과 같이 입력한다.

set nobeep

한텀을 사용하는 경우라면 visual bell 기능을 사용할 수 있다.  

다음 한텀 리소스 파일에서 visual bell : false를 true로 바꿔주면 된다.

/usr/X11R6/lib/X11/app-defaults/Hanterm

그렇지 않으면 한텀 화면에서 Ctrl + 마우스 가운데 버튼을 눌러서 나오는 메뉴 중에서 Enable Visual bell을 선택하여 사용할 수도 있다.

만약에 사운드 카드가 있다면 커널을 패치하여 사운드 카드에서 소리를 조절함으로써 내장 스피커를 사용하지 않도록 할 수 있다. 먼저 하드웨어적인 설치를 한다. 즉 스피커의 선을 사운드 카드에 연결하는데 보통의 사운드 카드라면 이러한 일을 할 수 있도록 되어 있다. 그리고 다음의 장소에서 oplbeep를 가져온다.

ftp://sunsite.unc.edu/pub/Linux/apps/sound

oplbeep 는 표준 beeper를 Yamaha FM synthesizer 로 보내는 역할을 한다. 이것을 사용하기 위해서는 oplbeep.kernel-patch를 하고 커널을 재 컴파일한다. 그리고 인스톨 한 다음에 부팅을 시킨다. 그런 다음 Beep.o 라는 모듈을 만든다. 그리고 insmod 명령으로 인스톨을 시킨다.

insmod Beep.o OPL3_PORT=FM-synthesizer-port-address

synth의 주소는 부팅 메시지로부터 확인할 수 있다. 보통은 다음과 같다.

snd1 <Yamaha 2-OP FM> at 0x388 irq 0 drq 0

소리를 들어보고 좋으면 사용하고 아니면 rmmod Beep 명령으로 모듈을 제거해 줄 수 있다.

 

3. FAT32 의 사용

FAT32 는 윈도우즈 시리즈에서 파일 시스템의 용량 손실을 막기 위한 새로운 FAT 파일 시스템이라고 할 수 있다. 그러나 리눅스가 이것을 지원하기 위해서는 커널 패치를 해야 한다. FAT32를 패치하기 위해서는 원래의 커널에서 다음과 같은 것이 설정되어 있어야 한다.

새로운 커널을 만들기 위해서는 유니 코드와 파일 시스템에 대한 Native language support 옵션(CONFIg_NLS)과 코드 페이지와 문자 세트를 선택해야 한다. 기본으로 되어있는 마운트 옵션은 codepage=437 이고 iocharset=iso8859-1 이다. 코드 페이지 437은 U.S.English 이고 iso8859-1 은 Latin 1 문자 셋트이다. 이것들은 보통의 유럽과 미국에서 사용되는 것이다. 이것이 잘 지정되어 있다면 마운트하는 것은 보통의 vfat이나 msdos 와 같다. 패치하는 중에 간혹 컴파일이 문제가 되는 경우가 있는데 이럴 때는 소스 디렉토리에서 .config 파일을 확인하여 CONFIG_NLS 가 설정되어 있고, CONFIG_UVFAT_FS 이 설정이 안되어 있는지를 확인한다. 아마 대부분의 컴파일 문제는 여기에서 비롯될 것이다. 추가적인 참고 사항은 다음 인터넷 페이지에서 볼 수 있다.

chaffee/fat32.html

 

4. 하드 공간이 부족할 때

만약 리눅스를 사용 중에 다음과 같은 에러 메시지를 받는다면 어떻게 할까?

No space left on device?

보통 리눅스를 맛 배기로 사용하려는 사람들은 리눅스의 설치에 그렇게 많은 용량을 할당하지 않는다. 그래서 가끔 보조 기억 장치의 용량 부족으로 이러한 에러 메시지를 받는 경우가 있다. 이럴 때는 아무 것도 못하게 되는데 결국 불필요한 내용을 지워줘야 하거나, 또는 추가적인 보조 기억장치를 장착하여 일부 디렉토리를 옮겨 주어야 할 것이다. 이 두 가지 방법도 상당히 고민을 해야 한다. 즉, 첫 번째 방법에서는 어떤 것이 불필요한 것인지를 생각해야 하고 두 번째 방법도 어차피 현재 위치에서는 지워지는 것이기 때문에 현재 위치에서 다른 곳으로 이동이 되었을 때, 이전과 동일하게 동작할 것인가를 생각해 봐야 하기 때문이다. 그러면 방법을 생각해보자.

먼저 지우는 것은 개인적인 문제이기 때문에 다를 필요가 없고 보조 기억 장치를 추가한 경우를 생각해 보자. 추가적인 보조 기억장치를 장착한 후 현재 파일 시스템에 있는 것 중에서 옮겨야 할 것을 생각한다. 만약 옮겼다면 추가적인 보조 기억 장치를 마운트 한 후 원래의 디렉토리로 링크를 시켜서 사용할 수 있고, 아예 마운트 장소를 원래의 디렉토리로 할 수도 있을 것이다. 그러나 마운트라는 과정이 필요하기 때문에 부팅되는 과정에서 필요한 파일이 있는 디렉토리를 옮겨주면 부팅에 곤란한 문제가 생길 것이다. 즉, local 파일 시스템의 마운트는 부팅이 상당히 진행된 후에 이루어지기 때문에, 그전에 사용되는 fsck 나 그 외 여러 가지 명령어들은 옮기면 곤란하게 되는 것이다. 그래서 옮길 디렉토리를 잘 선택해야 한다. 특히 /bin 이나 /sbin 등은 절대 안될 것이다. 이러한 제약을 생각한다면 옮길 수 있는 디렉토리는 용량도 많이 차지하고 부팅시에는 사용하지 않는 디렉토리인 /uar 나 /home 디렉토리가 적당할 것이다. 보통 /usr 가 제일 많은 부분을 차지하게 되기 때문에 다른 장치로 옮기면 루트 파티션의 용량을 줄일 수 있을 것이다.

이렇게 해서 옮기는 경우에 주의할 사항이 있다. 즉 우리가 보통으로 사용하는 cp나 mv 명령을 사용하면 옮기려는 동작에 문제가 생길 수 있다는 것이다. cp 명령은 옵션을 잘 확인하여 옮기려는 디렉토리 하위에 있는 모든 파일이 제대로 다 복사될 수 있도록 해야 하고 mv는 서로 다른 파티션 사이에는 동작하지 않는다. 그러므로 주의가 필요하다.

이때 사용될 수 있는 명령이 tar 이다. 이 명령은 기존의 모든 파일들을 그 파일의 특성을 모두 가진채로 묶어주기 때문에 옮기기에 편하고 에러가 발생할 가능성도 상당히 줄어들게 된다. 물론 옮겨서 다시 풀어야 하기 때문에 두 배의 용량이 필요한 단점이 있지만, 옮긴 후 실행이 안돼서 곤란하게 되는 것보다는 나을 것이다.

이제 순서를 따라가면서 정리를 해보자. 먼저 새로운 보조 기억 장치(주로 하드디스크가 될 것이다)를 장착한 후 ext2 파일 시스템을 구성한다. 새로 추가된 하드디스크가 Secondary IDE 의 Master 라면 다음과 같이 하면 될 것이다.

[root]# fdisk /dev/hdc

실행하여 파티션을 하드 전체로 잡고 ext2 시스템으로 사용한다고 지정한다. 다음에 파일 시스템을 구성한다.

[root]# mke2fs /dev/hdc1

위와 같이 하면 사용할 수 있다. 이것을 아무 디렉토리나 마운트해서 옮기려고 하는 디렉토리를 tar로 묶어서 그 하드로 복사하여 그 하드에서 untar 해준다. 이러면 원래의 디렉토리가 새로운 하드에 구성이 되었다. 이것을 부팅시에 바로 마운트 될 수 있도록 하기 위해서 /etc/fstab 편집해 준다.

/dev/hdc1 /usr ext2 defaults 0 0

이와 같이 해주면 부팅시에 바로 마운트가 되기 때문에 하드 디스크를 추가하기 전처럼 바로 사용할 수 있다. 혹시 문제가 생기면 single 모드로 부팅한 후

bash# e2fsck /dev/hdc1

을 해주면 된다.

 

5. 프로그램의 감시

가끔은 어떤 사용자가 로그인 되어 있는지 또는 파일이 얼마나 사용되는지 어떤 프로그램이 어떻게 실행되고 있는지 확인하고 싶을 때가 있다. 특히 서버 운영자라면 계정 이용자들의 상태를 확인하고자 할 때가 있다. 보통은 프로세스를 보고 사용자를 확인하거나, 또는 정기적으로 디스크에 대한 보기명령을 내림으로써 확인을 한다. 그러나 상당히 불편하다. 그래서 여기에 필요한 프로그램이 있다. 간단히 유틸리티가 효용성이 많은 때가 있다. 소개할 프로그램은 watch 라는 프로그램이다. procps 프로그램과 같이 따라오는 유틸리티이다.

사용법은 다음과 같다.

watch [-n] 초단위시간 프로그램 [인자...]

초단위시간이란 프로그램이 시간 단위로 갱신되게 하는 것이다. 지정을 하지 않으면 기본으로 2초가 지정된다. 만약 현재 디렉토리에 있는 파일의 크기를 2초마다 확인하고 싶다면 다음과 같이 하면 된다.

watch ls -1

위와 같이 하면 다음과 같은 결과가 나타나며 매 2초마다 이것이 갱신된다.

Every 2 seconds          ls -al            Wed Apr      8 22:27:13 1998
total   34
drwxrwxr-x   2 enlighte enlighte       1024 Apr      8 22:27   .
drwxrwxr-x   5 enlighte enlighte       1024 Apr      8 03:09  . .
-rw------  1 enlighte enlighte      24576 Apr      8 22:25   .tip5.txt.swp
-rwxrwxr-x   1 enlighte enlighte       6891 Apr      8 03:39   tip5.txt
-rw-rw-r-   1 enlighte enlighte             0 Apr      8 22:27   ttt.txt

만약 로그온 한 사용자들을 보고자 한다면 다음과 같이 입력한다.

watch -n 10 w

결과를 보면 위와 비슷하고 w 라는 사용자 확인 명령이 실행됨을 알 수 있다.

Every 10 seconds               w                 wed Apr 8 22:30:55 1998
10:30pm   up   6:53,   2 users,   load average : 0.49, 0.48, 0.41
USER       TTY       FROM       LOGIN@  IDLE     JCPU     PCPU   WHAT
root          tty1                      3:38pm    6:51m   0.31s    0.16s   -bash
enlighte    tty2                      3:39pm    6:51m   27.78s   0.07s   sh /usr/X11R6/b

간단한 유틸리티지만 사용하기에 따라서 활용도가 있을 것으로 생각한다.

 

6. syslog 메시지 출력

시스템 상황에 대한 메시지를 출력할 곳을 지정하는 파일이 /etc/syslog.conf 파일이다. 만약 가상 콘솔에 syslog 메시지를 출력하고 싶다면 간단히 해결할 수 있다. 먼저 사용할 가상 콘솔을 확인하고 syslog.conf 파일에 다음과 같은 내용을 추가 시킨다. 만약 /dev/tty12 에 하고 싶다면 다음과 같이 입력한다.

*.*    /dev/tty12

이것은 모든 메시지가 가상 콘솔 /dev/tty12 에 출력하도록 하는 것이다. 이렇게 입력한 후 재부팅하고 alt-F12 로 이동해가면 출력되는 내용을 볼 수 있을 것이다.



icon01.giftitle11.gif


리눅스 팁 시리즈 (Ⅵ)

이성주 linuxlee@hitel.net

 

◆ 리눅스 LILO 에 관하여

 

1. LILO 실패시의 에러 메시지

LILO 로 부팅할 때, LILO라는 글자가 제대로 표시가 안되면서 장비가 이상이 생기는 경우가 있다. 어떠한 경우에 어떠한 에러 메시지가 나오고 이것에 대한 처리 방법은 무엇인지 알아보자.

LILO 의 부팅 부분은 두 부분으로 나누어져 있다. 첫 번째 부분은 부트 섹터이고 두 번째 부분은 /boot/boot.b 이다. LILO를 설치하는 동안 map 파일(보통은 /boot/map)이 만들어진다. 그리고 이것으로 LILO가 시작되어야 할 운영체제의 필요한 지점을 찾는 것이다.

LILO가 로딩될 때는 LILO라는 단어가 표시된다. 각각의 단어가 표시되는 것에 따라 현재 수행되는 있는 부분을 파악할 수 있다. 반대로 이야기하면 어느 글자까지 표시되었는가를 보면 대충 어디서 에러가 발생했는지 알 수 있다. 각각의 에러의 경우를 알아보자.

* 아무 것도 표시가 안된 경우

이것은 LILO 자체가 로딩되지 않는다는 것이다. LILO 가 설치되지 않았거나 LILO가 설치된 파티션이 활성화되지 않은 경우이다.

* L 자만 나온 경우

부트로더의 첫 부분이 로딩되고 실행된 것이다. 하지만 부트로더의 두 번째 부분이 로딩되지 않았다. 이 경우는 보통 장치의 문제이거나 장치의 OS 위치 표시가 잘못된 경우이다.

* LI 자만 나온 경우

첫 번째 부트로더가 두 번째 단계의 부트로더를 로딩할 수 있었지만 그것을 실행하는데 실패한 경우다. 이 경우에도 역시 위치 표시의 문제이거나 또는 map 설치 프로그램 통하지 않고 임의로 /boot/boott.b 파일을 옮긴 경우이다.

* LIL 자만 나온 경우

두 번째 부트로더가 시작되었지만 map 파일로부터 descriptor 테이블을 로딩하는데 실패한 경우이다. 이 경우도 전형적인 장치의 문제이거나 위치가 잘못된 경우이다.

* LIL? 의 경우

두 번째 단계의 부트로더가 잘못된 주소를 로딩한 경우이다. 이것은 위치 표시가 잘못되었거나 역시 map 설치 프로그램을 이용하지 않고 임의대로 /boot/boot.b 파일을 옮긴 경우이다.

* LIL- 의 경우

descriptor 테이블이 잘못된 경우이다. 이 경우도 역시 위치 표시가 잘못되거나 /boot/boot.b 가 임의대로 옮겨진 경우가 전형적이다.

* LILO

모든 부분이 정상적으로 로딩된 것이다.

대부분의 위치 정보 오류(geometry 가 틀린 경우)의 경우는 물리적인 손상이 되었거나 또는 파티션 테이블의 정보가 잘못되었을 때 발생하지만 이뿐만 아니라 LILO가  설치될 때 에러가 발생한 경우에도 해당된다. 이러한 경우는 보통 1024 실린더 제한(2번 참고)을 무시할 때 발생한다.

위와 같은 에러가 발생했을 때의 해결책을 알아보자.

* 먼저 리눅스 부팅과 관련된 정보를 1024 실린더 안쪽으로 설치한다.
   여기에서 부팅에 관련된 정보는 /boot 디렉토리의 정보와 리눅스 커널을 말한다.

* LILO를 다시 설치한다. 단지 다음과 같이 LILO 프로그램을 실행시킴으로서
   다시 설치할 수 있다.

# /sbin/lilo

 

2. 1024 실린더 제한

대부분의 LILO 로딩 에러는 여기에 원인이 있는 것 같다. 이것에 대해서 자세히 알아보자.

부팅시에 LILO 는 하드 드라이브를 액세스하기 위해서 BIOS 정보를 사용한다. 그래서 접근 가능한 부분이 다음과 같은 부분으로 제한된다.

* 실린더 0에서 1023 번까지

* 처음 두 개의 물리적인 하드 드라이브

* 가능하다면 (E)IDE 드라이브

위의 세가지중 두 번째와 세 번째는 요즘의 PC 에서는 그렇게 심각한 문제는 아니다. 왜냐하면 요즘의 BIOS는 네 개의 EIDE 하드 드라이브까지 지원하고 이중 일부는 BIOS/SCSI 호스트 어댑터가 EIDE 디스크가 장비에 기본으로 설치되어 있어도 SCSI 로 부팅할 수 있는 기능을 제공한다. 그러나 이러한 특징은 그렇게 넓게 퍼진 것도 아니며, 표준으로 될 만큼 충분히 일반적이지도 않다.

위의 첫 번째 제한은 피해갈 방법이 쉽지 않다. 해결 방법을 알아보자.

LILO 가 사용하는 다음과 같은 데이터는 1024 실린더 안에 있어야만 한다.

* LILO 가 설치된 부트 섹터

* /boot 디렉토리에 있는 파일들(/etc/lilo.conf 파일에 지정된 내용에 해당된다.)

* LILO 가 부팅을 담당하는 리눅스 커널들

* 필요하다면 LILO 가 부팅을 담당하는 다른 OS의 부트섹터들

이러한 것들은 최소한 2MB 이상이다. /bootdhk 와 리눅스 커널은 보통 리눅스 root 파티션에 위치한다. 그러나 이것은 강제 사항이 아니다. 이론상으로는 위험하지만 다른 OS 시스템의 파티션에도 저장할 수 있다.

그렇다면 이러한 제한에 대해서 어떠한 점을 고려해야 하는가 알아보자.

* 대부분의 만족할 만한 해결책은 primary 리눅스 파티션을 완전히 1024 실린더
   아래쪽으로 만드는 것이다. 그리고 리눅스 커널을 포함하여 LILO의 관련 데이터들을
   그 안에 저장하면 될 것이다.

* 만약 LILO 가 MBR에 설치되어 있거나 또는 첫 번째 하드디스크의 확장 파티션
   시작에 위치하고 이 확장 파티션이 'active' 표시가 되어있다면 1024 실린더 경계
   아래쪽으로 충분한 크기의 논리 파티션을 만드는 것이다.
   만약 이 논리 파티션 자체도 부트가 가능하도록 할 수 있는 부트 매니저를
   사용한다면 LILO 를 그곳에 설치할 수 있다.

* 리눅스가 아닌 다른 OS의 파티션에 있는 LILO 관련 파일들 아마도 다른 OS 의 파티션이 1024 실린더 이하의 공간을 차지하고 있다면, 이 하드 드라이브를 다시 파티션하기란 쉽지 않을 것이다. 만약 리눅스 파티션 이외의 다른 파티션이 이 영역을 점유하고 있고 리눅스가 그 파티션의 파일 시스템에 대한 읽기와 쓰기 접근이 허용되어 있다면 LILO 의 관련된 파일들은 그곳에 저장할 수 있다. 이 때 물론 부트 섹터는 제외된다.

그러나 이러한 방법의 신뢰성에는 다소 의문이 있다. LILO 파일들이 그 OS의 보호아래 있어야만 한다. 즉 안전하게 존재해야 한다는 것이다. 또한 만약 이 다른 OS의 파티션이 1023 이상의 시린더에 접근할 수 있다고 한다면 LILO 에 관련된 파일들이 확실히 1024 아래쪽에 위치한다는 보장이 없다는 것이다.

이때 조심해야 할 것은 LILO 부트 섹터를 리눅스 이외의 이 파티션에 설치하면 안된다는 것이다. 이럴 경우에는 그 파일 시스템이 손상될 수 있다.

그래서 LILO 부트 섹터는 첫 번째 디스크(1024 보다 작다면)의 확장 파티션의 시작에 저장하거나 MBR 에 설치할 수 있다.

이러한 경우의 예를 들면 다음과 같다.

예 1:

일단 적당한 도스 파티션이 /dos 로 마운트 된다고 가정하자. LILO 는 MBR(즉, /dev/hda)에 설치되어야 한다. 이것은 또한 /dev/hda1으로 부팅 되도록 해야할 것이다. 이렇게 하려면 순서는 다음과 같다.

① MS-DOS 와 리눅스를 위한 부트 디스크를 만들고 동작이 잘되나 확인한다.
    이것으로 잘못될 경우에 예전의 MBR 로 복구할 수 있다.

② 새로운 디렉토리(예를 들면, /dos/LINUX)를 만들고 /boot로부터 LILO 에 관련된
    파일들을 거기에 복사한다. 그리고 LILO 가 부트시킬 리눅스 커널도 복사한다.

③ 그런 다음 /dos/LINUX/lilo.conf 파일을 만든다. 내용은 다음과 같다.

boot=/dev/hda
backup=/dos/LINUX/mbr_hda.bak
install=/dos/LINUX/boot.b
map=/dos/LINUX/map
message=/dos/LINUX/message
prompt
timeout=100
vga=normal
image= /dos/LINUX/First_Kernel
  root= dev/Root_Device
  label=linux
other=/dev/hda1
  label=dos
  loader=/dos/LINUX/chain.b
  table=/dev/hda

④ 이 lilo.conf 로 LILO를 설치한다.

# /sbin/lilo -C /dos/LINUX/lilo.conf

이렇게 하면 LILO가 잘 작동할 것이다. DOS로 부팅하고 가능한 한 LILO 와 관련된 파일들을 쓰기 금지해 놓는다. 그리고 관련 디렉토리도 시스템과 히든 속성을 적용해 놓는다.

 

예 2 :

만약 다른 사용되는 MBR 이 존재하고 그 MBR 대신에 LILO가 첫 번째 하드 드라이브의 확장 파티션에 설치되어야 한다면 단지 예1번의 boot= 라인만 변경하면 된다. 다음과 같이 한다.

boot=/dev/ext_partition

이때 디스크 1 의 확장 파티션을 LILO 설치 후에 리눅스를 이용하여 부팅 가능하게 하고 다른 primary 파티션에서는 active 표시를 제거해야 한다.

 

3. LILO의 "linear" 옵션

LILO가 하드 드라이브로부터 부팅할 때 부트 커널을 발견할 수 없어서 LI라는 글자만 화면에 보이고 멈췄다면 이것은 보통 1024 실린더 제한에 의한 경우가 많다. 또한 혹시 linear 옵션을 가지고 LILO가 설치된 경우라면 이것이 문제일 수도 있다. 이러한 경우에 1024 실린더 문제라면 위의 해결책을 이용하고 만약 LILO의 설치시 옵션 문제라면 /etc/lilo.conf 파일에서 linear 옵션을 제거한다. 그런 후 다시 /sbin/lilo 을 실행시킨다.

그럼 linear 옵션을 지정한 경우에 어떠한 점이 문제가 될 수 있는지 알아보자.

/boot/boot.b, /boot/map, kernel 등 등에서 하드 드라이브의 섹터에 대한 포인터는 LILO 부트 섹터와 물리(실린더-헤드 -섹터)주소 대신에 논리 섹터 주소를 가지고 있는 /boot/map 파일 안에 저장되어 있다.

부팅시에 LILO 부트 섹터는 BIOS 함수를 호출함으로써 하드 드라이브의 구조를 결정한다. 그래서 논리 섹터 주소를 물리주소로 매핑 한다. 그런 다음 실제 드라이브에 대한 접근은 물리 섹터 주소로 이루어진다.

linear 옵션은 리눅스가 실행될 때 다른 위치 정보를 가지는 특별한 하드 드라이브를 BIOS 가 볼 때 도움을 준다. 논리 섹터 주소는 하드 드라이브의 위치 정보와는 독립적으로 정확히 유지할 수 있다.

이것은 드문 경우이고 linear 옵션은 대부분의 경우는 필요없다. 그리고 linear 옵션은 1024 실린더 제한 외에 다른 제한이 있다. 이것은 특별히 요즘의 대용량 하드 드라이브에서 유효한 것이다. 즉 linear 는 오직 다음과 같은 상황에서 동작한다.

512MB 아래에서 16 섹터/트랙
1GB 아래에서 32 섹터/트랙
2GB 아래에서 63 섹터/트랙

64 헤드 수보다 더 많은 것을 가지는 경우에는 1024 개의 실린더 제한보다 더 제한적이다. 왜냐하면 요즘의 보통 128 이거나 또는 255 헤드를 가지기 때문이다. 이러한 제한이 생기는 이유는 부트시 물리 주소로의 변환을 하는 중간에 나오는 값이 있는데, 이것이 특정 섹터의 트랙이다. 이 값은 16 비트 연산이다. 그래서 트랙은 65535를 넘을 수 없다.

 

4. LILO로 부트시의 생기는 문제들

LILO 로 부팅할 때 커널이 로드된 후에 문제가 나타날 수 있다. 자신이 로드할 커널을 선택할 수 있다. 그러나 이 커널이 시작되지 않을 수 있다. 이것은 화면에 리눅스 커널의 압축이 풀린다는 메시지가 나오기 전에 여러 가지 다른 요인으로 시스템이 충돌된다는 것을 뜻한다.

가능한 에러 메시지와 현상은 다음과 같다.

* 시스템이 재부팅 되는 경우

* 시스템이 멈추는 경우

* crc-error 가 나오는 경우

* no free space 가 나오는 경우

* Error 0X00 이 나오는 경우

* Error 0X01 이 나오는 경우

* incomplete literal tree 가 나오는 경우

어떤 때는 플로피가 액세스 된 뒤에도 시스템이 멈추게 된다.

이러한 현상의 원인은 보통 커널의 크기가 매우 크다든지, 또는 LILO에 문제가 있든지 또는 문제 있는 하드웨어를 사용하는 경우이다.

문제가 있는 하드웨어라면 장비의 BIOS가 빠른 메모리 액세스를 할 경우에 문제를 발생시키기도 한다.

그러나 다음의 경우에는 문제가 발생하지 않는다.

* Loadlin을 사용해서 부팅을 하는 경우

* 커널이 플로피로 dd if=/vmlinuz of=/dev/fdo 하여 복사되고
   플로피로부터 로딩될 경우

* make zlmage을 이용하여 만들어진 크기가 작은 커널이 LILO에 의해서 부트되는 경우

장비 자체에서 BIOS 설정을 바꿈으로써 에러가 나오는 것을 막을 수도 있다. 대표적인 설정 몇 가지는 다음과 같다.

일단 시스템에 리눅스의 설치가 가능해야 한다. 만약 Loadlin을 통하여 부팅할 수 없다면 부팅 디스크를 이용해야 한다. 만약 이렇게 해도 안 된다면 BIOS 의 값을 변경해 본다.

어쨌든 설치가 된 후에 문제가 발생한다면 어떻게 시스템을 부트할 수 있는가 한가지씩 해본다. 먼저 설치될 때와 같은 장치를 통해서 부트를 시도해 본다.

즉 부팅 디스크로 설치를 했다면 부팅 디스크를 이용해서 부팅을 시도해 보는 것이다.

DOS 파티션에서 Loadlin을 사용하는데 문제가 없다면 부팅 디스크도 이용해 보는데 만약 여기에서 문제가 없다면 부팅 디스크도 이용해 보는데 만약 여기에서 문제가 발생한다면 부팅 디스크의 파라미터를 다음과 같이 해본다.

load_ramdisk=0 root=/dev/root_partition

이렇게 하고 나서 문제가 해결되면 새로운 커널이 수행되어야 한다. 만약 계속적으로 문제가 발생한다면 메인보드나 BIOS에 대한 조절을 고려해보고 자신의 하드웨어에 대한 총체적인 점검을 해보는 것도 좋을 것이다.

 

◆ 부트나 루트디스켓 만들기

1. 관련된 사항

리눅스를 설치하다보면 디스켓 한 두 장으로 설치가 진행되는 것을 볼 수 있을 것이다. 이 디스켓으로 작업하는 것은 많은 프로그램을 사용하지는 않지만 정말 필요한 몇 가지를 담아서 사용하는데는 지장이 없다. 그리고 이러한 것으로 거의 대부분의 시스템에 관련된 작업을 할 수 있다. 그래서 어떻게 부트와 루트 디스크를 만드는지 알아보자. 다음에 만드는 것은 리눅스의 플로피 디스크 버전이라고 할 수 있다. 순서는 다음과 같다.

① 사용하고자 하는 기본 커널을 컴파일해서 만든다.

② 디스크에 파일 시스템을 만들고

③ 필요한 것을 플롳피로 복사하는 것이다.

 

2. 커널 컴파일

디스크는 1.44MB 정도의 데이터밖에 저장을 할 수 없으므로 지금 사용하고 있는 커널을 바로 플로피로 복사할 수 없다. 그래서 커널을 컴파일 해서 새로 만들어야 한다. 이 때에 사용할 기능을 설정해야 하는데, 자신이 어떠한 것이 필요한가를 잘 생각해서 커널에 포함시켜야 한다. 여기서는 ext2 파티션 지원과 플로피 디스크 지원과 PPP 지원을 포함하기로 한다.

make dep ; make clean ; make zImage

명령을 실행시켜 커널 이미지를 만들어야 한다. 여기에서 make zImage 가 매우 중요하다. 이것은 마지막 과정에서 만들어진 커널을 압축해 준다. 이렇게 하면 /usr/src/linux/rach/i386/boot에 zImage 라는 이름으로 커널이 만들어져 있을 것이다.

 

3. 파일 시스템의 작성

커널을 만들고 바로 필요한 파일을 플로피로 복사하는 것이 아니다. 여기에서 디스크에 파일 시스템을 작성해야 한다. 그리고 필요한 프로그램을 모두 압축해야 한다. 이 과정이 좀 복잡하다. 다음과 같은 순서를 따른다. 먼저 다음 명령을 입력한다.

dd if=/dev/zero of=DEVICE bs=1k count=3000

DEVICE 는 압축을 하지 않은 파일 시스템이 위치할 하드 디스크상의 적당한 장소를 지정한다. 다음으로 다음 명령을 입력한다. 여기에서 DEVICE는 역시 압축하지 않은 파일 시스텝이 위치할 장소이다.

mke2fs -m 0 DEVICE

만약 이 명령에서 뭔가 질문을 해오면 무조건 yes라고 하면 된다.

이런 다음 새로 작성된 파일 시스템을 마운트 해야 한다. 새로운 파일 시스템은 정규 파일안에 있기 때문에 커널에서 loopback 장치에 대한 지원이 있어야 한다. 즉 현재 자신이 사용하는 커널에 이 기능이 포함되어 있어야 한다는 것이다. 만약 포함되어 있지 않다면 다시 설정을 하고 컴파일 해주면 된다. 설정하는 것은 다음과 같은 질문을 yes 또는 module 로 해주면 된다.

Loopback device support (CONFIG_BLK_DEV_LOOP) [M/n/y/?]

중요한 것은 이 커널을 플로피에 넣을 커널이 아니고 자신이 현재 사용하고 있는 커널을 말하는 것이다. 자신의 커널에 loopback 장치에 대한 설정을 가지고 있다면 다음과 같이 명령을 입력한다.

mount -t ext2 DEVICE /mnt

만약 loopback 장치를 모듈로 설정한 경우에는 modprobe loop 명령을 입력하여 모듈을 로딩해준다. 만약 이 명령에서 뭔가 경고나 도는 에러가 발생한다면 다음과 같이 입력해본다.

mount -o loop -t ext2 DEVICE /mnt

이렇게 한 후에 새로 만들어진 파일 시스템에 필요한 파일들을 복사한다.

먼저 /mnt 로 옮겨간 후에 다음 디렉

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,043 명
  • 현재 강좌수 :  35,853 개
  • 현재 접속자 :  69 명