2014-09-26 3 views
3

임의의 숫자로 알려진 값으로 프로그램을 테스트하는 기능 테스트 케이스를 작성하고 싶습니다. 나는 단위 테스트 도중 mock으로 이미 그것을 테스트했다. 그러나 기능 테스트를 위해서도 그러길 원합니다. (물론 모두는 아닙니다)테스트를 위해 dev/urandom | random을

/dev/urandom을 하나의 프로세스에 오버라이드하는 가장 쉬운 방법은 무엇입니까? 단일 파일에 대해 chroot과 같은 작업을 수행하고 다른 모든 사람들이 통과하도록 할 수 있습니까?

답변

3

시스템이 새롭고 (예 : RHEL 7) setns 시스템 콜을 지원하는 경우 마운트 네임 스페이스를 사용하여 수행 할 수 있습니다. 루트 액세스가 필요합니다.

아이디어는 프로세스에 대한 별도의 마운트 네임 스페이스를 만들고이 네임 스페이스 내에 /dev/random 이상의 다른 파일 또는 FIFO를 바인드 마운트하여이 마운트 네임 스페이스의 프로세스가이 바인드 마운트 파일의 데이터를 읽도록합니다. 다른 프로세스에는 일반 /dev/random이 표시됩니다.

이렇게하는 방법입니다.

준비 :이 직원을 모두 작동하게하려면 다음 명령을 실행하십시오 (기본값으로 작동하지 않을 수 있으므로 자세한 내용은 this question 참조).

# mount --make-rprivate/

이제 새 마운트 네임 스페이스에서 실행되는 셸을 만듭니다.

# unshare -m /bin/bash 

당신은 새로운 bash가 자신의 마운트 네임 스페이스가있는 시작했다. 당신이 쉘 내부에서 일부 다른 쉘에서 다음 명령의 결과를 비교할 수 있습니다

이 쉘 :

# ls -l /proc/self/ns/mnt 
lrwxrwxrwx. 1 root root 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026532148] 

다른 쉘 : 숫자가 다르다는 것을

$ ls -l /proc/self/ns/mnt 
lrwxrwxrwx. 1 ec2-user ec2-user 0 Sep 26 16:06 /proc/self/ns/mnt -> mnt:[4026531840] 

주, 그래서 두 개의 셸이 다른 마운트 네임 스페이스에 있고 첫 번째 셸에서 수행 된 마운트는 시스템의 다른 프로세스에서 볼 수 없습니다 (이 셸의 모든 하위 항목 제외).

이제이 셸에서 기존 /dev/random에 바인딩 할 수 있습니다. 당신은 할 수 있습니다 기능 테스트를 위해

# ls -l /dev/random 
-rw-r--r--. 1 root root 16 Sep 26 16:18 /dev/random 
# cat /dev/random 
some large text 

:

$ ls -l /dev/random 
crw-rw-rw-. 1 root root 1, 8 Sep 26 15:45 /dev/random 
$ cat /dev/random 
�Znp7�v�c��Ω^C 

그러나 우리의 쉘에 특별한입니다 :

# echo 'some large text' > /tmp/fakerandom 
# mount --bind /tmp/fakerandom /dev/random 

다른 프로세스가 그들을 위해, 평소와 같이 /dev/random 작품이 표시되지 않습니다 약간의 FIFO로 /dev/random을 대체하고 다른 일부 프로세스에서 해당 FIFO에 알려진 데이터를 기록하십시오 (필요한 경우 자세한 내용은 mkfifo(1) 참조).

마운트 네임 스페이스에 대한 자세한 내용은 this 우수 기사에서 확인할 수 있습니다.

관련 문제