두 번째 드라이브에서 바이너리를 실행할 때 분할 오류가 발생합니다.

두 번째 드라이브에서 바이너리를 실행할 때 분할 오류가 발생합니다.

두 번째(NTFS) 드라이브에서 실행 파일을 실행하려고 하면 분할 오류가 발생합니다. 내 홈 폴더에서 똑같은 실행 파일을 실행하면 제대로 작동합니다.

예: 다음 명령을 사용하여 다음 C 프로그램을 컴파일합니다 gcc a.c.

#include <stdio.h>

int main() {
    puts("Hello");
    return 0;
}

이제 ./a.out두 번째 드라이브에서 실행합니다.

$ ./a.out
zsh: segmentation fault  ./a.out

(활성화되어 다른 목적으로 사용 가능한 경우에도 코어 덤프가 생성되지 않습니다.)

/home/username/수정 없이 동일한 파일을 예를 들어 (내 메인/OS 드라이브에) 복사하는 경우 :

$ ./a.out
Hello

거기에서는 모든 것이 잘 작동합니다.

그러나 두 번째 드라이브에서는 시작 중에 GDB가 실패합니다.

(gdb) starti
Starting program: /path/to/a.out 
During startup program terminated with signal SIGSEGV, Segmentation fault.

다음을 사용할 때 실패했다고 strace표시됩니다 .execve

$ strace ./a.out
execve("./a.out", ["./a.out"], 0x7ffd0aa31070 /* 83 vars */) = -1 EOPNOTSUPP (Operation not supported)
+++ killed by SIGSEGV +++
zsh: segmentation fault (core dumped)  strace ./a.out

또한 두 번째 드라이브에서도 ldd말합니다 . 아주 잘 작동합니다 .not a dynamic executablereadelf -dobjdump -p

내 드라이브와 해당 하위 폴더 중 하나가 다음과 같이 마운트됩니다 /etc/fstab.

UUID=drive-uuid-123        /path/to/drive   ntfs3   defaults      0 2
/path/to/drive/some/path   /my/new/path     none    defaults,bind 0 2

다른 NTFS 드라이브에서 바이너리를 실행할 때도 동일한 문제가 발생합니다.

시스템 메시지:

$ uname -a
Linux thomas-manjaro 6.6.25-1-MANJARO #1 SMP PREEMPT_DYNAMIC Thu Apr  4 20:32:38 UTC 2024 x86_64 GNU/Linux

이것은 Manjaro를 새로 설치한 것이며 모든 패키지가 최신 상태입니다.

문제가 무엇인지 아시는 분 계신가요? 드라이브를 다르게 마운트해야 합니까? 일종의 시스템 변수를 설정해야 합니까?

답변1

노트: 한 줄에 2칸씩 띄워서 작성하고, fstab하단 완성된 부분에는 최대한 간격을 두었습니다. fstab실제로 사용하는 위치와 일치하도록 마운트 지점을 자유롭게 변경하십시오.

확인하다

  1. 설치하다:sudo pacman -S ntfs-3g fuse
  2. 테스트 설치: sudo mkdir -p /mnt/ntfs && sudo mount -t ntfs /dev/sdX /mnt/ntfs-X가 무엇인지 확인하려면 테스트용으로만 parted를 사용하세요. 곧 UUID를 추가할 예정입니다.
  3. 2단계의 마운트가 올바르게 설치되었는지 테스트합니다.mount | grep ntfs

fstab 어셈블

  1. UUID를 기록해 두십시오. sudo blkid /dev/sdX-위의 2단계를 참조하세요.
  2. fstab에 추가: UUID=XXXX-XXXX /mnt/ntfs ntfs user,ro,umask=0222,defaults 0 0- 이 "기본 마운트"는 커널의 파일 시스템 핸들러에 의해 처리됩니다.

이렇게 하면 루트가 필요 없이 전체 드라이브를 읽기 전용으로 마운트해야 하며 Linux 액세스 마스크와 일치해야 합니다. 이제 fstab에서와 마찬가지로 읽기/쓰기 디렉터리를 추가/마운트할 수 있습니다.FUSE 파일 시스템): /mnt/ntfs/path/to/directory /some/new/path ntfs-3g rbind,user,umask=0222,defaults 0 0- 이 "하위 설치"는 사용자 공간 도구에 의해 처리됩니다.

노트 2: rbind여기서는 설치의 일부를 수행하는 동안 변경 사항을 재귀적으로 유지하는 데 사용됩니다.전체 읽기 전용파일 시스템이 다른 파일 시스템으로 마운트되었습니다.읽기/쓰기. 변경 사항이 디스크에 올바르게 저장되도록 하려면 두 설치를 모두 동기화 상태로 유지해야 합니다. 바라보다:바인드 마운트에 대해 알아보기, 재귀 바인딩에 대한 설명이 포함되어 있습니다.

fstab 완료

#Device#MountPoint#FS #MountOptions#Fsck                  
UUID=XXXX-XXXX /mnt/ntfs ntfs 사용자,ro,umask=0222,기본값 0 0
/mnt/ntfs/special/dir /some/new/path ntfs-3g rbind, 사용자, umask=0222, 기본값 0 0

답변2

저는 이중 부팅 시스템을 유지하고 있지만 몇 년 동안 Windows를 부팅하지 않았습니다. 내부 및 외부(USB) 하드 드라이브 모두에 ​​오래된 파일이 많이 있습니다. 둘 다 Linux ext2/ext3 및 NTFS 파티션이 있습니다.

기본적으로 NTFS를 영구적으로 마운트하지 않기로 선택했기 때문에(USB는 제거 가능하므로) 항목이 없습니다 fstab. 나는 일반적으로 Linux 파일 관리자를 사용하여 필요에 따라 파티션을 마운트하는데, 이는 다음과 같은 특성을 제공합니다.

$ mount | grep Windows
/dev/sda2 on /media/paul/Windows type fuseblk \ 
    (rw,nosuid,nodev,relatime,user_id=0,group_id=0, \ 
    default_permissions,allow_other, \ 
    blksize=4096,uhelper=udisks2)

백업 스크립트와 같은 경우 다음과 같은 명령을 포함합니다.

mount -o uid=1000,gid=1000 "/dev/sda2" "/media/root/Windows"

udisksctl명령도 유용합니다.

관련 정보