virtio_rng (반가상화 난수 생성기)
- OS에서의 Random Number
- OS에서는 다양한 작업 시 난수를 필요로 하고 안정적인 OS 운영을 위해서는 올바른 난수에 대한 접근 관리가 필요.
- ssh나 GPG/PGP 키페어 생성
- 프로세스에 PID 부여
- TCP seq num 생성
- UUID 생성 등등..
- VM에서의 Random Number
- virtio-rng device는 RHEL 7.0부터 이용 가능.
- 이 드라이버는 RHEL6의 모든 마이너 버전에서도 사용 가능.
- 호스트와 VM의 OS 버전이 다르더라도 호스트의 엔트로피 사용이 가능함. (rhel 6 vm 에서 rhel 7 호스트의 엔트로피에 접근 가능)
- virtio RNG 드라이버는 MS Windows 게스트에서도 또한 사용 가능. (windows 용으로 cerfi된 드라이버가 있음)
- virtio RNG를 사용하지 않으면 게스트 OS의 /dev/random을 사용하고 있는건가 ?
- Red Hat Enterprise Linux 7에서는 KVM 가상 시스템이 호스트의 엔트로피에 접근할 수 있도록 virtio RNG(Random Number Generator) 를 도입.
- Red Hat Enterprise Virtualization 3.5 버전부터 해당 기능이 있었는데, Red Hat Enterprise Linux guests에서 해당 기능을 좀 더 쉽고 간편하게 사용할 수 있도록 개선함.
- redhat에서는 호스트의 hwrng를 사용할 것을 권장하고, 호스트에서는 모든 게스트에서의 요청과 더불어 호스트의 어플리케이션에서 발생하는 요청을 원활하게 처리할 수 있을 정도의 충분한 엔트로피가 필요.
- 권장 설정을 사용하면 호스트 Linux 커널( /dev/random을 통해)의 엔트로피는 hwrng에 의해 공급되고, QEMU 는 게스트가 난수 요청 시 엔트로피 소스로 /dev/random 을 사용하게 되는 구조. (이미지 참조)

- Linux의 /dev/random을 소스로 사용(권장 설정을 사용)하면 두 가지 측면에서 좋음
- hwrng의 입력이 다른 엔트로피(호스트 시스템에서 생성되는 다른 엔트로피)와 혼합됨. (기본적으로 /dev/random이 호스트에서 기본 엔트로피 소스로 사용되지만 hwrng이 소스에 추가되는)-> random num의 퀄리티가 좋아진다는 것 같음.
- 가상 머신의 라이브 마이그레이션은 물리적 hwrng에 의존하지 않음. 클러스터의 서로 다른 서버는 특정 모델이나 벤더에 종속되지 않고 다양한 공급업체의 hwrng를 사용할 수 있음. -> 결국은 /dev/random을 사용하게 되니까
- 클라우드 이미지에 어떤 이점이 있는지 ?
- 클라우드 이미지도 ssh 키페어를 만드는데 랜덤넘버가 필요한데, 이 부분이 완전히 자동화 됨.
- 이게 자동화되면서 기존에 클라우드 이미지에서 랜덤넘버를 대기하는 시간이 사라지게 되고, 클라우드 이미지 작업 속도가 매우 빨라지게 됨.
적용
- nova 설정 변경
[root@test01]# ansible -i hosts.txt all -m shell -a "sed -i 's/^\(rng_dev_path\).*$/\1 = \/dev\/random/g' /etc/nova/nova.conf" -u testuser -b -k
SSH password:
- 설정 확인
[root@test01]# ansible -i hosts.txt all -m shell -a "grep rng_dev_path /etc/nova/nova.conf" -u testuser -b -k
SSH password:
- openstack-nova-compute.services 재시작
- 특정 이미지에 virtion property 적용
[root@controller1 ~]# openstack image set --property hw_rng_model=virtio de41697d-****-****-b5c1-04b76887267b
- 인스턴스 생성 테스트
[root@controller1 ~]# openstack server create --network "int_net2" --flavor a2.4m.small --image "de41697d-****-****-b5c1-04b76887267b" --os-compute-api-version "2.74" --key-name testvm01
- 인스턴스 내에 virtio_rng 모듈이 로딩 여부 확인
~# lsmod | grep -i virtio
virtio_rng 16384 0
virtio_net 57344 0
net_failover 20480 1 virtio_net
virtio_blk 20480 3
- 동일 이미지에서 property를 제거하면 rng가 안 뜨는 것 확인.
~# lsmod | grep -i rng
- 전체 flavor, image에 virtio property 추가
[root@controller1 ~]# openstack flavor list --long -c ID -c Properties
+--------------------------------------+-------------------------------------------------------------------------------------------------------------------+
| ID | Properties |
+--------------------------------------+-------------------------------------------------------------------------------------------------------------------+
| 04df5678-****-****-b329-617099a956f4 | hw_rng:allowed='True' |
| 0f79720a-****-****-ac77-b84ab98ec0be | hw_rng:allowed='True', instance_type='*' |
(...)
+--------------------------------------+-------------------------------------------------------------------------------------------------------------------+