###########

## quota ##

###########


- 쿼타를 사용하기 위해서는 커널이 인식하고 있어야 한다.


참고 : 

https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=195&sca=1&sfl=wr_subject&stx=quota&sop=and

https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=860&sca=1&sfl=wr_subject&stx=quota&sop=and

https://www.linux.co.kr/home2/board/subbs/board.php?bo_table=lecture&wr_id=853&sca=1&sfl=wr_subject&stx=quota&sop=and



# df ; df -i

Filesystem           1K-blocks      Used Available Use% Mounted on

/dev/sda1              7103744   3055624   3681440  46% /

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/sda1            1835008  103132 1731876    6% /



# su - user1

$ for i in $(seq 500)

> do

>   touch ${i}.txt

> done

$ df -i

Filesystem            Inodes   IUsed   IFree IUse% Mounted on

/dev/sda1            1835008  103633 1731375    6% /


--> df -i 명령어를 통해 디바이스에서의 inode 사용정보를 볼 수 있다. 바로 위에서는 일반 유저로

--> 쉘 스크립트를 이용하여 500개의 txt 파일을 만들었다. 그리고 난 후 쉘 스크립트 전 inode 값과 쉘 스크립트 후의 inode값을 비교해 보면

--> IUsed 부분에 + 500이 된걸 볼 수 있다.



o 제한 방법

사용자 제한 : 사용자 쿼타

그룹 제한   : 그룹 쿼타 


관련 명령어들

/sbin/quotacheck : 쿼타를 체크한다.

/sbin/quotaoff : 쿼타를 off 

/sbin/quotaon  : 쿼타를 on

/usr/bin/quota : 일반유저가 자신의 용량을 확인

/usr/sbin/edquota : 사용자의 쿼타 설정

/usr/sbin/repquota : 사용자의 쿼타 출력


위에 명령어를 한번에 쓸 수도 있음

rpm -qlf `which quota` | grep bin




o 쿼타파일

- 일반적으로 만들때 속성이 걸려있다.

- 사용자쿼타 : quota.user -> aquota.user

- 그룹쿼타 : quota.group -> aquota.group

# lsattr /aquota.user 

----i--A----- /aquota.user



# rpm -q quota

quota-3.13-5.el5

# rpm -ql quota

/etc/quotagrpadmins

/etc/quotatab

/etc/warnquota.conf

/sbin/quotacheck

/sbin/quotaoff

/sbin/quotaon

/usr/bin/quota

/usr/include/rpcsvc/rquota.h

/usr/include/rpcsvc/rquota.x

/usr/sbin/convertquota

/usr/sbin/edquota

/usr/sbin/quotastats

/usr/sbin/repquota

/usr/sbin/rpc.rquotad

/usr/sbin/setquota

/usr/sbin/warnquota

/usr/share/locale/fr/LC_MESSAGES/quota.mo

/usr/share/locale/pl/LC_MESSAGES/quota.mo

/usr/share/man/man1/quota.1.gz

/usr/share/man/man2/quotactl.2.gz

/usr/share/man/man3/rquota.3.gz

/usr/share/man/man8/convertquota.8.gz

/usr/share/man/man8/edquota.8.gz

/usr/share/man/man8/quotacheck.8.gz

/usr/share/man/man8/quotaoff.8.gz

/usr/share/man/man8/quotaon.8.gz

/usr/share/man/man8/quotastats.8.gz

/usr/share/man/man8/repquota.8.gz

/usr/share/man/man8/rpc.rquotad.8.gz

/usr/share/man/man8/rquotad.8.gz

/usr/share/man/man8/setquota.8.gz

/usr/share/man/man8/warnquota.8.gz



-- 순서 --


- user quota 설정 


1. /etc/fstab 에 쿼타설정 (vi /etc/fstab)

2. 쿼타인식 (remount or reboot)

3. 쿼타파일 생성 ( install aquota.user )

4. 쿼타체크 (quotacheck )

5. 쿼타시작 (quotaon)

6. 사용자 설정 (edquota)

7. 사용자 확인 (repquota)


1. /etc/fstab 에 쿼타설정 (vi /etc/fstab)

- usrquota 를 추가한다.

# vi /etc/fstab

-- /etc/fstab --

LABEL=/   /      ext3    defaults,usrquota   1 1

-- /etc/fstab --


보통 일반 유저 사용 제한을 위한것이기 때문에 설치할때 /home 디렉터리를 파티션을 나눠서 /home 디렉터리의 마운트 옵션 부분에 usrquota를 추가해준다. 하지만 여기선 파티션을 따로 나누지 않았기 때문에 루트디렉터리(/)의 마운트 옵션 부분에 usrquota를 추가했다.



2. 쿼타인식 (mount or reboot)

# mount -o remount /

# mount

/dev/sda1 on / type ext3 (rw,usrquota)

  :

  :



3. 쿼타파일 생성 ( install aquota.user )

# install -m 600 /dev/null /aquota.user

# ls -l /aquota.user 

-rw------- 1 root root 0 Apr 16 13:53 /aquota.user



4. 쿼타체크 (quotacheck )

# quotacheck -avum

# ls -l /aquota.user 

-rw------- 1 root root 11264 Apr 16 13:55 /aquota.user



--> 용량이 변했다.


5. 쿼타시작 (quotaon)

# quotaon -avu

/dev/sda1 [/]: user quotas turned on


--> 이때 마운트 지점에 만든 aquota.user의 속성(Attribution)이 생긴다.

확장 파일 시스템의 파일 속성 변경에 대한 참조 자료는 여기에 가보자.

http://devanix.tistory.com/233




6. 사용자 설정 (edquota)

- 사용자 용량 (soft : 100M, hard : 200M)

- 파일 개수 (soft : 100, hard : 200)  

# useradd user1  

# useradd user2

# useradd user3

# useradd user4

# useradd user5



이제 일반 유저들에게 사용 제한을 해보자.


# edquota user1

Disk quotas for user user1 (uid 5007):

Filesystem  blocks  soft  hard    inodes  soft     hard

  /dev/sda1 156    100000 200000  20      100      200


위에 메뉴 설명하고 위치를 맞추진 않아도 된다. 그냥 순서만 맞게 쓰자



- 쿼타설정 복사 (edquota -p)

# edquota -p user1 user2 

# edquota -p user1 user3 

# edquota -p user1 user4 

# edquota -p user1 user5 




7. 사용자 확인 (repquota)


# repquota -a | grep ^user

user2     --     136  100000  200000             18   100   200       

user3     --     116  100000  200000             15   100   200       

user1     --     156  100000  200000             20   100   200       

user4     --      44  100000  200000              6   100   200       

user5     --      44  100000  200000              6   100   200  


--> grep ^user 의 의미는 user로 시작하는걸 뜻한다.



8. 테스트 


# su - user1

user1$ dd if=/dev/zero of=dump.dd bs=1024 count=100000



# repquota -a | grep user1

user1     +-  100264  100000  200000  6days      21   100   2 

              ~~~~~~~ ~~~~~~          ~~~~~



- soft 를 넘어가도 파일을 생성할 수 있다.

# su - user1 

$ dd if=/dev/zero of=a.dd bs=1024 count=10000

$ dd if=/dev/zero of=b.dd bs=1024 count=10000

$ ls -l

total 120156

-rw-rw-r-- 1 user1 user1  10240000  4월 17 10:40 a.dd

-rw-rw-r-- 1 user1 user1  10240000  4월 17 10:40 b.dd

-rw-rw-r-- 1 user1 user1 102400000  4월 17 10:38 dump.dd



$ exit


# date 042510002014

Fri Apr 25 10:00:00 KST 2014

# repquota -a | grep ^user1

user1     +-  120304  100000  200000   none   23   100   200  

                                       ~~~~


--> 아까 soft가 넘어서 repquota -a 로 6day라고 써있는 걸 볼수 있었다. 그럼 10일 뒤로 날짜를 변경하고 repquota -a 명령어로 다시 확인해보자.


- soft 용량이 넘어가고 grace 이 지났을 경우는 파일이 

  생성이 안된다.

- hard 용량이 넘어가면 grace 하고 상관없이 파일이 생성이 안된다.


$ dd if=/dev/zero of=f.dd bs=1024 count=10000

dd: opening `f.dd': Disk quota exceeded  <--




- 파일 개수 테스트 


repquota -a | grep user2

su - user2


$ for i in $(seq 200)

> do

>   touch ${i}.txt

> done

touch: cannot touch `182.txt': Disk quota exceeded

touch: cannot touch `183.txt': Disk quota exceeded

touch: cannot touch `184.txt': Disk quota exceeded

touch: cannot touch `185.txt': Disk quota exceeded

touch: cannot touch `186.txt': Disk quota exceeded

touch: cannot touch `187.txt': Disk quota exceeded

touch: cannot touch `188.txt': Disk quota exceeded

  :

  :


--> inode 값이 soft 100 hard 200으로 설정되어있고 현재 inode 를 9개 사용하고 있다.

--> 200개의 i.txt를 만드는 쉘 스크립트를 실행하면 1~191.txt 만들어지고 192.txt부터는 

--> inode hard 제한값인 200을 넘어가서 더 이상 만들 수 없게 된다. 에러 메시지 보면 9개일 것이다.


- 일반유저가 자신의 사용량을 확인하는 명령어

$ quota 

Disk quotas for user user1 (uid 5007): 

     Filesystem  blocks   quota   limit   grace   files   quota   limit   grace

      /dev/sda1     872  100000  200000             200*    100     200   6days




============================================================

LAB> 아래 조건에 맞게 사용자 쿼타를 설정하시오.

--> 해보길..


절약형 : 400M

일반형 : 800M

고급형 : 1.2G


user100 : 절약형

user200 : 절약형

user300 : 절약형


user400 : 일반형

user500 : 일반형

user600 : 일반형


user700 : 고급형

user800 : 고급형 

user900 : 고급형


-- 순서 --

1. 서비스에 대한 사용자를 등록/쿼타 설정

2. 각 사용자를 생성

3. 그 사용자의 용량에 맞게 edquota 로 복사


1. 서비스에 대한 사용자를 등록/쿼타 설정

************************************************

-- 쿼타정보 --

user400m  : block soft: 400000   hard: 410000

            inode soft: 5000     hard: 5100

user800m  : block soft: 800000   hard: 810000

            inode soft: 5000     hard: 5100

user1200m : block soft: 1200000  hard: 1210000

            inode soft: 5000     hard: 5100

************************************************


# useradd user400m

# useradd user800m

# useradd user1200m

# edquota user400m   

# edquota user800m 

# edquota user1200m 


2. 각 사용자를 생성

# useradd user100 

# useradd user200 

# useradd user300 

# useradd user400

# useradd user500

# useradd user600

# useradd user700

# useradd user800

# useradd user900


3. 그 사용자의 용량에 맞게 edquota 로 복사

# edquota -p user400m user100

# edquota -p user400m user200

# edquota -p user400m user300


# edquota -p user800m user400

# edquota -p user800m user500

# edquota -p user800m user600


# edquota -p user1200m user700

# edquota -p user1200m user800

# edquota -p user1200m user900

=========================================================



=========================================================

LAB> 위의 2,3의 조건에 맞게 쉘스크립트로 짜보시오.

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

--> 쉘 스크립트는 아래 있다. 해보자.


- 쿼타 자동생성 스크립트명 : useradd.sh 

- 스크립트의 인자 : <사용자명> <용량>

- 쉘스크립트에 필요한 제어문 : if , case

- 쉘스크립트에 필요한 변수들  

  $# : 인자의 개수

  $0 : 명령어

  $1 : 사용자명

  $2 : 용량


- 명령어 : useradd, passwd(생략), edquota, exit


- `.

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


ex)

# useradd.sh

Usage : useradd.sh <사용자명> <용량>


- user100 을 400m 쿼타 용량으로 할당

# useradd.sh user100 400m


- user500 을 800m 쿼타 용량으로 할당

# usreadd.sh user500 800m



- 프로그램 작성 -

# cd ~/bin

# install /dev/null useradd.sh 

# vi useradd.sh

-- useradd.sh --

#!/bin/sh


argc=$#

username=$1

userquota=$2


if [ $argc -ne 2 ]; then 

  echo "Usage : `basename $0` <username> <quota>"

  exit 1

fi


useradd $username


case $userquota in

  "400m"  ) edquota -p user400m  $username ;;

  "800m"  ) edquota -p user800m  $username ;; 

  "1200m" ) edquota -p user1200m $username ;;

esac

-- useradd.sh --



-- 실행 --

# ./useradd.sh 

Usage : useradd.sh <username> <quota>


400m, 800m, 1200m 유저를 만들어서 Sample로 제작해 논 상태로 해야한다.


# ./useradd.sh user100 400m

# ./useradd.sh user200 400m

# ./useradd.sh user300 400m

# ./useradd.sh user400 800m

# ./useradd.sh user500 800m

# ./useradd.sh user600 800m

# ./useradd.sh user700 1200m

# ./useradd.sh user800 1200m

# ./useradd.sh user900 1200m

# repquota -a  


user100   --      44  400000  410000              6  5000  5100       

user200   --      44  400000  410000              6  5000  5100       

user300   --      44  400000  410000              6  5000  5100       

user400   --      44  800000  810000              6  5000  5100       

user500   --      44  800000  810000              6  5000  5100       

user600   --      44  800000  810000              6  5000  5100       

user700   --      44 1200000 1210000              6  5000  5100       

user800   --      44 1200000 1210000              6  5000  5100       

user900   --      44 1200000 1210000              6  5000  5100 

============================================================




- 추천 사이트 - 

http://www.sir.co.kr  <-- 그누보드 무료

http://phpschool.com

http://www.xpressengine.com  <-- 제로보드 XE 무료



- grub이 지워졌을 경우 복구모드로 들어가는 방법

1. 1번 DVD 삽입

2. boot : linux rescue

3. rescue continue

4. chroot /mnt/sysimage

5. grub-install /dev/sda