2015년 5월 29일 금요일

TIP::linux root 암호 복구 방법

일어나서는 안되는 일이지만 가끔 일어나는 일이 root 암호를 잊는 것이다. 이 페이지를 찾아왔다면 암호를 잃어버려 화들짝 놀라 수명이 단축되는 느낌을 느꼈겠지만 걱정 마시라. (씨익)

다양한 이유가 있겠지만 정말 아무생각없이 설치하다가 또는 이전 관리자가 사라져 버리거나 해서 linux root 암호를 잃었을 때 복구방법을 설명 드리겠다. 참고로 난 지금 졸리다.

=-= zzZ

. note : CentOS 6 기준으로 설명하나 grub을 사용하는 linux는 대부분 비슷할 것이라고 생각된다. 아니면 말고..

우선 강제로 reboot 시킨다. 서버나 PC의 전원 버튼을 길게 눌러 껐다가 다시 켜거나 reset 버튼을 누른다. 전원을 뽑고 다시 연결하는 방법도 있다. 하드웨어와 linux가 친한 경우 전원버튼을 한 번만 살짝 누르면 자연스럽게 종료되기도 한다. 대부분의 비싼 x86 서버가 "한 번 살짝 눌러 OS에 종료 시그널 보내기 기능"을 지원하며, 요즘은 PC들도 잘 된다.

전원이 들어가고 팬(Fan)돌아가는 소리가 나면 매우 긴장하고 있다가 아래와 같은 화면이 보일 때 아무키나 누른다. 친절하게 상단에 아무키나 누르면 메뉴로 간다고 되어 있다. 지나쳤다면 잽싸게 Ctrl+Alt+Del.


메뉴 화면이 뜨고 그동안 설치했던 커널목록이 보인다. 아래에는 하나밖에 없다. yum update로 kernel이 업데이트 되었다면, 자주 update를 했다면 목록이 더 많을 수 있다. 아무거나 선택해도 되지만 우린 최신 커널이 좋으므로 제일 상단의 커널을 선택한다. (주의: 엔터를 누르면 안된다. 방향키로 선택만)


"e"키를 누르면 보통 아래와 같이 세개의 메뉴가 보인다. 방향키로 kernel로 시작하는 라인을 선택하고 또 "e"키를 누른다.


편집할 수 있는 페이지로 이동하고 커서가 보인다. 라인 제일 끝에 "single" 또는 "(숫자)1""쳐" 넣는다. 그리고 이 부분에서 누르고 싶었던 "엔터"를 누른다.


다시 아까봤던 화면으로 돌아오면 "b"를 누른다.


상단에 single user mode로 들어왔다는 표시가 보이고, 반가운 console이 보인다. ㅠㅠ


"passwd" 라고 치고, 엔터, 동일하게 두번 새 암호를 넣으면 root 로그인 암호가 변경된다. (현재 root이므로 무슨 짓이든 가능하다.)


그리고
>reboot

다시 재부팅 되고 로그인 화면이 보이면 변경된 암호로 로그인 할 수 있다. (감격 ㅠ^ㅠ)

root암호를 잊었을 때 외에도 linux 설정에 문제가 있어 부팅이 제대로 안되는 경우에 single-user mode를 활용할 수 있다. single-user mode에서 해결안되는 문제는 부팅 가능한 이미지 (DVD or USB)를 사용해서 rescue 모드로 부팅해야 한다.

. 주의 : 본인이 관리자가 아닌 서버에서 이러시면 곤란하다.

2015년 5월 27일 수요일

FIX::OutOfMemoryError: unable to create new native thread

OutOfMemoryError: unable to create new native thread 원인

OutOfMemoryError 문구만 봐서는 해당 에러가 메모리와 관련된 오류일 것이라고 생각하기 쉽다. 하지만 Java 1.6과 1.7에서 OS가 Thread를 생성해 주지 못할 때 OutOfMemoryError: unable to create new native thread 에러가 표시될 수 있다.
. 참고 : http://java.dzone.com/articles/outofmemoryerror-unable-create

Linux에서 사용자가 생성할 수 있는 최대 프로세스 개수를 확인하는 방법 중 하나는 ulimit 을 이용하는 것이다.

>ulimit -a
core file size                (blocks, -c) 0
data seg size               (kbytes, -d) unlimited
scheduling priority        (-e) 0
file size                      (blocks, -f) unlimited
pending signals            (-i) 62341
max locked memory       (kbytes, -l) 64
max memory size          (kbytes, -m) unlimited
open files                    (-n) 10240    
pipe size                     (512 bytes, -p) 8
POSIX message queues   (bytes, -q) 819200
real-time priority            (-r) 0
stack size                     (kbytes, -s) 10240
cpu time                     (seconds, -t) unlimited
max user processes        (-u) 1024    
virtual memory             (kbytes, -v) unlimited
file locks                      (-x) unlimited

프로세스 생성과 관련된 값은 "max user processes"이다.

해당값만 보고 싶다면
>ulimit -u
1024

Hard 설정 값을 보고 싶다면
>ulimit -Hu
2048

Java 프로세스가 자식 프로세스 모두 합쳐서 해당 값보다 많은 수의 Thread를 생성하려고 한다면 OutOfMemoryError: unable to create new native thread에러가 발생하게 된다.

max user processes 값 변경 방법

>ulimit -Hu 65535
>ulimit -Su 65535

위와 같이 할 경우 재부팅 되거나 세션이 새로 열리면 변경된 값이 적용되지 않는다.
재부팅이나 새 세션에도 해당값을 유지하려면 /etc/security/limits.conf 파일을 편집한 후 재부팅해야 한다.

>vi /etc/security/limits.conf
대략적으로 주석을 보면 어떻게 하는지 알 수 있다.

파일 제일 끝에 아래와 같이 추가한다. 이미 비슷한 라인이 있으면 편집한다.
*    hard    nproc    65535
*    soft    nproc    65535

특정 유저만 해당값을 설정하고 싶으면 '*'대신에 ID를 넣어준다.

hadoop    hard    nproc    65535
hadoop    soft    nproc    65535

hard는 최대로 생성할 수 있는 프로세스 수가 아니라 최대로 설정 가능한 제한값으로 root유저만 변경 가능하다. soft 값이 생성할 수 있는 최대 프로세스 수이며 root를 포함한 모든 유저는 hard값이하로만 설정 가능하다. (hard가 1024면 soft는 1024보다 클 수 없다.)
. 참고 : http://unix.stackexchange.com/questions/29577/ulimit-difference-between-hard-and-soft-limits

추가
. 파일 편집을 마친 후 재부팅 해야 해당 값이 적용된 다는 것을 잊지 말자.
. 해당 값을 너무 작게 설정하면 OS가 먹통이 될 수 있다. 복구하려면 rescue 나 single-user mode에서 /etc/security/limits.conf 파일을 편집해야 한다.
. max user processes의 최대값은 4,194,303이나 "sysctl kernel.pid_max"값에 따른다. CentOS 6.5의 kernel.pid_max 값은 32,768이다. 즉 ulimit에서 65,535로 변경해도 32,768이다.
(참고 : http://unix.stackexchange.com/questions/124040/how-to-determine-the-max-user-process-value)

참고
http://stackoverflow.com/questions/9361816/maximum-number-of-processes-in-linux

FIX :: ssh 접속이 느리고, /var/log/messages에 systemd-logind.service failed. 메시지가 남을 때

ssh 접속이 느릴 때가 있습니다. 보통은DNS가 제대로 설정되지 않았는데 /etc/ssh/sshd_config에 UseDNS가 yes로 되어 있을 때 발생합니다. 위와 같을 경우 /etc/ssh/sshd_config파일에서 아래와 같이 수정 후 ...