월간 보관물: 2016 6월

kvm 에서 vm template 만들기

문득 kvm에서 template를 만들어 쓸 순 없을까 라는 생각을 했다.

Disk 용량도 부족한데 … 1개의 가상머신에 10GB 되는 용량을 매번 부여하기가 힘들었다.

그래서 찾아봤는데 lvm thin provisioning 을 이용해서 tempate을 만드는게 잇더라.

정확히 말하면 lvm을 이용해서 template를 만드는게 있었는데 난 거기다 thin volume을 만들어서 좀더 용량을 아끼고 싶엇다. (회사에서 노트북 사줫는데 storage 용량이 198GB임… ; 그래도 memory 32GB랑 기능이 많아서 대 만족중 ㅎㅎ)

내가 참조한 site는 여기 !! https://dnaeon.github.io/creating-a-template-for-kvm-virtual-machines/

일단 나는 lvm thin provisioning volume을 만들어서 template(만든다음 그냥 안쓰기 ㅋ) 한 다음, 이걸 snapshot 을 이용해서 volume을 만들고 이걸 이용해서 kvm virtual machine 을 만든다.

시작!

먼저 lvm 을 이용해서 thin volume 을 만들자.

root@youngjulee-ThinkPad-S2:~# lvcreate –thinpool youngju-group/vms_thinpool -L 40G

### youngju-group 이라는 vgs(volume group) vms_thinpool 이라는 logical volume을 만드는데 이걸 thin volumepool로 쓴다. ###

root@youngjulee-ThinkPad-S2:~# lvcreate -V20G -T youngju-group/vms_thinpool -n rhgs_template

### vms_thinpool 에서 rhgs_template 라는 logical volume을 만드는데 size20G로 한다. -V 옵션은 가상 size를 정하는 옵션으로 실제로 쓴 용량만큼만 할당 하는데 20G 까지 쓸 수 있다는 뜻이다. ###

virt-install script 를 만들엇다.

root@youngjulee-ThinkPad-S2:~# cat virt-install.sh

#!/bin/bash

VMNAME=$1

VMVOLUEM=$2

VMISO=$3

virt-install –connect qemu:///system \ ### localhost qemu hypervisor 에 접속

–name $VMNAME \ ### virtual mathine name

–memory 4096 \ ### memory

–vcpus 2 \ ### cpus

–disk path=/dev/youngju-group/$VMVOLUEM \ ### template 으로 사용할 logical volumepath

–network network=youngju-thinkpad \ ### 사용할 network 기본으로 default

–virt-type kvm \ ### virtual machine type kvm 으로 함.

–os-variant auto \ ### os 종류 인데 fedora 등등 하고 싶은거 하면되는데 auto로 하면 iso이미지 보고 지가 알아서 해줌 별로 중요한건 아니다.

–graphics vnc \ ### console type

–hvm \ ### hardware virtual machine 으로 hardware의 도움을 받아 가상머신을 만들겟다는뜻. 그러니까 full virtualization type으로 만들겟다. Para virtualization hardware의 도움 필요없이 virthal mathine 만들기가 가능한데 os에다가 vmm(virtual machine monitor)기능을 하는 코드를 심어 줘야 한다고 알고잇음.

–cdrom /home/youngjulee/iso/$VMISO ### install cdrom path

### $1 $2 $3 은 이 script를 실행 했을때 위치매개변수를 지정한다. 쉽게말해 virt-install.sh rhgs_template rhgs_template_volume rhgs-3.1-u2-rhel-7-x86_64-dvd-2.iso 이렇게 3 개의 위치 argument 가 들어가면 명령어는 $0 순서대로 $1rhgs_template (이름) $2 rhgs_template_voluem (logical volume name) $3 rhgs-3.1-u2-rhel-7-x86_64-dvd-2.iso (설치할 iso 이미지) 이렇게 되어 있다. ###

root@youngjulee-ThinkPad-S2:~# ./virt-install.sh rhgs_template rhgs_template rhgs-3.1-u2-rhel-7-x86_64-dvd-2.iso

os install 이 끝나고 나면, system 에서 쓸 tool들을 설치하고 나서 # sys-unconfig 를 한다.

root@youngjulee-ThinkPad-S2:~# sys-unconfig

### windows sysprep 같은건데 system uuid 나 이런것들을 삭제시켜 준다. 재 부팅 시 다시 만들어줌. ###

root@youngjulee-ThinkPad-S2:~# lvcreate -s -T youngju-group/rhgs_template -n rhgs1

### rhgs_template volumesnapshot을 뜬다. -T 옵션은 snapshot을 뜰 thin volume을 지정해준다. -s 옵션은 snapshot을 뜨겟단 뜻 ###

root@youngjulee-ThinkPad-S2:~# lvchange -kn youngju-group/rhgs_template

### 중요한건데 snapshot volume은 만들어지면 defaultactive가 안되게끔 attr 의 마지막 k 가 켜져 있다. 뭔말이냐면 이 마지막의 klvchange –ay 명령어로 activation 할때 skip 하겠다는 뜻이다. 그래서 lvchange -ay activation 할때 -K option을 써서 activation skip을 무시 하고 activation 할건지 아니면 -kn option으로 activation skip option을 없애거나 해야한다. -K option을 하면 재부팅 후 자동으로 activation 되어 있지 않다.

root@youngjulee-ThinkPad-S2:~# lvs -o lv_name,attr,lv_role

LV Attr Role

home -wi-ao—- public

rhceph_template Vwi-a-tz– public

rhgs1 Vwi-a-tz-k public,snapshot,thinsnapshot

### 위의 k 때문에 일반적인 방법으로는 activation 이 안된다. 위에 기술된 내용으로 activation 시키자. ###

root@youngjulee-ThinkPad-S2:~# cat virt-install-template.sh

#!/bin/bash

VMNAME=$1

VMVOLUEM=$2

virt-install –connect qemu:///system \

–name $VMNAME \

–memory 4096 \

–vcpus 2 \

–disk path=/dev/youngju-group/$VMVOLUEM \

–network network=youngju-thinkpad \

–virt-type kvm \

–os-variant auto \

–graphics vnc \

–hvm \

–boot hd ### 요것만 틀림

### 위랑 다 똑같은데 booting hard disk로 한다. 이때 hard disk는 위에서 만든 snapshot volume으로 한다. ###

이렇게 해서 thin volume template 가 되고 snapshot이 가상머신 image 가 되엇다.

Snapshot 을 수십개 떠서 돌려도 실제로 차지하는 disk 용량은 template 용량 + 가상머신들이 부팅 후 실제 사용한 용량“ 이 된다. 내경우 8install 만 하니까 2GB도 안쓰더라.

Ovirt 가 이런식으로 가상머신 image 관리 하는것 같음.

linux 에서 smb mount 하기

Linux 에서 samba mount 하기…

별것도 아닌것에 꽤 고생햇네…

windows 에서는 explorer 주소창에 ‘\\<server name>’ 치면 바로 username , password 입력창이 나오고 접속이 되지만 linux에서는 그렇지가 않더라…

mount -t cifs -o username=<username>,password=<password> //ipaddress.or.fqdn/Samba /mnt/nas

이렇게 나와잇는데 {service name} 에다가 samba service를 해주고 있는 target을 지정해주는데 꼭 다음 directory 까지 지정해주거나 지정된 service name을 지정해줘야 한다. Service namelinux에서 samba service 해줄때 생성하는데 windows에서는 잘 모르겟다.

암턴 저 위에 //ipaddress.or.fqdn serverip가 되거나 fqdn(fully qualified domain name) 이 들어가야 하며 뒤에 /Samba 는 해당 디렉토리 명이 되겟다. 그 뒤의 /mnt/nas는 내 servermount point 이다.

fedora wifi access point 만들기

Fedora access point 만드는법.

Fedora 라고 되어 잇는데 rhel7 도 동일한 방법으로 가능하다.

root@youngju-laptop:~# dnf install hostapd

### hostapd 를 설치한다. ###

root@youngju-laptop:~#git clone https://github.com/oblique/create_ap 
root@youngju-laptop:~#cd create_ap
root@youngju-laptop:~# make install
### create_ap github에서 다운받은 후 설치를 한다. (내부동작은 사실 복사하는거임 ㅋ) ###

이제 /usr/bin/create_ap 명령어가 생겨 있는데 까보면 bash script로 되어있다. 얘가 hostadp를 잘 조작해서 ap(access point)를 만들어 준다. 

root@youngju-laptop:~# vim /usr/lib/systemd/system/create_ap.service

[Unit]
Description=Create AP Service
After=network.target

[Service]
Type=simple
ExecStart=/usr/bin/create_ap -g 192.168.125.1  -c 3 -w 1+2  wlp1s0 enp0s20f0u2 soma-ap3 30013001
### 요줄만 고쳐주면 된다.  -g gateway 설정 -c channel (1~14번중 제일 안쓰고 있는것 1개를 쓰자. Android wifi analyzer라는 어플로 지금 wifi가 어떤 channel 들에서 돌아가고 있는지 확인 가능하다.) -w WPA(wifi protected access) version 인데 암호방식 어떤거 쓸거냐고 묻는다. 1+2 로 둘다 쓰자.ㅋ 그리고 뒤에는 순서대로 wireless interface , wired interface (현재 network 연결되어있는 유선 interface), access-point name(ssid), password 이런 순으로 지정해주자. ###
KillSignal=SIGINT
Restart=on-failure
RestartSec=5

[Install]
WantedBy=multi-user.target

root@youngju-laptop:~# systemctl stop NetworkManager 
root@youngju-laptop:~# systemctl restart create_ap 
root@youngju-laptop:~# systemctl resart NetworkManager 
### hostapd NetworkManager 가 올라와 있으면 작동이 안된다. create_ap 를 올려준 후 다시 NetworkManager 를 올려주자. ### 

wifi 접속이 되는지 확인. !!! 
만약 접속이 안되거나 create_ap service 가 시작되지 않는다면 아까 저위에 옵션에다가 –hostapd-debug 1 요걸 추가해서 debuging을 하자. 
# Journalctl -lf  command log 확인도 같이 하면서 debuging을 하자. 

혹시 dnsmasq 를 이미 사용중이라면 시작이 안될것이다. Kvm 을 사용중이라도 안될것이다. 
이유는 kvm에서 dnsmasq를 이용해서 dhcp service를 해주는데 create_ap도 똑같이 dnsmasq를 이용해서 dhcp service를 해주기 때문이다. 
이 경우 이미 설정되어 있는 파일의 내용을 복사해서 /usr/bin/create_ap 에다가 아래와 같이 넣어주자. 


1632     cat << EOF > $CONFDIR/dnsmasq.conf
1633 #listen-address=${GATEWAY}
1634 #${DNSMASQ_BIND}
1635 #dhcp-range=${GATEWAY%.*}.1,${GATEWAY%.*}.254,255.255.255.0,24h
1636 #dhcp-option-force=option:router,${GATEWAY}
1637 #dhcp-option-force=option:dns-server,${DHCP_DNS} 
	### 원본 내용을 주석처리 해주자 ###
1638 ### edit by youngju ###
1639 listen-address=192.168.125.1  
	### lesten-address 요거 빠지니까 wifi 접속해서 ip를 못받아 오드라. Wifi apservice 해주는 interfaceip 주소(아까 위에서 설정한 gateway 주소)를 넣어주자 ###
1640 interface=wlp1s0
1641 interface=virbr0
1642 dhcp-range=set:wifi,192.168.125.100,192.168.125.250,255.255.255.0,12h
1643 dhcp-range=set:vm,192.168.124.100,192.168.124.250,255.255.255.0,12h
1644 dhcp-option=tag:wifi,option:router,192.168.125.1
1645 dhcp-option=tag:vm,option:router,192.168.124.1
1646 dhcp-option=tag:wifi,option:dns-server,192.168.125.1,8.8.8.8
1647 dhcp-option=tag:vm,option:dns-server,192.168.124.1,8.8.8.8
1648 conf-dir=/etc/dnsmasq.d,.rpmnew,.rpmsave,.rpmorig
1649 bind-dynamic
1650 dhcp-option-force=option:mtu,1500
1651 #no-hosts
1652 ### edit by youngju ###

1653 EOF
1654     MTU=$(get_mtu $INTERNET_IFACE)
1655     [[ -n "$MTU" ]] && echo "dhcp-option-force=option:mtu,${MTU}" >> $CONFDIR/temp-dnsmasq.conf
1656     [[ $ETC_HOSTS -eq 0 ]] && echo no-hosts >> $CONFDIR/temp-dnsmasq.conf
1657     if [[ "$SHARE_METHOD" == "none" && "$REDIRECT_TO_LOCALHOST" == "1" ]]; then
1658         cat << EOF >> $CONFDIR/temp-dnsmasq.conf
	### dnsmasq.conf 라고 되어 있는것을 참조하지 못하게 temp-dnsmasq.conf로 고쳐줬다. ### 
1659 address=/#/$GATEWAY
1660 EOF

root@youngju-laptop:~# systemctl restart create_ap 
 	### 다시 create_ap 를 재시작 해주자. ### 
이렇게 설정을 하면 kvm에서 사용하는 대역과 wifi 대역 모두 dhcp service를 해줄 수 가 있다. !!

rhev vm recovery

RHEV vm recovery

rhevdatacenterstorage domain에 문제가 생겼을때 유용한 방법이다.

이는 가상머신 image를 교체하여 복구하는방법이며, 이름이나 기타 system설정도 같이 맞추려면 'engine-image-upload' command 를 이용하여 export domain에다가 넣고 그걸 다시 storage domain 에다가 import 해야한다. ㅋㅋ 복잡하며 시간도 2배 이상걸림(copy 하는시간만 2배에다가 여러 설정 및 귀찮은거 하는시간 + 하면 2배 이상이 된다.)

일단 rhevstorage domain 구조에 대해서 조금 살펴보면…

-bash-4.1# tree /data/

/data/

├── 6c986cd7-d207-4034-8935-d76c0958bdb1

│   ├── dom_md

│   │   ├── ids

│   │   ├── inbox

│   │   ├── leases

│   │   ├── metadata

│   │   └── outbox

│   ├── images

│   │   ├── 0acada18-222a-45e9-b481-d1d6f9841c9a

│   │   │   ├── 8d529398-d8a1-455b-b147-d1e1ecb119c7

│   │   │   ├── 8d529398-d8a1-455b-b147-d1e1ecb119c7.lease

│   │   │   └── 8d529398-d8a1-455b-b147-d1e1ecb119c7.meta

│   │   ├── 698145dd-9a9c-4a87-8c93-ef9ee906b213

│   │   │   ├── cb1c8efa-f98d-4e9d-b7e8-d0b5fd1b10d6.lease

│   │   │   └── cb1c8efa-f98d-4e9d-b7e8-d0b5fd1b10d6.meta

│   └── master

│   ├── tasks

│   └── vms

│   ├── 56739063-960c-4e3a-9093-ac3f1a95c4c1

│   └── ca4fa03c-e201-4285-8c60-2670a40b2371

│   └── ca4fa03c-e201-4285-8c60-2670a40b2371.ovf

└── __DIRECT_IO_TEST__

맨위에 6c986cd7-d207-4034-8935-d76c0958bdb1 요건 해당 storage domainid가 된다. 그리고 아래 트리에는 dom_md images master directory 들이 각각 위치하게 되는데, dom_md 는 해당 domainmetadata가 들어가며, metadata 파일에는 해당 domain의 정보가 적혀져 있다.

images 에는 가상머신의 disk image가 들어가 잇다. Images/아래 하위디렉토리가 imageid이며 .meta file이 해당 disk imagemeta 정보가 적혀져 있다.

Master 에는 가상머신의 ovf(open virtual format) 파일이 들어있는 vms director tasks라는 디렉토리가 있는데, tasks 디렉토리는 해당 storage domain에 뭔가 작업을 할 경우 여기에 task 파일들이 생기게 된다. 해당 파일들은 작업이 끝나면 commit 되어 사라지게 된다. rhevtaskdatabase에도 저장 되며, rhev에 간혹 생기는 zombie task 들을 지워주는 작업은 이 tasks 디렉토리의 파일과, database에서 해당 task id를 삭제하여 주는 작업을 말한다. Zombie task 없애주는 툴이 따로 있음 ㅋㅋ. 이걸로도 삭제 안되는 작업은 직접 database 찾아가서 지워줘야함 ㅋ

암턴 우리가 할일은 저 위에 있는 images directory 안에있는 실제 가상머신의 disk image를 바꿔치기 하는 작업이다.

가상머신 2개를 만든다.

1

그리고 두 가상머신의 disk image를 바꾼다.

-bash-4.1# mv \

/data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/0acada18-222a-45e9-b481-d1d6f9841c9a/8d529398-d8a1-455b-b147-d1e1ecb119c7 \

/data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/

### test1 imagebooting 시 참조하지 못하게 다른 디렉토리로 옮겨 둔다. ###

-bash-4.1# mv \

/data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/698145dd-9a9c-4a87-8c93-ef9ee906b213/cb1c8efa-f98d-4e9d-b7e8-d0b5fd1b10d6 \

/data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/0acada18-222a-45e9-b481-d1d6f9841c9a/

### test2 imagetest1의 공간으로 옮긴다. ###

-bash-4.1# cd /data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/0acada18-222a-45e9-b481-d1d6f9841c9a/

### test1의 공간으로 이동한다. ###

-bash-4.1# mv cb1c8efa-f98d-4e9d-b7e8-d0b5fd1b10d6 \

8d529398-d8a1-455b-b147-d1e1ecb119c7

### test2disktest1disk 이름으로 바꾼다. ###

-bash-4.1# tree /data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/

/data/6c986cd7-d207-4034-8935-d76c0958bdb1/images/

├── 0acada18-222a-45e9-b481-d1d6f9841c9a

│   ├── 8d529398-d8a1-455b-b147-d1e1ecb119c7

│   ├── 8d529398-d8a1-455b-b147-d1e1ecb119c7.lease

│   └── 8d529398-d8a1-455b-b147-d1e1ecb119c7.meta

├── 698145dd-9a9c-4a87-8c93-ef9ee906b213

│   ├── cb1c8efa-f98d-4e9d-b7e8-d0b5fd1b10d6.lease

│   └── cb1c8efa-f98d-4e9d-b7e8-d0b5fd1b10d6.meta

└── 8d529398-d8a1-455b-b147-d1e1ecb119c7

자 이제 booting 시켜보자.

2

test1이 켜져 있지만 test2의 내용물을 가지고 있는것을 확인 할 수 있다.

복구끝!