mango bio photo

mango

Que sera sera

Email Facebook

Shell Programming

#!/bin/bash
echo "Hello world!"
pid=`ps -e | grep crond | awk '{print $1}'`
kill -9 $pid

유용한 툴

  • vi
  • gedit
  • awk
  • sed

Troble Shooting

도구

  • 프로세스 디버깅 도구 : ps/pgrep/pstree/top
  • 시스템콜(system call) 추적 도구 : strace
  • 프로세스의 역추적 : 마법키? 사용
  • 오픈파일 확인 도구 : lsof

프로세스 상태

http://www.makelinux.net/books/lkd2/ch03lev1sec1

pid_max

man proc

Process State Codes

man ps

좀비 프로세스 확인 및 처리

ps -el

좀비프로세스 확인

ps-el | awk '$2=="Z" { print $5 }'

zombie.sh

#!/bin/bash
# check the zombie process
ppid=`ps -el | awk '$2=="Z" {print $5}'`
for pid in $ppid
do
        ps -e | grep $pid
done

thread 조회

gcc countThead.c -o countThread -lpthread
ps -eL | grep countThread
ps -eLo "pcpu,rss,vsz,command" | grep countThread
ps -eo "pid,ppid,rss,vsz,command" | grep firefox

Process monitoring

#!/bin/bash
#Monitoring processes
if [ $# -ne 1 ]
then
        echo "Usage : $0 process_name"
        exit 1
fi
while true
do
        ps -eo "pid,ppid,rss,vsz,command" | grep $1 | grep -v grep
        sleep 3
done

pgrep, pstree, top

strace

파일로 결과 저장

strace -o /tmp/id.strace id

파일에 관련된 것만 출력

strace -e trace=file id

프로세스에 관련된 것만 출력

strace -e trace=process id

telnet 설치

yum install -y telnetd

service xinetd restart

yum install -y telnet

strace -p `pgrep xinetd`

strace -p `pgrep xinetd` -f -e trace=network

좋은데 결과를 읽기가 너무 힘들다 ㅠㅠ

  • 참고

http://chadfowler.com/blog/2014/01/26/the-magic-of-strace/

http://www.hokstad.com/5-simple-ways-to-troubleshoot-using-strace

  • 조금더 간단한 명령 ltrace

실제 예제

fileopen 이라는 프로그램이 실행시 Permission denied가 뜬다

strace 실행

strace ./fileopen

결과

open("/etc/shadow", O_RDONLY)           = -1 EACCES (Permission denied)

ltrace 실행

ltrace ./fileopen

결과

fopen("/etc/shadow", "r")               = 0
perror("fopen"fopen: Permission denied
)

lsof - list open files

특정파일을 오픈하고 있는 프로세스 추적

lsof /etc/passwd

ftp포트가 열고있는 파일리스트

lsof -i:ftp

명령 반복

lsof 0r 3 -i:telnet

특정 프로세스가 오픈하고 있는 파일

lsof -p `pgrep sshd`
  • lsof -p 명령은 PID를 하나만 받으므로 sshd 프로세스가 여러개일경우 오류가 날 수 있다.

netstat

netstat -atp
netstat -atp | grep telnet

p 옵션 강추. 프로세스 정보도 함께 보여줌

ifconfig

UP BROADCAST RUNNING MULTICAST 올라와있고 broadcast 가능하며 실행되고 있고 multicast가능

  • eth+숫자 : 외부와 통신
  • lo : loopback
  • ::1/128 -> ipv6 앞부분이 모두 00인 경우 표기법
  • /etc/sysconfig/network-scripts/ifcfg-eth? 네트웍설정

Gateway 확인

route

or

netstat -r

ARP

OSI 1, 2계층에서는 mac addr을 사용하여 통신함

arp 테이블에서 IP와 mac addr을 매핑해둔다

tcpdump

tcpdump -i lo -w /tmp/tcpdump.log

tcpdump -r /tmp/tcpdump.log port telnet

wireshark

yum install wireshark-gnome

lo 살리기

ifup lo

Linux Filesystem

history

ext2 -> ext3 (journaling) -> ext4 (journal checksum, delayed file space allocation)

http://www.linuxdevelopernews.com/a-brief-history-of-ext2-ext3-and-ext4-2011-12

xfs, brfs(Btree Filesystem)


## 참고 http://egaoneko.github.io/os/2015/05/24/linux-starter-guide-4.html

e2fsck

[root@localhost VMware Tools]# umount /data
[root@localhost VMware Tools]# df
Filesystem     1K-blocks     Used Available Use% Mounted on
/dev/sda2       18143556  5160340  12054912  30% /
tmpfs            1958420      224   1958196   1% /dev/shm
/dev/sda1         289293    74645    199288  28% /boot
.host:/        104318044 71775404  32542640  69% /mnt/hgfs
/dev/sr0           71618    71618         0 100% /media/VMware Tools
[root@localhost VMware Tools]#

[root@localhost VMware Tools]# e2fsck /dev/sdb1
e2fsck 1.41.12 (17-May-2010)
/dev/sdb1: clean, 11/327680 files, 55935/1309289 blocks
[root@localhost VMware Tools]# e2fsck -f /dev/sdb1
e2fsck 1.41.12 (17-May-2010)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/sdb1: 11/327680 files (0.0% non-contiguous), 55935/1309289 blocks
[root@localhost VMware Tools]#

mke2fs 를 이용한 superblock backup확인

mke2fs /dev/sdb1 --날라감 포맷명령

[root@localhost VMware Tools]# mke2fs -n /dev/sdb1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
327680 inodes, 1309289 blocks
65464 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1342177280
40 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks:
	32768, 98304, 163840, 229376, 294912, 819200, 884736

[root@localhost VMware Tools]#

tune2fs

ext2 -> ext3 인 경우 journaling 추가

tune2fs -j 장치명

ext3 -> ext4

[root@localhost ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
.host:/ on /mnt/hgfs type vmhgfs (rw,ttl=1)
vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on /media/VMware Tools type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=0,gid=0,iocharset=utf8,mode=0400,dmode=0500)
/dev/sdb1 on /data type ext3 (rw)
[root@localhost ~]#

tune2fs -O extents,uninit_bg,dir_index /dev/sdb1

# e2fsck /dev/sdb1

mount /data –오류! cat /etc/fstab에 정의된 fs타입과 다름

mount /dev/sdb1 /data

[root@localhost ~]# mount
/dev/sda2 on / type ext4 (rw)
proc on /proc type proc (rw)
sysfs on /sys type sysfs (rw)
devpts on /dev/pts type devpts (rw,gid=5,mode=620)
tmpfs on /dev/shm type tmpfs (rw,rootcontext="system_u:object_r:tmpfs_t:s0")
/dev/sda1 on /boot type ext4 (rw)
none on /proc/sys/fs/binfmt_misc type binfmt_misc (rw)
.host:/ on /mnt/hgfs type vmhgfs (rw,ttl=1)
vmware-vmblock on /var/run/vmblock-fuse type fuse.vmware-vmblock (rw,nosuid,nodev,default_permissions,allow_other)
gvfs-fuse-daemon on /root/.gvfs type fuse.gvfs-fuse-daemon (rw,nosuid,nodev)
/dev/sr0 on /media/VMware Tools type iso9660 (ro,nosuid,nodev,uhelper=udisks,uid=0,gid=0,iocharset=utf8,mode=0400,dmode=0500)
/dev/sdb1 on /data type ext4 (rw)

참고 To enable the ext4 features on an existing ext3 filesystem, use the command: # tune2fs -O extents,uninit_bg,dir_index /dev/DEV WARNING: Once you run this command, the filesystem will no longer be mountable using the ext3 filesystem! After running this command (specifically, after setting the uninit_bg parameter), you MUST run fsck to fix up some on-disk structures that tune2fs has modified: # e2fsck -fDC0 /dev/DEV

https://ext4.wiki.kernel.org/index.php/Ext4_Howto#Converting_an_ext3_filesystem_to_ext4

시스템 튜닝 데몬 tuned

참고

http://docs.redhat.com

[root@localhost tune-profiles]# pwd
/etc/tune-profiles
[root@localhost tune-profiles]# ls
active-profile      laptop-ac-powersave       throughput-performance
default             laptop-battery-powersave  virtual-guest
desktop-powersave   latency-performance       virtual-host
enterprise-storage  server-powersave
functions           spindown-disk

커널파라미터 확인

sysctl -a

프로파일 변경

[root@localhost tune-profiles]# tuned-adm profile enterprise-storage
Switching to profile 'enterprise-storage'
Applying deadline elevator: sda sdb sdc                    [  OK  ]
Applying ktune sysctl settings:
/etc/ktune.d/tunedadm.conf:                                [  OK  ]
Calling '/etc/ktune.d/tunedadm.sh start':                  [  OK  ]
Applying sysctl settings from /etc/sysctl.conf
Starting tuned:                                            [  OK  ]
[root@localhost tune-profiles]# tuned-adm active
Current active profile: enterprise-storage
Service tuned: enabled, running
Service ktune: enabled, running
[root@localhost tune-profiles]#

부팅시 문제

RHEL6 vs RHEL7 교재 참고

root 비밀번호 잊어버렸을때

  • 부팅시 runlevel 1로 변경 후 재부팅하면 비번없이 로그인됨 (RHEL6의 경우)
  • passwd root 로 비번 재설정

파일시스템 마운트 실패시

/etc/fstab

# /etc/fstab
# Created by anaconda on Tue Aug 25 01:29:29 2015
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
UUID=807ea5cc-3c92-4a88-be4d-2630553640af /                       ext4    defaults        1 1
UUID=71e68e21-ea8c-4a16-a71d-85e0e03789a8 /boot                   ext4    defaults        1 2
UUID=fdff50ba-06c8-4548-a803-2a9e02aebbeb swap                    swap    defaults        0 0
tmpfs                   /dev/shm                tmpfs   defaults        0 0
devpts                  /dev/pts                devpts  gid=5,mode=620  0 0
sysfs                   /sys                    sysfs   defaults        0 0
proc                    /proc                   proc    defaults        0 0
UUID="06770c0a-8b83-43ab-be41-f53be632e42b" /data               ext3    defaults        1 3
[root@localhost ~]# blkid /dev/sdb1
/dev/sdb1: UUID="06770c0a-8b83-43ab-be41-f53be632e42b" TYPE="ext4"
  • 파일시스템 마운트 실패시 파일시스템이 읽기전용으로 마운트됨
  • 파일시스템을 쓰기가능한 상태로 다시 마운트
mount -o remount,rw /

/sbin/init이 깨졌을때

부팅시 init=/bin/bash로 재부팅 rpm -qf /sbin/init로 패키지 확인후 복구

커널 문제 추적

디바이스 드라이버는 커널에 적재되어 실행됨

커널 메시지 확인 명령

dmesg

리눅스 커널 빌드

make oldconfig/menuconfig/xconfig

make

make install

Kernel Panic, oops, 세그멘테이션 오류(segmentation fault)

Kernel Panic

Kernel oops

kdb를 이용한 커널 디버깅

@_@;;

Kernel 덤프

dump 도구
  • diskdump
  • kdump (기본)
  • LKCD
분석 도구
  • crash
kdump 설정
  • /boot/grub/grub.conf 수정 - crashkernel=128M@16M
chkconfig kdump on

service kdump start

service kdump status
  • 런레별별 서비스 시작여부 확인
chkconfig --list kdump
  • 현재 런레벨
runlevel

crash로 분석

  • vmlinx 파일 위치 확인
find / -name vmlinux
  • crash 명령
crash vmlinux /var/crash/127.0.0.1-2015-08-27-21:57:03/vmcore
crash> set 1
PID: 1
COMMAND: "init"

crash> ascii 0x41424344
41424344: DCBA
  • bt [option][PID]
bt -l

커널소스파일 및 라인번호 정보

live 커널 디버깅

crash vmlinux

모듈

/lib/modules/uname -r/kernel/drivers/ 하위에 *.ko

insmod modulename

modprobe slip

insmod oops.ko -> crash

시스템 보안

서비스 시작 설정

ntsysv

chkconfig --list

chkconfig --list xinetd

chkconfig --level 3 xinetd off

chkconfig xinetd off

포트 관련

netstat -atp

lsof -i:smtp

PAM

  • 설정화일: /etc/pam.d/
  • 모듈위치: /lib/security/ 혹은 /lib64/security/
  • pam_nologin.so모듈 설정예
touch /etc/nologin

ulimit

  • ctrl + \ 로 core 파일 떨어짐
ulimit -c unlimited
  • core파일 안떨어짐
ulimit -c 0

파일사용권한 타그룹 권한 t

-rwsr-sr-t

  • s : set uid 누가 실행하든 만든 사용자의 사용자아이디로 설정함
  • s : set gid 누가 실행하든 만든 사용자의 그룹아이디로 설정함
  • t : sticky 디렉토리 권한, 타사용자가 생성한 파일 삭제 안됨

  • setuid 파일 검색
find / -perm -2000
  • setgid 파일 검색
find / -perm -4000

파일속성

  • a : append만 가능
  • i : immutable 추가,변경,삭제 불가
lsattr /etc/passwd

chattr +i /etc/passwd

chattr -i /etc/passwd

커널 파라미터

  • 기본사용법
sysctl -a | grep file-max
fs.file-max = 385767

cat /proc/sys/fs/file-max
385767
  • 수정

/etc/sysctl.conf 수정

  • sysctl.conf 즉시적용
sysctl -p

네트워크 보안

TCP Wrapper

  • 설정화일 위치

    /etc/hosts.deny

    /etc/hosts.allow

  • man 참조

man hosts.deny
man hosts.allow

방화벽

  • 방화벽 설정 확인
iptables -L
  • 설정
iptables -A INPUT -s 192.168.10.0/24 --dport 80 -j REJECT
  • 삭제
iptables -D INPUT -s 192.168.10.0/24 --dport 80 -j REJECT

*

iptables -P INPUT DROP