Unix/CentOS

사용자 쿼터설정: NFS와 Samba, vsftpd도...

ForceCore 2006. 8. 30. 08:42

수많은 사용자들이 있는데, 용량제한을 두지 않으면 안 좋은 일이 벌어질듯 ㅡ,.ㅡa;;

제도적으로 그런 일을 방지하자.

 

0) quota에 대해

http://wiki.kldp.org/wiki.php/QuotaMiniHOWTO

http://wiki.kldp.org/wiki.php/DocbookSgml/Quota

(앗싸 kldp)

 

1) vsftpd: 0번에 한대로 하면 될듯...? 아마도? vsftpd quota라고 검색을 구글에 해보면 별다른 말이 없다.

 

2) NFS, Samba쿼터

 http://www.webservertalk.com/archive214-2004-9-408155.html

 마음대로 되지 않는 쿼터...? FTP까진 좋은데 삼바나 NFS가 결합되면 좋지않은 일이 발생하나보다.

 

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

일단은 해보고 안 되는 부분을 고치자 ㅡ,.ㅡ;;

가장 기본 쿼타인 0번을 해보자...

으음;;;;; 유저쿼타일듯...a 그룹쿼터에 "그룹의 각각의 유저에 다 적용됨" 옵션은 없으니까...

 

서자룡의 리눅스 9+ 그대로 따라하기 책을 컨닝한 바에 의하면

예를들어 /home에 쿼터를 할당한다고 하자.

1. /etc/fstab수정. /home에 defaults라고만 된 옵션 뒤에다가 usrquota를 붙인다.

2. mount -o remount /home로 재마운트한다.

3. mount명령을 쳤을 때 usrquota라는 옵션이 붙어있으면 성공.

4. 쿼터를 설정한 파티션의 루트... 여기서는 /home이 되겠다. 거기에다가 빈 quota.user생성.

  # touch /home/quota.user

  # chmod 600 /home/quota.user

  루트로서 생성해야 하고, 루트만이 읽고 쓸 수 있어야 한다.

5. 쿼터상태체크 (비어있는 quota.user파일을 적절히 initialize하는 단계)

  # quotacheck -avugm

  그러면 truncated. 어쩌구 하는 에러처럼 보이는 메시지를 보여줄 것이다. 하지만 그냥 꾹 기다린다.

6. 쿼터 DB 변환

  # convertquota -u [quota.user파일이 든 디렉토리명]

  여기선 convertquota -u /home

  이렇게 되겠다.

7. 준비 되었다. 쿼타를 켠다.

  # quotaon /home

8. 유저의 쿼타를 에디트하자.

  # edquota 유저명

  그러면 vi에디터로 여러가지가 나올텐데...

  blocks 부분은 에디트하지 말 것. 해봤자 소용도 없음.

  그 옆의 soft는 소프트리밋, hard는 절대로 넘을 수 없는 수치이다. 용량은 kb단위.

  파일의 개수도 제한 가능하다. inodes.. (역시 에디트 불가)

  soft와 hard도 존재.

9. 해당 유저가 quota라는 명령어를 치면 자신의 쿼타를 확인 가능. 루트는 quota [유저명]을 사용하면 쿼타 확인 가능.

 

1. FTP로 서버에 직접 접속한 경우: hard limit에 도달하자 파일 전송이 멎었다.

2. FTP -> 서버1 -> NFS로 간접 접속한 경우: hardlimit이 무시되는 것 처럼 보이지만, 용량은 0바이트로서 열심히 전송된 내용은 씹혀있다. 네트워크의 낭비라고 해야되나?;;

3. SSH -> NFS마운트 된 홈디렉토리에다 wget으로 파일 받기: cannot write라고 뜬다.

4. 삼바로 직접 접속한 경우: 용량이 부족하다고 잘 알려준다.

5. AD상 유저에게도 쿼터가 잘 걸리나? yes.

 

결론: 잘 된다 ㅡ_ㅡ;; 걱정할 필요 없는듯.

 

쿼터를 왕창 설정하는 법:

어딜가나 나오는 예제를 응용해보자.

(기억이 잘 안 나는데 구글로 edquota users가 들어가게 영어로 -_- 검색 했던 듯)

edquota -p [대표유저id] `awk -F: '$3> 500 {print $1}' /etc/passwd`

/etc/passwd의 사용자 목록을 awk의 먹이로 주어서 uid가 500을 초과하는 인간들에게 쿼터를 준다는 명령이다. 하지만 필자는 AD를 쓰므로 약간 수정을 해보기로 했다.

 

필자는 AD유저의 gid를 5000으로 설정해놓았다.

그래서,

getent passwd | awk -F: '$4==5000 {print $1}'

라고 개조하니 AD상의 유저까지 포함해 gid가 5000인 인간들이 쭉 나왔다.

$3항을 $4로 바꿔서 gid를 읽게 한 것이다. (콜론으로 구분된것 중 몇번째... 를 의미하나보다.)

조건도 '칼같이 5000'으로 수정함.

 

하지만 학번별로 다른 파티션을 쓰므로 쿼타 내용도 다르고, 따라서 대표유저도 각각 달라야 하는데;;;

학번이 숫자이고 일정한 규칙이 있으니까...

2005xxxxx

2006xxxxx

대소비교가 된다... 응용하고 싶은데 이 이상은 awk에 대한 지식이 필요하군.

http://www.vectorsite.net/tsawk.html

 

컨닝하고 수정하니...

getent passwd | awk -F: '{ if( $4==5000 && 200500000 <= $3 && $3 < 200600000 ) {print $1} }'

(2005학번대 목록만 나온다.)

 

edquota -p [대표유저id] `getent passwd | awk -F: '{ if( $4==5000 && 200500000 <= $3 && $3 < 200600000 ) {print $1} }'`

이것이 최종적인 명령이 되겠다 +_+


* Note: getent passwd명령이 모든 사용자를 display하지 않아서 일부 사용자들만 쿼터의 제한을 받게 되었다. 펄스크립트로 홈디렉토리가 존재하는 유저들에 대해 스크립트가 돌게 고쳤다.

#!/usr/bin/perl

sub setquota {
        my $entry;
        my $gid;
        $dir = shift;
        chdir $dir;

        # scan directory.
        while (defined( $id = <*> )) {

                # if $id is a directory, not a file...
                # we have entries like this
                # ssanzing:x:200512345:5000:ssanzing2:/home/2005/ssanzing:/bin/bash
                if( -d $id ) {
                        # we do getent passwd userid, because getent passwd does not print all users.
                        $entry = `getent passwd $id`;
                        chomp( $entry );
                        $entry =~ /.+:x:.+:(.+):.+:.+:.+/;
                        $gid = $1;

                        # if gid is 5000, that person is not administrator. -> set quota.
                        if ( $gid == 5000 ) {
                                system( "edquota -p ssanzing '$id'" );
                        }
                }
        }
}

# main
setquota( "/home/2004" );
setquota( "/home/2005" );
setquota( "/home/2006" );
setquota( "/home/2007" );