디스크가 있는 가상 머신에서 Apache를 실행하고 있습니다 qcow2
. Apache는 다음을 수행하는 (컴파일된 C++) 프로그램을 실행합니다.
system
파일을 실행하는 다른 (C++) 프로그램을 호출합니다.그런 다음 파일을 읽고 처리하려고 시도합니다.
단계 (2) 을 사용해 보았습니다 ifstream::open
. 가상 머신에서 프로그램을 실행하면 실패하고( ifstream::good
반환 false
) errno
파일이 존재하지 않는다는 메시지가 나타납니다. 그러나 쉘을 열고 파일을 찾으면 파일이 존재합니다.
프로그램은 시작되지 않아도 qcow2
(3개의 서로 다른 RedHat 및 Ubuntu 시스템에서) 잘 실행되는데, 그게 뭔가 관련이 있는 것 같습니다. 이 문제는 두 가지 방법으로 해결할 수 있습니다.
- (1)과 (2) 사이에 다른 단계를 추가하고 호출
system("ls /foo/bar/myfile")
명령이ls
실패하면 2가 반환됩니다. 100번 호출해도 여전히 실패합니다. 그러나 이제 (2)단계는 성공합니다. system("sync")
대신 실행하면system("ls")
단계 (2)가 성공합니다.
무슨 일이 일어났는지 아세요? qcow2
비정상적인 세척 요구 사항이 있습니까 ?
편집 - 일부 시스템 정보를 추가했습니다.
- RHEL 8.5, 최신
- 커널 4.18.0-348.12.2.el8_5.x86_64
- pc-q35-rhel8.2.0 시뮬레이션
- 4GiB RAM, 2vCPU(Skylake-Client-IBRS)를 갖춘 VM
- 디스크: 10GB, 35% 사용됨, virtio, 기본 캐시, Ubuntu 20.04 이미지
저는 수년 동안 Win 7 및 Linux 이미지를 사용하여 이 설정을 실행해 왔지만 이전에는 문제가 없었습니다.
$ virsh version
Compiled against library: libvirt 6.0.0
Using library: libvirt 6.0.0
Using API: QEMU 6.0.0
Running hypervisor: QEMU 4.2.0
답변1
비슷한 문제가 있습니다애플리케이션 이미지 포함, (Go로 작성) 베어메탈에 있습니다. 이 문제는 파일을 생성한 프로그램을 호출하여 f.Sync()
해결되었습니다 .
나는 이것이 qemu에만 국한된 것이라고 생각하지 않습니다. 내 작업 이론은 파일이 저장소에 동기화되지 않은 경우 해당 파일을 만든 프로세스에만 표시된다는 것입니다. 그 사람이 돌아온다면 아마도 부모님일 것이다. 다른 상위 프로세스의 프로세스는 파일이 동기화될 때까지 기다려야 할 수 있습니다.
이에 대한 명확한 리소스는 없으며 위의 디버깅 중에 찾은 것뿐입니다.