출처 : http://zero-gravity.tistory.com/270

참고 : http://www.happyjung.com/lecture/2471


집에 서버를 구성하고나서 불과 며칠이 지나지 않아 로그인 시도가 7천번 가까이 있었다. ㄷㄷ

   /var/log/secure로 접속 아이피를 찾아서 조회해보니 죄다 중국쪽으로 찍힌다..;; 우회한 건지 직접 접속 시도한 건지는 모르겠지만... 중국 정말 싫다 ......




   앗 뜨거 하고, 이래선 안되겠다는 생각에 바로 보안 설정에 들어갔다.



   1. SSH 포트 & 프로토콜 변경


vi /etc/ssh/sshd_config


# If you want to change the port on a SELinux system, you have to tell

# SELinux about this change.

# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER

#

Port 1234

#AddressFamily any

#ListenAddress 0.0.0.0

#ListenAddress ::


   Port 부분을 22에서 다른 번호로 변경한다.


# The default requires explicit activation of protocol 1

Protocol 2


   Protocol을 2로 변경한다. (보안상 2로 하는 게 좋다고 한다.)




   2. root로 로그인이 불가능하도록 설정


#LoginGraceTime 2m

PermitRootLogin no

#StrictModes yes

MaxAuthTries 6

#MaxSessions 10


   PermitRootLogin을 주석 해제하고 no로 기입하면 root로는 직접 로그인이 불가능하다. root로 로그인하고 싶다면, 일반 유저로 로그인한 뒤에 "su - root"로 바꿔줘야 함.


   MaxAuthTries는 로그인 시도 횟수를 제한한다. 6으로 해놓을 경우, 6번 로그인 실패하면 자동으로 차단.



   # systemctl reload sshd.service


   설정을 마치고 SSH 서비스를 재시작한다.



# firewall-cmd --permanent --zone=public --add-port=1980/tcp

# firewall-cmd --reload


   마지막으로 1234포트 방화벽 열어주면, 1234 포트로만 SSH 접속이 가능할 것이다.





   만약 되지 않는다?


   내 경우, 여기까지 했는데 포트가 바뀌지 않았다. ㅡㅡ; 그래서 이것저것 찾아본 결과... 뭔가 더 해줘야 했다.


   내껀 semanage로 SSH 포트를 변경해줘야 완벽하게 변경이 됐다.


   CentOS를 최소 설치를 하면 "semanage" 명령어가 실행되지 않는데,


# yum install policycoreutils-python


   이럴 땐, policycoreutils-python을 설치해준다.



# semanage port -a -t ssh_port_t -p tcp 1234


   그리고나서 semanage 명령어로 SSH 포트를 아까 변경해줬던 포트 번호로 설정한다.



# semanage port -l | grep ssh


   위 명령어로 확인해보면 22번 포트가 1234로 잘 변경됐음을 확인할 수 있다.



# systemctl restart sshd.service


   다시 ssh서비스 재시작을 해주면 완료!





   3. Fail2ban 설치 (로그인 시도 아이피 차단)


   Fail2ban은 SSH 로그인 시도가 일정 수 이상일 경우 자동으로 차단해주는 녀석이다. 얼른 설치하자!


# yum install fail2ban jwhois



   설치만 한다고 해서 다 되는 건 아니고, 몇 가지 설정이 필요하다.


# vi /etc/fail2ban/jail.conf


# External command that will take an tagged arguments to ignore, e.g. <ip>,

# and return true if the IP is to be ignored. False otherwise.

#

# ignorecommand = /path/to/command <ip>

ignorecommand =     #123.111.0.444/24 이런식으로 아이피를 적어놓으면 접근 시도를 몇 번을 하든 차단되지 않는다.


# "bantime" is the number of seconds that a host is banned.

bantime  = 600    #일정 횟수를 초과하여 접근 시도 시, 접근 거부 시간. 600초


# A host is banned if it has generated "maxretry" during the last "findtime"

# seconds.

findtime  = 600    #입력한 시간 사이에 지정 횟수 초과 시 차단. 600초


# "maxretry" is the number of failures before a host get banned.

maxretry = 3    #최대 접근 횟수. 3회를 초과할 경우 접근 차단.


# Provide customizations in a jail.local file or a jail.d/customisation.local.

# For example to change the default bantime for all jails and to enable the

# ssh-iptables jail the following (uncommented) would appear in the .local file.

# See man 5 jail.conf for details.

#

# [DEFAULT]

# bantime = 3600

#

 [sshd]

enabled = true  #이걸 true로 해줘야 SSH 접근 시도 시, fail2ban이 동작함.

#

# See jail.conf(5) man page for more information


   설정을 마쳤으면,



# service fail2ban start


   서비스 재시작. 끝!


출처 : http://webdir.tistory.com/102

리눅스 시스템에 로그인했을때, 처음으로 접하게 되는 메세지들을 작성할 수 있습니다. 개성있는 로그인 공지사항들을 구글링하면 많이 찾을 수 있을 겁니다. 아래의 그림도 그 중 하나의 예이죠.

로그인 공지사항

로그인시에 보여줄 메세지를 설정할 수 있다.

설정파일

설정파일 설명 상태
/etc/issue 콘솔(로컬) 접속시도시 보여줄 메시지파일 로그인 전
/etc/issue.net 원격지에서 접속시도시 보여줄 메시지파일 로그인 전
/etc/motd 로컬접속, 원격접속 모두에 해당하며 로그인 성공 후 뵤여줄 메시지 파일 로그인 후

이를 이용하여 접속시도시에는 "불법적인 접근을 허용하지 않습니다" 라는 메세지들을 출력할 수 있고, 로그인 성공 후에는 각 사용자별 현재 디렉토리 사용량들이나 공지사항을 출력할 수 있다.

간단히 vi 로 편집하자.

Bash
vi /etc/issue

  +-------------------+
  | 불법적인 접근 금지 |
  +-------------------+
Bash
vi /etc/issue.net

  +-------------------+
  | 불법적인 접근 금지 |
  +-------------------+
Bash
vi /etc/motd

  +------------+
  | 환영합니다. |
  +------------+

/etc/issue.net 이나 /etc/issue 의 내용을 작성해도 ssh 를 사용해 로그인 한다면 작동하지 않는데 그럴 경우 /etc/ssh/sshd_config 를 수정해야 한다.

Bash
vi /etc/ssh/sshd_config

  # no default banner path
  Banner /etc/issue.net

ssh를 재시작 한다.

Bash
/etc/init.d/sshd restart 

Putty 를 이용해 SSH 로 접속시에는 옵션에서 창 > 변환 에서 수신한 데이터를 이 문자셋으로 가정(R): 의 드롭다운 메뉴에서 UTF-8 을 선택해서 접속해야 한글 문자셋이 제대로 출력된다.



출처 : http://www.jnetwork.co.kr/bbs/board.php?bo_table=useguide&wr_id=138

find 명령어로 일정기간, 특정용량 파일 삭제 및 찾기 

*  일정기간 지난 파일 삭제 명령 - 7일 지난 파일 삭제 예 
find [디렉토리] -ctime +7 -exec rm -f {} \;

* 특정용량 이상되는 파일 찾기 - 10MB 이상 되는 파일 찾기 예
find [디렉토리] -size +1000k -exec ls -al {} \;

*  생산된지 30일 이상 된 파일만 삭제
find [디렉토리] -type f -ctime +30 -exec rm -rf {} \;

*  생산된지 30일 이상 된 비어있는 디렉토리만 삭제
find [디렉토리] -empty -type d -ctime +30 -exec rmdir {} \;
※ 리눅스 버전에 따라 -ctime 이 먹지 않는 경우가 있다. 이때는 -mtime 으로 대체한다 (의미는 다르지만....)

*  현재 디렉토리( . ) 이하에 확장자가 .html ( -name "*.html" ) 인 파일만 ( -type -f ) 
find . -name "*.html" -type f -ls
* 현재 디렉토리 이하에서 확장자가 .php 인 파일만 삭제하기
find . -name '*.php' -exec rm -f {} \;

* 파일크기가 300KB 이상 ( -size +300k ) 인 파일만 (호스팅 되는 홈피내에 큰 사이트의 파일이 있는지 찾을 때 유용)
find . -size +300k -ls

* 파일크기가 500bytes 이하 ( -size -500c )인 파일만
find . -size -500c -ls

* 수정한지 20일 이상 ( -mtime +20 ) 된 파일과 디렉토리
find . -mtime +20 -ls

* 수정한지 20일 이상된 파일만
find . -mtime +20 -type f -ls

* 수정한지 20일 이상된 파일만 삭제 ( -exec rm {} \; ) ( 정기적으로 20일지 지난 파일을 삭제할 때 유용 )
find . -mtime +20 -type f -ls -exec rm {} \;

* 수정한지 3일 이내 ( -mtime -3 ) 의 파일만 ( 백업할 때 유용 )
find . -mtime -3 -type f -ls

* 수정한지 30분 이내 ( -mmin -30 ) 의 파일만
find . -mmin -30 -type -f -ls


출처 : http://faq.hostway.co.kr/?mid=Linux_ETC&page=9&document_srl=1423

관리자가 없어 자주 확인을 하지 않는 서버들의 경우는 홈페이지가 열리지 않는 경우 
하드웨어 장애가 아닐 경우에 상당수 많은 부분을 차지 하는 것이 파티션 사이즈가 100% 가 되면서 문제가 발생되곤 합니다.

이 경우 근본적인 해결책은 로그를 logrotate와 같은 형태로 분할 진행할 수 있겠지만, 
급한대로 로그를 비워야할 때 어떻게 해야 할지 모르는 경우가 있다.

 

1. Log file은 apache, mysql, 등 어플리케이션 설정내에서 경로가 지정되어 있기 때문에, 삭제 하

    게 되면 오류가 발생 하게 됩니다.
   아래와 같이 /usr 혹은 /var 파티션이 100%가 되는 경우가 상당 수 발생.

   [root@hostway /]# df -Th
   Filesystem    Type    Size  Used Avail Use% Mounted on
   /dev/sda1     ext3    1.9G  826M  963M  47% /
   /dev/sda6     ext3    950M   19M  884M   3% /tmp
   /dev/sda3     ext3    4.6G  485M  3.9G  11% /var
   /dev/sda2     ext3    9.2G  9.2G  0G  100% /usr
   /dev/sda7     ext3     92G   64G   24G  74% /home
   /dev/sda8     ext3    118G   93G   20G  83% /data

2. 이 경우 어떤 파일 혹은 디렉토리가 큰 용량을 차지하고 있는지 확인이 필요 합니다.

 

   방법 1) du 명령을 통해 용량이 큰 디렉토리 및 파일 확인


   [root@hostway ~]# cd /usr


   [root@hostway usr]# du -sh *
   578M    lib
   55M     libexec
   7.2G    local
   16K     lost+found
   
   [root@hostway usr]# cd local

   [root@hostway local]# du -sh *


  위와 같은 형태로 찾아 찾아 들어가는 형태로 파일이 커진 파일을 확인 할 수 있습니다.


   방법 2) find를 이용해 /usr 디렉토리 밑에 200M 이상 파일들 찾는 방법 예시
 
   [root@hostway usr]# find /usr -size +200000 -print

   위 방법들로 파일 사이즈가 큰 것들을 찾을 수 있습니다.

 

3. 보통 문제가 되는 파일들은 /usr/local/apache2/logs/~~  경로와 같이 웹 로그 파일들이 쌓이는

   부분에서 문제가 발생 합니다.
   예를 들어 /usr/local/apache2/logs/access.log 파일의 크기가 3.5G나 되는 경우 로그를 여는데도

   상당 수 시간이 소요되며, 서버의 부하가 발생 합니다.
   이 경우 로그가 꼭 필요하다면, 여유가 있는 다른 파티션으로 이동 후 비워주는 작업을 해주셔야

   합니다.

   아래 명령을 수행 하게 되면 null (0) 값으로 access.log를 채우게 되면서 결과적으로는 사이즈가 
   0이 되어지고 파일은 남아있습니다.

   [root@hostway usr]# cat /dev/null > /usr/local/apache2/logs/access.log   

   /usr 파티션에는 아래와 같이 3.5G 여유공간이 생깁니다.


   [root@hostway /]# df -Th
   Filesystem    Type    Size  Used Avail Use% Mounted on
   /dev/sda1     ext3    1.9G  826M  963M  47% /
   /dev/sda6     ext3    950M   19M  884M   3% /tmp
   /dev/sda3     ext3    4.6G  485M  3.9G  11% /var
   /dev/sda2     ext3    9.2G  5.7G  3.5G  70% /usr
   /dev/sda7     ext3     92G   64G   24G  74% /home
   /dev/sda8     ext3    118G   93G   20G  83% /data

 

   위와 같은 원인이 발생하는 이유는 공간부족으로 인해 데몬이 구동하기 위해 필요한 pid 파일이

   생성되지 못하기 때문입니다.


  - Mysql의 bin log 같은 경우엔 주의가 필요로 합니다.
    제일 마지막 번호의 log 인 즉 데몬이 쿼리를 쌓고 있는 파일은 비우시면 안됩니다.


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

2>/dev/null 의미란??

출처 : http://shakii.tistory.com/94

오늘 해커스쿨 운동장(?)에서 놀다 보니 2>/dev/null 관련된 문제가 있었다

   

일단 문제는 역시 내 수준하고는..... 너무 어려워 ㅜㅜ

   

암튼 그래서 먼저 풀어 보신분들의 해답(?)등을 참고 하다보니 위에 같은 명령어가 나오길래...

   

/dev/null 알겠는데...

   

1>/dev/null

2>/dev/null

   

은 처음 보는거라 생소 했다.. 그래서 네이버에게 물어보니 이러한 답변이...

   

A.

   

B.

   

C.

   

일단 A와 B은 같은 의미

   

그럼 B와 C의 차이는 뭐냐

   

1의 의미는 STDOUT(standard output)

2의 의미는 STRERR(standard error)

   

STDOUT은 표준출력으로, 정상적인 메시지를 출력하고

STDERR은 표준에러로, 에러메시지를 출력하는것이다

   

다시 말해

B는 표준출력을 /dev/null로 redirection하고 (정상적인 메시지를 null로)

C는 표준에러를 /dev/null로 redirection 한다 (에러메시지를 null로)

   

정상적인 메시지는 안보인다

   

위와 다르게 Permission denied인 에러메시지들은 안보인다

   

   

표준출력, 표준에러 그리고 표준입력도 있는데 이것을 리눅에서는 "파일"이라고 부른다.

   

   



PS: /dev/null 자체를 모르시는 분도 계실듯..

나는 이것을 쉽게 생각해서 "블랙홀"이라고 배웠다

이파일에 쓰는 모든것은 영원히 사라진다는것으로 아무것도 아닌(null) 장치파일이라고 볼수 있다(?)

어떠한 작업의 출력되는 내용을 보고 싶지 않을때, 이곳으로 그 출력을 보내버리면,

아무것도 보여지지 않게 되는것이다. 이럴때 아주 유용하게 쓰이게 된다

파일을 지울때는 rm 명령어로 지우면 되겠지만 텍스트로 이루어진 로그파일이라도

그 로그파일이 시스템에서 사용중일수 있다 그러면 삭제하는것은 위험 하기 때문에

그럴때

"/dev/null > 로그파일.log"

위와 같이 해주면 로그파일의 속(?)을 비워주게 되는것이다.



출처 : http://luckyyowu.tistory.com/122


리눅스에 JDK와 Tomcat을 설치해 JSP 서비스가 가능하도록 만들어 보겠습니다. 이번학기 수강하는 '객체지향 패러다임' 수업에서는 Windows에서 Tomcat Server를 구동해서 실습하지만 저는 리눅스를 좋아하니깐? 리눅스에 설치하겠습니다. (죄송합니다 교수님) 운영체제는 CentOS Linux 6.5 배포판이며 JDK와 Tomcat의 버전은 2014. 04. 10 기준 최신버전인 JDK 1.8.0, Tomcat 8.0.5를 설치하겠습니다.




JDK 다운로드 & 설치


이번 포스팅에서는 우선 JDK만 설치하며, Tomcat은 JDK의 설치 후 진행됩니다. 계정은 기본적으로 슈퍼유저의 권한을 가진 root 계정으로 진행하며 우선 jdk와 tomcat의 설치파일을 다운받을 디렉토리를 생성합니다.


# cd /usr/local/src

# mkdir tomcat


JavaSE JDK 설치파일 홈페이지(오라클)

http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html


먼저 JDK부터 설치하도록 합시다. 오라클 홈페이지에서 JDK 설치 파일을 다운 받습니다. rpm 확장자를 가진 패키지 설치 파일과 tar.gz 확장자를 가진 압축파일 두가지가 제공됩니다. 저는 압축파일로 설치할 것이므로 tar.gz 파일을 선택합니다. 또한 CentOS 6.5 리눅스 32비트 버전이므로 jdk-8-linux-i586.tar.gz 파일을 받겠습니다. 64비트 버전이라면 해당 버전에 맞는 파일을 받으시면 됩니다.


다운받는 방법은 wget, ftp 등 여러가지가 있겠지만 저는 윈도우에서 다운받은 후 rz 명령어로 리눅스로 옮겼습니다. 설치파일이 tar, gz으로 압축되어 있으니 풀어줍시다.


# gunzip jdk-8-linux-i586.tar.gz

# tar -xvf jdk-8-linux-i586.tar


압축을 풀면 jdk1.8.0 디렉토리가 생성됩니다.


생성된 jdk1.8.0 디렉토리를 /usr/local 디렉토리로 이동시킵시다. 그리고 심볼릭 링크 파일을 만들어줍니다. 심볼릭 링크를 만드는 이유는 여러가지가 있겠지만 나중에 JDK 버전이 업데이트 됬을 시 환경 설정을 변경하지 않고 심볼릭 링크의 내용만 수정해 주면 된답니다. 


# mv jdk1.8.0 /usr/local

# cd /usr/local

# ln -s jdk1.8.0 java


/usr/local 디렉토리로 jdk1.8.0 디렉토리가 이동했고 java란 심볼릭 링크가 생성된걸 확인해줍시다.


이제 명령어를 사용하기 /etc/profile의 내용을 수정합시다. vim 에디터를 열어 상단에 다음 내용을 추가합니다. (vi 사용법은.. 음... 파이팅)


# vi /etc/profile


JAVA_HOME=/usr/local/java

CLASSPATH=.:$JAVA_HOME/lib/tools.jar

PATH=$PATH:$JAVA_HOME/bin

export JAVA_HOME CLASSPATH PATH


리눅스에 기본적으로 설정된 java 명령어 위치의 인식을 피하기 위해 /usr/bin 디렉토리의 java 파일 이름을 바꿔줍시다. 그 후 source 명령어를 사용해 /etc/profile의 내용을 현제 쉘에 적용시킵니다. 그리고 java, javac 명령어로 버전을 확인해서 설치된 버전이 출력되면 제대로 설치 된겁니다.


# mv /usr/bin/java /usr/bin/java-old

# source /etc/profile

# java -version

# javac -version


JDK를 설치하는 이유는 JSP 서비스를 구동해주는 톰캣에서 JDK를 사용해 클래스를 컴파일하기 때문입니다. 다음 포스팅에서는 리눅스에 Tomcat를 설치해 JSP 서비스를 구동해 보도록 하겠습니다.

참고 : http://webdir.tistory.com/120


시간을 동기화하는 방법으로 NTP 와 rdate 를 이용하는 방법을 사용합니다. 소수점까지 정확한 단위의 동기화가 필요하다면 원자단위의 NTP 를 이용해야 합니다.

NTP 시간 동기화

NTP(Network Time Protocol)는 인터넷상의 시간을 정확하게 유지시켜 주기 위한 통신망 시간 규약이다. 라디오나 원자시계에 맞추어 시간을 조정하며 밀리초 1/1000초 단위까지 시간을 맞출 수 있다.

기본적으로, NTP 방식은 straum이라는 계층구조를 가지는데 straum 0 은 GPS나 세슘 원자 시계등 시간을 구하는 장비를 말하며, straum 1은 GPS 나 세슘 원자 시계등에서 직접 시간을 동기화하는 서버를 의미한다. strum 2 부터는 트리 구조를 형성하게 된다. 보통 straum 2에서 동기화를 하고, 이 동기화를 받은 straum 3 서버에서 나머지 같이 운영하는 서버들을 peer로 해서 동기화를 시키므로써 straum 1 서버들의 부하를 줄인다.

NTP 는 UDP 123을 기본 포트로 사용(포트 개방 필요)한다.

우리나라에서 운영되고 있는 NTP 서버

  • kr.pool.ntp.org
  • time.bora.net
  • time.nuri.net

NTP 설치

CentOS 6.4 Minimal 버전에는 NTP 가 설치되어 있지 않다. yum 을 이용해서 설치하자.

yum install ntp

  ================================================================================
   Package        Arch          Version                         Repository   Size
  ================================================================================
  Installing:
    ntp          x86_64        4.2.4p8-3.el6.centos              base        444 k

  Installing for dependencies:
    libedit      x86_64        2.11-4.20080712cvs.1.el6          base         74 k
    ntpdate      x86_64        4.2.4p8-3.el6.centos              base         58 k

  Transaction Summary
  ================================================================================
  Install       3 Package(s)

NTP 설정

peer 설정이다. 즉, 시간 동기화를 받기 위한 설정내용이다. 기본적으로 입력되어있는 server 0.centos.pool.ntp.org등을 주석처리하거나 삭제하고 국내 NTP 서버로 대체한다.

vi /etc/ntp.conf

  # Use public servers from the pool.ntp.org project.
  # Please consider joining the pool (http://www.pool.ntp.org/join.html).
  #server 0.centos.pool.ntp.org
  #server 1.centos.pool.ntp.org
  #server 2.centos.pool.ntp.org
  server kr.pool.ntp.org
  server time.bora.net
  server time.kornet.net

NTP 서비스를 시작프로그램에 등록한다.

chkconfig ntpd on

NTP 서비스 등록 확인

chkconfig --list | grep ntpd

  ntpd            0:해제  1:해제  2:활성  3:활성  4:활성  5:활성  6:해제

NTP 서비스를 시작한다.

/etc/init.d/ntpd start

  ntpd (을)를 시작 중:                                       [  OK  ]

NTP 는 동기화하기까지 5~10분의 시간이 걸리니 여유를 갖도록 하자.

ntpq -p

      remote           refid      st t when poll reach   delay   offset  jitter
  ==============================================================================
  *121.182.147.191 .GPS.            1 u   24   64  377    9.611    9.432   4.998
  +time.bora.net   90.1.14.51       2 u    1   64  177    7.049   -4.907  12.329
  +ntp1.sjtel.net  192.168.18.6     2 u    4   64  377    9.096   10.322   5.248
  • * : 현재 sync 를 받고 있음을 의미
  • + : ntp 알고리즘에 의해 접속은 가능하지만 sync 를 하고 있지는 않음을 의미
  • - : ntp 알고리즘에 의해 접속은 가능하지만 sync 가능 리스트에서 제외
  • blank : 접속이 불가능함을 의미

remote는 sync 를 하는 straum 2 서버주소를 가리키며, refid는 각 straum 2 서버가 현재 sync 를 하고 있는 straum 1 서버를 보여준다. st가 16일 경우 해당 서버에 접속 할 수 없음을 의미한다.

NTP 서버 설정

단순히 시간 동기화가 목적이 아니라 자체 동기화 서버를 구축하려는 경우 아래의 설정이 도움이 될지도 모르겠다.

vi /etc/ntp/ntp.conf 

  restrict default nomodify notrap noquery 
  restrict 127.0.0.1 
  restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap 

  # straum 2 server list 
  server ntp.ewha.net 
  server ntp1.epidc.co.kr 
  server time.bora.net 
  server time.wonkwang.ac.kr 
  server time.korserve.net 
  server noc6-3.koren21.net 

   driftfile /var/lib/ntp/drift 
   broadcastdelay 0.008 
   keys /etc/ntp/keys 
  • /etc/ntp.conf와 driftfile 과 keys의 경우 배포본마다 위치가 다를 수 있으니 확인을 하도록 한다.
  • restric 설정은 peer 들이 본 서버로 sync 하는 것에 대한 제한을 한다.
  • restrict default nomodify notrap noquery 설정은 기본으로 모든 권한을 주지 않음을 의미한다.
  • restrict 127.0.0.1 설정은 127.0.0.1 즉, 서버 자신에서는 모든 권한을 가진다.
  • restrict 192.168.0.0 mask 255.255.255.0 nomodify notrap 설정은 192.168.0.0 ~ 192.168.0.255 c class 에서는 질의를 할 수 있는 권한을 가진다. 즉, 위의 2 라인은 항상 기본으로 들어가는 설정이며, peer 를 거느릴 서버에서는 (즉 A 의 입장에서는) 하위 peer 들의 질의를 받을수 있도록 3 번째 라인과 같이 restrict 설정을 해 주어야 한다.

설정을 마쳤다면, service ntpd restart 명령으로 ntpd 데몬을 시작하고, ntpq 명령을 이용하여 sync 를 잘 하고 있는지 확인을 한다.


[환경정보]

# OS 확인
$> grep . /etc/*-release

# CPU 코어전체개수
$> grep -c processor /proc/cpuinfo

# 물리 CPU 수
$> grep ^processor /proc/cpuinfo | wc -l

# bit 확인
$> getconf LONG_BIT

# 메모리
$> cat /proc/meminfo | grep MemTotal


[기타]
# 현재 경로
$> pwd
$> pwd -P

# ls로 날짜 포맷 (연도 표시)
$> ls -al --time-style=long-iso



[yum]
# 설치
$> yum install 패키지명

# 삭제
$> yum remove 패키지명

# 설치된 목록
$> yum list installed
$> yum list installed 패키지명

# yum 설치, 변경, 삭제 이력
$> yum history list
$> yum history list 패키지명

# cache clean
$> yum clean all

# yum 패키지 업데이트
$> yum -y update

# yum 업데이트
$> yum update yum


[apt]
# 설치
$> apt install 패키지명

# 삭제
$> apt remove 패키지명

# 설치된 목록
$> apt list --installed

# 사용가능한 패키지 목록 저장소 업데이트
$> apt update

# 설치된 패키지 업그레이드
$> apt upgrade

# 설치된 패키지 업그레이드 (의존성 검사)
$> apt dist-upgrade



[용량]
* 디스크 확인
$> fdisk -l

* 디스크 확인 (해당 디스크)
$> fdisk -l [장치명]
$> fdisk -l /dev/sda

* 파디션 용량 확인
$> df -h

* 파티션 용량 전체 합계
$> df -P | awk '{sum += $2} END {print sum " KB"}'
$> df -P | awk '{sum += $2} END {print sum/1024 " MB"}'
$> df -P | awk '{sum += $2} END {print sum/1024/1024 " GB"}'

* 파티션 용량 전체 합계 (NAS 제외)
$> df -P | grep -v : | awk '{sum += $2} END {print sum/1024/1024 " GB"}'

* 파티션 사용용량 전체 합계
$> df -P | awk '{sum += $3} END {print sum/1024/1024 " GB"}'

* 파티션 사용용량 전체 합계 (NAS 제외)
$> df -P | grep -v : | awk '{sum += $3} END {print sum/1024/1024 " GB"}' 

* 폴더 용량 확인
$> du -hs 폴더명

* 현재폴더의 하위폴더 용량확인
$> du -hs *

* 현재폴더에 있는 폴더 및 파일 중에서 용량이 큰 것 순으로 10개 보기
$> du -hsx * | sort -rh | head -n 10



[cpu 정보]
참고 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_CPU_%EC%82%AC%EC%9A%A9%EB%A5%A0_%ED%99%95%EC%9D%B8

* cpu / 메모리 정보
$> top

* cpu 정보
$> lscpu


[메모리 정보]
참고 : https://zetawiki.com/wiki/%EB%A6%AC%EB%88%85%EC%8A%A4_%EB%A9%94%EB%AA%A8%EB%A6%AC_%EC%82%AC%EC%9A%A9%EB%A5%A0_%ED%99%95%EC%9D%B8

* 메모리 정보
$> free

* 1초마다 갱신
$> sar -r 1



[장비]
* PCI 장비 목록
$> lspci

* PCI 장비 목록 자세히
$> lspci -v

* PCI 장비 목록 자세히 및 "/" 입력 시 검색
$> lspci -v | less

* 하드웨어 목록
$> lshw
$> lshw -numeric -C display



[사용중인 포트 확인]
$> netstat -anp | grep LISTEN | grep :포트번호
$> netstat -tnlp | grep :80

$> ps -ef | grep 1722

$> curl -v telnet://IP:Port

$> curl -v telnet://127.0.0.1:443
# 연결이 잘 됐을 때
* About to connect() to 127.0.0.1 port 443 (#0)
*     Trying 127.0.0.1 ...
* Connected to 127.0.0.1 (127.0.0.1) port 443 (#0)

# 방화벽이 막혔을 때
* About to connect() to 127.0.0.1 port 443 (#0)
*     Trying 127.0.0.1 ... (여기서 멈춤)

# 방화벽 연결이 되고 서비스가 기동 중이 아닐 때 (서비스 포트 안됨)
* About to connect() to 127.0.0.1 port 443 (#0)
*     Trying 127.0.0.1 ...
* Connection refused
* Failed connect to 127.0.0.1:443; Connection refused
* Closing connection 0
curl: (7) Failed connect to 127.0.0.1:443; Connection refused





[systemctl]
참고 : systemd(system daemon) 을 관리하는 systemctl 명령어 사용법 (lesstif.com)

systemctl start service_name.service // 시작
systemctl stop service_name.service // 중지
systemctl status service_name.service // 상태
systemctl restart service_name.service // 재시작
systemctl enable service_name.service  // 부팅 시 자동 실행 하기
systemctl disable service_name.service  // 부팅 시 자동 실행 하지 않기
systemctl list-units --type=service  // 실행 중인 모든 서비스 보기
systemctl list-units --type service --all  // 모든 서비스 보기


* systemctl 등록
cd /etc/systemd/system/
vim tomcat.service

[Unit]
Description=Apache Tomcat 8 Servlet Container
After=syslog.target network.target
 
[Service]
User=tomcat
Group=tomcat
Type=forking
Environment=CATALINA_PID=/opt/tomcat/tomcat.pid
Environment=CATALINA_HOME=/opt/tomcat
Environment=CATALINA_BASE=/opt/tomcat
ExecStart=/opt/tomcat/bin/startup.sh
ExecStop=/opt/tomcat/bin/shutdown.sh
Restart=on-failure
 
[Install]
WantedBy=multi-user.target

systemctl daemon-reload  // systemctl 리로딩
systemctl start tomcat
systemctl enable tomcat


[Apache]
$> yum install httpd-devel
$> systemctl start httpd.service
$> systemctl stop httpd.service
$> systemctl status httpd.service


[Tomcat]
$ systemctl enable tomcat


[user]
# 사용자에 그룹 추가
$> usermod -aG 사용자ID 그룹ID
$> usermod -a -G root bbur01

# root로 사용자 변경
$> sudo su

# root로 사용자 변경 (환경정보 load)
$> sudo su -

# 다른 계정으로 변경
$> sudo su - 계정ID

# sudo su - 와 비슷하게 root로 변경하지만 sudoers 정책에 따라 권한이 부여됨
$> sudo -i

# root 사용자로 변경 (환경정보 load)
$> su - 

# 다른 사용자로 변경
$> su - 사용자ID

# 권한을 빌려서 명령어 실행
$> sudo -u 사용자ID command
$> sudo -u root ls
$> sudo -i -u 계정ID

# sudo로 사용할 수 있는 명령어 목록 조회
$> sudo -l



[jenkins 설치]
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo (최신)
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat-stable/jenkins.repo (안정)
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins


[방화벽]
firewall-cmd --permanent --new-service=jenkins
firewall-cmd --permanent --service=jenkins --set-short="Jenkins Service Ports"
firewall-cmd --permanent --service=jenkins --set-description="Jenkins service firewalld port exceptions"
firewall-cmd --permanent --service=jenkins --add-port=8080/tcp
firewall-cmd --permanent --add-service=jenkins
firewall-cmd --zone=public --add-service=http --permanent
firewall-cmd --reload


[부팅 시 서비스 자동 실행 및 실행]
systemctl enable jenkins
systemctl start jenkins

sudo service jenkins start
sudo service jenkins stop
sudo service jenkins restart


[jenkins]
vi /etc/sysconfig/jenkins
JENKINS_PORT="9090"

/etc/init.d/jenkins start

/var/lib/jenkins/secrets/initialAdminPassword



[gradle]
$> sudo mkdir /opt/gradle
$> sudo unzip -d /opt/gradle gradle-3.4.1-bin.zip
$> export PATH=$PATH:/opt/gradle/gradle-3.4.1/bin


[lsof]
# -u : 사용자가 열고 있는 파일
$> lsof -u tibero | grep tbsvr

# -i : TCP/UDP, 포트로 열고 있는 파일
$> lsof -i TCP
$> lsof -i TCP:22-80


[pstack]
$> pstack ${PID} > pstack.log



[Apache 설치 경로 찾기]
$> find / -name "httpd" -exec ls -al {} \;
$> which httpd
$> whereis httpd


[JDK 설치 경로 찾기]
$> which java
$> ls -l (which java 목록에서 나온 결과값)


[Root 비밀번호 변경]
$> sudo passwd root
$> 현재 로그인된 사용자의 암호
$> 새로 생성할 root 비밀번호
$> 새로 생성할 root 비밀번호 확인


[명령어 로그]
# 로그 출력 안함
$> ./shutdown.sh >& /dev/null

# 로그 출력 안함 (1: 정상, 2: 오류)
$> ./shutdown.sh > /dev/null 2>&1


[Watch]
# ls 결과 건수 (1초마다 갱신)
$> watch -n 1 'ls | wc -l'


[파티션 구성]
참고 : https://kimhyun2017.tistory.com/21


[wget]
# 다운받은 stream을 화면에 그대로 출력
$> wget -q -O - 웹주소
$> wget -qO- 웹주소

# 외부IP (인터넷) IP 확인
$> wget -qO- http://api.ipify.org


[curl]
# Response를 화면에 그대로 출력
$> curl -fsSL 웹주소

# 외부IP (인터넷) IP 확인
$> curl -kLs http://api.ipify.org


[IP]
# 인터넷망 IP 조회
$> ip route get 8.8.8.8 | awk '{gsub(".*src", ""); print $1; exit}'

$> HOST_IP=$(ip route get 8.8.8.8 | awk '{gsub(".*src", ""); print $1; exit}')
$> echo $HOST_IP

# 랜카드 IP 조회
$> ifconfig 랜카드명 | grep 'inet ' | awk '{print $2}'
$> ifconfig 랜카드명 | awk '/inet / {print $2}'


[변수]
# 설정 (빈칸 없이)
$> HOST_IP=$(ip addr)
$> echo $HOST_IP

# 해제
$> unset HOST_IP

# 환경변수 정보
$> env

[시스템]
# 최근 기동 시간
$> uptime

# 재부팅 이력
$> last reboot


[KILL]
Kill 관련 블로그 : https://www.lesstif.com/system-admin/unix-linux-kill-12943674.html

# Kill 명령어 목록
$> kill -l

# Kill 강제 종료
# kill 이후 옵션은 "kill -l" 목록과 동일하며 숫자 또는 목록에서 "SIG" 문구를 제외한 문자열과 동일함
$> kill -9 ${PID}
$> kill -KILL ${PID}

# Kill Graceful 종료
$> kill -15 ${PID}
$> kill -TERM ${PID}

# Process의 PID 찾아서 종료
# "grep -v grep"은 grep 더미 프로세스를 제외함
$> ps -ef | grep java | grep -v grep | awk '{print "kill -TERM "$2}' | sh -x

# PID (Process ID), PPID (Parent Process ID), PGID (Process Group ID), SID (Session ID)
참고 : https://leeyh0216.github.io/posts/sid_pid_ppid_pgid/
$> ps -A -o pid,ppid,pgid,sid,command

# PGID로 Parent -> Child Process 모두 종료하기
$> kill -- -PGID
$> kill -- -827
$> pkill -g PGID
$> pkill -TERM -g 827

# SID로 종료하기 (접속하고 있는 shell 까지 종료됨)
$> pkill -15 -s SID
$> pkill -TERM -s 2748

# Parent -> Child Process 구조에서 Child Process의 PGID를 Parent Process와 다르게 할 경우
parent.sh에서 작성

#!/bin/bash

set -o monitor
./child.sh


[Replace - 치환]

# config.properties 파일 내의 /home/www => /home/apps로 변경
sed -i 's/\/home\/www/\/home\/apps/g' config.properties

# 현재 경로에서 xml 확장자 파일 내의 asd => dsg로 변경 (대소문자 구분 안함)
sed -i "s/asd/dsg/ig" $(find . -type f -name "*.xml")

# /apps 경로에서 xml 확장자 파일 내의 asd => dsg로 변경 (대소문자 구분 안함)
sed -i "s/asd/dsg/ig" $(find /apps -type f -name "*.xml")

# 치환 다른 방법
#     -r : 문자열 검색 옵션
#     -l : 해당 경로(파일명 포함)만 표시
grep -r -l abc * | xargs sed -i 's/abc/def/g'
grep -rl abc . | xargs sed -i 's/abc/def/g'

# xml 확장자 파일만 변경
grep -rl abc --include \*.xml | xargs sed -i 's/abc/def/g'



[VI]
# Vi 설정
~/.vimrc
/etc/vimrc
/etc/vim/vimrc
/etc/vim/vimrc.local

# 현재 파일 확인
Ctrl + G

# 현재 파일 경로 확인
1, Ctrl + G
:!realpath %

# 되돌리기 (undo)
u

# 되돌리기를 되돌리기 (redo)
Ctrl + R

# 치환 (replace)
:%s/[원본단어]/[바꿀단어]/[옵션]
:%s/foo/bar/i => foo를 bar로 변경 (대소문자 구분 없이 첫 번째 찾은 단어만 변경)
:%s/foo/bar/g =>foo를 bar로 변경 (문서 전체) 
:%s/foo/bar/c => foo를 bar로 변경을 확인한다. foo에 focus가 됨, (interactive (대화형))
                        사용자에게 변경할 지 여부를 확인한다.
                        replace with bar (y/n/a/q/l/^E/^Y)?
                        - y: 현재 focus된 단어를 변경하고 다음 단어에 focus
                        - n: 현재 focus된 단어를 변경하지 않고 다음 단어에 focus
                        - a: 더 이상 묻지 않고 모든 단어 변경
                        - q: 변경하는 것을 멈춤
                        - l: 현재 focus된 단어를 변경하고 멈춤
:%s/foo/bar/igc => foo를 bar로 변경 (대소문자 구분 없이, 문서 전체를 변경하면서 변경 여부를 물어본다)
:%s/\/etc\file.txt/\/opt\/user\/data\/file.txt/g => 치환 문자에 경로가 포함된 경우 \/ 로 처리
:%s/\n//g => 문서 내 개행 (줄바꿈) 문자를 모두 없앰 

# 멀티 주석 추가
1. esc를 눌러 명령어i 모드 진입
2. 주석 시작 위치로 이동 후 Ctrl + v를 누르고 cell 편집 모드로 변경되면 화살표 키를 이용하여 세로로 블록 지정
3. Shift + i 로 입력모드 변경하고 주석 문자인 #을 입력 (맨 첫 줄만 #이 삽입된다)
4. esc 키를 누르고 수 초를 기다리면 블록된 라인 주석 처리 됨

# 멀티 주석 추가
1. esc를 눌러 명령어 모드 진입
2. v를 누르면 visual 모드로 전환 되는데 hjkl 을 사용하여 (화살표 키 사용하면 안됨) 블록 지정
3. :를 누르면 :'<,'> 이 표시가 되는데 그 문자를 놔두고 아래처럼 입력
:'<,'>norm i원하는문자
:'<,'>norm i#

# 멀티 주석 삭제
1. esc를 눌러 명령어 모드 진입
2. 주석 시작 위치로 이동 후 Ctrl + v를 누르고 cell 편집 모드로 변경되면 화살표 키를 이용하여 세로로 블록 지정
3. x 버튼을 클릭하여 삭제

# 멀티 주석 삭제
1. esc를 눌러 명령어 모드 진입
2. v를 누르면 visual 모드로 전환 되는데 hjkl 을 사용하여 (화살표 키 사용하면 안됨) 블록 지정
3. :를 누르면 :'<,'> 이 표시가 되는데 그 문자를 놔두고 아래처럼 입력
:'<,'>norm 1x (앞쪽 1개의 문자가 삭제됨)
:'<,'>norm 2x (앞쪽 2개의 문자가 삭제됨)

# Encoding (Charset) 확인
1. esc를 눌러 명령어 모드 진입
2. :set encoding

# Encoding (Charset) 변경하여 보기
1. esc를 눌러 명령어 모드 진입
2. :e ++enc=UTF-8
    :e ++enc=EUC-KR

# Encoding (Charset) 변경하여 저장
1. esc를 눌러 명령어 모드 진입
2. :set fileencoding=UTF-8
    :set fileencoding=EUC-KR



# 붙여넣기 시 탭 들여쓰기 없애기

# 현재 설정 확인
# 기본으로는 paste 옵션이 없음
:set

# paste 옵션 설정 (붙여넣기 시 자동 들여쓰기 안함)
:set paste

# nopaste 옵션 설정 (붙여넣기 시 자동 들여쓰기 함)
:set nopaste

# paste / nopaste 옵션을 단축키 (F2)로 설정하기
# 
$> vi ~/.vimrc
nnoremap <F2> :set invpaste paste?<CR>
set pastetoggle=<F2>
set showmode


[Profile]
vi ~/.bash_profile

#!/bin/bash

# 폴더/파일을 생성할 때 기본 퍼미션 조정
# Default : 0002
# 설정된 umask 확인 : umask
# 설정된 umask 문자열로 확인 : umask -S
# 폴더 : 777 권한에서 umask에 설정된 값을 뺀 권한이 실제 권한
# 파일 : 폴더 권한에 실행권한(1)을 뺀 권한이 실제 권한, 666에서 시작
# 예제
#     0000 : 폴더 권한(777), 파일 권한(666)
#     0001 : 폴더 권한(776), 파일 권한(665)
#     0002 : 폴더 권한(775), 파일 권한(664)
#     0022 : 폴더 권한(755), 파일 권한(644)
#     0077 : 폴더 권한(700), 파일 권한(600)
umask 022

### AIX 전용
# vi 사용하듯이 편집기 사용
# set -o vi

# back space 적용
# stty erase ^?


[폴더 삭제]
# 하위 폴더만 삭제
find 상위경로 -mindepth 1 -type d -exec rm -rf {} \;

# 하위 폴더만 삭제
ls -al | grep ^d | grep -wv "\." | awk '{print $NF}' | xargs rm -rf

# 특정 폴더에서 하위 폴더만 삭제
ls -al /경로 | grep ^d | grep -wv "\." | awk '{print $NF}' | xargs rm -rf

# .svn 파일 삭제
find . -name .svn -print0 | xargs -0 rm -rf
FOR /R %1 %%1 IN (.svn) DO RMDIR /S /Q "%%1" (Windows 버전)


[Echo Color 적용]
참고 : https://stackoverflow.com/questions/5947742/how-to-change-the-output-color-of-echo-in-linux

# 사용예제

# -e : 백슬래시 escape를 활성화하는 옵션

# 강조된 Red로 출력
$> ehco -e "\033[0;91m<TEXT>\033[0m"

# Bold & 강조된 Yellow로 출력
$> echo -e "\e[0;93m<TEXT>\e[0m"



# Color/Style 샘플

# Reset
Color_Off='\033[0m'       # Text Reset

# Regular Colors
Black='\033[0;30m'        # Black
Red='\033[0;31m'          # Red
Green='\033[0;32m'        # Green
Yellow='\033[0;33m'       # Yellow
Blue='\033[0;34m'         # Blue
Purple='\033[0;35m'       # Purple
Cyan='\033[0;36m'         # Cyan
White='\033[0;37m'        # White

# Bold
BBlack='\033[1;30m'       # Black
BRed='\033[1;31m'         # Red
BGreen='\033[1;32m'       # Green
BYellow='\033[1;33m'      # Yellow
BBlue='\033[1;34m'        # Blue
BPurple='\033[1;35m'      # Purple
BCyan='\033[1;36m'        # Cyan
BWhite='\033[1;37m'       # White

# Underline
UBlack='\033[4;30m'       # Black
URed='\033[4;31m'         # Red
UGreen='\033[4;32m'       # Green
UYellow='\033[4;33m'      # Yellow
UBlue='\033[4;34m'        # Blue
UPurple='\033[4;35m'      # Purple
UCyan='\033[4;36m'        # Cyan
UWhite='\033[4;37m'       # White

# Background
On_Black='\033[40m'       # Black
On_Red='\033[41m'         # Red
On_Green='\033[42m'       # Green
On_Yellow='\033[43m'      # Yellow
On_Blue='\033[44m'        # Blue
On_Purple='\033[45m'      # Purple
On_Cyan='\033[46m'        # Cyan
On_White='\033[47m'       # White

# High Intensity
IBlack='\033[0;90m'       # Black
IRed='\033[0;91m'         # Red
IGreen='\033[0;92m'       # Green
IYellow='\033[0;93m'      # Yellow
IBlue='\033[0;94m'        # Blue
IPurple='\033[0;95m'      # Purple
ICyan='\033[0;96m'        # Cyan
IWhite='\033[0;97m'       # White

# Bold High Intensity
BIBlack='\033[1;90m'      # Black
BIRed='\033[1;91m'        # Red
BIGreen='\033[1;92m'      # Green
BIYellow='\033[1;93m'     # Yellow
BIBlue='\033[1;94m'       # Blue
BIPurple='\033[1;95m'     # Purple
BICyan='\033[1;96m'       # Cyan
BIWhite='\033[1;97m'      # White

# High Intensity backgrounds
On_IBlack='\033[0;100m'   # Black
On_IRed='\033[0;101m'     # Red
On_IGreen='\033[0;102m'   # Green
On_IYellow='\033[0;103m'  # Yellow
On_IBlue='\033[0;104m'    # Blue
On_IPurple='\033[0;105m'  # Purple
On_ICyan='\033[0;106m'    # Cyan
On_IWhite='\033[0;107m'   # White


# Escape 문자

|       | bash  | hex     | octal   | NOTE                         |
|-------+-------+---------+---------+------------------------------|
| start | \e    | \x1b    | \033    |                              |
| start | \E    | \x1B    | -       | x cannot be capital          |
| end   | \e[0m | \x1b[0m | \033[0m |                              |
| end   | \e[m  | \x1b[m  | \033[m  | 0 is appended if you omit it |
|       |       |         |         |                              |


# 예제

| color       | bash         | hex            | octal          | NOTE                                  |
|-------------+--------------+----------------+----------------+---------------------------------------|
| start green | \e[32m<text> | \x1b[32m<text> | \033[32m<text> | m is NOT optional                     |
| reset       | <text>\e[0m  | <text>\1xb[0m  | <text>\033[om  | o is optional (do it as best practice |
|             |              |                |                |                                       |




[LVM - Logical Volume Manager]
개념 : https://tech.cloud.nongshim.co.kr/2018/11/23/lvmlogical-volume-manager-1-%EA%B0%9C%EB%85%90/
* 용어
  - PV (Physical Volume) : LVM에서 물리적인 디스크를 사용하기 위해 PV로 초기화가 필요, PE의 그룹
  - PE (Physical Extent) :  PV를 구성하는 일정크기 블록으로 LVM2에서는 4MB, LV의 LE와 1:1 대응됨
  - VG (Volume Group) : PV의 집합으로 LV를 할당 할 수 있음
  - LV (Logical Volume) : 논리 스토리지로 사용자가 최종 사용하게 되는 볼륨, LE의 그룹
  - LE (Logical Extent) : LV를 구성하는 블록으로 PE 사이즈와 동일

# VG 확인
$> vgs
$> vgdisplay
VG             #PV   #LV   #SN    Attr       VSize         PFree
ubuntu-vg    1      1      0        wz--n-   <464.26g    <264.26g     => 500GB 디스크임, 464GB 중 200GB는 할당되어 있고 264GB가 현재 남아 있음

# PV 확인
$> pvs
$> pvdisplay
PV                     VG             Fmt    Attr   PSize      PFree
/dev/nvme0n1p3  ubuntu-vg    lvm2   a--   <464.26g <264.26g

# LV 확인
$> lvs
$> lvdisplay
LV            VG             Attr           LSize        Pool   Origin   Data%   Meta%   Move   Log   Cpy%Sync   Convert
ubuntu-lv   ubuntu-vg   -wi-ao----   200.00.g

# PV 생성
$> pvcreate /dev/sdb1     => 두번째 ssd의 첫번째 파티션을 PV로 생성
$> pvs
PV                    VG              Fmt    Attr   PSize      PFree
/dev/sdb1                            lvm2   ---   220.0g    220.0g
/dev/nvme0n1p3  ubuntu-vg    lvm2   a--   <464.26g <264.26g

# VG 확장
$> vgextend ubuntu-vg /dev/sdb1    => 500GB 중 200GB만 할당된 ubuntu-vg에 /dev/sdb1을 확장함
$> vgs
VG             #PV   #LV   #SN    Attr       VSize         PFree
ubuntu-vg    2      1      0        wz--n-   <684.26g    <484.26g

# LV 확장
$> lvextend -L+220G /dev/ubuntu-lv


# MBR / GPT
- MBR : 주 파티션 4개까지 사용, 디스크 최대 용량 2TB, BIOS가 설치된 PC에서 사용
- GPT : 주 파티션 128개까지 사용, 디스크 최대 용량 9.4ZB, UEFI가 설치된 PC에서 사용
* 파티션 툴을 사용할 때 MBR은 fdisk, GPT는 parted를 사용

# Partition 확인
$> parted -l
$> fdisk -l

# Partition 명령어
$> parted /dev/sda
$> fdisk /dev/sda (/dev/sda는 device의 sd (ssd)의 a (첫번째 디스크))
$> fdisk /dev/nvme0n1 (첫번째 nvme 디스크)

# Partition 분할 (디스크 추가로 삽입한 경우)
$> parted /dev/sdb
(parted) mklabel gpt
(parted) mkpart primary 0 3TB     => 0부터 3TB를 첫번째 파티션으로 설정
(parted) mkpart primary 3TB 100%     => 3TB 이후 모든 용량을 두번째 파티션으로 설정
(parted) print     => 파티션 확인
(parted) quit

# Format
$> mkfs.ext4 /dev/sdb1
$> mkfs.ext4 /dev/sdb2

# Mount
$> mount /dev/sdb1 /logs
$> mount /dev/sdb2 /backup

+ Recent posts