Full Stack JavaScript Developer | Half-time Open Sourcerer.
모든 저자 보기chkconfig run level 설명
개요
chkconfig 로 부팅시 자동실행 서비스를 등록할 수 있다.
chkconfig service on
이 명령어를 사용하면 2345 레벨이 활성화 된다. 그렇다면 레벨은 뭘까?
Run Level
Run Level 은 서비스의 실행을 단계별로 구분하여 적용하는 것을 말한다.
-
0 - halt (Do NOT set init default to this)
-
1 - Single user mode
-
2 - Multiuser, without NFS (The same as 3, if you do not have networking)
-
3 - Full multiuser mode
-
4 - unused
-
5 - X11
-
6 - reboot (Do NOT set init default to this)
-
0 : 시스템 종료시
-
1 : 싱글 유저 모드 (시스템 복원모드, 기본적으로 관리자 권한의 쉘을 얻게 된다)
-
2 : NFS가 지원되지 않는 다중 사용자 모드 (네트워크를 사용하지 않는 텍스트 유저 모드)
-
3 : 완전 다중 사용자 모드 (일반적인 로그인 시, CLI 환경)
-
4 : 미지정 (사용안함, 임의로 정할 수 있음)
-
5 : 3번과 같으나 GUI (X11) 환경
-
6 : 재부팅
모듈 설치시에는 on 또는 345 설정이 큰 차이가 없다.
CentOS 버전 및 Bit 확인
캐시메모리가 꽉차서 메모리 용량이 부족한 경우
파일에 접근이 빈번한 시스템에서 메모리 용량을 확인시
## 메모리 용량 확인
$ free -m
캐시메모리의 점유율이 꽉찰 정도로 높게 나타나 메모리 용량이 부족한 걸 확인할 수 있다.
원인
리눅스는 물리적인 저장/통신 장치와 데이터를 주고 받을 때 메모리에 먼저 적재한 후에 데이터를 주고 받는다. 이는 동일한 데이터에 대한 접근을 할 경우 메모리에서 바로 가져오도록 하여 I/O 성능을 높이기 위함이다.
해결
vfs_cache_pressure
시스템 설정 파일을 열어 디렉토리와 inode 오브젝트에 대한 캐시로 사용된 메모리를 반환하는 정도를 지정하는 vfs_cache_pressure 파라미터를 수정해준다.
$ vi /etc/sysctl.conf
## 기본값은 100
vm.vfs_cache_pressure = 10000
cache memory drop
캐시메모리를 주기적으로 비워주자
$ crontab -e
## 매일 새벽 4시에 캐시메모리 강제비우기
0 4 * * * sync && echo 3 > /proc/sys/vm/drop_caches
sync 명령어로 캐시메모리에 담긴 데이터를 실제 저장장치에 반영해주고, drop_caches를 실행한다. 커맨드로 실행시에 메모리를 반환하면서 서버가 잠시 멈출 수 있으니 새벽에 실행을 걸어놓자
- echo 1 : page cache 해제
- echo 2 : inode, dentry cache 해제
- echo 3 : 모두 해제
Linux 유저 비밀번호 변경
passwd
리눅스 유저 비밀번호를 변경해보자. 비밀번호를 변경하고 싶은 유저로 로그인을 한 뒤 아래 명령어를 날리면 된다.
passwd
Root 권한이라면 다른 아이디의 비밀번호도 변경이 가능하다.
## passwd 뒤에 유저아이디를 적는다
$ passwd userid
cron 부팅시 프로그램 실행
리눅스에서 재부팅시 자동으로 프로그램을 실행해야하는 경우가 있다. init.d에 등록하는 방법이 있지만 스케쥴 작업인 경우 크론에서 관리하는게 깔끔한 것 같다.
예제
$ crontab -e
@reboot /test/test.sh start
@reboot를 쓴 뒤 부팅시 실행시킬 명령어를 적어주면 된다.
내부 아이피 사용 또는 수동 네트워크 설정시 오류
수동으로 내부 아이피 세팅 중 문제가 발생하는 경우 확인해봐야한다.
NetworkManager
네트워크 매니저가 돌아가고 있으면 충돌이 발생할 수 있다.
## 확인
$ service NetworkManager status
## 서비스 종료
$ service NetworkManager stop
## 부팅 서비스 삭제
$ chkconfig NetworkManager off
내부 IP 확인
/sbin/ifconfig $1 | grep "inet addr" | awk -F: '{print $2}' | awk '{print $1}'
정상적으로 할당될 것이다.
mysql, maria 등의 서비스 포트 변경이 안 될때
일반적인 포트 변경
포트 확인
## grep 뒤에 확인할 포트를 적으면 된다.
$ netstat -lp | grep 3307
iptable 수정
$ vi /etc/sysconfig/iptables
## 해당 포트를 방화벽에서 열어준다.
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3307 -j ACCEPT
database 포트 변경
$ vi /etc/my.cnf
## 포트가 설정되있는 부분을 찾아 변경한다.
port = 3307
서비스 재시작
service mysql restart
잘 했는데 서비스가 올라가지 않는다!!!
원인
로그 확인
mysql 설치 경로로 이동하여 로그를 살펴보자.
$ cd /var/lib/mysql/ # basedir 설정이 되어있다면 해당경로를 덧붙힌다.
$ cat {hostname}.err
[ERROR] Cant start server: Bind on TCP/IP port. Got error: 13: Permission denied
[ERROR] Do you already have another mysqld server running on port: 3307 ?
[ERROR] Aborting
해당 포트에 권한이 없다. 해당 포트를 다른 mysqld 서비스가 사용하는가? 라고 로그가 남겨져있다.
SELinux 확인
$ sestatus
SELinux status: enabled
혹시나 역시나 SELinux가 활성화 되어있다. SELinux에서 포트가 서비스용으로 활성화가 되지 않았기 때문에 계속 거절당한 것이였다.
해결
SELinux 설정 확인
semanage 명령어를 사용해서 확인하고 변경할 수 있다. 명령어 실행이 안될 경우 policycoreutils-python 패키지를 설치해주면 된다.
## semanage 설치
$ yum install -y policycoreutils-python
## 포트 확인
## mysql
$ semanage port -l | grep mysqld_port_t
## http
$ semanage port -l | grep http_port_t
mysqld_port_t tcp 1186, 3306, 63132-63164
변경하려는 3307 포트는 등록되어 있지 않다.
SELinux에 포트 등록
semanage port -a -t mysqld_port_t -p tcp 3307
명령어가 iptables에 등록하는 것과 유사하다.
확인
$ semanage port -l | grep mysqld_port_t
mysqld_port_t tcp 3307, 1186, 3306, 63132-63164
이제 mysql restart를 하면 정상적으로 구동된다.
여담
리눅스에서 정상적으로 진행했는데 뭔가 안된다면 SELinux부터 의심해보자.
Temporary failure in name resolution, 일시적인 실패
모듈 설치시 domain을 사용하거나, telnet 도메인 포트를 호출해봤는데 name resolution에서 일시적인실패 또는 Temporary failure 문구의 에러가 보이는 경우가 있다.
원인
nameserver를 찾지 못해서 발생한다.
해결
Root 계정으로 접속 후 nameserver 설정을 추가한다.
$ vi /etc/resolv.conf
## 아래 내용을 추가
nameserver 58.227.193.227
nameserver 221.143.20.131
저장하면 서비스 재시작이 필요없이 바로 적용된다.
여담
- 통신사별 DNS 정보 페이지를 첨부한다.
- 아마존 DNS 오류로 이 페이지의 조회수가 급증했다.