'퍼미션'에 해당되는 글 4건

  1. 2010.01.06 find + xargs + ls 명령어 몇가지 활용 (2)
  2. 2009.07.12 PostgreSQL On Gentoo
  3. 2009.05.27 UFS(Unix File System) ACL 사용
2010. 1. 6. 09:36

find + xargs + ls 명령어 몇가지 활용

작성자 : 김칠봉
작성일 : 2001.03.12

목차
1. 가장 일반적인 find 명령어

2. find 명령어 일반적인 옵션
  2-1. 사용법 개요
  2-2. 일반적으로 표현식 옵션 구분
  3-3. 자주 사용되는 표현식 옵션
  3-4. path(find 명령어 다음의 path)
  3-5. 표현식-연산자

3. 예제
  3-1. 다른 명령어와 결합형태(ls,xargs)
  3-2. 퍼미션 관련 예제
  3-3. 유저와 관련된 예제
  3-4. 팁
  - 최근 하루(1) 동안(-)에 변경(change)된 파일을 찾을려면(-ctime)?
  - 오래된 파일을 찾을려면(30일 이상 수정(modify))되지 않은)?
  - 최근 30일(30) 안에(-) 접근(access)하지 않은 파일과 디렉토리를 리스트로 만들려면(-atime)?
  - 자신의 홈디렉토리에서 만 검색하려면?
  - 서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색하려면?
  - 특정 유저(foobar) 소유의 파일을 찾을려면?
  - 퍼미션이 777인 파일을 찾을려면 ?
  - others에게 쓰기 권한이 있는 파일을 찾을려면?
  - others에게 쓰기 권한이 있는 파일을 찾아 쓰기 권한을 없애려면?
  - 유저이름과 그룹이름이 없는 파일을 찾을려면?
  - 빈 파일을 찾을려면?
  - 파일크기가 100M 이상된 파일을 찾을려면?
  - *.bak 파일을 찾아 지울려면?
  - *.bak 파일을 찾아 특정 디렉토리로 옮길려면?
  - 디렉토리 만 찾을려면?
  - root권한으로 실행되는 파일을 찾을려면?
  - 다른 파일시스템을 검색하지 않을려면?
  - 파일이름에 공백이 들어간 파일을 찾을려면?
  - 숨겨진(hidden) 파일을 찾을려면?
  - 같은 이름을 가진 디렉토리를 찾을려면?
  - 잘못된 링크를 찾을려면?

4. find 명령어에 대해서 좀더 알아보려면?

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

1. 가장 일반적인 find 명령어

# find /path -name "foobar" -print

제일 먼저(?) 배우는 형식이 아닌가 쉽군요.


2. find 명령어 일반적인 옵션

2-1. 사용법 개요

find 명령어 사용법 보기 :

# find --help
# man find (직접 입력해 보세요. 내용이 너무 많아서..)

사용법 : find [path...] [expression]
기본값 : default path는 현재 디렉토리;  default expression은 -print

표현식(expression) 구성 :
operators (decreasing precedence; -and is implicit where no others are given):
      ( EXPR ) ! EXPR -not EXPR EXPR1 -a EXPR2 EXPR1 -and EXPR2
      EXPR1 -o EXPR2 EXPR1 -or EXPR2 EXPR1 , EXPR2
options (always true): -daystart -depth -follow --help
      -maxdepth LEVELS -mindepth LEVELS -mount -noleaf --version -xdev
tests (N can be +N or -N or N):
      -amin N -anewer FILE -atime N -cmin N
      -cnewer FILE -ctime N -empty -false -fstype TYPE -gid N -group NAME
      -ilname PATTERN -iname PATTERN -inum N -ipath PATTERN -iregex PATTERN
      -links N -lname PATTERN -mmin N -mtime N -name PATTERN -newer FILE
      -nouser -nogroup -path PATTERN -perm [+-]MODE -regex PATTERN
      -size N[bckw] -true -type [bcdpfls] -uid N -used N -user NAME
      -xtype [bcdpfls]
actions:
      -exec COMMAND ; -fprint FILE -fprint0 FILE -fprintf FILE FORMAT
      -ok COMMAND ; -print -print0 -printf FORMAT -prune -ls

간단하게 몇가지만 알아보죠...
(자세한 사용설명은 꼭 man 페이지를 읽어보세요....한글은 없군요..T.T)


2-2. 일반적으로 표현식 옵션 구분

  -a'xxxx'
'xxxx'에 대한 Access(접근)
  -c'xxxx'
'xxxx'에 대한 Changes(변경), 마지막으로 Access한 경우 변경됨
  -m'xxxx'
'xxxx'에 대한 Modify(수정), 파일내용 자체 수정한 경우
  -i'xxxx'
'xxxx'(inum 제외)에 대한 Insensitive(대소문자 구분없이)

3-3. 자주 사용되는 표현식 옵션

  N
정확하게 N과 일치
  +N
N 보다 큰 경우
  -N
N 보다 작은 경우
  -name PATTERN
PATTERN에 일치하는 파일 찾기, 와일드카드 문자 사용가능
  -iname PATTERN
PATTERN에 일치하지 않은(insensitive) 파일 찾기
  -perm [+-]mode
PERMission('mode')에 해당되는 파일 찾기, ls와 결합 가능
  -type [bcdpfls]
b(블럭파일), c(특정 문자), d(디렉토리), p(파이프),
f(정규표현 일반파일), l(링크), s(소켓) 유형의 파일 찾기
  -size N[bckw]
파일 크기가 N 인 파일 찾기
b(블럭-기본값), c(bytes), k(kbytes),
w(2바이트 단어)
  -user NAME
NAME은 유저이름이거나 UID
  -atime N
N*24 시간 동안에 Access 한 파일
  -ctime N
N*24 시간 동안에 Changes 한 파일(내용수정이 아니고 읽기모드도 Changes됨)
  -mtime N
N*24 시간 동안에 Modify 한 파일
  -empty
파일이 비어 있고(0 bytes), 정규식 파일이거나 디렉토리
  -newer FILE
FILE 보다 최근에 갱신된 파일
  -path PATTERN
path가 PATTERN과 일치하는 path에 대해서 검색
  -regex PATTERN
파일이름이 PATTERN에 일치하는 정규식에 대해서 검색
  -inum N
inode N을 갖는 파일
  -nouser,-nogroup
USER나 GROUP에 이름이 없는 파일 검색(UID,GID만 있는 파일)
  -exec COMMAND
검색된 파일을 찾으면 COMMAND 명령을 실행한다.
COMMAND 인자(검색된 파일)는 {}으로 사용하며,
이때 COMMAND 끝은 ;(;이 아님)을 사용해야 한다. 즉 명령구분
문자인 ';'을 탈출()시켜줘야 한다.
  -ok COMMAND
-exec COMMAND와 같지만 COMMAND를 실행하기 전에 확인을 요청한다.

3-4. path(find 명령어 다음의 path)
  .
현재 디렉토리(기본값이므로 생략해도 됨)
  `pwd`
현재 디렉토리와 결합(?) `은 ~문자가 있는 자판
  $(pwd)
위의 `pwd`와 같거나 비슷함
  /
최상위 루트 디렉토리에서 하위 모든 디렉토리
  /home
특정 /home 디렉토리에서 하위 모든 디렉토리
  /{usr,home/{aaa,san2},var}
/usr, /usr/home/aaa /usr/home/san2 /var

3-5. 표현식-연산자

  ( 표현식 )
'표현식'을 우선적으로 먼저 수행
(와 )앞에 를 넣어야 하며, '표현식'과 공백을 각각 둔다.
( A + B ) * ( C + D ) 와 같이 (, )안을 우선적으로 수행
  ! 표현식 , -not 표현식
'표현식'을 부정
  표현식1 -a 표현식2, 표현식1 -and 표현식2
표현식1과 표현식2의 AND 연산
  표현식1 -o 표현식2, 표현식1 -or 표현식2
표현식1과 표현식2의 OR 연산


3. 예제

3-1. 다른 명령어와 결합 형태(ls,xargs)

찾는 것 그 차체 만으로 만족(?) 할 수 도 있지만 그 결과에 대해서
어떤 행동(Actions)을 취할 필요가 있습니다.

  형태1. -exec 이용시

# find ..... -exec COMMAND {} ;

  형태2. xargs 명령어로 표준 입력받아 COMMAND 수행

# find ..... | xargs COMMAND

  형태3. ls 명령어로 최종 결과 출력

# ls -l `find .....[COMMAND]`
또는
# find .... ls
(ls는 ls -dils와 같음)

  xargs
xargs rpm 정보보기
# rpm -qi `rpm -qf $(which xargs)`
또는
# rpm -qf `which xargs` | xargs rpm -qi

즉, find 결과에 대해서,

형태1은 -exec를 사용하여 그 인자를 {}로 사용하고,

형태2는 xargs 명령어로 find에서 넘어온 결과(표준출력)에 대해서 COMMAND를 실행하고,

형태3은 오른쪽의 find 결과물에 대해서 ls 명령어를 실행합니다.
간혹 '/bin/ls Argument list too long'이라는 에러를 낸 경우도 있습니다.
이는 검색조건에 너무 많은 와일드카드 문자로 찾을 경우에 그렇습니다.
이를 테면 /*/*/*.*/.*,

`은 ~문자가 있는 자판(역인용부호).

ls -l 명령어를 사용할 경우, 찾는 결과가 없다면 모두 출력됩니다.
(ls -l와 같기 때문에)
ls 명령어와 마찬가지로 다른 명령어(chmod, chmod)를 결합하여 사용할 경우 그 찾는
결과가 없다면 명령어에 대한 에러를 내겠죠.
(chmod 'null')과 같은 예..........

# find /{home,usr/{src,local/src}} -nouser -o -nogroup -exec ls -l {} ; -print | more
# find /{home,usr/{src,local/src}} -nouser -o -nogroup -print | xargs ls -l | more

위의 2개의 명령어 대해서 직접 테스트 해보세요...

전자의 경우, 아마 아무것도 출력되지 않을 겁니다.

# find /{home,usr/{src,local/src}} ( -nouser -o -nogroup ) -exec ls -l {} ; -print | more

위와 같이 해야 맞겠죠...(우선순위)

후자의 경우도 마찬가지로 다음과 같이 우선순위를 정해놓아야 겠지요..
아마 원하는 출력이 이 경우일 것 같군요.

# find /{home,usr/{src,local/src}} ( -nouser -o -nogroup ) -print | xargs ls -l | more


3-2. 퍼미션 관련 예제

othesrs에 쓰기(w:2) 권한이 있는 모든(-기호를 붙임) 파일 리스트를 찾을려면?

# find `pwd` -perm -2 -print | xargs ls -l

여기에서 2는
퍼미션이 -------w- 와 일치하는 파일이며 -의 의미는 rwx-중 하나.

왜 2인가요?
만약 퍼미션이 755 이라면,

   700 : rwx------ : user
    50 : ---r-x--- : group
     5 : ------r-x : others
   ------------------------
   755 : rwxr-xr-x : others는 읽기와 실행 권한

따라서 others의 권한은 8진수로 5(r+x)이다.

그렇다면, others가 쓰기(w:2) 권한은 당연히 -------w-

그룹이나 others에게 쓰기 권한이 있는 파일일 경우

-perm -20 -o -perm -2

그룹과 others에게 모두 쓰기 권한이 있는 파일일 경우

-perm -22

[others에게 w 권한이 있는 파일에 w 권한 없애기]

방법1)
  1. others에게 w 권한이 있는 파일 리스트 출력

# find `pwd` -perm -2 -print | xargs ls -l | more
(만약 매치되는 리스트가 없다면 전부 출력함)

  2. others에게 w 권한을 없애기

# find `pwd` -perm -2 -print | xargs chmod o-w
(만약 매치되는 리스트가 없다면 chmod에 에러를 냄)

방법2) 방법1)의 과정을 한꺼번에 할 경우

  # find `pwd` -perm -2 -exec chmod o-w {} ; -print | xargs ls -l
  또는
  # ls -l `find $(pwd) -perm -2 -print | xargs chmod o-rwx` | more

  이 경우는 퍼미션이 조정된 결과를 출력함.


3-3. 유저와 관련된 예제

UID와 GID에 대한 유저가 없는 파일을 root.root로 바꾸어 보죠.

1) 먼저 리스트를 출력해 보자.(확인해야하니깐)

  # find . ( -nouser -o -nogroup ) -print | xargs ls -l | more

2) 확인했으면, chown root.root 명령을 내리자.

  # find . ( -nouser -o -nogroup ) -print | xargs chown root.root | more
  또는
  # find . ( -nouser -o -nogroup ) -exec chown root.root {} ; -print | xargs ls -l
  (chown root.root 의 결과를 ls -l)


3-4. 유용한 팁

*주의) ***********************************************
  -a'xxxx'
'xxxx'에 대한 Access(접근), 읽기
  -c'xxxx'
'xxxx'에 대한 Changes(변경), 마지막으로 Access한 경우에도 변경됨
  -m'xxxx'
'xxxx'에 대한 Modify(수정), 파일내용 자체 수정한 경우
*****************************************************

  - 최근 하루(1) 동안(-)에 변경(change)된 파일을 찾을려면(-ctime)?

# find / -ctime -1 -a -type f | xargs ls -l | more

  - 오래된 파일을 찾을려면(30일 이상 수정(modify))되지 않은)?

# find / -mtime +30 -print | more

  - 최근 30일(30) 안에(-) 접근(access)하지 않은 파일과 디렉토리를 리스트로 만들려면(-atime)?

# find / ! ( -atime -30 -a ( -type d -o -type f ) ) | xargs ls -l > not_access.list

  - 자신의 홈디렉토리에서 만 검색하려면?

# find $HOM ...
또는
# find ~root ...

  - 서브 디렉토리로 내려가지 않고 현재 디렉토리에서만 검색하려면?

# find . -prune ...

  - 특정 유저(foobar) 소유의 파일을 찾을려면?

# find / -user foobar -print | more

  - 퍼미션이 777인 파일을 찾을려면 ?

# find / -perm 777 -print | xargs ls -l | more

  - others에게 쓰기 권한이 있는 파일을 찾을려면?

# find / -perm -2 -print | xargs ls -l | more

  - others에게 쓰기 권한이 있는 파일을 찾아 쓰기 권한을 없애려면?

# find / -perm -2 -print | xargs chmod o-w
또는
# find / -perm -2 -exec chmod o-w {} ; -print | xargs ls -l | more

  - 유저이름과 그룹이름이 없는 파일을 찾을려면?

# find / ( -nouser -o -nogroup ) -print | more

  - 빈 파일을 찾을려면?

# find / -empty -print | more
또는
# find / -size 0 -print | more

  - 파일크기가 100M 이상된 파일을 찾을려면?

# find / -size +102400k -print | xargs ls -hl

  - *.bak 파일을 찾아 지울려면?

# find / -name "*.bak" -exec rm -rf {} ;

  - *.bak 파일을 찾아 특정 디렉토리로 옮길려면?

# mv `find . -name "*.bak"` /home/bak/

  - 디렉토리 만 찾을려면?

# find . -type d ...

  - root권한으로 실행되는 파일을 찾을려면?

# find / ( -user root -a -perm +4000 ) -print | xargs ls -l | more

  - 다른 파일시스템을 검색하지 않을려면?

# find / -xdev ...

  - 파일이름에 공백이 들어간 파일을 찾을려면?

# find / -name "* *" -print

  - 숨겨진(hidden) 파일을 찾을려면?

# find / -name ".*" -print | more

  - 같은 이름을 가진 디렉토리를 찾을려면?

# find / -type d -print | awk -F/ '{printf("%s %s
",$NF,$0);}' | sort| more
*주)'O'Reilly Unix Power Tools' 참고

  - 잘못된 링크를 찾을려면?

# find . -type l -print | perl -nle '-e || print' | xargs ls -l
*주)'O'Reilly Unix Power Tools' 참고

Trackback 0 Comment 2
  1. find 2010.01.06 09:40 address edit & del reply

    find / | xargs grep -in 찾을문자

  2. find 2010.01.06 09:40 address edit & del reply

    find grep xargs 사용예

    nohup find ./ -type f -exec echo {} \; -exec grep -n iap_apllogput {} \; > `. cdz;pwd`/iap_apllogput_test.txt &

    nohup find ./ -name "*.ec" -type f -exec grep -ns iap_apllogput {} "|" xargs echo {} \; > `. cdz;pwd`/iap_apllogput_test2.txt &
    nohup find ./ -name "*.ec" -type f -exec grep -ns ui_CommitWork {} "|" xargs echo {} \; > `. cdz;pwd`/ui_CommitWork_ec &
    nohup find ./ -name "*.h" -type f -exec grep -ns ui_CommitWork {} "|" xargs echo {} \; > `. cdz;pwd`/ui_CommitWork_h &
    nohup find ./ -name "*.ec" -type f -exec grep -ns aap_aloghdr {} "|" xargs echo {} \; > `. cdz;pwd`/aap_aloghdr_ec &
    nohup find ./ -name "*.h" -type f -exec grep -ns aap_aloghdr {} "|" xargs echo {} \; > `. cdz;pwd`/aap_aloghdr_h &

    nohup find ./ -name "*.pc" -type f -exec grep -ns uisttcnv_INCT3001001 {} "|" xargs echo {} \; > /pgm_nb/kdy_uisttcnv_INCT3001001_pc &
    nohup find ./ -name "*.h" -type f -exec grep -ns uisttcnv_INCT3001001 {} "|" xargs echo {} \; > /pgm_nb/kdy_uisttcnv_INCT3001001_h &

    nohup find ./ -name "*.*" -type f -exec grep -ns uisttcnv_INCT3001001 {} "|" xargs echo {} \; > /pgm_nb/kdy_uisttcnv_INCT3001001_All &

    find / \( -name a.out -o -name '*.o' \) -atime +7 ! -fstype nfs -exec \ rm {} \;

    nohup find ./ -name "*.*" -type f -exec grep -ns pCCn9999.c {} "|" xargs echo {} \;

2009. 7. 12. 03:36

PostgreSQL On Gentoo

이 문서는 Gentoo에서 PostgreSQL을 설치하기 위한 문서입니다. http://www.gentoo.org/doc/en/postgres-howto.xml 을 원본으로 하여 번역한 것입니다.

1 소개

1.1 PostgreSQL 소개

대부분의 개발자와 다른 데이터베이스 솔루션들에 대하여 대화를 나누어 보면, 두 가지 종류의 데이터베이스가 주로 대답으로 나옵니다. 하나는 MySQL이고 다른 하나는 이 문서에서 다루고자 하는 PostgreSQL입니다. 서로간의 장단점에 대해서 오랜 시간동안 논쟁이 있어 왔지만, PostgreSQL이 MySQL보다 진정한 관계형 데이터베이스 구조에는 더 확고하다는 말이 있습니다. FOREIGN KEY와 같은 대부분의 기본적인 특징들이 MySQL 5에서 추가되었습니다. 그러나 어떤 상황이 되든, 이 문서는 여러분이 PostgreSQL을 사용할 데이터베이스로 선택했다고 가정합니다. 처음 해야 할 일은 emerge 과정을 시작하는 것입니다. 다음 섹션에서는 기본 설정 뿐만 아니라 emerge를 통한 설치 과정을 설명할 것입니다.

1.2 PostgreSQL 설치하기

시작하려면 먼저 PostgreSQL 패키지를 emerge 해야 합니다. 이렇게 하려면 다음과 같은 코드로 옵션이 제대로 설정되어 있는지를 먼저 확인해야 합니다.

코드 목록 1.1: PostgreSQL 빌드 옵션 확인
# emerge -pv postgresql

These are the packages that I would merge, in order:

Calculating dependencies ...done!
[ebuild  N    ] dev-db/postgresql-8.0.4  -doc -kerberos +libg++ +nls +pam +perl
-pg-hier -pg-intdatetime +python +readline (-selinux) +ssl -tcltk +xml2 +zlib 0 kB

여기 서로 다른 빌드 옵션이 나타내는 것의 목록이 있습니다.

USE 플래그 의미
doc 이 USE 플래그는 표준 man 페이지의 외부 문서 설치를 켜거나 끕니다. 공간이 적거나 문서를 얻을 수 있는 다른 방법(온라인 등)이 있으시면 이것을 끄시면 됩니다.
kerberos 데이터베이스에 이 옵션을 켜서 접속하면 admin이 데이터베이스로의 사용자/서비스를 검증할 때, kerberos를 사용하는 옵션을 갖습니다.
libg++ 이 옵션이 켜져 있으면 PostgreSQL의 C++ 바인딩이 설치됩니다. C++ 프로그래머가 연결할 수 있는 libpq++가 설치됩니다.
nls 이 옵션이 켜져 있으면 영어를 사용하지 않는 사용자를 위하여 번역된 문자열을 쓸 수 있습니다.
pam 이 옵션이 켜져 있고, admin이 PostgreSQL 설정 파일을 제대로 설정하면 사용자/서비스는 PAM(Pluggable Authentication Module)을 이용하여 PostgreSQL에 로그인 할 수 있게 됩니다.
perl 이 옵션이 켜져 있으면 PostgreSQL의 펄 바인딩이 설치됩니다.
pg-hier 이 옵션이 켜져 있으면 오라클 데이터베이스의 CONNECT 문에서 볼 수 있는 계층적 질의를 켜는 패치를 적용하게 됩니다. 오라클 참조 안내서에 계층적 질의에 대한 더 많은 정보가 있습니다.
pg-intdatetime 이 옵션이 켜져 있으면 PostgreSQL은 64비트 정수 날짜 형식을 지원하게 됩니다.
python 이 옵션이 켜져 있으면, PostgreSQL은 파이썬 바인딩을 설치하게 됩니다.
readline 이 옵션이 켜져 있으면, PostgreSQL은 readline 스타일의 명령줄 편집을 지원하게 됩니다. 이것은 명령 히스토리와 isearch 기능을 포함합니다.
selinux 이 옵션이 켜져 있으면, PostgreSQL의 selinux 정책이 설치 됩니다.
ssl 이 옵션이 켜져 있으면, PostgreSQL은 OpenSSL 라이브러리로 PostgreSQL 클라이언트와 서버 사이의 트래픽을 암호화하게 됩니다.
tcltk 이 옵션이 켜져 있으면, PostgreSQL은 tcl/tk 바인딩을 설치하게 됩니다.
xml2 이 옵션이 켜져 있으면, XPATH 스타일 xml 지원이 설치되게 됩니다. PostgreSQL의 xml 지원에 대한 더 자세한 정보는 PostgreSQL과 XML에서 찾으실 수 있습니다.
zlib 이것은 PostgreSQL 자체에서는 사용하지 않습니다만 pg_dump에서 생성하는 덤프를 압축합니다.

주의: pg-hier 패치 작성자는 패치 업무를 중단하였으며, 다음 버전에서는 삭제될 것입니다.

PostgreSQL을 여러분의 필요에 따라서 커스터마이징 하였다면 계속 진행하여 emerge를 시작하십시오.

코드 목록 1.2: PostgreSQL emerge 하기
# emerge postgresql
(Output shortened)
>>> /usr/lib/libecpg.so.5 -> libecpg.so.5.0
>>> /usr/bin/postmaster -> postgres
 * Make sure the postgres user in /etc/passwd has an account setup with /bin/bash as the shell
 *
 * Execute the following command
 * emerge --config =postgresql-8.0.4
 * to setup the initial database environment.
 *
>>> Regenerating /etc/ld.so.cache...
>>> dev-db/postgresql-8.0.4 merged.

einfo 출력에서 나타났듯이, 설치 후에 해야 할 작업들이 있습니다. 다음 장에서 PostgreSQL의 실제 설정에 대해서 살펴볼 것입니다.

2 PostgreSQL 설정하기

2.1 초기 데이터베이스 환경 설정하기


이전의 emerge 출력에서 알려준 대로, 초기 데이터베이스 환경을 설정해야 합니다. 그러나 이것을 하기 전에 한 가지 고려해야 할 점이 있습니다. MySQL 같은 것과는 다르게, PostgreSQL의 "root" 패스워드는 실제 사용자의 패스워드라는 것입니다. 그러나 ebuild가 생성한 사용자는 패스워드가 설정되어 있지 않습니다. 따라서 시작하기 전에 postgres 사용자의 패스워드를 설정해야 합니다.

코드 목록 2.1: 패스워드 설정
# passwd postgres
New UNIX password:
Retype new UNIX password:
passwd: password updated successfully

이제 설정이 되었고, 초기 데이터베이스를 생성할 수 있습니다.

코드 목록 2.2: emerge --config로 데이터베이스 환경 설정하기
# emerge --config =postgresql-8.0.4


Configuring pkg...

 * Creating the data directory ...
 * Initializing the database ...
The files belonging to this database system will be owned by user "postgres".
This user must also own the server process.

The database cluster will be initialized with locale C.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating directory /var/lib/postgresql/data/global ... ok
creating directory /var/lib/postgresql/data/pg_xlog ... ok
creating directory /var/lib/postgresql/data/pg_xlog/archive_status ... ok
creating directory /var/lib/postgresql/data/pg_clog ... ok
creating directory /var/lib/postgresql/data/pg_subtrans ... ok
creating directory /var/lib/postgresql/data/base ... ok
creating directory /var/lib/postgresql/data/base/1 ... ok
creating directory /var/lib/postgresql/data/pg_tblspc ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 1000
creating configuration files ... ok
creating template1 database in /var/lib/postgresql/data/base/1 ... ok
initializing pg_shadow ... ok
enabling unlimited row size for system tables ... ok
initializing pg_depend ... ok
creating system views ... ok
loading pg_description ... ok
creating conversions ... ok
setting privileges on built-in objects ... ok
creating information schema ... ok
vacuuming database template1 ... ok
copying template1 to template0 ... ok

WARNING: enabling "trust" authentication for local connections
You can change this by editing pg_hba.conf or using the -A option the
next time you run initdb.

Success. You can now start the database server using:

    /usr/bin/postmaster -D /var/lib/postgresql/data
or
    /usr/bin/pg_ctl -D /var/lib/postgresql/data -l logfile start

 *
 * You can use /etc/init.d/postgresql script to run PostgreSQL instead of pg_ctl.
 *

이제 초기 데이터베이스가 설정되었습니다. 다음 섹션에서는 설치를 검증하고 데이터베이스에 접근할 사용자를 설정하는 것을 하겠습니다.

2.2 PostgreSQL 데이터베이스 설정


이제 PostgreSQL이 설정되었습니다. 이제 설치를 검증해 보는 것이 좋을 것입니다. 먼저, 서비스가 제대로 시작되는지 확인해 봅시다.

코드 목록 2.3: PostgreSQL 서비스 시작하기
# /etc/init.d/postgresql start
* Starting PostgreSQL ...                                          [ ok ]

이것이 제대로 동작하는지 확인이 되면, 부팅될 때마다 시작할 수 있도록 기본 runlevel에 추가해 주는 것이 좋을 것입니다.

코드 목록 2.4: 기본 runlevel에 추가하기
# rc-update add postgresql default
* postgresql added to runlevel default

이제 서비스가 시작되었고 데이터베이스를 검사해 볼 시간입니다. 시작하려면 createdb 명령을 써서 test 데이터베이스를 만들어 봅시다. -U 옵션을 넘겨서 사용자 이름(넘기지 않으면 기본값으로 현재 사용자 이름이 됩니다)를 정하고, -W 옵션으로 이전에 만들었던 암호를 요청합니다. 결국 만들고자 하는 데이터베이스에 이름을 정해 주었습니다.

코드 목록 2.5: createdb로 데이터베이스 생성하기
$ createdb -U postgres -W test
Password:
CREATE DATABASE

데이터베이스가 성공적으로 만들어졌으며, 데이터베이스가 기본적인 작업을 수행할 수 있는지 확인해 볼 수 있습니다. 계속해서 dropdb 명령으로 데이터베이스를 떨어뜨리고(지워버리고) 다음에 다시 쓸 데이터베이스를 생성할 것입니다.

코드 목록 2.6: dropdb로 데이터베이스 떨어뜨리기
$ dropdb -U postgres -W test
Password:
DROP DATABASE

이제, postgres 사용자만 명령을 수행할 수 있습니다. 분명히 다중 사용 환경은 설정의 일종은 아닙니다. 다음 섹션에서 사용자 계정에 대한 것을 살펴볼 것입니다.

2.3 데이터베이스 사용자 계정 설정하기


이미 언급했듯이, postgres 사용자로 로그인 해야 한다는 것은 다중 사용자 환경에서는 적합하지 않습니다. 대부분의 경우에 다양한 사용자와 서비스가 서버에 접근할 것이고 각각은 서로 다른 퍼미션이 필요할 것입니다. 따라서 이것을 다루려면 createuser 명령을 사용합니다. 이 명령은 몇몇 SQL 질의문을 수행하는 대신에 쓸 수 있고, admin의 관점에서 훨씬 더 유연합니다. 계속해서 두 명의 사용자, 즉 다른 사용자와 관리자를 추가할 수 있는 'superuser'와 일반 사용자를 생성할 것입니다.

코드 목록 2.7: superuser 설정하기
(replace chris with the username you'd like to use)
$ createuser -a -d -P -E -U postgres -W chris
Enter password for new user:
Enter it again:
Password:
CREATE USER

이제 superuser를 생성하였습니다. 명령줄 옵션 -a는 다른 사용자를 추가할 수 있는 사용자라는 것을 나타냅니다. -d는 데이터베이스를 만들 수 있는 사용자라는 것을 의미합니다. -P는 이 사용자의 암호를 입력할 수 있게 해 주고, -E는 보안 목적을 위하여 그것을 암호화합니다. 이제 일반 사용자를 설정하면서 이 새로운 사용자의 퍼미션을 검사해 봅시다.

코드 목록 2.8: 일반 사용자 설정하기
(replace chris with the username you've just created)
$ createuser -A -D -P -E -U chris -W testuser
Enter password for new user:
Enter it again:
Password:
CREATE USER

성공했습니다! 새 사용자를 이전에 만들었던 superuser를 통하여 만들었습니다. -A와 -D 옵션은 -a와 -d의 반대로써, 다른 사용자와 데이터베이스의 사용을 거부합니다. 이제 작업을 할 수 있는 사용자가 만들어졌고 새로운 데이터베이스가 만들어졌으므로 다음 장에서는 새 데이터베이스를 만드는 것을 살펴보겠습니다.

3 PostgreSQL 사용하기

3.1 퍼미션 설정하기

새 데이터베이스에 데이터베이스를 새로 만들고 다른 사용자를 추가할 수 있는 사용자가 있고 무엇이든 할 수 있는 메인 postgres 사용자가 있습니다. 이전에 만들었던 사용자는 현재 서버에 로그인할 수 있고, 그것에 대한 것입니다. 일반적으로 사용자는 데이터를 삽입하고 꺼낼 수 있어햐 하며, 때로는 다른 여러 작업을 할 수 있어야 합니다. 따라서 이 새 사용자가 어떤 것이든 할 수 있어야 하고, 적합한 퍼미션을 설정하여야 합니다. 이것은 -O 매개변수를 createdb에 넘겨주는 것으로 쉽게 할 수 있습니다. superuser로 MyDB라는 새 데이터베이스를 만들고 그것을 이전의 testuser의 소유로 만드는 것부터 시작할 것입니다.

코드 목록 3.1: MyDB 데이터베이스 만들기
$ createdb -O testuser -U chris -W MyDB
Password:
CREATE DATABASE

되었습니다. 이제는 새 MyDB 데이터베이스를 만들었고, testuser가 그것에 접근할 수 있습니다. 이것을 검사하기 위하여 testuser로 이 새 MyDB 데이터베이스에 로그인하여 볼 것입니다. psql 프로그램으로 이것을 할 수 있습니다. 이 프로그램은 명령줄에서 PostgreSQL 데이터베이스로 연결하는데 사용하는 프로그램입니다. 따라서 새 데이터베이스에 이렇게 연결합니다.

코드 목록 3.2: testuser로 MyDB 데이터베이스에 로그인하기
$ psql -U testuser -W MyDB
Password:
Welcome to psql 8.0.4, the PostgreSQL interactive terminal.

Type:  \copyright for distribution terms
       \h for help with SQL commands
       \? for help with psql commands
       \g or terminate with semicolon to execute query
       \q to quit

MyDB=>

이제 testuser로 데이터베이스에 로그인하였으며, 몇 가지 명령을 시작할 수 있습니다. PostgreSQL을 이용하는 느낌을 받으려면 다음 섹션에서 psql 클라이언트를 돌아다니는 기본 명령에 대하여 살펴보십시오.

3.2 기본 PostgreSQL 명령과 테이블 작성하기


MySQL을 사용해 본 적이 있으신 분들을 위하여 꼭 읽어야 할 것이 있습니다. 여기서 PostgreSQL이 명령을 수행하는 것과 관련하여 독특한 무언가를 알 수 있을 것입니다. 시작하려면 여기에서 논의하고자 하는 명령의 목록을 보십시오.

명령 사용법 동등한 MySQL 명령
\connect [DBNAME|- USER] 다른 데이터베이스에 연결한다 USE DATABASE
\q psql 클라이언트를 종료한다 quit
\i FILE FILE에서 명령을 수행한다 source FILE
\o FILE 질의문의 결과를 FILE로 보낸다 INTO OUTFILE, but outputs everything (not just SELECTS)
\d NAME (다른 아이템도 물론이며) 데이터베이스나 테이블을 묘사한다 DESC(RIBE)
\db PATTERN PATTERN에 맞는 쓸 수 있는 테이블의 목록을 나열한다 (패턴을 주지 않으면 모든 테이블을 나열) SHOW TABLES

\connect를 제외하고 모든 명령은 이 섹션의 뒤에서 보여줄 것입니다. 따라서 지금은 데이터베이스가 비어 있습니다. 그 말은 데이터를 삽입할 필요가 있다는 것입니다. 그러나 데이터를 삽입하는 첫 걸음은 테이블에 넣는 것입니다. 지금 현재로서는 테이블이 데이터베이스에 없으므로, 이것을 먼저 만들어야 합니다. CREATE TABLE 명령으로 이것을 할 수 있습니다. 항목의 테이블을 만들 것입니다. 상품 ID와 설명, 가격이 들어간 테이블을 만들 것입니다.

코드 목록 3.3: 상품 테이블 만들기
MyDB=> CREATE TABLE products (
MyDB(>   product_id SERIAL,
MyDB(>   description TEXT,
MyDB(>   price DECIMAL
MyDB(> );
NOTICE:  CREATE TABLE will create implicit sequence "products_product_id_seq"
for serial column "products.product_id"
CREATE TABLE

NOTICE는 무시하여도 되고 완전히 무해합니다. 함수의 마지막 줄인 CREATE TABLE을 보면 명령이 성공적으로 이루어졌다는 것을 알 수 있습니다. 그러나 계속해서 테이블이 정말 성공적으로 만들어졌는지 \d 명령을 통하여 알아봅시다.

코드 목록 3.4: 새로 작성한 테이블 살펴보기
MyDB=> \d products
                                 Table "public.products"
   Column    |  Type   |                            Modifiers
-------------+---------+------------------------------------------------------------------
 product_id  | integer | not null default nextval('public.products_product_id_seq'::text)
 description | text    |
 price       | numeric |

정말로 테이블이 만들어졌습니다. 이제 테이블이 만들어졌으니 데이터를 집어넣어야 합니다. 다음 섹션에서 데이터베이스에 데이터를 집어넣는 것을 살펴볼 것입니다.

3.3 데이터를 데이터베이스에 삽입하기


이 섹션은 새로 만들어진 테이블에 데이터를 집어넣는 두 가지 방법을 살펴볼 것입니다. 첫 번째로 가장 기본적인 명령인 INSERT를 알아봅시다.

코드 목록 3.5: INSERT 구문
INSERT INTO [tablename] (column1,column2,column3) VALUES(value1,value2,value3)

테이블 이름은 데이터를 집어넣을 테이블의 이름을 포함합니다. (column1,column2,column3)은 특정 컬럼에 값을 넣을 수 있게 해 줍니다. VALUES(value,value2,value3)은 값의 나열입니다. 이 값들은 컬럼과 같은 순서(column1이 value1을 갖고, column2가 value2를 갖고, column3이 value3를 갖는다)가 됩니다. 이들의 수는 서로 같아야 합니다. 계속해서 항목을 테이블에 넣어 봅시다.

중요: 데이터베이스에서 오랫동안 작업하면서 개인적으로 INSERT 명령문을 위와 같이 정확하게 할 것을 추천합니다. 개발자들은 INSERT INTO에서 컬럼 이름을 명시하지 않고 실수로 종종 사용합니다. 새 컬럼이 데이터베이스에 추가될 수도 있어서 이것은 비생산적입니다. 값과 컬럼의 수가 서로 같지 않아서 에러가 발생할 수 있습니다. 새로운 컬럼을 추가할 것을 300% 확신하지 않는다면 항상 컬럼을 명시해 주세요.

코드 목록 3.6: 테이블에 데이터를 삽입하기
MyDB=> INSERT INTO products (description,price) VALUES('A test product', 12.00);
INSERT 17273 1

마지막 줄은 약간 설명이 필요합니다. insert 명령의 반환값은 OID (객체 식별자)와 삽입된 줄의 수입니다. OID는 이 가이드의 범위를 조금 넘어선 것이고 PostgreSQL 매뉴얼에 좋은 정보가 있을 것입니다. 이제 20,000 상품을 가지고 있는 상황에서 이 insert 문은 조금 번거로울 수 있습니다. 그러나 모든 것을 잃는 것은 아닙니다. COPY 명령이 파일이나 stdin에서 테이블을 삽입할 수 있습니다. 이 예제에서는 csv(컴마로 구분된 값) 파일이 있다고 하고, 이것에 상품 id, 설명, 가격이 있다고 합시다. 파일은 다음과 같을 것입니다.

코드 목록 3.7: products.csv
2,meat,6.79
3,soup,0.69
4,soda,1.79

이제 COPY 명령으로 데이터를 집어넣어 봅시다.

중요: postgres 사용자만이 파일에서 데이터를 집어넣을 수 있기 때문에 COPY FROM STDIN 명령을 사용하였습니다. (명백한 보안상의 이유)

코드 목록 3.8: COPY를 사용하여 상품 테이블에 집어넣는 모습
MyDB=> COPY products FROM STDIN WITH DELIMITER AS ',';
Enter data to be copied followed by a newline.
End with a backslash and a period on a line by itself.
>> 2,meat,6.79
>> 3,soup,0.69
>> 4,soda,1.79
>> \.

불행히도, 이 줄이 INSERT INTO 명령어와 같은 상태 정보를 보여주지는 않습니다. 데이터가 들어갔는지 어떻게 알 수 있을까요? 다음 섹션에서 데이터를 확인하기 위하여 실행하는 질의문을 살펴볼 것이빈다.

3.4 PostgreSQL 질의 사용하기


이번 섹션에서는 테이블 내에 있는 정보를 보는 SELECT문에 대하여 설펴 볼 것입니다. 기본적인 SELECT 형식은 다음과 같습니다.

코드 목록 3.9: SELECT 구문
SELECT (column1,column2|*) FROM (table) [WHERE (conditionals)]

컬럼을 선택하는 방법은 두 가지가 있습니다. 첫 번째 것은 *로 모든 컬럼을 선택하는 방법이고 두 번째는 보고자 하는 특정 컬럼의 목록을 명시하는 것입니다. 두 번째는 큰 목록을 보기보다는 특정 컬럼만 보려고 하는 경우에 꽤나 편리합니다. SELECT에 *로 모든 컬럼을 명시하는 것부터 시작해 봅시다.

코드 목록 3.10: 상품 테이블 보기
MyDB=> SELECT * FROM products;
 product_id |  description   | price
------------+----------------+-------
          1 | A test product | 12.00
          2 | meat           |  6.79
          3 | soup           |  0.69
          4 | soda           |  1.79
(4 rows)

여기서 나타난 대로, 모든 데이터가 정말로 테이블에 들어갔습니다. 이제 설명과 가격만 보고자 한다고 하고, 상품 id는 보고 싶지 않다고 합시다. 이제 컬럼을 명시한 SELECT 형태를 사용할 것입니다.

코드 목록 3.11: 상품 테이블에서 특정 컬럼을 보기
MyDB=> SELECT description,price FROM products;
  description   | price
----------------+-------
 A test product | 12.00
 meat           |  6.79
 soup           |  0.69
 soda           |  1.79
(4 rows)

이제 상품과 가격만 보이기 때문에 중요한 자료에 집중할 수 있게 되었습니다. 이제 $2.00이 넘는 항목만을 보고자 한다고 합시다. 여기 WHERE 절을 간편하게 쓸 수 있습니다.

코드 목록 3.12: 상품 테이블의 특정 행을 보기
MyDB=> SELECT description,price FROM products WHERE price > 2.00;
  description   | price
----------------+-------
 A test product | 12.00
 meat           |  6.79
(2 rows)

이제 $2.00이 넘는 상품이 화면에 나타나서 더욱 집중할 수 있게 되었습니다. 정보 질의의 이런 형태는 아주 강력하고 극도로 유용한 보고를 만들 수 있습니다.

3.5 맺음말


PostgreSQL의 가이드가 여기서 끝이 납니다. 저의 질문에 대답을 해 주시어 도와주신 젠투 PostgreSQL 유지를 맡고 있는 마사도모 나가노씨에게 크게 감사합니다. 이 가이드에 어떤 제안이라도 있으시면 chriswhite@gentoo.org 에 보내 주십시오. 더 확장적인 문서를 원하시면 PostgreSQL 웹사이트를 보십시오.


출처 : http://wiki.kldp.org/

Trackback 0 Comment 0
2009. 5. 27. 17:43

UFS(Unix File System) ACL 사용

UFS 파일시스템 : 사용자나 시스템이 접근하는 파일이나 디렉토리를 저장한 정보를 가짐
 
   ① 디스크레이블
   ② 부트블럭
   ③ 슈퍼블럭
    ---------------
   ④ 백업슈퍼블럭        ┐
   ⑤ 실린더 그룹 블럭  │  First Cylinder Group  : 논리적으로 나눠놓은 공간
   ⑥ i-node 테이블      │
   ⑦ 데이터 블럭          ┘
    ---------------
   ⑧ 백업슈퍼블럭       ┐
   ⑨ 실린더 그룹 블럭  │ Second Cylinder Group
   ⓐ i-node 테이블      │                :
   ⓑ 데이터 블럭         ┘                 :

① 디스크레이블 : VTOC, 디스크에 대한 전반적인정보, (slice를 구성할때 생성됨)
② 부트블럭 : 시스템이 부팅하는데 사용되는 bootblk 프로그램이 저장되는 곳
                    부팅에 대한 정보를 저장해 놓은 영역,  각각의 파일 시스템에 존재(slice단위)
                    부팅불가능한 파일시스템에는 bootblk프로그램이 저장되지 않음
③ 슈퍼블럭 : 16~31섹터를 사용하며, 파일 시스템에 대한 전반적인 정보를 저장하는 영역
                     + 데이터블럭의 수, 실린더그룹의 수, i-node, 백업슈퍼블럭

④ 백업슈퍼블럭 : 슈퍼블럭에 대한 복사본
                           #newfs -N /dev/rdsk/c0d0s0 : slice, 슈퍼블록백업 정보가 출력
                              정보중) 16 c/g : 1개의 실린더 그룹에 16개 실린더로 구성
                                          16.00MB/g : 1개의 실린더 그룹의 용량은 16Mb
                                          7680 i/g : 7680개의 i-node가 소속
⑤ 실린더 그룹 블럭  : 최소 16에서 최대 256개 실린더로 구성되며, disk 접근 속도 향상 목적
                                 + 백업슈퍼블럭 : 슈퍼블럭의 정보를 가짐 (복사본)
                                 + 실린더그룹블럭 : i-node테이블 정보와, 데이터블록에 대한 정보
                                 + i-node : 데이터블럭에 대한 위치정보
                                 + 데이터블럭 :  데이터의 실제 저장소
⑥ i-node 테이블 : 실제 데이터를 저장하는 데이터 블록의 위치를 저장하는 영역
                i-node테이블 하나의 크기는 약 64kbyte
                file type, permission, uid, gid, size, date, direct pointer, single I.D.P, Double I.D.P, shadow i-node 정보가 저장
                   #ls -i : i-node의 Number를 확인
 *shadow i-node : ACL정보를 저장

⑦ 데이터 블럭 : 실제 데이터의 실제 저장소


링크파일
     - symbolic link : 윈도우의 단축아이콘과 비슷, 사이즈는 경로명의 글자수 (file type : l)
                               디렉토리 링크 가능
                               원본에 문제가 생기면 내용을 확인 할 수 없다.
                               #ln -s a b (ln -s 원본파일명 링크파일명)
     - Hard link : 원본과 동일한 i-node 사용, 파일로 만들어지지 않으며, 디렉토리 안에 i-node정보를 변경하기 때문에 링크수가 증가한다)
                        디렉토리 자체는 링크 할 수 없다
                        원본에 문제가 생겨도 내용확인이 가능하다
                        #ln a b   (ln 원본파일명 링크파일명)
                        *복사와는 개념이 틀림 (복사는 데이터블록도 틀리고, i-node정보도 틀림)


Device File
 + 시스템의 하드웨어나 주변기기를 나타내는 파일
 + 디바이스 파일의 실제 크기는 존재하지 않음 (185, 3등으로 표시한다)
     ┌ major number : 디바이스 파일의 종류 , 185
     └ minor number : 디바이스의 위치 , 3



mount : 물리적인 저장공간을 사용하기 위하여, 저장매체를 논리적인 저장공간으로 포인터로 연결 (디렉토리로 연결)
  옵션) -F (ufs, hsfs, pcfs, nfs) : 파일시스템을 지정하는 옵션 (기본적으로 ufs파일 시스템으로 지정)
    > mount 명령어는 재부팅을 하면 사라짐



퍼미션만으로는 충분치 않을 때 ACL을 사용하라.

예전에는 대체로 Unix 의 파일 퍼미션만으로 충분했다. 그러나, 다중 사용자로 구성된 고도의 협업 환경에서는 이 방법만으로는 관리가 힘들게 되었다. ACL(Access control list)은 오픈 소스Unix(Linux계열)에서는 새로운 기능이지만, 예전부터 상용 OS에서는 사용되고 있었다. ACL은 원래 시스템의 안전성을 높여주는 것이 아니라, 복잡한 퍼미션 관리를 편리하게 해주는 것이다. ACL은 파일과 디렉터리 퍼미션을 적용하는 새로운 방법으로, 불필요한 그룹을 생성하지는 않는다.

ACL은 파일시스템의 메타데이터의 확장된 속성으로서 저장된다. 당신이 정한 기준에 근거하여 파일이나 디렉터리에 액세스를 허가하거나 거부하는 리스트를 ACL에 정의할 수 있다. 하지만, ACL은 기존의 퍼미션 시스템을 완전히 버리는 것은 아니다. ACL은 user와 group에 지정할 수 있고, read, write, execute 영역으로 구분된다. 게다가 ACL은 파일 모드의 "other" 비트처럼 어떠한 유저 ACL이나 그룹 ACL에도 속하지 않는 유저나 그룹에도 정의할 수 있다.

또한 ACL은 ACL 마스크(mask)라는 것을 가지고 있어, 유저와 그룹에 지정된 모든 ACL의 퍼미션 마스크로서 동작한다. 이것은 umask와 비슷하지만, 약간 다르다. 예를 들어, ACL마스크를 r-- 로 설정하면, 일치하는 모든 ACL은 자신의 갖고 있는 퍼미션(예: rw-)이 효력을 잃게 되어, r--로 설정된다. 디렉터리는 디폴트 ACL을 가질 수 있는데, 이것은 해당 디렉터리에 내에서 생성되는 파일이나 서브디렉터리의 디폴트 ACL이다.


1. ACL의 활성화

Linux 계열(Ext2/3, ReiserFS, JFS, XFS)에서 사용되는 대부분의 파일시스템은 ACL을 지원하고 있다. Linux의 경우, 당신이 사용하고 있는 파일 시스템의 종류에 해당하는 커널 구성 옵션이 설정되어 있는지 확인하면 된다.

CONFIG_EXT2_FS_POSIX_ACL=y
CONFIG_EXT3_FS_POSIX_ACL=y
CONFIG_REISERFS_FS_POSIX_ACL=y
CONFIG_JFS_POSIX_ACL=y
CONFIG_FS_POSIX_ACL=y
CONFIG_XFS_POSIX_ACL=y


FreeBSD의 경우에는 파일시스템을 acls 옵션으로 마운트하면 ACL을 사용할 수 있다.

# mount -o acls -u /usr
# mount

/dev/ad0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/ad0s1e on /tmp (ufs, local, soft-updates)
/dev/ad0s1f on /usr (ufs, local, soft-updates, acls)
/dev/ad0s1d on /var (ufs, local, soft-updates)


-u옵션은 현재 마운트되어 있는 파일시스템의 마운트 옵션을 업데이트한다. 비활성화할 경우에는 noacls 옵션을 사용한다. 파일시스템 부팅시 자동으로 ACL을 활성화하려면, /etc/fstab 에서 해당 파일시스템 부분을 다음과 같이 수정한다.

/dev/ad0s1f /usr ufs rw,acls 2 2


2. ACL관리

ACL이 활성화되면, setfacl커맨드를 사용하여 ACL의 설정, 수정 및 삭제가 가능하다. ACL을 생성하거나 수정하기 위해서는 -m옵션을 사용한다. -x옵션과 함께 ACL이나 ACL리스트를 지정하면 ACL을 삭제할 수 있다.

다음과 같이 ACL은 일반적으로 user, group, other의 형태로 나뉜다.

# User ACL
u:[user]:
# Group ACL
g:[group]:
# Other ACL
o:


user와 group 에 ACL을 지정할 때 ACL명은 옵션이다. ACL명이 생략되면, ACL은 base ACL을 적용하는데, 이것은 파일의 mode bit에서 유래한 것이다. 따라서 base ACL을 변경하면, 마찬가지로 mode bit도 변경된다.

다음은 myfile이라는 파일을 생성하고, 그 파일의 base ACL을 수정하는 예이다.

$ touch myfile
$ ls -l myfile

-rw-rw-r-- 1 andrew andrew 0 Oct 13 15:57 myfile
$ setfacl -m u::---,g::---,o:--- myfile
$ ls -l myfile

---------- 1 andrew andrew 0 Oct 13 15:57 myfile


이 예에서는 컴마(,)를 사용하여 여러 ACL을 지정하고 있다.

다음 예는 유저나 그룹에 ACL을 지정하는 것을 나타낸다.

$ touch foo
$ setfacl -m u:jlope:rwx,g:wine:rwx,o:--- foo
$ getfacl foo

# file: foo
# owner: andrew
# group: andrew
user::rw-
user:jlope:rwx
group::---
group:wine:rwx
mask::rwx
other::---


마스크를 r--로 변경하면, jlope 과 wine 의 ACL은 실제 r-- 이 된다.

$ setfacl -m m:r-- foo
$ getfacl foo

# file: foo
# owner: andrew
# group: andrew
user::rw-
user:jlope:rwx #effective:r--
group::---
group:wine:rwx #effective:r--
mask::r--
other::---


위에서 언급했듯이, 디렉터리는 자신의 디렉터리내에서 생성되는 파일에 자동으로 적용되는 디폴트 ACL을 가질 수 있다. 디폴트 ACL을 지정하기 위해서는 d: 를 사용한다.

$ mkdir mydir
$ setfacl -m d:u:jlope:rwx mydir
$ getfacl mydir

# file: mydir
# owner: andrew
# group: andrew
user::rwx
group::---
other::---
default:user::rwx
default:user:jlope:rwx
default:group::---
default:mask::rwx
default:other::---

$ touch mydir/bar
$ getfacl mydir/bar

# file: mydir/bar
# owner: andrew
# group: andrew
user::rw-
user:jlope:rwx #effective:rw-
group::---
mask::rw-
other::---


getfacl 커맨드를 사용하여 ACL을 참조할 수 있다. 이 커맨드는 간단하여 옵션이 별로 없지만, -R옵션을 사용하면 ACL을 반복하여 실행하므로 유용하다(ls –R과 유사). 

 

UFS(Unix file system) 구조 

0      Disk Label
1~15   Bootblk
16~31  Super Block 
32     Backup Super Block         ---------------------------------------------
       Cylinder Group Block       First cylinder group
       Inode table
       Data Block                 ---------------------     ufs file system                      
       Backup Super Block         Second cylinder group
       Cylinder Group Block
       Inode table
       Data Block                 ----------------------------------------------


◆ Disk Label

- 하드 디스크 전체 정보를 담고 있는 영역으로 0번 sector에 저장된다.
- 디스크 레이블에 저장되는 데이터는 섹터의 크기, 트랙 하나당 섹터의 개수,
- 실린더 하나 당 트랙의 개수, 실린더 하나당 섹터의 개수, 전체 실린더의 개수,
- 슬라이스 테이블 등의 내용이 저장된다.
- 디스트 레이블은 VTOC 라고 불리기도 한다.

# prtvtoc /dev/dsk/c0d0s2

 

◆ Boot Block [1~15] (7.5kbyte)

- bootprogram저장
- 각각의 파일 시스템에 존재
- root file system은 오직 하나의 active boot block 소유


. 시스템이 부팅하는 대 사용되는 bootblk 프로그램이 저장되는 곳

 

◆ Superblock [16~31]

. 파일 시스템에 대한 중요한 정보가 저장되어 있다.

 

file system 에 대한 정보를 저장

-datablock의 수
-cylinder group의 수
-data block크기와 fragment의 수
-mount point 이름
-file system  상태 플래그
(clean,stable,active,logging,unknown)

 

◆ Cylinder groups

 

Definition

* disk 접근 속도 향상
* 최소 16개의 cylinder로 구성

구성요소

* Backup super block
* cylinder group block
-inode 의 수, cylinder group 에서 data block의 수, 디렉토리 수
-free block, free inode, free fragment, free block map
-사용중인 inode map

* Inode table
-data block에 대한 위치 정보

* Data block
-data의 실제 저장소
-8kbyte 단위

. 실제 파일이나 디렉토리의 저장하는 영역이다.

. 백업 수퍼블럭, 실린더 그룹 블록, i-node table, 데이터 블록이 모여 하나의 실린더 그룹을 이룬다.
. 파일 시스템이 크면 실런더 구룹도 커진다. 최소 16개의 실런더부터 최대 256개까지 가능하다.
. i-node의 크기는 항상 일정하지만 데이터 블록의 크기는 파일의 크기에 따라 다른다.

 

◆ Backup Superblock

*Definition
- super block의 backup
- 각 cylinder group당 하나씩 존재
- 첫번째 backup block는 32sector부터 시작

.실린더 그룹의 내용 중 가장 먼저 나오는 내용이다.

.백업 수퍼 블록은 수퍼 블록이 잘못 되었을 경우를 대비하여 수퍼블록과 동일한 내용을 가지는 영역이다
.항상 실린더 그룹의 처음에 위치하고 크기도 수퍼 블록과 동일하다.
.수퍼블록이 잘못 되었을 경우 fsck 명령어를 사용해 백업 수퍼 블록으로 정정할 수 있다.

 

◆ Inode

* i-node table

전체 파일 시스템에 존재하는 i-node중 현재 실린더 그룹에 할당된 i-node들의 시작 위치가 기록됨

.ls-l 명령어를 사용 했을 경우 파일 이름을 제외한 나머지 정보가 모두 기록되어있다.

.실제 데이터를 저장하는 데이터 블록의 위치가 어디에 있는지 저장된다.
.i-node table 정보는 file type, permission ,uid, gid, size, date, direct pointer, single
I.D.P , Double I.D.P, Triple I.D.P shadow i-node 정보가 들어가 있다.
.direct-pointer는 4byte로 1개의 data블록을 가르킨다. 12개의 data 블록, 즉 96kbyte를 저장한다.
.단일 간접 포인터가 지정하는 위치의 파일 시스템 블록에는 8kbyte는 4byte direct-pointer 2048
를 가진다. 즉 16MB까지 표현 가능하다
.이중 간접 포인터가 지정하는 위치의 파일 시스템 블록에는 단일 간접 포인터가 단일 간접 포인터에는
직접 포인터가 존재한다. 즉 2048 * 2048 * 8kbyte 의 내용을 추가할 수 있기에 32GB까지 표현 가능하다
.삼중 간접포인터가 지정하는 위치의 파일 시스템 블록에는 이중 간접 포인터가 이중 간접 포인터는
단일 간접 포인터를 단일 간접 포인터는 직접 포인터를 가르킨다. 즉 2048 * 2048 * 8Kbyte의
내용을 추가할 수 있기에 64TB까지 표현 가능하다.

 

◆ shadow inode

*definition
-setfacl에 의 해 설정된 permission
-ufs inode (일반) vs shadown inode

*file inodes

owner permission
group permission
other permission
shadow adress  -------------------------*shadown inode         
file data address-----↓                   ACL
                               ↓                    ↓
                               ↓                    ↓
                        *data black            *DATA BLACK
                             file data             ACL list
                                                     user100:rwx
                                                    group700;r-x

-shadow i-node

.기본 권한 이외에 ACL(access control list)이 추가로 설정된 파일이나 디렉토리는 i-node와 함께 shadow i-node를 가진다
.i-node 기본 권한과 함께 ACL이 저장된 데이터 블럭에 대한 직접 포인터도 함께 가진다
.setfacl명령어 사용해서 ACL 설정을 하게 되면 shadow i-node가 추가로 생성된다
shadow i-node에는 i-node가 가지는 권한 소유주 이름 그룹 소유주 이름에 관련된 정보가
저장되고 shadow i-node가 직접 포인터를 사용해 지저하는 데이터 블럭에 setfacl명령어로 설저한 ACL내용이 저장된다.

 

◆ Datablack

*definition
-실제 데이터가 저장되는곳
-8kbyte단위 

*fragmentation

   frament
      ↑
ㅁ ㅁ ㅁ ㅁ ㅁ ㅁ ㅁ ㅁ )->전체 data black(8192byte)

1024byte

- data black & data black fregment

.솔라리스에서 파일의 실제 데이터를 저장하기 위해 8kb의 데이터 블록을
파일 크기에 따라 할당한다

.touch를 이용해 파일을 생성할 경우에도 데이터 블록을 할당한다 touch뿐 아니라작은 데이터 파일에도 동일하게8kb의 데이터 블록을 할당할 경우 공간 낭비가도기 때문에
하나의데이터 블록을 8개 조각으로 나누어 블록 조각 하나하나를 파일마다 할당해서 사용할수 있다

.파일이 아무리 작아도 동일한 데이터 블록을 공유 할수 없다.


Trackback 0 Comment 0