수많은 사용자들이 있는데, 용량제한을 두지 않으면 안 좋은 일이 벌어질듯 ㅡ,.ㅡ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" );