바나나 PI-R1(ARMv7)에서 qemu-i386-static을 사용하여 정적으로 연결된 x86 Barracuda VPN 클라이언트를 실행하려고 했습니다. 이 주제를 따르면 다음과 같습니다.armv7에서 X86 바이너리 실행
그러나 VPN이 TUN 장치를 열려고 하면 "지원되지 않는 ioctl: cmd=0x400454ca" "TUNSETIFF: 기능이 구현되지 않음" 오류가 발생합니다.
C 예제를 만들 때 동일한 오류를 재현할 수 있습니다. 네이티브 ARM에서 컴파일할 때는 작동하지만 i386용으로 컴파일할 때는 실패합니다(qemu-i386-static을 사용하는 경우에만).
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>
#include <sys/ioctl.h>
#include <net/if.h>
#include <linux/if_tun.h>
#include <fcntl.h>
static int tun_alloc_old(char *dev) {
char tunname[IFNAMSIZ];
sprintf(tunname, "/dev/%s", dev);
return open(tunname, O_RDWR);
}
static int tun_alloc(char *dev) {
struct ifreq ifr;
int fd;
int err;
if ((fd = open("/dev/net/tun", O_RDWR)) < 0)
return tun_alloc_old(dev);
memset(&ifr, 0, sizeof(ifr));
ifr.ifr_flags = IFF_TUN;
if (*dev)
strncpy(ifr.ifr_name, dev, IFNAMSIZ);
if ((err = ioctl(fd, TUNSETIFF, (void*)&ifr)) < 0) {
close(fd);
perror("TUNSETIFF");
return err;
}
strcpy(dev, ifr.ifr_name);
return fd;
}
int main(void) {
char tun[20] = "tun0";
printf("fd=%d, if=%s\n", tun_alloc(tun), tun);
return 0;
}
일반 결과(기본 i386 또는 ARM):
# ./main
fd=3, if=tun0
에뮬레이터를 사용하십시오.
# qemu-i386-static ./main
Unsupported ioctl: cmd=0x400454ca
TUNSETIFF: Function not implemented
fd=-1, if=tun0