## Install OpenVPN

# apt-get update
# apt-get install openvpn easy-rsa

## Set Up the CA Directory (using easy-rsa)
# make-cadir /etc/openvpn/ease-rsa
# cd /etc/openvpn/ease-rsa

## Configure the CA Variables
# vi vars
export KEY_COUNTRY="KR"
export KEY_PROVINCE="Seoul"
export KEY_CITY="Jongno"
export KEY_ORG="OpenStackKR"
export KEY_EMAIL="root@localhost"
export KEY_OU="OpenStack KR"
export KEY_NAME="server"

## Build the Certificate Authority
# source vars
# ./clean-all
# ./build-ca
Generating a 2048 bit RSA private key
.....................................................+++
...................+++
writing new private key to 'ca.key'
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [Seoul]:
Locality Name (eg, city) [Jongno]:
Organization Name (eg, company) [OpenStackKR]:
Organizational Unit Name (eg, section) [OpenStackKR]:
Common Name (eg, your name or your server's hostname) [OpenStackKR CA]:
Name [server]:
Email Address [root@localhost]:


## Create the Server Certificate, Key, and Encryption Files
# ./build-key-server server

A challenge password []:               --> 그냥 엔터
Sign the certificate? [y/n]:y

1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated


# ./build-dh
# openvpn --genkey --secret keys/ta.key


## Generate a Client Certificate and Key Pair
# cd /etc/openvpn/ease-rsa
# source vars
./build-key seungkyua
Generating a 2048 bit RSA private key
.....+++
.................+++
writing new private key to 'seungkyua.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [KR]:
State or Province Name (full name) [Seoul]:
Locality Name (eg, city) [Jongno]:
Organization Name (eg, company) [OpenStackKR]:
Organizational Unit Name (eg, section) [OpenStackKR]:
Common Name (eg, your name or your server's hostname) [seungkyua]:
Name [server]:
Email Address [root@localhost]:

Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:password
An optional company name []: OpenStackKR
Using configuration from /etc/openvpn/easy-rsa/openssl-1.0.0.cnf
Check that the request matches the signature
Signature ok
The Subject's Distinguished Name is as follows
countryName           :PRINTABLE:'KR'
stateOrProvinceName   :PRINTABLE:'Seoul'
localityName          :PRINTABLE:'Jongno'
organizationName      :PRINTABLE:'OpenStackKR'
organizationalUnitName:PRINTABLE:'OpenStackKR'
commonName            :PRINTABLE:'seungkyua'
name                  :PRINTABLE:'server'
emailAddress          :IA5STRING:'root@localhost'
Certificate is to be certified until Aug 29 01:42:22 2027 GMT (3650 days)
Sign the certificate? [y/n]:y


1 out of 1 certificate requests certified, commit? [y/n]y
Write out database with 1 new entries
Data Base Updated



## Configure the OpenVPN Service
# cd /etc/openvpn/ease-rsa/keys
# cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
# gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | sudo tee /etc/openvpn/server.conf

# vi /etc/openvpn/server.conf
32 port 1194
35 proto tcp
78 ca ca.crt
79 cert server.crt
80 key server.key

141 push "route 192.168.30.0 255.255.255.0"
142 push "route 192.168.230.0 255.255.255.0"
143 push "route 192.168.130.0 255.255.255.0"
144 push "route 192.168.49.0 255.255.255.0"
145 push "route 192.168.51.0 255.255.255.0"
146 push "route 192.168.54.0 255.255.255.0"

205 push "dhcp-option DNS 192.168.30.26"    # 사설 DNS 서버가 설치될 서버 IP
206 push "dhcp-option DNS 8.8.8.8"
208 push "dhcp-option DOMAIN cicd.seungkyua"   # 사설 DNS 도메인

250 tls-auth ta.key 0
256 cipher AES-128-CBC   # AES
259 auth SHA256
275 user nobody
276 group nogroup


## Adjust the Server Networking Configuration
# vi /etc/sysctl.conf
28 net.ipv4.ip_forward=1

# sysctl -p

# ip route | grep default
# iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o br-ex -j MASQUERADE



## Start and Enable the OpenVPN Service
# systemctl start openvpn@server
# systemctl status openvpn@server
# systemctl enable openvpn@server


## Create Client Configuration Infrastructure
# cd /etc/openvpn
# mkdir -p /etc/openvpn/client-configs/files
# chmod 700 /etc/openvpn/client-configs/files
# cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf /etc/openvpn/client-configs/base.conf

# vi client-configs/base.conf
36 proto tcp
42 remote server_ip 1194
61 user nobody
62 group nogroup
88 #ca ca.crt
89 #cert client.crt
90 #key client.key
113 cipher AES-128-CBC
114 auth SHA256
115 key-direction 1


# vi client-configs/make_config.sh
#!/bin/bash

# First argument: Client identifier

KEY_DIR=/etc/openvpn/ease-rsa/keys
OUTPUT_DIR=/etc/openvpn/client-configs/files
BASE_CONFIG=/etc/openvpn/client-configs/base.conf

cat ${BASE_CONFIG} \
    <(echo -e '<ca>') \
    ${KEY_DIR}/ca.crt \
    <(echo -e '</ca>\n<cert>') \
    ${KEY_DIR}/${1}.crt \
    <(echo -e '</cert>\n<key>') \
    ${KEY_DIR}/${1}.key \
    <(echo -e '</key>\n<tls-auth>') \
    ${KEY_DIR}/ta.key \
    <(echo -e '</tls-auth>') \
    > ${OUTPUT_DIR}/${1}.ovpn


# chmod 700 client-configs/make_config.sh

# cd /etc/openvpn/client-configs

## seungkyua.ovpn 파일이 /etc/openvpn/client-configs/files 디렉토리 밑에 생성됨
# ./make_config.sh seungkyua



## 사용자 추가 시 클라이언트 파일 만드는 법

# cd /etc/openvpn/ease-rsa
# source vars
# ./build-key seungkyua

# cd /etc/openvpn/client-configs
# ./make_config.sh seungkyua


## server reboot 시 체크
# ip route | grep default

# iptables -t nat -A POSTROUTING -s 10.8.0.0/8 -o br-ex -j MASQUERADE



출처 : https://www.digitalocean.com/community/tutorials/how-to-set-up-an-openvpn-server-on-ubuntu-16-04






## Install Bind on the DNS Server
# sudo apt-get update
# apt-get install unbound


## config 설정
# cd /etc/unbound
# vi unbound.conf.d/root-auto-trust-anchor-file.conf
server:
    verbosity: 1
    statistics-interval: 0
    statistics-cumulative: no
    extended-statistics: yes
    num-threads: 2

        interface: 192.168.30.26
        interface: 127.0.0.1

    outgoing-range: 4096
    outgoing-port-permit: 40000-44096
    cache-max-ttl: 3600
    do-ip4: yes
    do-ip6: no

    access-control: 10.8.0.0/24 allow
    access-control: 192.168.30.0/24 allow
    access-control: 192.168.54.0/24 allow

    chroot: ""
    username: "unbound"
    directory: "/etc/unbound"
    log-time-ascii: yes
    pidfile: "/var/run/unbound/unbound.pid"
    hide-identity: yes
    hide-version: yes
    harden-short-bufsize: yes
    harden-large-queries: yes
    harden-glue: yes
    harden-dnssec-stripped: yes
    harden-below-nxdomain: yes
    harden-referral-path: yes
    use-caps-for-id: yes
    unwanted-reply-threshold: 10000000
    prefetch: yes
    prefetch-key: yes
    rrset-roundrobin: yes
    minimal-responses: yes
#    trusted-keys-file: /etc/unbound/keys.d/*.key
    auto-trust-anchor-file: "/var/lib/unbound/root.key"
    val-clean-additional: yes
    val-permissive-mode: no
    val-log-level: 1
    key-cache-size: 512m

    include: /etc/unbound/local.d/*.conf

# Remote control config section.
remote-control:
    control-enable: yes
    server-key-file: "/etc/unbound/unbound_server.key"
    server-cert-file: "/etc/unbound/unbound_server.pem"
    control-key-file: "/etc/unbound/unbound_control.key"
    control-cert-file: "/etc/unbound/unbound_control.pem"

# Stub and Forward zones
# include: /etc/unbound/conf.d/*.conf



## dns 설정
# mkdir -p local.d
# vi local.d/cicd.seungkyua.conf
local-zone: "cicd.stg.taco." static
local-data: "master01.cicd.seungkyua. IN A 192.168.30.13"
local-data: "node01.cicd.seungkyua. IN A 192.168.30.12"
local-data: "node02.cicd.seungkyua. IN A 192.168.30.17"
local-data: "node03.cicd.seungkyua. IN A 192.168.30.18"
local-data: "node04.cicd.seungkyua. IN A 192.168.30.21"

local-data: "centos-repo.cicd.seungkyua. IN A 192.168.30.12"
local-data: "dashboard.cicd.seungkyua. IN A 192.168.30.12"
local-data: "grafana.cicd.seungkyua. IN A 192.168.30.12"
local-data: "horizon.cicd.seungkyua. IN A 192.168.30.12"
local-data: "jenkins.cicd.seungkyua. IN A 192.168.30.12"
local-data: "keystone.cicd.seungkyua. IN A 192.168.30.12"
local-data: "kibana.cicd.seungkyua. IN A 192.168.30.12"
local-data: "minio.seungkyua. IN A 192.168.30.12"
local-data: "pypi-repo.cicd.seungkyua. IN A 192.168.30.12"
local-data: "registry.cicd.seungkyua. IN A 192.168.30.12"
local-data: "scope.cicd.seungkyua. IN A 192.168.30.12"
local-data: "prometheus.cicd.seungkyua. IN A 192.168.30.12"
local-data: "ubuntu-repo.cicd.seungkyua. IN A 192.168.30.12"



## start unbound
# systemctl restart unbound.service

# systemctl enable unbound.service 



출처 : https://calomel.org/unbound_dns.html



## reload unbound server with new configuration

# unbound-control reload






Posted by Kubernetes Korea co-leader seungkyua@gmail.com

ip link 로 device 를 namespace 로 보내면 Host 에서 해당 device 는 볼 수 가 없다.

이를 다시 Host 로 원복하는 방법



## Host 서버의 eno2 를 qrouter namespace 에 넣고 ip 세팅
$ sudo ip netns
qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc
qdhcp-03a6de58-9693-4c41-9577-9307c8750141

## eno2 를 네임스페이스로 보내기
$ sudo ip link set eno2 netns qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc
$ sudo ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ip a
4: eno2: <BROADCAST,MULTICAST> mtu 1500 qdisc noop state DOWN group default qlen 1000
    link/ether 3c:a8:2a:20:ed:d1 brd ff:ff:ff:ff:ff:ff

$ sudo ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ip addr add 192.168.130.100/24 dev eno2
$ sudo ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ifconfig eno2 up



## qrouter namespace 에 있는 eno2 를 Host 로 다시 돌려 보내기

$ ip netns exec qrouter-68cfc511-7e75-4b85-a1ca-d8a09c489ccc ip link set eno2 netns 1










Posted by Kubernetes Korea co-leader seungkyua@gmail.com

haproxy 설치

Linux/Ubuntu 2016.01.09 15:15

1. hpproxy install

$ sudo apt-get install haproxy


$ sudo vi /etc/haproxy/haproxy.cfg

...

defaults

log        global

mode    http

retries   3                  # 추가

option   httplog

option   dontlognull

option   redispatch      # 추가 : 한 서버가 죽으면 다른 서버로 보내라

...

...

listen serv 0.0.0.0:80        # 추가 : serv 는 아무 이름이나 줘도 됨

mode http

option http-server-close

timeout http-keep-alive 3000             # 추가 : 이미지 같은 것은 하나의 컨넥션으로 연결하기 위해

server serv 127.0.0.1:9000 check       # server1, server2 이런 식으로 서버 이름을 준다.


$ sudo service haproxy reload


















Posted by Kubernetes Korea co-leader seungkyua@gmail.com

$ cd /opt

$ sudo wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/8u20-b26/jdk-8u20-linux-x64.tar.gz"


$ sudo tar -zxvf jdk-8u20-linux-x64.tar.gz


$ sudo update-alternatives --install /usr/bin/java java /opt/jdk1.8.0_20/bin/java 2


$ sudo update-alternatives --config java


There are 2 choices for the alternative java (providing /usr/bin/java).


  Selection    Path                                            Priority   Status

------------------------------------------------------------

* 0            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      auto mode

  1            /opt/jdk1.8.0_20/bin/java                                 2         manual mode

  2            /usr/lib/jvm/java-7-openjdk-amd64/jre/bin/java   1071      manual mode


Press enter to keep the current choice[*], or type selection number: 1



$ sudo update-alternatives --install /usr/bin/javac javac /opt/jdk1.8.0_20/bin/javac 2

$ sudo update-alternatives --config javac



$ sudo update-alternatives --install /usr/bin/jar jar /opt/jdk1.8.0_20/bin/jar 2

$ sudo update-alternatives --config jar


$ sudo vi .bashrc


export JAVA_HOME=/opt/jdk1.8.0_20

export JRE_HOME=/opt/jdk1.8.0_20/jre

export PATH=$PATH:/opt/jdk1.8.0_20/bin:/opt/jdk1.8.0_20/jre/bin


$ echo $JAVA_HOME

$ echo $JRE_HOME






Posted by Kubernetes Korea co-leader seungkyua@gmail.com

1. vlan mode

   access : switch 에서 vlan tag 를 만들어 줌

    trunk : untagged 는 default vlan 1 로 할당하고 tagged 는 해당 tag 만 가능하게.

              보안상 특정 port 는 특정 vlan 을 쓸 수 있다고 access 를 풀어줘야 함


    gateway 를 거치게 되면 vlan tag 는 사라짐


2. Host 서버 routing 추가

    Host 에 2개의 네트워크가 연결되어 있고 각각이 L2 가 아닌 L3 로 통신해야 한다면

    1개의 네트워크에 해당하는 default gateway 외에 다른 하나의 gateway 를 routing 에 추가해 줘야 함


3. Switch secondary gateway

    OpenStack nova-network 와 같이 하나의 네트워크에 호스트들이 붙어 있고 host public 네트워크와는

    다른 서브넷으로 public ip를 floating ip 로 사용한다면 Switch 에 floating ip 에 대한 secondary gateway 를

    지정해야 함.


    Switch의 같은 port 에 두개 이상의 gateway를 지정해야 한다면 처음은 primary gateway로 그 다음 부터는

    secondary gateway 로 지정


4. iptables (NAT)



PREROUTING ACCEPT (DNAT 에서 사용)

    nova-network-PREROUTING

        -> VM DNAT 변환

    nova-compute-PREROUTING

    nova-api-metadat-PREROUTING

INPUT ACCEPT

OUTPUT ACCEPT (DNAT 에서 사용)

    nova-network-OUTPUT

        -> VM DNAT 변환

    nova-compute-OUTPUT

    nova-api-metadat-OUTPUT

POSTROUTING ACCEPT (SNAT 에서 사용)

    nova-network-POSTROUTING

    nova-compute-POSTROUTING

    nova-api-metadat-POSTROUTING

    nova-postrouting-bottom

        nova-network-snat

            nova-network-float-snat

                -> VM SNAT 변환

            -> Host SNAT 변환

        nova-compute-snat

            nova-compute-float-snat

        nova-api-metadat-snat

            nova-api-metadat-float-snat



4-1. iptables 종류

  - Filter  :  INPUT, OUTPUT, FORWARD

  - NAT : PREROUTING, POSTROUTING, OUTPUT


4-2. iptables : networ A -> network A (같은 네트워크일 때는 filter 의 FORWARD를 거치지 않음)  


1. PREROUTING (nat)   :  DNAT

2. INPUT (filter)

3. OUTPUT (nat)          : DNAT

4. OUTPUT (filter)

5. POSTROUTING (nat) : SNAT


4-3. iptables : networ A -> network B (다른 네트워크일 때는 filter 의 FORWARD를 거침) 


1. PREROUTING (nat)    : DNAT

2. FORWARD (filter)

3. POSTROUTING (nat)  : SNAT


5. BGP

    L3 를 BGP 로 사용할려며 TOR 을 L3 로 올리고 floating ip 입력시 switch -> Host 로 routing 될 수 있게

    static routing 을 switch 에 입력해야 함 (32bit ip 를 exact 하게 routing 함)








Posted by Kubernetes Korea co-leader seungkyua@gmail.com

DNS Server setting

Linux/Ubuntu 2014.07.18 16:34

1. dnsmasq 설치하기

# apt-get install dnsmasq


2. conf 설정

# vi /etc/dnsmasq.conf


resolv-file=/etc/resolv.conf

interface=eth0

interface=eth1

listen-address=127.0.0.1


3. 다른 호스트에서 nameserver 를 dnsmasq 가 설치된 서버로 지정

# vi /etc/resolv.conf

nameserver dnsmasq 서버


Posted by Kubernetes Korea co-leader seungkyua@gmail.com

linux 에서 vlan 을 생성하고 삭제하는 명령어


1.  vlan101 이름으로 101 vlan 을 eth0 에 만든다.

# ip link add link eth0 name vlan101 type vlan id 101

# ip -d link show vlan101

# ip link set vlan101 up


2. vlan101 을 삭제한다.

# ip link set vlan101 down

# ip link delete vlan101


※ bridge 와 device interface 연결은 brctl show 로 연결을 볼 수 있지만,

vlan 은 ip addr show 로 보여지는 vlan101@eth0 와 같이 @ 다음의 device interface 로 알 수 있다.


OpenStack 에서 vlan Manager 를 사용하면 연결고리는 다음과 같다.

bridge -> vlan -> eth0

예) br101 -> vlan101 (vlan101@eth0) -> eth0

Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG Linux, VLAN

$ sudo vi /etc/udev/rules.d/70-persistent-net.rules


SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:e3:d9:dd", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eno*", NAME="eth0"

SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:0c:29:e3:d9:e7", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eno*", NAME="eth1"


auto lo

iface lo inet loopback


auto eth0

iface eth0 inet static

        address 192.168.75.129

        netmask 255.255.255.0

        gateway 192.168.75.2

        dns-nameservers 8.8.8.8 8.8.4.4


auto eth1

iface eth1 inet static

        address 192.168.230.129

        netmask 255.255.255.0


$ sudo reboot




=========== 이전 자료 =======================


1) 수정 /etc/default/grub
GRUB_CMDLINE_LINUX_DEFAULT=”biosdevname=0 quiet splash”
GRUB_CMDLINE_LINUX=”biosdevname=0″
위 두 파라메터의 값에 biosdevname=0 을 추가 해 주십시요.
2) sudo update-grub
3) /etc/network/interface 의 NIC 설정 변경
4) reboot

이 방법으로 변경이 되지 않으시거나 kernel option 을 변경하고 싶지 않으시면 아래 방법으로 변경해 주시면 됩니다.

1) biosdevname package 삭제
sudo apt-get purge biosdevname
2) NIC 의 MAC 확인
ifconfig | grep HWaddr
xx:xx:xx:yy:yy:yy

3) /etc/udev/rules.d/70-persistent-net.rules 설정 변경
아래 라인을 추가 해 주시거나 해당 라인이 있으면 수정 해 주십시요.
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="xx:xx:xx:yy:yy:yy", ATTR{dev_id}=="0x0", ATTR{type}=="1", KERNEL=="eth*", NAME="eth0"

위 설정은 MAC xx:xx:xx:yy:yy:yy 을 가지는 NIC 에 대해 eth0 으로 장치명을 설정하는 예제 입니다.

3) /etc/network/interface 의 NIC 설정 변경
4) reboot

- /etc/udev/rules.d/ 에 biosdevname 관련 파일이 있으면 삭제 해 주십시요.


- From 심장훈 at Canonical -

Posted by Kubernetes Korea co-leader seungkyua@gmail.com
TAG em, eth, ubuntu

free 메모리 보기

Linux 2014.04.05 19:06

1. 메모리 보기

# free


                   total       used          free     shared    buffers     cached

Mem:       3079912    2870192      209720             0     260776     1637140

-/+ buffers/cache:     972276    2107636

Swap:      5237184             0    5237184


2. 유저 메모리


    유저 메모리 = 디스크 캐시 ( buffers + cached )   +   AnonPages

           * 디스크 캐시에는 Shmem (tmpfs) 가 포함되어 있음


    유저 메모리 = File-backend 메모리 ( Active(file) + Inactive(file) )   +   

                       Anonymous 메모리 ( Active(anon) + Inactive (anon) )

           *  Anonymous 메모리에는 Shmem (tmpfs) 가 포함되어 있음



3. 커널 메모리


    커널 메모리 = MemTotal - (MemFree + Active + Inactive + Unevictable)


    커널 메모리 = Slab + VmallocUsed (ioremap 제외) + KernelStack + PageTebles



4. VmallocUsed 에서 ioremap 제외하고 계산하는 방법

# cat /proc/vmallocinfo | grep -v "ioremap" | awk '{print $2}' | paste -s -d "+" | bc


byte 로 결과 값이 출력됨


# echo "(" $(cat /proc/vmallocinfo | grep -v "ioremap" | awk '{print $2}' | paste -s -d "+") ") / 1024" | bc


KB 로 출력됨



5. pmap

# pmap -x 1154              (sshd 의 프로세스 id 가 1154 임)


출력 예)

Address           Kbytes     RSS   Dirty Mode   Mapping

00007f55459c7000       0      16       0 r-x--  libnss_files-2.15.so

00007f55459d3000       0       0       0 -----  libnss_files-2.15.so

00007f55489a7000       0       4       4 rw---  libwrap.so.0.7.6

00007f55489a8000       0     112       0 r-x--  ld-2.15.so

00007f5548bad000       0      40      40 rw---    [ anon ]

00007f5548bc8000       0       8       8 rw---    [ anon ]

00007f5548bca000       0       4       4 r----  ld-2.15.so

00007f5548bcb000       0       8       8 rw---  ld-2.15.so

00007f5548bcd000       0     232       0 r-x--  sshd

00007f5548e47000       0      12      12 r----  sshd

00007f5548e4a000       0       4       4 rw---  sshd

00007f5548e4b000       0      36      36 rw---    [ anon ]

00007f5548e5b000       0      68      68 rw---    [ anon ]

00007fff2b5e7000         0      20      20 rw---    [ stack ]

00007fff2b687000         0       4       0 r-x--    [ anon ]

ffffffffff600000               0       0       0 r-x--    [ anon ]


[anon] 으로 표시되는 것이 AnonPages 즉 유저 영역 메모리로 malloc 등으로 확보한 메모리를 말한다.

Kbytes 는 논리 어드레스 이고 RSS 는 물리 메모리 용량(KB) 이다.





Posted by Kubernetes Korea co-leader seungkyua@gmail.com

Linx 명령어

Linux 2014.04.05 17:38

1. wait

   - 쉘에서 wait 커맨드를 실행한 곳에서 슬립상태로 대기하며 백그라운드에서 실행 중인 자식 프로세스가 완전히 종료되어 CHLD 시그널이 통지되기를 기다린다. 모든 자식 프로세스가 종료되면 wait 의 다음 처리를 진행한다.


2. redirect

# command >test.log 2>test.err &


> : 표준출력은 test.log, 에러는 test.err 에 저장한다.

& : 백그라운드 프로세스로 실행한다.


# command >test.log 2>&1 &


2>&1 : 에러출력을 표준출력에 출력한다.


# command >/dev/null 2>&1 &


/dev/null : 버린다.


# nohup command >/test.log 2>&1 &


nohup : bash 프로세스는 종료되면 자식 프로세스에 HUP 시그널을 전송한다. HUP 시그널은 프로세스 종료

            시그널이므로 bash 가 끝나면 백그라운드로 돌리는 자식 프로세스도 종료된다.

            nohup 은 bash 프로세스가 종료되더라도 HUP 시그널을 보내지 말라는 의미


3. Ctrl + Z

   - 일시 정지라는 의미로 vi 실행 중에 잘못하여 Ctrl + Z 를 하면 에디터 화면이 없어서지고 명령 프롬프트로 떨어짐

      이 때 fg 커맨드를 실행하면 다시 vi 에디터 화면으로 이동

   - 포그란운드 실행 커맨드에서 Ctrl + Z 로 일시 정지 후에 bg 를 실행하면 백그라운드 실행으로 바꿀 수 있음


4. 파이프라인 (|)

    - 프로세스 A | 프로세스 B  : 프로세스 A 의 표준출력을 받아서 프로세스 B 의 표준입력으로 처리한다.


5. tr, cut, grep

# ps -ef | head -5


출력 예)

UID        PID  PPID  C STIME TTY          TIME CMD

root         1        0   0  16:22   ?              00:00:02 /sbin/init

root         2        0   0  16:22   ?              00:00:00 [kthreadd]

root         3        2   0  16:22   ?              00:00:00 [ksoftirqd/0]

root         5        2   0  16:22   ?              00:00:00 [kworker/u:0]


head -5 : 처음 5줄만 출력


# ps -ef | head -5 | tr -s " " | cut -d " " -f 2 | grep -v "PID"


출력 예)

1

2

3

5


tr -s " " : 여러 공백이 있으면 하나의 공백으로 변환

cut -d " " -f 2 : -d 로 지정한 문자를 기준으로 구분(여기서는 공백) -f 로 지정한 위치필드(여기서는 2) 출력

grep -v "PID" : -v 뒤에 지정한 조건은 제외하고 출력


# ps -ef | grep -E -v "^(root|UID)"


grep -E : 확장 정규표현 식을 사용

^(root|UID) : 처음에 오는 문자가 root 이거나 UID

-v : 일치하는 조건은 제외


6. awk

# ps -ef | head -5 | awk '{print $2}' | grep -v "PID"


awk '{print $2}' : 연결 공백을 구분 문자로 2번째 위치필드를 출력


# cat /etc/passwd | awk -F ":" '{print $1}'


awk -F ":" '{print $1}' : -F 로 지정한 문자를 기준으로 구분(여기서는 :) 첫번째 필드를 출력


7. ps

# ps -e --no-headers -o pid | head -5


출력 예) : 프로세스 id 가 우측 정렬로 되어 있어 앞에 공백이 있음

    1

    2

    3

    5

    6


--no-headers : 헤더는 출력에서 제외

-o pid : pid 만 출력


8. sed

# ps -e --no-headers -o pid | head -5 | sed "s/^ *//"


출력 예)

1

2

3

5

6


s : 변환

/ : 시작

^ : 첫행

(스페이스)* : 정규표현으로 공백이 여러개(*)

/ : 끝

(Null)/ : null 로 치환


# ps -ef | grep -E -v "^(root|UID)" | sed "s/^/kill -9 /"


s/^/kill -9 : 처음문자 앞에 kill -9 를 삽입


9. $()

   - $() 안의 커맨드 출력 결과를 넣어라

# ps -ef | wc -l


출력 예)

196


# ps -ef | head -$(ps -ef |wc -l)


ps -ef | wc -l 의 결과 즉, 196 을 넣어서 ps -ef | head -196 과 같은 뜻이 됨


10. yes

# yes "kill" | head -5


출력 예)

kill

kill

kill

kill

kill


yes "kill" : kill 이라는 문자를 계속 출력


11. pgrep

# pgrep -v -u root


유저가 root 가 아닌 pid 를 출력


12. pkill

# pkill -9 -v -u root


유저가 root 가 아닌 모든 프로세스를 kill -9 로 죽인다.


13. tcp dump

# tcpdump -i any -vv 'tcp port 80' -w hostname.out

혹은

# tcpdump -i br100 -n -v udp port 53


14. tcp time_wait 세션 개수 보기

# netstat -an | grep -i wait | wc -l



Posted by Kubernetes Korea co-leader seungkyua@gmail.com