PostgreSQL을 처음 설치할 때 SuperUser 권한을 가진 'postgres'라는 계정이 default로 생성된다.
하지만 데이터베이스를 생성하고 조회할 때마저 이 계정으로 접속한다면 그건 문제가 있다.
왜냐면 모든 테이블을 drop 할 권한도 갖춘 가장 강력한 힘을 가진 계정이기 때문이다.
따라서 데이터베이스를 이용할 admin계정과 조회용 계정을 만들어본다.
[minggu@dev DB server ~]# psql -U postgres
postgres 사용자의 암호:
psql (14.0)
도움말을 보려면 "help"를 입력하십시오.
postgres=#
일단 psql 명령어를 통해 최초에 생성한 postgres 계정으로 접속을 한다.
postgres=# \du
롤 목록
롤 이름 | 속성 | 소속 그룹:
------------+------------------------------------------------+------------
postgres | 슈퍼유저, 롤 만들기, DB 만들기, 복제, RLS 통과 | {}
postgres=#
psql에서는 명령어 이용할 때 역 슬래쉬(\)를 이용한다. \du 명령어를 통해 유저리스트를 확인해본다.
[Admin 계정 생성]
postgres=# CREATE ROLE minggu_admin SUPERUSER CREATEDB CREATEROLE NOINHERIT LOGIN PASSWORD '123456';
CREATE ROLE
postgres-#
[developer 계정 생성]
postgres=# CREATE ROLE minggu_dev NOSUPERUSER NOCREATEDB NOCREATEROLE NOINHERIT LOGIN PASSWORD 'test';
CREATE ROLE
postgres-#
ROLE을 만들면서 옵션 설정을 통해 admin과 dev계정을 만들었다.
postgres=# \du
롤 목록
롤 이름 | 속성 | 소속 그룹:
------------+------------------------------------------------+------------
minggu_admin | 슈퍼유저, 상속 없음, DB 만들기 | {}
minggu_dev | 상속 없음 | {}
postgres | 슈퍼유저, 롤 만들기, DB 만들기, 복제, RLS 통과 | {}
확인해 보면 계정이 추가되었음을 알 수 있다.
[원하는 테이블에 대한 Select 권한]
postgres=# GRANT USAGE ON SCHEMA scm1 TO minggu_dev
postgres=# GRANT SELECT ON TABLE scm1.testTable TO minggu_dev;
[원하는 테이블에 대한 멀티 권한]
postgres=# GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE scm1.testTable TO minggu_dev;
이제 추가한 dev 계정에 권한을 GRANT 한다.
기본적으로 스키마의 이용권한을 주고 원하는 테이블에 원하는 권한을 주면 된다.
[특정 시퀀스에 대한 권한 부여]
postgres=# GRANT select ON ALL SEQUENCES IN SCHEMA scm1 TO minggu_dev;
[특정 함수에 대한 권한 부여]
postgres=# GRANT ALL ON FUNCTION [scm1.test_function(varchar,int4)] FROM minggu_dev;
[모든 함수와 시퀀스에 대한 권한 부여]
postgres=# GRANT ALL PRIVILEGES ON ALL FUNCTIONS IN SCHEMA scm1 TO minggu_dev
postgres=# GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA scm1 TO minggu_dev;
함수와 시퀀스를 사용한다면 잊지 말고 권한을 챙겨줘야 한다. (view도)
[해당 스키마에 대한 모든 테이블 권한주기]
postgres=# GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA scm1 TO minggu_dev;
[추후 테이블 추가를 위한 기본권한 변경]
postgres=# ALTER DEFAULT PRIVILEGES IN SCHEMA scm1 GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO minggu_dev;
해당 스키마에 존재하는 모든 테이블에 대한 권한을 주거나, 기본 권한을 변경시켜 추후 테이블 추가를 위한 설정을 미리 할 수도 있다.
[PostgreSQL] ROW_NUMBER() OVER PARTITION BY를 이용한 다중 칼럼 그룹핑 조회
쿼리문은 알면 알수록 오묘한 것.
다양한 형태로 내가 원하는대로 데이터를 뽑기 위해서는 마찬가지로 다양한 스킬들을 알고 있어야 한다.
특히 이 row_number() 함수를 이용한 방법은 두고두고 도움이 된다!
개발자는 쿼리를 짤 때 퍼포먼스를 고려한, 성능이 저하되지 않도록 옵티마이징 한다. 혹은 데이터를 분산배치, 마트 테이블을 구성하기도 한다.
마케터는 데이터를 뽑아내기만 하면 된다. 그래서 이런 쿼리를 공부하는게 개발자뿐 아니라 sql을 사용할 마케터에게도 도움이 될 수 있다.
일단 샘플테이블을 만들어 데이터를 넣어준다.
/* 테이블 생성 */
create table sample(
id varchar not null,
name varchar not null,
age int not null,
university varchar
)
/* 샘플데이터 삽입 */
insert into sample values
('1000','밍구1','20','서울대'),
('2000','밍구2','25','고려대'),
('1000','밍구3','25','연세대'),
('3000','밍구4','28','서울대'),
('2000','밍구5','27','연세대'),
('2000','밍구6','30','중앙대'),
('5000','밍구7','30','고려대'),
('4000','밍구8','30','서울대')
;
자 여기서 id가 중복되는 경우도 있고 age나 university 칼럼이 중복되는 경우도 있다.
내가 중복되지 않은 특정컬럼을 뽑아내고자 한다면
동일한 컬럼을 묶어내는 group by와 중복을 제거해서 unique 한 값만을 나타내는 select절의 distinct 조건을 사용하는 방법이 있을 것이다.
그러나 이 방법엔 치명적인 단점이 있는데, 내가 중복 제거한 칼럼 이외의 데이터는 볼 수가 없다는 것이다.
group by 절을 아래와 같이 사용한다면 SQL Error 가 발생한다.
이럴 때 사용하는 방법이 바로 ROW_NUMBER() 함수이다.
이 함수는 내가 보고 싶은 순서대로 정렬을 하고 ROW에 대해 순서를 매기는 기능을 한다.
select *, row_number() over (order by age) from sample;
그럼 단순히 결과를 칼럼 순으로 정렬하는 order by 와 무슨 차이가 있느냐 할 텐데
여기에 PARTITION BY 절을 추가하면 된다.
select *, row_number() over (PARTITION by university order by age desc) from sample;
결론적으로 내가 여기서 row_number 칼럼이 1인 녀석들만 가지고 오면 같은 university의 1명만 가져올 수 있다.
select *
from (
select *, row_number() over (PARTITION by university order by age desc) as rnum from sample
) t
where rnum = 1;
그리고 독학할 거면 100점을 목표로 해라. (본인 100점 목표로 해서 82점이라도 나온 것 같다..^^)
이 뒤로는 한풀이 같은 건데...
애초에 직장인이 자격증 따기 위해 공부하는 시간은 많지 않을 것이다.. 그 시간을 최소화해보고자 기출만 보는 건데 이 리눅스마스터란 시험은 문제를 정말 더럽게 낸다.
기출문제로 커버할 수 없을 정도로 더럽게 낸다.
아주 디테일하고 사소한 것 까지 낸다.
그래서 무조건 교재를 보거나 강의를 들어야 한다. 그렇게 만든다. 정말 악독하다.
매년 교재는 새로 나오고 심지어 교재값도 비싸다. 응시비는 필기 실기하면 10만 원이 넘는데 내년엔 거기서 더 오른다 ㅋㅋㅋㅋ실기만 77000원...?
명색이 리눅스마스터, 파이썬 어쩌고 자격증 주관하는 기관이 지네 서버 홈페이지는 자주 터진다 ㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋㅋ
아니 그리고 시험 응시장소가 시험 보기 10일 전에 나오는 게 말이 되나 진짜?ㅋㅋㅋㅋ
문제는 실무와 동떨어진 것을 위주로 내면서 ( 도대체 설루션이나 외부 프로그램 사용하지 않고 시험에 나오는 것처럼 세팅하는 서버가 있긴 있을까? ) 문제의 퀄리티도, 난이도도, 관리도 응시비에 상응하지는 못하는 것 같다...
아니 리눅스 옵션 세팅을 필기시험으로 외워서 적는 게 말이 되나 컴퓨터 시험인데??? 누가 그 옵션을 외워야 리눅스 잘한다고 평가한단 말이냐 세상에... 이 자격증 정말 가치 있는 것 맞나요..?
내가 여태 사회복지사 1급, 컴활 1급(이놈들도 진짜 개 악독하다), 정보처리기능사, 정보처리기사, SQLD, 네트워크관리사 2급, 외환 전문역 이런 시험들 다 봤어도 이렇게 공부하기 싫고 시험 보기 싫었던 적은 처음이다. (시험 보는 중에도 지문 대충 보고 시간 남았을 때도 문제 다시 안 보고 그냥 제출하고 퇴실했다...) 함께 해서 더러웠고 두 번 다신 보지 말자 정말로.
1. 다음은 사용자를 관리하는 과정이다. 조건에 맞게 (괄호) 안에 알맞은 내용을 적으시오.
가. 웹서버를 운영할 예정이라서 사용자 추가 시에 www 디렉터리를 기본적으로 제공하려고 한다. 관련 디렉터리를 생성하는 명령을 실행한다. # ( ① ) ( ② )
나. 현재 ihduser 사용자의 주 그룹이 kait인 상태이다. 주 그룹 변경 없이 추가로 admin 그룹에 포함시킨다. # ( ③ ) ( ④ )
■ 조건 - ①번부터 ③번에는 관련 명령어만 기입한다. - ②번은 생성해야 하는 디렉터리를 절대 경로로 기입한다. - ④번은 ③번 명령어의 옵션 또는 옵션과 관련된 인자 값을 기입하는데, 옵션과 관련된 인자 값이 있는 경우에는 하나의 괄호로 처리한다. (예: -d /home/ihduser) - ②번과 ④번의 경우 명령어가 틀리면 채점하지 않는다.
2. 다음은 파일 시스템을 생성하고 관련 정보를 확인하는 과정이다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. /dev/sdb1 장치의 파일 시스템을 XFS로 생성한다. # ( ① ) /dev/sdb1
나. 파일 시스템이 생성된 /dev/sdb1의 UUID 값을 확인한다. #( ② )
■ 조건 - ①번과 ②번은 특별한 옵션이나 인자값 없이 관련 명령어만 기입한다.
3. 다음은 cron을 이용한 스케줄링 작업을 관리하는 과정이다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. ihduser 사용자가 예약한 cron 작업의 파일을 삭제한다. # rm ( ① )
나. /etc/heartbeat.sh 명령을 매주 일요일에 10분 주기로 실행한다. #( ② )
■ 조건 - ①번은 관련 파일명을 절대경로로 기입한다. - ②번은 cron 항목 중에 날짜 및 시간 관련 5가지 설정에 대해서만 조건과 형식에 맞게 순차적으로 기입한다.
4. 다음은 추가로 생성한 C 언어 소스 프로그램의 오브젝트 파일을 생성하고, 백업을 진행하는 과정이다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 새롭게 작성한 C 언어 소스를 컴파일 하여 오브젝트 파일을 생성한다. # ( ① )( ② ) sum.c # ( ① )( ② ) avg.c
나. 생성된 두 개의 오브젝트 파일을 이용하여 calc라는 실행 파일을 생성한다. # ( ① )( ③ ) sum.o avg.o
다. tar 명령을 이용하여 현재 디렉터리에 있는 오브젝트 파일만을 묶어서 obj.tar 파일을 생성한다. # tar ( ④ )
■ 조건 - ①번과 관련 명령어만 기입한다. - ②번과 ③번은 명령어의 옵션 또는 옵션과 관련된 인자 값을 기입한다. ( 예: -d /home/ihduser) - ④번은 명령어의 옵션 또는 옵션과 관련된 인자값, 대상(target) 등을 기입하는데, 명령어를 제외한 나머지 부분을 하나의 괄호로 처리한다. ( 예: -d /home/ihduser -g kait) - ②번과 ③번의 경우 명령어가 틀리면 채점하지 않는다.
5. 다음은 모듈 관련 작업을 진행하는 과정이다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 모듈의 alias, alias symbol, blacklist 비롯하여 다양한 정보를 출력한다. # ( ① )( ② )
나. iptable_filter 모듈을 제거하면서 관련 모듈도 같이 제거한다. # ( ① )( ③ ) iptable_filter
다. e1000.ko 모듈 관련 정보를 출력한다. # ( ④ ) e1000.ko.xz
■ 조건 - ①번과 ④번은 명령어만 기입한다. - ②번과 ③번은 명령어의 옵션만 기입하고, 명령어가 틀리면 채점하지 않는다.
6. 다음은 2개의 하드디스크를 이용해서 LVM을 구성하는 과정이다. ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 2개의 파티션을 물리적 볼륨으로 구성한다. # ( ① ) /dev/sdb1 /dev/sdc1
나. 물리적 볼륨을 lvm0이라는 볼륨 그룹으로 구성한다. # ( ② ) /dev/sdb1 /dev/sdc1
다. 약 2GB정도의 논리적 볼륨을 생성하는데, 이름은 kdata1로 설정한다. # ( ③ ) ( ④ )
■ 조건 - ①번은 관련 명령어만 기입한다. - ②번은 관련 명령어 또는 명령어 및 인자값을 한 번에 기입한다. - ③번은 관련 명령어만 기입한다. - ④번은 ③번에 기입한 명령어를 제외한 나머지를 한 번에 기입하고, 명령어 틀리면 채점하지 않는다.
7. 다음은 시스템 로그 관련 설정을 하는 과정이다.조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 모든 서비스(facility)에 대해 가장 최고 수준(priority)의 위험한 상황이 발생한 경우에는 모든 사용자의 터미널로 관련 로그를 전송한다. ( ① ) ( ② )
나. ssh와 같은 인증 관련 로그는 /var/log/ssh.log 파일에 기록한다. ( ③ ) ( ④ )
■ 조건 - ①번과 ③번은 facility.priority 형식으로 기입한다. - ②번과 ④번은 관련 설정(action)을 기입한다.
8. 시스템에 접속하는 사용자가 너무 많아서 특정 로그 파일의 로테이션 관련 설정을 변경하려고 한다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
로그인에 실패한 사용자의 정보가 저장되는 로그 파일은 일주일 단위로 로테이션을 실행한다. 단 파일의 크기가 1MB에 도달하면 그 이전이라도 로테이션을 실행한다. 생성되는 파일을 소유자는 root, 소유그룹은 utmp로 지정하며, root 사용자만 읽기 및 쓰기가 가능하도록 설정한다. ( ① ) { ( ② ) ( ③ ) ( ④ ) rotate 5 }
■ 조건 - ①번은 해당 파일명을 절대 경로로 기입한다. - ②번 ~ ④번은 관련 설정을 하나씩 기입한다. (순서 무관)
9. 외부로부터의 접근을 일시적으로 허가하기 위해서 SELinux 설정을 확인하고 제어하는 과정이다.조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 현재 SELinux 설정 상태를 확인한다. # ( ① )
나. SELinux를 비활성화 상태로 바꾼다. # ( ② )
■ 조건 - ①번과 ②번은 명령어 또는 명령어와 인자값 조합으로 기입한다.
10. 다음은 원격지 호스트의 데이터를 백업하는 과정이다. 작업사항에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
(작업 사항) IP 주소가 192.168.5.13번인 원격지 호스트의 /home 디렉터리를 로컬시스템의 디렉터리로 복사하는 과정이다. root 권한으로 접속하여 허가권, 타임스탬프 등을 그대로 유지하면서 백업을 진행한다. 또한 작업 진행 상황을 표시하고, 전송 시에 압축 기법을 사용한다.
# ( ① ) ( ② ) root@192.168.5.13:/home /
■ 조건 - ①번은 관련 명령어만 기입한다. - ②번은 ①번에 사용되는 명령어의 옵션을 기입한다. 명령어가 틀리면 채점하지 않는다.
<작업식 11~16>
11. 다음은 삼바 서버를 설정하는 과정이다. 조건에 맞게( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 윈도우 호스트에서 접근할 때 보이는 폴더의 이름은 web으로 지정한다. ( ① )
나. 디렉터리에 대한 설명은 "HTML Directory"로 설정한다. ( ② ) 다. 공유 디렉터리 경로는 /usr/local/apache/html로 설정한다. ( ③ )
라. 접근이 가능한 사용자는 ihduser 및 kaituser만 가능하고, 두 사용자 모두에서 파일 생성 및 삭제 권한을 부여한다. ( ④ ) ( ⑤ )
■ 조건 - ① ~ ⑤번은 관련 항목과 값을 한 번에 기재한다. - ④번과 ⑤번은 순서 무관하다.
12. 다음은 메일 서버를 설정하는 과정이다.조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 발신지 도메인의 spam.com으로부터 오는 메일을 거부하는데, 별도의 메세지는 보내지 않도록 설정한다. # vi ( ① ) ( ② )
나. 변경된 내용이 적용되도록 관련 정보를 갱신시킨다. # ( ③ ) ( ① ) ( ④ ) ( ① )
■ 조건 - ①번은 관련 파일명을 절대 경로로 기입한다. - ②번은 관련 설정을 한 줄로 기입한다. - ③번은 관련 명령어 또는 명령어와 인자 값 조합으로 한 번에 기입한다. - ④번은 관련 기호를 기입한다.
13. 다음 조건에 따라 아파치 웹 서버 환경 설정을 진행하려고 한다.( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 아파치 웹 서버 환경 설정 파일을 vi 편집기로 불러온다. # vi ( ① )
나. 도메인명을 www.ihd.or.kr으로 지정하고 포트 번호는 80을 사용한다. ( ② )
다.웹 문서가 위치하는 디렉터리의 경로는 /usr/local/apache/html로 변경한다. ( ③ )
라. 아파치 웹 서버 데몬을 실행한다. # ( ④ )
■ 조건 - 아파치 웹 서버는 소스 파일을 이용해서 /usr/local/apache 디렉터리에 설치되어 있다. - ①번은 아파치 웹 서버의 환경 설정 파일명을 절대 경로로 기입한다. - ②번과 ③번은 ①번 파일에 존재하는 항목과 값을 하나로 기입하고 대소문자를 구분하여 정확히 기재한다. (예 : LogLevel warn) - ④ 아파치 데몬을 실행하는 명령을 정확히 기입한다.
14. 다음은 DNS 서버의 환경 설정 파일을 관련 내용에 따라 설정하는 과정이다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
가. 도메인에 대한 질의를 다른 DNS 서버인 168.126.63.1로 넘기는데, 이 서버에서 응답이 없을 때도 처리 하지 않는다. ( ① ) ( ② )
나. zone 파일의 내용을 복사할 대상으로 192.168.5.0 네트워크 대역에 속한 호스트들만 허가한다. ( ③ )
다. 네임 서버에 질의할 수 있는 호스트를 192.168.12.0 네트워크 대역에 속한 호스트, 192.168.3.13 호스트만 가능하도록 설정한다. ( ④ )
■ 조건 - ①번과 ④번은 관련 설정 내용을 한 줄씩 기입한다. - ①번과 ②번은 순서 무관하게 기입한다.
15. iptables 기반으로 하나의 공인 IP 주소를 공유해서 다수의 컴퓨터를 사용하는 환경을 구축하려고 한다. 조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
# iptables -t ( ① ) -A ( ② ) ( ③ ) eth0 -j ( ④ ) --to 200.100.50.10
■ 조건 - 해당 시스템에는 이더넷 카드가 두 개가 장착되어 있는데, 외부망과 연결된 첫 번째 이더넷 카드의 공인 IP 주소는 200.100.50.10이다.
16.다음은 DHCP 서버의 설정 과정이다.조건에 맞게 ( 괄호 ) 안에 알맞은 내용을 적으시오.
( ① ) ( ② ){ ( ③ ) 03:13:12:22:c0:a5; ( ④ ) 192.168.5.13; }
■ 조건 - 맥(MAC) 주소가 03:13:12:22:c0:a5 인 경우에는 고정적으로 192.168.5.13번 IP 주소를 할당한다. - 호스트명은 ihd_com으로 관리한다. - ①번부터 ④번에 해당하는 내용을 순차적으로 기입한다.
넉넉하게 추가해 준 뒤 해당 pc를 재부팅하고 디스크가 장착이 됐는지 lsblk 명령어와 ll /dev/sd* 명령어로 확인을 해보자. (기본적으로 하드 장치를 추가하면 /dev 디렉터리 안에 sda, sdb, sdc.. 이렇게 명명되는 듯하다.)
# 하드디스크 추가 전
[root@minggu92 ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
[root@minggu92 ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 0 Nov 8 10:02 /dev/sda
brw-rw----. 1 root disk 8, 1 Nov 8 10:02 /dev/sda1
brw-rw----. 1 root disk 8, 2 Nov 8 10:02 /dev/sda2
# 하드디스크 추가 후
[root@skylark_dev ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 100G 0 disk
[root@minggu92 ~]# ll /dev/sd*
brw-rw----. 1 root disk 8, 0 Nov 8 10:02 /dev/sda
brw-rw----. 1 root disk 8, 1 Nov 8 10:02 /dev/sda1
brw-rw----. 1 root disk 8, 2 Nov 8 10:02 /dev/sda2
brw-rw----. 1 root disk 8, 16 Nov 8 10:02 /dev/sdb
sdb라는 장치가 인식되었다! 여기서 이 장치만 마운트 하여 용량을 확보하고, 용량을 많이 잡아먹는 프로세스들을 옮기는 방법도 있겠지만,, 우리가 하고 싶은 것은 단순 폴더 용량 확장!
그렇기 때문에 sdb라는 물리 장치를 마운트 시킨 뒤에 논리 볼륨으로 centos-root 폴더에 할당할 것이다.
3. 하드디스크 파티셔닝 및 마운트
fdisk 명령어를 이용해 primary로 새롭게 마운트 한다.
[root@minggu92 ~]# fdisk /dev/sdb
Welcome to fdisk (util-linux 2.23.2).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Command (m for help): n
Command action
e extended
p primary partition (1-4)
Select (default p): p
Partition number (1-4): 1
First cylinder (1-13054, default 1): (Enter)
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-13054, default 13054): (Enter)
Using default value 13054
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
Syncing disks.
4. PVM에 파티션 추가 (물리적 볼륨)
하드디스크라는 물리적 장치 파티션을 추가한다.
# 현재 사용 가능한 물리적볼륨 확인
[root@minggu92 ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
Total: 1 [18.99 GiB] / in use: 2 [18.99 GiB] / in no VG: 0 [0 ]
# 추가한 파티션을 물리적 볼륨으로 추가
[root@minggu92 ~]# pvcreate /dev/sdb1
Physical volume "/dev/sdb1" successfully created
# 재확인
[root@minggu92 ~]# pvscan
PV /dev/sda2 VG centos lvm2 [<19.00 GiB / 0 free]
PV /dev/sdb1 VG centos lvm2 [<100.00 GiB / <75.00 GiB free]
Total: 2 [118.99 GiB] / in use: 2 [118.99 GiB] / in no VG: 0 [0 ]
# 볼륨그룹에 할당
[root@minggu92 ~]# vgextend centos /dev/sdb1
Volume group "centos" successfully extended
pvscan 명령어를 통해 나오는 물리적 볼륨에서 경로 뒤에 나오는 VG칼럼의 centos는 현재 설정된 볼륨 그룹을 나타낸다.
5. LVM에 파티션 추가 (논리적 볼륨)
추가된 물리 볼륨을 논리 볼륨으로 할당해준다.
# 사용 가능한 PE size 확인
[root@minggu92 ~]# pvdisplay /dev/sdb1
--- Physical volume ---
PV Name /dev/sdb1
VG Name centos
PV Size <100.00 GiB / not usable 3.00 MiB
Allocatable yes
PE Size 4.00 MiB
Total PE 25599
Free PE 19199
Allocated PE 6400
PV UUID g5vG5z-JzYw-zcAQ-kJLd-rHnQ-aJRJ-L4q1xI
# PE를 LVM 파티션에 추가하고 파티션을 resize
# 볼륨그룹에 따라 경로가 다를 수 있다.
# 기가바이트로 할 수도 있고
[root@minggu92 ~]# lvextend -L +20GB /dev/centos/root
# pe size로 할당할 수 있다.
[root@minggu92 ~]# lvextend /dev/centos/root -l +25599
Size of logical volume VolGroup/lv_root changed from 47.57 GiB (12178 extents) to 147.57 GiB (37777 extents).
Logical volume lv_root successfully resized
리눅스 용량 할당을 간편하게 도와주는 growpart 패키지를 설치해서 진행할 수 있다. 클라우드 서비스를 이용하는 상태이거나 하드디스크 추가가 아닌 vmware에서 할당된 디스크량만 늘리면 lsblk 명령어를 통해 늘어난 것을 확인할 수 있는데 해당 상태에서 하위 파티션으로 바로 용량을 할당할 수 있다.
다운로드도 워낙 간편하고 속도도 빠르고 폭넓게 사용할 수 있어 제일 좋아하는 WAS(Web Application Server)이다.
아무튼, 퍼블릭 서비스를 하는 중에 이용자가 많이 몰리게 되어 개발서버에서도 정말 동일한 환경으로 테스트를 많이 해야 할 필요성을 느껴... 개발 서버와 운영 서버 간의 같은 WAR 파일을 구동시키다 보니 구분을 어떻게 할까 고민이 되었다.
그중 System.properties() 를 이용해 구분하면 되지 않을까! 란 생각을 가지고 WildFly를 구동할 때 나오는 로그를 참조해보았다.
단순히 저기서 보이는 host.name 이나 node.name, server.name 만 바꾸면 될 것이라고 생각했는데...
안 바 껴
왜 안되는지 전혀 감도 안잡힌다..
WildFly를 편하게 실행하기 위해 service로 등록을 해두었는데 WildFly_HOME 근처에 systemd 폴더를 찾아보니 wildfly.service 파일을 발견했다.
아니 EnvironmentFile 경로가 저렇게 잡혀있네...? 하고 해당 파일을 열어보았다.
참고로 bind IP가 0.0.0.0으로 세팅되어 있었고 서버 구동할 때 로그도 0.0.0.0이었다가 저 부분을 한번 바꿔보니까 반영이 되더라... 근데 실제로는.... 저것과 전혀 상관없이 다른 ip로 구동이 잘 되고 있다는 것...
개발서버는 내부망 ip를 할당하여 어차피 회사 pc로 밖에 접속이 안되고 그때 이미 다른 ip를 할당해놨던 상태다..
하 뭘까 도대체 저것들은 어디서 가져오는 것이냐, 어떻게 수정할 수 있는 것이냐.
결론적으로 말하면 System.properties()로 가져오는 것들에 대한 세팅은 standalone.xml, host.xml, domain.xml 이 세 개에 골고루 퍼져있다. 그리고 wildfly를 실행시키는 모드가 domain이면 domain.xml을, standalone이면 standalone.xml을 수정시켜주면 되겠다 이 말이다.