2011. 8. 12. 05:17

 











유닉스이론과실습유닉스전문가로가는첫걸음
카테고리 컴퓨터/IT > OS
지은이 윤소정 (한빛미디어, 2006년)
상세보기
 

   

[ 책소개 ]

누구를 위한 책인가?

이 책은 유닉스나 리눅스에 대한 기본 지식을 배우고자 하는 컴퓨터 관련 학과의 학부생을 대상으로 한다.

가장 일반적인 솔라리스를 기반으로, 유닉스 입문에 꼭 필요한 기본 기능과 명령의 사용 방법을 다양한

예제를 통해 익힐 수 있다. 유닉스에서 중요하고 꼭 알아야 할 내용만 엄선하여 상세히 다루었으므로 강의

교재로 적합하며, 독학용으로도 활용할 수 있다.

 

무엇을 다루는가?

이 책은 총 4부로 구성되어 있다.

1장~5장: 유닉스의 기본_유닉스 개요 및 기본 사용법, 파일과 디렉토리 다루기, vi 편집기 사용법,

콘 셸 활용법. 6장~11장: 유닉스 고급 기능_파일 접근 권한, 고급 파일 관리, 사용자와 프로세스,

파일 백업과 압축, 인터넷과 통신 등 12장~13장: 유닉스 셸_셸의 이해, 콘 셸 프로그래밍 기초

14~15장: 유닉스 시스템 관리 기초_유닉스 내부 구조, 시스템 관리 기초

 


<예제소스>
Posted by devanix
2011. 8. 11. 02:27

 

 

 

 

 

 

 

 

 

 

tar(tape archiver)는 초기 유닉스 시스템에서부터 사용.

지금은 마그네틱 테이프가 일반적이지 않지만, tar는 여전히

아카이브 파일을 생성하고 여러 미디어를 통해 배포하는데

선호되는 명령어이다.

 

 

◈ [ 기능 옵션 ] - 반드시 아래 옵션들 중 하나가 들어가야 함

옵 션 [ ,긴 옵션 ]

설 명

-c, --create

새로운 아카이브를 만든다

-x, --extract

아카이브 파일을 풀어준다

-d, --diff

아카이브 파일을 비교하여 다른 점을 찾는다

-u, --update

아카이브 파일에 저장된 사본보다 새로운 파일만 덧붙여 업데이트

-A, --catenate

하나의 tar 파일에 다른 파일을 병합

-r, --append

아카이브 파일 끝에 파일을 덧붙여 추가

-t, --list

아카이브 파일 내용목록을 보여준다

--delete

기존 아카이브 파일에서 삭제 (자기 테이프에 쓰면 안됨X)

 

[ 부가적인 옵션 ]

옵 션 [ ,긴 옵션 ]

설 명

-f, --file ARCHIVE

지정한 아카이브파일에 읽기 ∙ 쓰기를 실행. (필수)

" - " 는 표준입력에서 데이터를 받거나 표준출력으로 데이터를 쓴다.

-v, --verbose

처리중인 과정을 자세히 출력

-p

모든 퍼미션 정보를 유지.

-j, --bzip2

bzip2 사용하여 파일 압축/풀기

-z, --[un]gzip

gzip 사용하여 파일 압축/풀기

-Z, --[un]compress

compress 사용하여 파일 압축/풀기

--use-compress-program PROG

PROG 로 지정된 압축툴로 아카이브 파일을 다시 처리

( PROG는 반드시 -d(압축 해제)를 처리해야 함)

 

 

tar는 명령어에 옵션을 넣어주는 표준적인 방법이 정해지기 전에 만들어진 명령이다.

지금은 tar에서도 대시(-)로 시작하는 옵션을 사용할 수 있지만 항상 필요한 것은 아니다.

때문에 옵션을 의미하는 문자가 없는 tar xvf와 같은 명령어도 볼 수 있다.

 

 

tar [ .tar ] - 기본 사용 예

tar는 기본적으로 압축은 하지 않고 단순히 하나의 파일(.tar)로 묶음.

 

▶ tar 아카이브 파일 생성(묶기) : (c옵션)

$ tar cvf archive.tar *.txt

aaa.txt

bbb.txt

ccc.txt

 

▶ tar 아카이브 파일 풀기 : (x옵션)

$ tar xvf archive.tar

aaa.txt

bbb.txt

ccc.txt

 

▶ tar 아카이브 파일 목록 보기 : (t옵션)

$ tar tvf archive.tar

-rw-r--r-- devanix/devanix 19 2011-08-10 22:42 aaa.txt

-rw-r--r-- devanix/devanix 16 2011-08-10 22:42 bbb.txt

-rw-r--r-- devanix/devanix 19 2011-08-10 22:42 ccc.txt

 

▶ tar 아카이브 파일에 다른 파일을 병합 : (A 옵션)

$ tar -Af archive1.tar archive2.tar

$ tar tvf archive1.tar

-rw-r--r-- devanix/devanix 19 2011-08-10 22:42 aaa.txt

-rw-r--r-- devanix/devanix 16 2011-08-10 22:42 bbb.txt

-rw-r--r-- devanix/devanix 19 2011-08-10 22:42 ccc.txt

-rw-r--r-- devanix/devanix 40 2011-08-10 23:55 ddd.txt

-rw-r--r-- devanix/devanix 35 2011-08-10 23:55 eee.txt

archive2.tar 파일이 archive1.tar 아카이브에 추가된다.

 

▶ tar 아카이브에서 파일 삭제 : (--delete)

$ tar --delete ddd.txt eee.txt -f archive1.tar

$ tar tvf archive1.tar

-rw-r--r-- devanix/devanix 19 2011-08-10 22:42 aaa.txt

-rw-r--r-- devanix/devanix 16 2011-08-10 22:42 bbb.txt

-rw-r--r-- devanix/devanix 19 2011-08-10 22:42 ccc.txt

 

▶ tar 아카이브에 하나 이상의 파일 추가 : (r 옵션)

$ tar rvf archive1.tar ddd.txt eee.txt

ddd.txt

eee.txt

ddd.txt, eee.txtarchive1.tar 아카이브 파일에 추가 된다.

 

 

 

 

tar + 타 압축 필터(gzip, bzip2, ...)

♧ tar + gzip (z 옵션)

tar로 하나의 파일로 묶고 gzip으로 압축하는 과정을 한번에 수행.

tar+gzip확장자 : [ .tar.gz | .tar.z | .tgz ]

 

▶ tar + gzip 아카이브 파일 압축 생성 : (.tar.gz)

$ tar czvf archive.tar.gz *.txt

aaa.txt

bbb.txt

ccc.txt

▷ z옵션이 지원하지 않는 경우 :

$ tar cvf - *.txt | gzip -c > archive.tar.gz

tar로 하나의 아카이브 파일로 묶고(.tar) gzip로 압축(.gz) 한다.

 

▶ tar + gzip 아카이브 압축 파일 풀기 : (.tar.gz)

$ tar xzvf archive.tar.gz

aaa.txt

bbb.txt

ccc.txt

▷ z옵션이 지원하지 않는 경우 :

$ gunzip -c archive.tar.gz | tar xvf -

gunzip으로 압축 파일을 풀고(.gz) tar로 나머지 아카이브 파일 풀기(.tar)

 

 

♧ tar + bzip2 (j 옵션)

tar로 하나의 파일로 묶고 bzip2으로 압축하는 과정을 한번에 수행.

tar+bzip2확장자 : [ .tar.bz2 ]

 

▶ 압축 생성 & 해제 역시 위의 예와 동일하나 해당 압축 필터 사용 옵션으로 변경 한다.

/* 아카이브 압축 생성 */

$ tar cjvf archive.tar.bz2 *.txt

/* 아카이브 압축 풀기 */

$ tar xjvf archive.tar.bz2

 

♧ tar + lzop (--use-compress-progarm 옵션)

--use-compress-program옵션 사용하여 lzop 압축 툴 사용.

⇒ 해당 lzop 압축 유틸은 조금 덜 통합된 tar이다.

lzop를 사용하기 전에 lzop 패키지를 먼저 인스톨 해야 한다.

tar+lzop확장자 : [ .tar.lzo ]

 

▶ tar+lzop 압축 & 해제 사용

/* 아카이브 압축 생성 */

$ tar --use-compress-program=lzop -cf archive.tar.lzo *.txt

/* 아카이브 압축 풀기 */

$ tar --use-compress-program=lzop -xf archive.tar.lzo

 

 

※ 다른 압축 파일 역시 사용 방법은 다 비슷하므로 file 명령을 사용하여 압축 파일의 종류를 먼저 구분한다.

$ file archive.tgz

archive.tgz: gzip compressed data, from Unix, …

$ file archive.tar.bz2

archi.tar.bz2: bzip2 compressed data, block size = 900k

$ file archive.tar.lzo

archive.tar.lzo: lzop compressed data - version 1.020, LZO1X-1, os: Unix

 

 

 

Posted by devanix
2011. 8. 10. 02:52

♧ 리눅스에서는 윈도우에서 사용하는 scandisk 유틸리티와 같은

물리적인 수준에서 배드블록을 검사하기 위해 badblocks 명령어를 사용한다.

그리고 fsck 명령어를 사용해 논리적인 수준에서 파일시스템의 오류를 검사할 수도 있다.

 

■ badblocks - 장치의 배드블럭을 검색

badblocks [ -b 블록크기 ] [ -o 출력파일 ] [ -v ] [ -w ]

 

◈ [ 옵션 ]

옵 션

설 명

-b 블록크기

블록크기를 바이트 수로 나타냄 (기본값 : 1024 bytes)

-o 파일명

지정한 파일에 배드 블록의 리스트 기록

-v

자세한 출력 모드

-e 최대블록개수

점검을 멈출 최대 블록 개수 (0이면 지정된 범위 까지 점검)

-p num_passes

지정된 숫자 만큼 디스크 스캔 반복.

-w

읽기/쓰기 모드 에서 배드블록을 검사 (-n 옵션과 함께 사용 X, 상호 배타적임)

-n

비-파괴 읽고/쓰기 모드 ( -w옵션과 함께 사용 X, 상호 배타적임)

-s

검사 진행 과정 표시

 

 

badblocks 명령의 일반적인 사용 예:

 

▶ -v 옵션 : 자세한 정보 출력과 함께 기본적인 사용

$ sudo badblocks -v /dev/sdb1

Checking blocks 0 to 1044192

Checking for bad blocks (read-only test): done

Pass completed, 0 bad blocks found.

 

▶ 비-파괴 모드로 배드블록을 검사.

$ sudo badblocks -vsn /dev/sdb1

Checking for bad blocks in non-destructive read-write mode

From block 0 to 1044192

Checking for bad blocks (non-destructive read-write test)

Testing with random pattern: 12.88% done, 0:05 elapsed

☞ 기본적으로, 배드블록 검사는 읽기전용 모드에서 수행하는 것이 안전하다.

비-파괴(non-destructive) 읽고/쓰기 검사는 매우 느리지만

디바이스에 저장된 데이터의 손실 없이 검사할 수 있는 가장 좋은 방법이다.

 

▶ 읽기/쓰기 모드 검사. ( 경고 : 데이터가 파괴될 수 있음 )

$ sudo badblocks -vsw /dev/sdb1

Checking for bad blocks in read-write mode

From block 0 to 1044192

Testing with pattern 0xaa: done

Reading and comparing: done

Testing with pattern 0x55: done

Reading and comparing: done

Testing with pattern 0xff: done

Reading and comparing: done

Testing with pattern 0x00: done

Reading and comparing: done

Pass completed, 0 bad blocks found.

☞ 읽기/쓰기 모드에서 배드블록을 검사하는 것으로 빠르게 검사할 수는 있지만 데이터가 파괴 된다.

 

▶ 다수의 배드블록 검사 수행

$ sudo badblocks -vsnp 2 /dev/sdb1

☞ 디스크 품질을 검사하고, 초기 고장률을 낮추기 위한 테스트용으로 사용.

 

 

■ fcsk - 리눅스 파일시스템을 검사

fsck 명령어는 특정 파일시스템 유형에 사용되는 검사 유틸리티의 프론트엔드 역할을 수행.

 

fsck [ -AVRTNP ] [ -s ] [ -t 파일시스템유형 ] [ 파일시스템옵션 ] 파일시스템 [ ... ]

 

◈ [ 옵션 ]

옵 션

설 명

-A

/etc/fstab 파일에 표시된 모든 파일시스템을 한 번 씩 모두 점검.

-R

-A 플래그와 같이 사용될 때 루트 파일시스템은 제외

-T

시작할 때 버전정보를 출력하지 않음

-V

자세한 출력 수행

-N

실행하지는 말고 어떤 작업을 할 것인지만 보여줌.

 

 

fsck 명령의 일반적인 사용 예:

 

▶ 파일시스템 검사 (-TV : 자세한 출력 및 버전 출력 방지 옵션)

$ sudo fsck -TV /dev/sdb1

[/sbin/fsck.ext4 (1) -- /dev/sdb1] fsck.ext4 /dev/sdb1

e2fsck 1.41.14 (22-Dec-2010)

/dev/sdb1 is mounted.

 

WARNING!!! The filesystem is mounted. If you continue you ***WILL***

cause ***SEVERE*** filesystem damage.

 

Do you really want to continue (y/n)? yes

 

/dev/sdb1: 저널 복구중

/dev/sdb1: clean, 11/65280 files, 8523/261048 blocks

 

▷ 검사 수행 도중 문제가 발생하면, 문제를 수정할 것인지 사용자에게 물어보는데

-y옵션을 추가하여 모든 질문에 대해 yes로 답변하도록 할 수 있다.

$ sudo fsck -TVy /dev/sdb1

 

 

Posted by devanix
2011. 8. 10. 00:55

■ mount 명령어를 사용해 파일시스템 마운트 하기

♧ mount 명령어를 사용하면 로컬(하드디스크, USB, CD, DVD 등)뿐만 아니라 원격지(NFS, 삼바 등)까지

포함해 시스템에 마운트되어 있는 모든 파일시스템 정보를 볼 수 있음.

 

mount [-hV]
 
 

    mount -a [-fnrvw] [-t 파일시스템유형]

    mount [-fnrvw] [-o 옵션 [,...]] 장치 | 디렉토리

    mount [-fnrvw] [-t 파일시스템유형] [-o 옵션] 장치 디렉토리

 

 

▶ mount 명령어 옵션

옵 션

설 명

-a, --all

fstab 파일에 언급된 모든 파일시스템을 마운트.

-v, --verbose

자세한 출력 모드.

-f, --fake

실제 시스템 호출은 하지 않고 마운트할 수 있는지 점검.

보통 -v 플래그를 써서 mount 명령의 결과를 알고자 할 때 유용

-n, --no-mtab

/etc/mtab 파일에 쓰기 작업을 하지 않고 마운트.

/etc가 읽기전용 파일시스템인 경우에 필요.

-r, --read-only

읽기만 가능하게 마운트. ( 같은 옵션으로 -o ro )

-w, --rw

읽기/쓰기 모드로 마운트. ( 같은 옵션으로 -o rw ) 기본 디폴트값

-t <vfstype>

마운트할 파일시스템 유형을 명시적으로 지정.

-o <options>

플래그 뒤에 콤마로 분리한 옵션을 적어준다.

-B, --bind

기존에 마운트되어 있는 파일시스템을 서브트리의 다른 위치에 한번 더 마운트.

-M, --move

마운트되어 있는 파일시스템의 마운트 지점을 다른 위치로 이동.

 

▷ 마운트 플래그 옵션 : 파일시스템 속성 설정 옵션

옵 션

설 명

defaults

rw, suid, dev, exec, auto, nouser, async 속성을 모두 가짐

auto

부팅시 자동 마운트

noauto

부팅시 자동마운트 안함

dev

파일시스템 상의 문자, 블럭 특수 장치를 해석.

nodev

파일시스템 상의 문자, 블럭 특수 장치를 해석 하지 않음.

exec

바이너리 실행파일이 실행되는 것을 허용.

noexec

바이너리 실행파일이 실행되는 것을 허용 안함.

(/tmp 디렉토리와 같이 신뢰할 수 없는 사용자도 접근할 수 있는 경우에 보안 향상)

suid

setuid, setgid 의 사용을 허용

nosuid

setuid, setgid의 사용을 거부

ro

읽기 전용 (read-only)

rw

읽기/쓰기 (read/write) 가능

async

파일시스템에 대한 I/O가 비동기적으로 이뤄지게 함.

sync

파일시스템에 대한 I/O가 동기적으로 이뤄지게 함.

user

일반 계정 사용자들도 마운트 할 수 있게 허용

nouser

일반 계정 사용자가 마운트할 수 없음 (즉, root만 mount 가능)

noatime

파일 접근시간을 업데이트하지 않는다.

(메일 스풀이나 로그와 같이 I/O가 많은 파일시스템에 유용)

remount

이미 마운트된 파일시스템을 다시 마운트.

 

 

mount 명령 기본적인 사용 예:

▶ 마운트된 로컬 및 원격지 파일시스템 목록보기

$ mount

/dev/sda1 on / type ext4 (rw,errors=remount-ro,commit=0)

proc on /proc type proc (rw,noexec,nosuid,nodev)

none on /sys type sysfs (rw,noexec,nosuid,nodev)

 

▶ 특정 파일시스템 유형을 가진 목록만 보기 (-t 옵션 사용)

$ mount -t ext4

/dev/sda1 on / type ext4 (rw,errors=remount-ro,commit=0)

/dev/sdb1 on data type ext4 (rw)

 

/dev/sdb1 디바이스를 /mnt/mymount로 마운트 (-v 옵션 : 자세한 정보 출력)

$ sudo mount -v /dev/sdb1 /mnt/mymount/

mount: you didn't specify a filesystem type for /dev/sdb1

I will try type ext4

/dev/sdb1 on /mnt/mymount type ext4 (rw)

☞ 파일시스템 유형을 명시하지 않고 경고를 출력하며, 알아서 ext4로 시도하여 마운트 함.

 

▶ 마운트할 파일시스템 유형을 명시적으로 지정 (-t 옵션 사용)

$ sudo mount -v -t ext4 /dev/sdb1 /mnt/mymount

/dev/sdb1 on /mnt/mymount type ext4 (rw)

 

▶ 마운트 옵션 지정 (-o 옵션 사용)

/* 읽고/쓰기(rw) 모드 지정 */

$ sudo mount -v -t ext4 -o rw /dev/sdb1 /mnt/mymount

/dev/sdb1 on /mnt/mymount type ext4 (rw)

/* 읽기전용(ro) 모드 지정 */

$ sudo mount -v -t ext4 -o ro /dev/sdb1 /mnt/mymount

/dev/sdb1 on /mnt/mymount type ext4 (ro)

/etc/fstab 파일의 네 번째 필드와 동일한 효력을 가짐.

-o 옵션과 콤마로 구분된 옵션들을 입력하여 구제적인 마운트 옵션을 지정해줄 수 있음.

 

remount 옵션 - 이미 마운트되어 있는 파일시스템의 옵션 변경.

/* 만약 이미 마운트 되어 있다면 경고 메시지와 함께 마운트 되지 않는다 */

$ sudo mount -v -t ext4 -o ro /dev/sdb1 /mnt/mymount

mount: /dev/sdb1 already mounted or /mnt/mymount busy

mount: according to mtab, /dev/sdb1 is already mounted on /mnt/mymount

/* remount 옵션을 사용하여 한번의 명령으로 언마운트하고 새로운 옵션으로 다시 마운트 */

$ sudo mount -v -o remount,rw /dev/sdb1 /mnt/mymount

/dev/sdb1 on /mnt/mymount type unknown (rw)

☞ 읽기 전용으로 마운트되어 있는 파일시스템을 읽기전용으로 다시 마운트.

 

--bind 옵션 - 마운트되어 있는 파일시스템을 다른 위치에 한번 더 마운트.

$ sudo mount -v --bind /mnt/mymount /tmp/mydir

/mnt/mymount on /tmp/mydir type none (rw,bind)

 

$ mount | grep /mnt/mymount

/dev/sdb1 on /mnt/mymount type ext4 (rw)

/mnt/mymount on /tmp/mydir type none (rw,bind)

☞ 동일한 파일시스템을 서로 다른 두 개의 마운트 지점에서 접근할 수 있게 되었다.

☞ 새로운 마운트 지점 역시 기존과 같은 옵션을 사용.

 

--move 옵션 - 마운트되어 있는 파일시스템의 마운트 지점을 다른 위치로 이동.

$ sudo mount -v --move /mnt/mymount /tmp/mydir

/mnt/mymount on /tmp/mydir type none (rw)

 

$ mount | grep /dev/sdb1

/dev/sdb1 on /tmp/mydir type ext4 (rw)

 

 

 

[ fstab 파일에 기술되어 있는 파일시스템을 마운트 하는 세 가지 방법 ]

mount -a [-t type] 라고 하면 fstab 에서 기술되어 있는 모든 파일 시스템을 마운트 시킨다.

② 그냥 디바이스명만 써주거나 또는 마운트 포인트(마운트될 디렉토리)만 적어주면 된다.

$ sudo mount -v /dev/sdb1

디바이스명을 사용해 파일시스템 마운트

$ sudo mount -v /mnt/mymount

마운트 지점을 사용해 파일시스템 마운트

③ 다음과 같이 fstabuser라는 옵션이 적혀 있다면, 누구든 마운트 가능.

/dev/sdb1 /data ext4 ro,user,noauto,async 0 0

 

 

 

[ 루프백 마운트 ]

♧ 파일을 블럭 디바이스 처럼 엑세스 할 수 있게 해주는 가상의 장치.

 

스왑 파일을 생성하는 것처럼, 일반 파일시스템도 파일 속에 생성할 수 있다.

이러한 가상 파일시스템은 루프백 마운트라고 하는 방법으로 마운트 해야 한다.

(다운로드받은 리눅스 설치 CD또는 라이브 CD등을 마운트하려는 경우)

 

▷ loop장치가 명시되지 않으면 ( -o loop라는 옵션만 주면)

mount는 사용하지 않은 loop장치를 찾아서 사용

 

▶ CD 이미지파일(iso9660)을 시스템에 마운트

$ sudo mount -v -t iso9660 -o loop /tmp/myimage.iso /mnt/mymount

mount: going to use the loop device /dev/loop0

/tmp/myimage.iso on /mnt/mymount type ext3 (rw, loop=/dev/loop0)

loop : 명시적으로 /dev/loop* 를 지정하지 않으면 사용하지 않는 loop 디바이스를 자동으로 지정.

 

▶ USB 디스크 부트 이미지 파일을 시스템에 마운트.

$ sudo mount -v -o loop /tmp/diskboot.img /mnt/mymount

mount: going to use the loop device /dev/loop0

mount: you didn't specify a filesystem type for /dev/loop0

I will try type vfat

/tmp/diskboot.img on /mnt/mymount type vfat (rw,loop=/dev/loop0)

 

♧ 루프백 디바이스 상태에 관한 정보를 보고 싶다면 losetup 명령 사용.

▶ 마운트된 루프백 디바이스를 보여준다.

$ sudo losetup /dev/loop0

/dev/loop0: [0807]:1009045 (/tmp/diskboot.img)

 

▶ 마운트된 루프백 디바이스를 강제로 언마운트

$ sudo losetup -d /dev/loop1

☞ 만약 루프백 마운트에 문제가 발생해 언마운트할 수 없다면 다음 명령어를 사용하여 분리작업 시도

 

 

 

 

■ umount 명령어를 사용해 파일시스템 언마운트 하기

♧ 파일시스템의 마운트 해제는 umount명령을 사용한다.

 

umount [-hV]

 

    umount -a [-dflnrv] [-t vfstype] [-O options]

    umount [-dflnrv] {dir | device}...

 

 

umount 명령 기본적인 사용 예:

♧ 마운트와 마찬가지로 디바이스명 또는 마운트 지점을 이용해 언마운트 할 수 있다.

bind 옵션(하나의 디바이스, 여러 개의 마운트 지점)으로 마운트 했을 경우 발생할 수 있는 혼란을 피하고 싶다면

가급적 마운트 지점을 이용해 언마운트 하도록 한다.

 

▶ 디바이스명을 사용해 언마운트.

$ sudo umount -v /dev/sda1

/dev/sdb1 umounted

 

▶ 마운트 지점을 사용해 언마운트.

$ sudo umount -v /mnt/mymount/

/tmp/diskboot.img umounted

 

▶ 언마운트가 되지 않을 경우

$ sudo umount -v /mnt/mymount

umount: /mnt/mymount: device is busy.

(In some cases useful info about processes that use

the device is found by lsof(8) or fuser(1))

☞ 만약 디바이스가 사용 중이라면 'device is busy' 라는 메시지가 출력되면서 언마운트할 수 없을 것.

(실패하는 일반적인 원인으로, 마운트된 파일시스템의 디렉토리를 사용하고 있는 쉘이 실행중인 경우가 많음)

 

드물지만 'device is busy'의 정확한 원인을 알 수 없을 경우 :

/* mymount 파티션에 열려있는 파일을 찾는다 */

$ sudo lsof | grep mymount

bash 9341 devanix cwd DIR 7,0 4096 2 /mnt/mymount

☞ devanix 유저가 실행한 PID 9341이 bash 쉘 프로세스가 마운트 지점을 사용하고 있다는 것을 확인.

(결국 이 bash 프로세스가 mymount 파티션의 언마운트를 방해하고 있었던 것)

 

▶ -l 옵션 : 지연된 언마운트(lazy umount) 사용.

/* 지연된 언마운트를 실행 */

$ sudo umount -vl /mnt/mymount/

☞ 'device is busy'로 언마운트할 수 없을 때,

이를 해결하기 위한 또 다른 방법으로 지연된 언마운트(lazy umount)가 있다.

☞ 지연된 언마운트(lazy umount)는 디바이스가 사용되지 않을 때까지 대기한 후에

디렉토리 트리로부터 파일시스템을 언마운트한다.

 

▷ 그밖에 이동식 저장장치를 언마운트할 때에는 eject 명령어를 사용할 수 있다.

eject를 사용하면 CD파일시스템이 언마운트되고 드라이브에서 CD가 자동으로 배출 된다.

$ sudo eject /dev/cdrom

 

Posted by devanix
2011. 8. 9. 05:00

■ fstab - 파일 시스템에 대한 정보를 고정적으로 저장

/etc/fstab 파일은 보통 리눅스 설치단계에서 루트 파일시스템과 시스템에서 사용될

다른 파일시스템 정보를 바탕으로 자동적으로 만들어 진다.

fstab 파일은 리눅스에서 사용하는 파일시스템 정보를 고정적으로 저장하고 있는 파일로

시스템이 부팅될 때 자동으로 마운트되거나 사용자가 직접 마운트한다.

fstab파일의 정보가 조금이라도 잘못되면 부팅과정의 파일시스템 마운트 단계에서 멈춤.

 

◈ /etc/fstab 파일 예제:

<file system>

<mount point>

<type>

<options>

<dump>

<pass>

/dev/VolGroup00/LogVol00

/

ext3

defaults

1

1

LABEL=/boot

/boot

ext3

defaults

1

2

tmpfs

/dev/shm

tmpfs

defaults

0

0

devpts

/dev/pts

devpts

gid=5, mode=620

0

0

sysfs

/sys

sysfs

defaults

0

0

proc

/proc

proc

defaults

0

0

/dev/VolGroup00/LogVol01

swap

swap

defaults

0

0

/dev/sda1

/mnt/windows

vfat

noauto

0

0

( 직관적으로 보기 위해UUID 목록 제외 )

☞ 루트 파일시스템(/) 과 스왑 파티션(swap)의 경우 논리적 볼륨 관리자(LVM)의 볼륨으로 설정.

- LVM은 볼륨 ID는 그대로 유지하면서 물리적인 파티션들을 이동시키거나 연결하기 쉽도록 만들어 줌.

☞ 여러 가상 파일시스템(물리적 파티션이 없는 파일시스템)으로 구성.

- devpts(pts 가상 터미널 인터페이스)

- sysfs(커널 2.6에 관한 정보 제공 통로)

- proc(커널 2.6 이전에 구현된 커널 정보 제공 통로) 등

☞ 마지막 /dev/sda1 디스크 파티션의 경우, 하드디스크에 있는 윈도우 파티션을 마운트하기 위해 사용자가 직접 추가.

 

※ 과거 리눅스 버전과 달리 /etc/fstab 파일에서는 이제 더 이상 이동식 저장장치 정보를 관리하지 않음.

이러한 이동식 저장장치들은 하드웨어 추상화 계층(Hardware Abstraction Layer, HAL)이라고 하는

시스템에 의해 자동적으로 검색된 후, /media 디렉토리에 생성된 전용 마운트 지점

(디바이스 볼륨 ID 정보 등을 바탕으로 생성)에 마운트 된다.

- 필요하다면 /etc/fstab 파일에 자신만의 하드디스크 또는 이동식 저장장치 파티션에 대한 정보 추가.

- 원격지 파일시스템(NFS, 삼바 등) 역시 /etc/fstab 파일에 포함될 수 있음.

 

◈ /etc/fstab 파일의 필드

필 드

설 명

1 <file system>

파일시스템을 대표하는 디바이스명:

⇒ 마운트되는 파티션의 디바이스명(/dev/sda1와 같은) 표시.

(그러나 최근에는 디바이스명 대신 LABEL 또는 UUID를 사용)

2 <mount point>

파일시스템이 마운트될 위치:

⇒ 마운트된 파일시스템의 모든 디렉토리 트리구조와 저장된 데이터가 이 지점과 연결.

3 <type>

파일시스템 유형:

⇒ ext?, tmpfs, devpts, sysfs, swap, vfat, hfs, ufs …와 같은 파일시스템 장치 종류

/proc/filesystems에서 리눅스에서 현재 사용하고 있는 지원가능한 파일시스템 확인

4 <options>

마운트 옵션:

⇒ 파일시스템을 용도에 맞게 사용하기 위한 파일시스템 속성 설정.

⇒ defaults, auto, exec, suid, ro, rw, user, nouser 등 (man mount 에서 -o 옵션 참조)

5 <dump>

파일시스템 덤프 여부: ( 0 또는 1의 값을 가짐)

dump 명령을 사용하여 백업을 수행할 때에만 의미가 있다.

숫자 0 : dump 명령으로 덤프 되지 않는 파일시스템.

숫자 1 : 데이터 백업등을 위해 dump가 가능한 파일시스템.

6 <pass>

파일시스템 검사 여부:

fsck 명령을 사용한 무결성 검사가 필요한지 여부를 가리킨다.

숫자 0 : 해당 파일시스템에 검사가 필요 없음 (fsck가 실행 되지 않음)

숫자 1 : 먼저 파일시스템 검사가 필요 (루트 파일시스템)

숫자 2 : 루트 파일시스템을 제외한 나머지 파일시스템을 의미

 

 

[ 디바이스명 대신 UUID를 사용하자 ]

♧ 하드디스크를 추가한 후 드바이스명이 순서가 바뀔 수 있다.

이런경우 하드디스크의 고유한 UUID 를 이용하면 바뀌는 것에 신경을 쓰지 않아도 된다.

 

fstabdata용으로 쓸 /dev/sda3을 마운트 해보자.

 

① fstab에 추가할 디바이스 UUID 확인

$ blkid -o list

device            fs_type label     mount point       UUID

-----------------------------------------------------------------------------------

/dev/sda1     ext4                      /                            01b059a5-5924-4a72-968d-88df4ad60374

/dev/sda2     swap                  <swap>               285a650a-1313-496f-aa6c-9c574c15d912

/dev/sda3     ext4                     /data                    e3853343-ec3b-4933-b0e0-2a872112ed6d

 

② /etc/fstab 파일 편집

# data was on /dev/sda3

UUID=e3853343-ec3b-4933-b0e0-2a872112ed6d     /data     ext4      defaults     0 0

☞ /dev/sda3 디바이스명을 위처럼 UUID=e3853343… 처럼 바꿔주면 된다.

 

이렇게 하면 추후 하드디스크를 추가해서 드라이브문자가 바뀐다고 해도 이상 없이 작동한다.

Posted by devanix
2011. 8. 9. 01:44

♧ 모든 파티션 준비가 끝났다면 이제 각각의 파티션을 원하는 파일시스템으로 포맷.

 

■ mkfs - 리눅스 파일 시스템 만들기

mkfs [ -V ] [ -t fstype ] [ fs-options ] filesys [ blocks ]

 

▷ mkfs 명령어는 아래와 같은 리눅스 파일 시스템을 만든다.

mkfs.ext2, mkfs.ext3, mkfs.ext4, mkfs.cramfs, mkfs.msdos, mkfs.ntfs, mkfs.vfat … 등등

 

▷ 기본적인 사용 방법 예:

$ sudo mkfs -t ext3 /dev/sdb1

sdb1에 ext3 파일시스템 생성.

$ sudo mkfs -t ext3 -v -c /dev/sdb1

배드 플록 검사와 함께 좀 더 자세한 출력 요구.

$ sudo mkfs.ext3 -c /dev/sdb1

위 명령어와 동일한 경과

 

 

[ 가상 파일시스템 생성 ]

♧ 물리적으로 고정된 디스크 파티션을 직접 생성하지 않고 특정 파일시스템 유형을

테스트 하고자 한다면 가상 파일시스템을 사용할 수 있다.

(라이브 CD를 만들거나 가상 운영체제를 실행하는 경우에 유용)

 

▷ 1GB 크기의 빈 디스크 이미지 파일을 생성 & 포맷 & 마운트

/* 0으로 채워진 1GB 파일 생성 */

$ dd if=/dev/zero of=mydisk count=2048000

2048000+0 레코드 들어옴

2048000+0 레코드 나감

1048576000 바이트 (1.0 GB) 복사됨, 25.8721 초, 40.5 MB/초

 

/* 가상 파일시스템의 크기를 확인 */

$ du -sh mydisk

1001M mydisk

 

/* mkdisk 파일에 파일시스템을 만든다 */

$ mkfs -t ext4 mydisk

mke2fs 1.41.14 (22-Dec-2010)

mydisk is not a block special device.

Proceed anyway? (y,n) y

 

/* 마운트 위치 생성 & 디스크 이미지 마운트 */

$ sudo mkdir /mnt/image

$ sudo mount -o loop /tmp/mydisk /mnt/image

dd 명령어로 204800 블록(약 1GB)의 빈 디스크 이미지 생성.

mkfs 명령어로 사용자가 선택한 유형의 파일시스템을 생성.

→ 실제 블록 디바이스가 아니기 때문에 경고 출력

☞ 가상 파일시스템은 다른 파일시스템과 동일한 방법으로는 마운트 할 수 없다.

→ 마운트할 디렉토리를 생성한 다음, 파일(mydisk)를 루프 디바이스(-o loop)로서 마운트 해야 함

→ mount 명령 실행시 root 권한 필요

 

▶ 가상 파일시스템 /mnt/image 접근 사용.

$ sudo cd /mnt/image

마운트 지점으로 이동

$ sudo mkdir teset

파일시스템에 디렉토리 생성

$ sudo cp /etc/hosts .

파일을 파일시스템으로 복사

$ cd

파일시스템을 벗어난다.

$ sudo umount /mnt/image

파일시스템의 마운트를 해제

☞ 가상 파일시스템의 마운트를 해제한 다음, 파일을 다른 시스템으로 이동시키거나

다른 곳에서 사용하기 위해 CD에 기록해 둘 수 있다.

☞ 만약 이 가상 파일시스템이 더 이상 필요 없다면 단순히 파일을 삭제.

Posted by devanix
2011. 8. 8. 21:09

♧ 디스크 파티션과 관련하여 라벨(label)이라는 용어는 두 가지 다른 의미를 가짐.

디스크 라벨은 parted 출력에서 볼 수 있뜻이 파티션 테이블의 또 다른 이름.

파티션 라벨은 각각의 개별 파티션이 가진 이름을 의미.

 

■ e2label - 리눅스 파일시스템(ext2,ext3,ext4) 라벨 변경.

e2label device [ new-label ]

 

e2label 명령어를 사용하여 파티션의 라벨을 출력.

$ sudo e2label /dev/sda2

/home

 

e2label 명령어로 파티션 라벨 설정.

$ sudo e2label /dev/sda2 datapartition

 

/etc/fstab에서도 파티션을 마운트하기 위해 파티션라벨을 사용할 수 있다.

LABEL=/boot

/boot

ext3

defaults

1 2

☞ 그러나 라벨 변경 작업으로 인해 시스템이 부팅하지 못하는 경우를 주의.

 

 

■ findfs - UUID나 LABEL을 이용하여 파일시스템(or 파티션) 찾기

findfs LABEL=label

findfs UUID=uuid

 

▶ findfs 명령어를 사용하여 label 이나 uuid로 파티션 찾기.

$ sudo findfs LABEL=datapartition

/dev/sda2

 

$ sudo findfs UUID=01b059a5-5924…

/dev/sda2

 

Posted by devanix
2011. 8. 8. 07:13

♧ 전통적으로 PC 하드디스크는 마스터 부트 레코드(MBR)가 포함된 32bit PC-BIOS

파티션 테이블을 사용해왔다. 이러한 조건 때문에 파티션 하나의 크기는 최대 2TB

가 한계이며, 각 드라이브당 네 개의 주(primary) 파티션만을 가질 수 있었다.

확장 파티션은 이러한 주 파티션의 개수의 제한을 극복하기 위한 방법이다.

최근에는 2TB파티션 용량 제한을 해결하기 위해 PC-BIOS 파티션 테이블을

GTP(GUID 파티션테이블)로 대체 하고 있다.

 

기존 디스크 파티션 작업을 위한 표준 명령어로는 fdisk가 있다. 그러나 fdisk는

현재 새로운 GTP 파티션을 지원하지 못하기 때문에 사용빈도가 줄어들 것이다.

대신 적극적으로 지원받고 있는 새로운 명령어인 parted가 부각되고 있다.

 

⌒그래픽 파티셔닝 툴 : gparted, qtparted

 

 

■ fdisk를 사용하여 디스크 파티션 변경

fdisk 명령어는 디스크 파티션을 나열하고 변경하는데 유용한 툴.

 

▶ 파티션 정보 출력

$ sudo fdisk -l

 

Disk /dev/sda: 19.3 GB, 19327352832 bytes

255 heads, 63 sectors/track, 2349 cylinders

Units = cylinders of 16065 * 512 = 8225280 bytes

Sector size (logical/physical): 512 bytes / 512 bytes

I/O size (minimum/optimal): 512 bytes / 512 bytes

Disk identifier: 0x0003ed61

 

Device Boot Start End Blocks Id System

/dev/sda1 * 1 2220 17824768 83 Linux

/dev/sda2 2220 2350 1046529 5 Extended

/dev/sda5 2220 2350 1046528 82 Linux swap / Solaris

☞ 리눅스 커널 2.6.20 버전부터 IDESCSI 디스크 모드 /dev/sd? 디바이스명 사용.(여기서 ? 표시는 a,b,c 등)

우분투의 오래된 버전은 SCSI 디스크와 USB디스크만 /dev/sd?를 사용하며,

IDE 하드드라이브는 /dev/hd?를 사용했다.

☞ 특정 디스크에 대한 파티션 목록 출력 : $ sudo fdisk -l /dev/sdb

 

▶ 간략한 fdisk 명령어 사용 예:

$ sudo fdisk /dev/sdb

Command (m for help): m

도움말 출력

Command (m for help): d

Partition number (1-4): 1

파티션 삭제 요청

삭제할 파티션 번호 입력

Command (m for help): n

Command action

e extended

p primary partition (1-4)

p

Partition number (1-4): 1

First cylinder (1-130, default 1): 1

Last cylinder … +size{K,M,G} (1-130, default 130): 130

새로운 파티션 생성

 

확장 파티션

주 파티션

주 파티션 선택

주 파티션 번호 1번 선택

시작 위치 선택(또는 그냥 엔터)

끝 위치 선택 (또는 그냥 엔터)

Command (m for help): a

Partition number (1-4): 1

부팅 가능한 파티션 선택

부팅 가능한 파티션 번호 입력

Command (m for help): t

Hex code (type L to list codes): L

Hex code (type L to list codes): 82

파일시스템 유형 선택

선택할 코드 리스트 출력

스왑 파티션으로 지정

Command (m for help): w

변경 내용 파티션 테이블에 쓰고 종료

 

 

■ sfdisk를 사용하여 파티션 테이블 복사

♧ 디스크 파티션 테이블을 백업하거나 복사하는 경우 sfdisk 사용

 

$ sudo sfdisk -d /dev/sda > sda-table

파티션 테이블을 파일로 복사

$ sudo sfdisk /dev/sda < sda-table

파일로부터 파티션 테이블을 복구

$ sudo sfdisk -d /dev/sda | sfdisk /dev/sdb

디스크에서 다른 디스크로 파티션 테이블 복사

 

 

■ parted를 사용하여 디스크 파티션 변경

fdisk와 같이 parted 역시 디스크 파티션 정보를 확인하거나 변경하는 툴

 

▶ 디스크 파티션 목록 출력

$ sudo parted /dev/sda print

Model: VMware, VMware Virtual S (scsi)

Disk /dev/sda: 19.3GB

Sector size (logical/physical): 512B/512B

Partition Table: msdos

 

Number Start End Size Type File system Flags

1 1049kB 18.3GB 18.3GB primary ext4 boot

2 18.3GB 19.3GB 1072MB extended

5 18.3GB 19.3GB 1072MB logical linux-swap(v1)

 

▶ 대화식 모드

$ sudo parted

GNU Parted 2.3

Using /dev/sda

Welcome to GNU Parted! Type 'help' to view a list of commands.

☞ 특정 디스크 파티션 작업 : $ sudo parted /dev/sdb

 

※ fdisk와는 다르게, parted는 별도의 쓰기 과정 없이 파티션에 변경 작업을 즉시 적용.

따라서 단순히 parted를 종료하는 것으로는 어떠한 변경도 되돌릴 수 없기 때문에 신중하게 작업해야 함.

 

▶ 간략한 parted 명령어 사용 예:

$ sudo parted /dev/sdb

(parted) help mklabel

특정 도움말 자세히 출력

(parted) mklabel msdos

새로운 디스크 레이블 만듬(리눅스: msdos)

(parted) rm

Partition number? 1

파티션 삭제 요청

삭제할 파티션 번호 입력

(parted) mkpart

Partition type? primary/extended? primary

File system type? [ext2]? ext3

Start? 1

End? -1

새로운 파티션 생성

파티션 타입

파일 시스템 타입

시작 위치

끝 위치 (-1: 끝까지 의미)

(parted) print

파티션 테이블 출력

(parted) quit

종료

☞ 명령어와 함께 입력 (예: rm 1, mkpart primary ext3 0 -1)

partedmkpartfs 명령은 ext3 파티션을 제대로 생성하지 못하므로 가급적 사용을 피한다

☞ 일반적으로 partedext3, ext4 파일시스템 지원이 미비 하므로 mkfs.ext? 명령 이용하여 파티션 포맷.

Posted by devanix