레이블이 vagrant인 게시물을 표시합니다. 모든 게시물 표시
레이블이 vagrant인 게시물을 표시합니다. 모든 게시물 표시

install kubernetes

# kubernetes(k8s) 는 물리적으로 master(control plane 이라고 불린다.) 와 worker 노드로 구성된다.

# k8s master 노드의 컴포넌트들
# kube-apiserver : kubectl, kubelet, kube-scheduler, kube-controller 등 의 api 요청을 처리하는 웹서버 역할
# etcd : key-value 저장소로 k8s 모든 정보가 저장되는 곳이다. kubectl 등의 리소스 명세서등도 여기 저장된다.
# kube-scheduler : 워커노드의 리소스 상태를 파악하고 pod 를 적절한 워커노드에 띄운다.
# kube-controller : pod 를 모니터링하며서 pod 가 특정 상태를 유지하도록 한다.(ex. replica 2 일때 pod 2개중 1개가 죽으면 pod 1개를 새로 띄운다.)

# k8s worker 노드 컴포넌트
# kubelet : master 의 kube-apiserver 와 통신하며 원하는 리소스(ex. pod)들을 관리하는 일종의 에이전트
# kube-proxy : network proxy 역할

# ubuntu 에서 kubeadm(k8s 클러스터 구성 및 관리 툴) 설치

# apt 저장소 추가
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://apt.kubernetes.io/ kubernetes-xenial main" | sudo tee /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update

# master, worker 모두에 설치하자.
k8s_version="1.19.16-00"
sudo apt-get install -y kubelet=${k8s_version} kubeadm=${k8s_version} kubectl=${k8s_version}

# kubelet kubeadm kubectl 업데이트 되지 않도록 hold 설정
sudo apt-mark hold kubelet kubeadm kubectl

# kubeadm 으로 클러스터를 구성한다.
sudo kubeadm init \
 --apiserver-advertise-address=192.168.104.2 \
 --apiserver-cert-extra-sans=192.168.104.2 \
 --node-name=control-plane \
 --pod-network-cidr=10.224.0.0/16 \
 --service-cidr=10.225.0.0/16

# 설치가 완료되면 다음과 같은 메시지가 출력된다.
# kubectl 사용을 위한 kubeconfig 설정
mkdir -p $HOME/.kube
sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
sudo chown $(id -u):$(id -g) $HOME/.kube/config
... 생략 ...
# worker -> master 에 조인을 위해  worker 노드에서 실행한다.
... 생략 ...
kubeadm join 192.168.104.2:6443 --token aaaaa --discovery-token-ca-cert-hash sha256:aaaaa
... 생략 ...

# 참고로 kube-apiserver 에서 6443포트를 사용한다.

# master 에서 노드 상태 watching 하고
kubectl get nodes -w

# worker1, worker2 에서 다음 명령을 실행해 master 노드에 join 하도록 한다.
sudo kubeadm join 192.168.104.2:6443 --token aaaaa --discovery-token-ca-cert-hash sha256:aaaaa

# node 에서 돌고 있는 서비스
kubelet
kube-proxy

# master node 돌고 있는 서비스
kube-scheduler
kube-controller-manager
kube-apiserver


#####

# 노드 삭제시
kubectl delete node 노드명

# 노드에 접속해서 kubelet 서비스 비활성화 및 설정 파일 제거
ssh ysoftman@노드 "sudo kubeadm reset -f"

# 클러스터 정보 확인
kubectl cluster-info

# 노드 추가시 
# 노드에서 kubeadm, kubelet, kubectl 설치하고
# token 확인
sudo kubeadm token list

# hash 확인
openssl x509 -pubkey -in /etc/kubernetes/pki/ca.crt | openssl rsa -pubin -outform der 2>/dev/null | openssl dgst -sha256 -hex | sed 's/^.* //'

# 마스터 노드에 조인
sudo kubeadm join 마스터노드IP:6443 --token 토큰 --discovery-token-ca-cert-hash sha256:해시

overlay network 사용하기

# 들어가기 전에
# overlay network 실제 네트워크가 위에서 동작하는 가상네트워크다.
# overlay network 로 물리적으로 떨어져 있는 네트워크들도 마치 같은 네트워크에 있는 LAN 처럼 취급할 수 있다.
# 종류로 Virtual eXtensible LAN (VXLan)가 있다.
# OSI7계층 중 L2(datalink), L3(network) 에 걸쳐 사용되고, L2 프레임을 캡슐화해 터널링한다.
# MTU(Maximum Transmission Unit)는 패킷이나 프레임단위로 전송할때 최대 크기로 일반적으로 1500byte 으로 설정되는데 VXLan 사용시 캡슐화에 50byte 가 필요하기 때문에 1450byte 로 설정한다.
# ICMP(Internet Control Message Protocol) 는 L3 동작하며 대상 IP 의 상태(이상없는지)를 확인하는 프로토콜이다.
# ARP(Address Resolution Protocol)은 L3 동작하며 IP 주소를 L2의 물리주소(MAC, Media Access Control)주소로 바인딩시키기 위한 프로토콜이다.
# FDB(Fowarding DataBase)는 L2 에서 포워딩을 위해 MAC 주소를 저장하고 있다.


#####


# 테스트 환경 : vagrant ubuntu-1804
HOST_NAME = "ubuntu1804"    # node1 192.168.104.2
HOST_NAME2 = "ubuntu1804-2" # node2 192.168.104.3

# node1,2 각각 접속시 
vagrant ssh ubuntu184
vagrant ssh ubuntu184-2

# vxlan 으로 노드간 통신하기
# node1, node2 는 다음과 같이 구성(연결)할 것이다.
[node1]
pinkns(eth0:12.12.12.2/24) <-> overns(veth1 <-> br0:arp참고 <-> vxlan1:fdb참고) <-> host(eth1:192.168.104.2) <-> 외부
[node2]
pinkns(eth0:12.12.12.3/24),skyns(eth0:12.12.12.4/24) <-> overns(veth1 <-> br0:arp참고 <-> vxlan1:fdb참고) <-> host(eth1:192.168.104.3) <-> 외부

# node1, node2 각각 overns, pinkns 이름의 network namespace(netns) 생성
ip netns add overns
ip netns add pinkns

# node1, node2 각각 network namespace 확인
ip netns

# node1, node2 각각 veth1(overns) <-> eth0(pinkns) 연결(link 생성)
ip link add dev veth1 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns pinkns

# 참고로 ip netns exec overns 대신 overns 에 조인해서 작업할 경우
# 작업후 호스트 network namespace 로 돌아오기 위해 exit 잊지 말자.
# nsenter --net=/var/run/netns/overns

# node1(overns), node2(overns) 에서 ip link 확인
ip netns exec overns ip link

# node1(pinkns) 에서 �eth0 에 mac,ip address 추가
ip netns exec pinkns ip link set dev eth0 address 02:42:c0:a8:00:02
ip netns exec pinkns ip addr add dev eth0 12.12.12.2/24

# node2(pinkns) 에서 eth0 에 mac,ip address 추가
ip netns exec pinkns ip link set dev eth0 address 02:42:c0:a8:00:03
ip netns exec pinkns ip addr add dev eth0 12.12.12.3/24

# node1(overns), node2(overns) 에서 bridge 생성
ip netns exec overns ip link add dev br0 type bridge
ip netns exec overns ip addr add dev br0 12.12.12.1/24

# node1(overns), node2(overns) 에서 ip, link 확인
ip netns exec overns ip a
ip netns exec overns ip link

# node1, node2 에서 vxlan(overns) 생성
# type vxlan : vxlan 타입 생성
# id 42 : vxlan 식별자 42
# proxy : vxlan 이 ARP 요청에 대신 응답하도록 설정
# learning : 커널이 패킷을 파악해 bridge FDB 를 자동으로 설정할 수 있도록 설정
# dstport 4789 : vxlan 터널링에 사용하는 UDP 포트로 4789 사용
ip link add dev vxlan1 netns overns type vxlan id 42 proxy learning dstport 4789

# node1(overns), node2(overns) 에서 veth1 <-> br0 연결
ip netns exec overns ip link set veth1 master br0

# node1(overns), node2(overns) 에서 vxlan1 <-> br0 연결
ip netns exec overns ip link set vxlan1 master br0

# node1, node2 각각 overns, pinkns 의 장치들 모두 power on
ip netns exec overns ip link set br0 up
ip netns exec overns ip link set vxlan1 up
ip netns exec overns ip link set veth1 up
ip netns exec pinkns ip link set eth0 up

# node1(overns) 에서
# 목적지 ip(12.12.12.3),mac(02:42:c0:a8:00:03)를 사용하는 vxlan1 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.3 lladdr 02:42:c0:a8:00:03 dev vxlan1

# node2(overns)에서
# 목적지 ip(12.12.12.2),mac(02:42:c0:a8:00:02)를 사용하는 vxlan1 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.2 lladdr 02:42:c0:a8:00:02 dev vxlan1

# node1(overns), node2(overns) 에서 neighbor 확인
ip netns exec overns ip neighbor show

# node1(overns) 에서
# bridge fdb 설정 추가
# 192.168.104.3 : 목적지 IP
# 42 : 목적지 vni(VXLAN Network Identifier) ID
# 4789 : 목적지 Port
# 다음과 같이 수동으로 설정하면 permanent 하게 유지된다.
ip netns exec overns bridge fdb add 02:42:c0:a8:00:03 dev vxlan1 self dst 192.168.104.3 vni 42 port 4789

# node1(overns) 에서 fdb 설정 확인하면 permanent 표시가 있다.
ip netns exec overns bridge fdb show | grep 02:42:c0:a8:00:03

# node1(overns) 에서 br0, vxlan 에서 패킷 확인시
ip netns exec overns tcpdump -l -i br0
ip netns exec overns tcpdump -l -i vxlan1

# 위에서 vxlan 디바이스 생성 시에 learning 옵션사용했기 때문에 fdb, ARP 정보는 커널에서 패킷 분석해서 설정해준다.
# 하지만 수동설정(permanent)와 달리 aging 으로 인해 일정 시간 지나면 설정이 제거된다.
# node2(overns)에서 다음과 같이 다시 수동으로 변경하면 permanent 하게 설정된다.
ip netns exec overns bridge fdb replace 02:42:c0:a8:00:02 dev vxlan1 self dst 192.168.104.2 vni 42 port 4789

# node2(overns)에서 다시 fdb 설정 확인하면 permanent 가 있다.
ip netns exec overns bridge fdb show | grep 02:42:c0:a8:00:02

# 참고로 overns 의 FORWARD 가 허용으로 되어 있는지 확인
ip netns exec overns iptables -t filter -L | grep -i policy
Chain INPUT (policy ACCEPT)
Chain FORWARD (policy ACCEPT)
Chain OUTPUT (policy ACCEPT)

# node1(pinkns조인 상태) -> node2(pinkns) ping 해보면 응답을 받는다.
ip netns exec pinkns ping 12.12.12.3

# node2(pinkns조인 상태) -> node1(pinkns) ping 해보면 응답을 받는다.
ip netns exec pinkns ping 12.12.12.2



#####


# node1 에 새로운 skyns network namespace 추가하고 통신하기

# node1 에서 skyns 네트워크네임스페이스 추가, mac,ip 등 추가하고 power on
ip netns add skyns
ip link add dev veth2 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns skyns
ip netns exec skyns ip link set dev eth0 address 02:42:c0:a8:00:04
ip netns exec skyns ip addr add dev eth0 12.12.12.4/24
ip netns exec overns ip link set veth2 master br0
ip netns exec overns ip link set veth2 up
ip netns exec skyns ip link set eth0 up

# node1(skyns) -> node1(pinkns) ping 테스트
ip netns exec skyns ping 12.12.12.2

# node1(pinkns) -> node1(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.4

# node2(overns) 에서 fdb 추가
ip netns exec overns ip neighbor add 12.12.12.4 lladdr 02:42:c0:a8:00:04 dev vxlan1

# node1(skyns) -> node2(pinkns) ping 테스트
ip netns exec skyns ping 12.12.12.3


#####


# node3(192.168.104.4) 추가하고 node1,2와 통신하기

# vagrantfile 노드 추가 후 
# HOST_NAME3 = "ubuntu1804-3" # node3 192.168.104.4
# ubuntu1804-3(node3) 만 추가로 띄우기
# vagrant up
# ubuntu1804-3(node3) 접속
vagrant ssh ubuntu184-3

# node3 overns,pinkns, skyns network namespace 추가
ip netns add overns
ip netns add pinkns
ip netns add skyns

# node3 veth1(overns) <-> eth0(pinkns) 연결(link 생성)
ip link add dev veth1 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns pinkns

# node3 veth1(overns) <-> eth0(skyns) 연결(link 생성)
ip link add dev veth2 mtu 1450 netns overns type veth peer name eth0 mtu 1450 netns skyns

# node3(pinkns) 에서 eth0 에 mac,ip address 추가
ip netns exec pinkns ip link set dev eth0 address 02:42:c0:a8:00:0a
ip netns exec pinkns ip addr add dev eth0 12.12.12.10/24

# node3(skyns) 에서 eth0 에 mac,ip address 추가
ip netns exec skyns ip link set dev eth0 address 02:42:c0:a8:00:0b
ip netns exec skyns ip addr add dev eth0 12.12.12.11/24

# node3(overns) 에서 bridge 생성
ip netns exec overns ip link add dev br0 type bridge
ip netns exec overns ip addr add dev br0 12.12.12.1/24

# node3(overns) 에서 vxlan 생성
ip link add dev vxlan1 netns overns type vxlan id 42 proxy learning dstport 4789

# node3(overns) 에서 veth1 <-> br0, veth2 <-> br0, vxlan1 <-> br0 연결
ip netns exec overns ip link set veth1 master br0
ip netns exec overns ip link set veth2 master br0
ip netns exec overns ip link set vxlan1 master br0

# node3 overns, pinkns, skyns 의 장치들 모두 power on
ip netns exec overns ip link set br0 up
ip netns exec overns ip link set vxlan1 up
ip netns exec overns ip link set veth1 up
ip netns exec overns ip link set veth2 up
ip netns exec pinkns ip link set eth0 up
ip netns exec skyns ip link set eth0 up

# node3(overns) 에 node1,node2 ip,mac 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.3 lladdr 02:42:c0:a8:00:03 dev vxlan1
ip netns exec overns ip neighbor add 12.12.12.2 lladdr 02:42:c0:a8:00:02 dev vxlan1

# node3(overns) 에 node1,nod2 ip,mac 정보를 fdb 로 기록
ip netns exec overns bridge fdb add 02:42:c0:a8:00:02 dev vxlan1 self dst 192.168.104.2 vni 42 port 4789
ip netns exec overns bridge fdb add 02:42:c0:a8:00:03 dev vxlan1 self dst 192.168.104.3 vni 42 port 4789

# node1(overns), node2(overns) 에 node3 ip,mac 정보를 ARP 테이블에 기록
ip netns exec overns ip neighbor add 12.12.12.10 lladdr 02:42:c0:a8:00:0a dev vxlan1
ip netns exec overns ip neighbor add 12.12.12.11 lladdr 02:42:c0:a8:00:0b dev vxlan1

# node1(overns), node2(overns) 에 node3 ip,mac 정보를 fdb 로 기록
ip netns exec overns bridge fdb add 02:42:c0:a8:00:0a dev vxlan1 self dst 192.168.104.4 vni 42 port 4789
ip netns exec overns bridge fdb add 02:42:c0:a8:00:0b dev vxlan1 self dst 192.168.104.4 vni 42 port 4789

# node1(pinkns) -> node3(pinkns), node3(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.10
ip netns exec pinkns ping 12.12.12.11

# node2(pinkns) -> node3(pinkns), node3(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.10
ip netns exec pinkns ping 12.12.12.11

# node3(pinkns) -> node1(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.2

# node3(pinkns) -> node2(skyns) ping 테스트
ip netns exec pinkns ping 12.12.12.3

# 모든 테스트가 끝나고 network namespace 삭제하려면
ip netns delete overns
ip netns delete pinkns
ip netns delete skyns

chroot, pvirot_root, unshare

# container 없던 시절 완벽하진 않은 격리효과를 위해서 사용할 수 있는 명령들

# 가상작업환경 : virtualbox + vagrant + ubuntu box image
# vagrant up 후 vagrant ssh 로 접속
# root 환경에서 작업하기
sudo -Es

# 마운트등의 이슈로 /tmp 에서 작업한다.
cd /tmp

# chroot 사용하기
# 새로운 root 경로가 될 디렉토리 생성
mkdir new_root

# 단순히 chroot new_root 하면
chroot new_root
# 다음과 같은 에러가 발생한다.
chroot: failed to run command ‘/bin/bash’: No such file or directory

# chroot 하면 bash 가 실행하는데 new_root 에서는 bin/bash 가 없어 이를 새루트에 복사해야 한다.
# bash 구동을 위해 필요한 파일들 확인하자
ldd /bin/bash
linux-vdso.so.1 (0x00007ffe49bfb000)
libtinfo.so.5 => /lib/x86_64-linux-gnu/libtinfo.so.5 (0x00007fc6e4d28000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007fc6e4b24000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007fc6e4733000)
/lib64/ld-linux-x86-64.so.2 (0x00007fc6e526c000)

# bash 및 관련 라이브러리 복사
mkdir -p new_root/{bin,usr,lib,lib64} new_root/lib/x86_64-linux-gnu/ new_root/usr/lib/x86_64-linux-gnu
cp /bin/bash new_root/bin
cp /lib/x86_64-linux-gnu/{libtinfo.so.5,libdl.so.2,libc.so.6} new_root/lib
cp /lib64/ld-linux-x86-64.so.2 new_root/lib64

# ls 외 필요한 기본 명령어도 확인하고 복사하자.
# ps 는 /proc 디렉토리를 생성(mkdir)하고 mount 해야 사용할 수 있다.
ldd /bin/ps
linux-vdso.so.1 (0x00007ffc403b6000)
libprocps.so.6 => /lib/x86_64-linux-gnu/libprocps.so.6 (0x00007f594c99d000)
libdl.so.2 => /lib/x86_64-linux-gnu/libdl.so.2 (0x00007f594c799000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f594c3a8000)
libsystemd.so.0 => /lib/x86_64-linux-gnu/libsystemd.so.0 (0x00007f594c124000)
/lib64/ld-linux-x86-64.so.2 (0x00007f594ce03000)
librt.so.1 => /lib/x86_64-linux-gnu/librt.so.1 (0x00007f594bf1c000)
liblzma.so.5 => /lib/x86_64-linux-gnu/liblzma.so.5 (0x00007f594bcf6000)
liblz4.so.1 => /usr/lib/x86_64-linux-gnu/liblz4.so.1 (0x00007f594bada000)
libgcrypt.so.20 => /lib/x86_64-linux-gnu/libgcrypt.so.20 (0x00007f594b7be000)
libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 (0x00007f594b59f000)
libgpg-error.so.0 => /lib/x86_64-linux-gnu/libgpg-error.so.0 (0x00007f594b38a000)

# 일일히 lib 복사하지 말고 그냥 lib,lib64 파일 모두 복사해놓자.
cp -rv /bin/{ls,cat,mount,umount,mkdir,rmdir,rm,cp,grep,ps} new_root/bin
cp -rv /usr/lib/x86_64-linux-gnu/* new_root/usr/lib/x86_64-linux-gnu
cp -rv /lib/x86_64-linux-gnu/* new_root/lib/x86_64-linux-gnu
cp -rv /lib64/* new_root/lib64

# 이제 chroot 를 해보면 /bin/bash 가 실행된다.
chroot new_root
# root 경로가 바뀐것 확인(cat,mkdir,ps 등도 동작한다.)
ls /

# ps 명령을 실행하기 위해선 /proc 디렉토리를 만들고 마운트해야한다.
mkdir -p /proc
mount -t proc proc /proc

# chroot 는 다음코드를 실행하면 현재 root 경로를 나갈수 있다(탈옥가능)
cat > break_chroot.c << EOF
#include <sys/stat.h>
#include <unistd.h>
int main(void)
{
    mkdir("foo", 0755);
    chroot("foo");
    chdir("../../../../../");
    chroot(".");
    return execl("/bin/bash", "-i", NULL);
}
EOF
# 빌드
gcc break_chroot.c -o break_chroot
# new_root 에 복사하고
cp -v break_chroot new_root
# new_root 에서 실행하면 chroot 의 / 를 빠져나가는 이슈가 있다.
chroot new_root
./break_chroot

# chroot 나가기
exit


#####


# pivot_root : root 를 new_root 아래로 mount 하여 경로 탈옥을 막아보자.

# 새로운 root 경로가될 디렉토리 생성
mkdir new_root2

# unshare 는 부모로 부터 격리된 특정 네임스페이스로 프로그램 실행�한다.
# -m : unshare mount namespace
# 프로그램 명시하지 않으면 기본 $SHELL(/bin/sh 등) 를 실행한다.
unshare -m

# 새로운 파일시스템을 생성해 new_root2 에 마운트
# 참고로 
# chroot 테스트에서 사용했던 파일들 모두 사용하기 위해 디스크 크기를 넉넉하게 한다.
# 디스크 크기를 너무 적게 설정하면 mount 오류로 다음과 같은 에러가 발생할 수 있다.
# -bash: /bin/ls: Input/output error
mount -t tmpfs -o size=500M none new_root2

# chroot 테스트에서 사용했던 파일들 복사해오기
cp -rv new_root/* new_root2/

# root 경로를 마운트할 디렉토리 생성
mkdir new_root2/put_old
cd new_root2

# pivot_root: change the root filesystem
# 현재 프로세스의 root 파일시스템을 put_old 로 옮기고 . 를 새로운 root 파일 시스템으로 만든다.
pivot_root . put_old

# root 파일 시스템 자체가 바뀌었음으로
# chroot 탈옥 코드로 root 경로 탈옥이 되지 않는다.
./break_chroot

# unshare 나가기
exit

vagrant 디렉토리 권한 문제

vagrant 사용중 권한 거부로 파일 read/write 가 거부되는 현상이 발견되었다.

[case1]
아파치 웹서버를 시작시 포크될 httpd 프로세스들의 계정을 다음과 같이 기존 (ysoftman) -> nobody 로 설정하고 코어덤프 디렉토리의 권한은 nbody.nbody 755 로 만들었다.

# 기존
# User ysoftman
# Group ysoftman
User nobody
Group nobody

CoreDumpDirectory /home/ysoftman/apache/bin/core

그리고 아파치 웹 서버의 테스트를 위해 에러 상황을 만들어 코어 파일을 생성하려고 했다.
그런데 코어 파일이생성되지 않는 현상이 발생했다.
계정과 코어덤프 디렉토리 계정을 ysoftman 으로 변경하면 코어 파일이 잘 생성된다.

case1 의 경우는 최신 버전 1.9.3 (March 21, 2017) 설치하니 된다.ㅠㅠ
기존에는 vagrant 를 1.8.4 를 사용하고 있었다.
또는 virtual box 에서 이미지를 삭제 후 다시 생성해 본다.

vagrant 변경 사항 참고
https://github.com/mitchellh/vagrant/blob/master/CHANGELOG.md


[case2]
Vagrantfile 파일의 synced_folder (nobody 소유) 를 다음과 같이 설정한다.
synced_folder 사용 방법
https://www.vagrantup.com/docs/synced-folders/basic_usage.html

config.vm.synced_folder "../to-guest", "/home/ysoftman/from-host", create: true, owner: "nobody", group: "nobody", mount_option: ["dmode=775", fmode="664"]

vagrant 시작 후 ssh 접속하여 해당 synced_folder 를 Symbolic Links 로 구성한다.

ln -s /home/ysoftman/from-host /home/ysoftman/mydata

nobody 계정의 아파치 프로세스가 mydata 를 사용하는데 접근 하지 못하는 문제(permission denied)가 발생했다.

위 synced_folder 사용 문서의 맨마지막 Symbolic Links 에 보면 현재 vagrant 는 symbolic links 에 대해서 아직 제대로 작동하지 않는다고 하니 테스트 후 원하는 동작이 나오지 않으면 synced_folder 를 symbolic links 하지 않고 사용하도록 하자~

** 해결책
링크의 대상 파일 경로의 첫번째 부터 접근 권한을 설정해주면 동작한다.
예를 들어 a 링크가 다음과 같다고 하면
a -> /home/ysoftman/b
/home
/ysoftman
/b
각각의 접근 모드(755)를 변경해주니 permission denied 에러가 발생하지 않았다.

vagrant box 파일 지우기

vagrant 를 사용(생성,실행)하게 되면 디스크용량을 꽤 잡아먹는다.
vagrant 가 차지하는 위치는 다음과 같다.

1. vagrant up 실행시 Vagrantfile  -> config.vm.box_url 로 부터 파일을 다운받는 위치, 사용하지 않는 버전만 골라 삭제하자.
~/.vagrant.d/boxes

2. vagrant up 실행시 임시공간으로 사용하는 위치, 이상이 없으면 자동 삭제되나 구동시 문제가 있다면 파일이 남아있으니 수동으로 삭제해주자.
~/.vagrant.d/tmp

3. vagrant up 실행시 실제 virtualbox에 가 사용하는 위치, 사용하지 않는 버전만 골라 삭제하자.
~/VirtualBox VMs/

4. vagrant package 로 실행시 box 파일을 출력하는 위치, 1번위치에 박스 파일이 있다면 삭제해도 된다.
${PWD}

vagrant up rsync 에러 해결하기

# 윈도우 administrator 계정에서
# vagrant box add centos/7
# vagrant init centos/7
# 설정하여 vagrant up 시 다음과 같은 에러가 발생한다.
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Checking if box 'centos/7' is up to date...
"rsync" could not be found on your PATH. Make sure that rsync
is properly installed on your system and available on the PATH.

# 호스트가 윈도우인데 rsync 를 사용하게 설정되어 있어 발생한것이다.
# 다음 경로의 centos/7 box 의 vagrantfile 에서 type 의 rsync 부분을 삭제하도록 한다.
C:\Users\Administrator\.vagrant.d\boxes\centos-VAGRANTSLASH-7\1611.01\virtualbox\Vagrantfile
Vagrant.configure("2") do |config|
  config.vm.base_mac = "525400225b53"
  config.vm.synced_folder ".", "/vagrant", type: ""
end

# vagrant ssh 수행시 ssh 클라이언트가 없다면
# https://git-scm.com/download/win 에서 git 을 설치해야 한다.
# 설치시 windows command prompt 에서도 ssh 를 사용할 수 있도록 "use git and optional unix tools from the windows command prompt" 를 선택하자.


vagrant 로 가상머신 사용하기

다수의 virtual box(가상 머신 이미지) 생성 및 관리에 vagrant 를 사용하면 편리하다.

# virtual box 프로그램이 이미 설치되어 있어야 한다.
# OS 에 따른 vagrant 다운로드 받아 설치
# vagrant 를 테스트할 디렉토리를 하나 생성한다.
# 이후 작업(명령)은 해당 디렉토리에서 진행된다.
mkdir vagrant-test
cd vagrant-test

# vagrant 에서 제공되는 박스 이미지 추가
# ~/.vagrant.d/boxes/ 에 이미지가 다운로드 된다.
# hashicorp 에서 제공하는 precise64 이미지 사용하는 경우
vagrant box add hashicorp/precise64

# 또는 특정 url 에서 박스 이미지를 다운받아 사용할 경우
# vagrant box add 타이틀 해당URL
vagrant box add ysoftman-centos7 http://10.10.10.10/centos7.box


# init 으로 초기화하면 현재 디렉토리에 Vagrantfile 라는 이름의 설정 파일이 생성된다.
vagrant init

# 생성된 Vagrantfile 의 box 이름, 호스트명, ip, 포트포워딩, 디렉토리싱크 설정
vi Vagrantfile
config.vm.box = "ysoftman-centos7"
config.vm.hostname = "ysoftman-centos7"
config.vm.network "private_network", ip: "192.168.33.10"
config.vm.network "forwarded_port", guest: 80, host: 8080
config.vm.synced_folder "./data", "/vagrant_data", create:true


# 박스 이미지 가동하기
vagrant up

# ssh 접속해보기
vagrant ssh

# 현재 박스(가상머신) 상태
# 현재 디렉토리의 Vagrantfile 에 명시된 박스 상태(poweroff/running...)
vagrant status

# 전체 박스 상태 보기
vagrant global-status

# 박스에 추가된 가상 머신(이미지)들 보기
vagrant box list

# 올린 가상 머신에 ssh 로 접속
vagrant ssh

# 가상 머신 종료
vagrant halt

# 박스 이미지를 새로 받아야 하는경우
# 기존 박스를 삭제(~/.vagrant.d/boxes/ 파일도 삭제된다.)
vagrant box remove 박스이미지이름

# 현재 디렉토리에서 박스 관련 정보 삭제
vagrant destroy -f

#  박스 이미지 새로 가동
vagrant up

# 참고