У меня проблема с программным доступом к файлам в файловой системе Amazon EFS: та же программа C будет работать с 64-битным исполняемым файлом, но не с 32-битным исполняемым файлом.

Точка монтирования - / EFS, программа ниже перечислит как каталог EFS (/ EFS / data), так и локальный каталог (/ home / centos):

Вот тестовая программа:

#include <stdio.h>
#include <dirent.h>

int main(void) {
   struct dirent *d;

   char efs_dir[]   = "/EFS/data";
   char local_dir[] = "/home/centos";

   printf("EFS dir : %s\n",efs_dir);
   DIR *dirEFS = opendir(efs_dir);
   if (dirEFS == NULL) {
      printf("Could not open current directory");
      return 1;
   }
   while ((d = readdir(dirEFS)) != NULL)
     printf("%s\n", d->d_name);

   closedir(dirEFS);

   printf("\nlocal filesystem dir : %s\n",local_dir);
   DIR *dirLOCAL = opendir(local_dir);
   if (dirLOCAL == NULL) {
      printf("Could not open current directory");
      return 1;
   }
   while ((d = readdir(dirLOCAL)) != NULL)
     printf("%s\n", d->d_name);

   closedir(dirLOCAL);
   return 0;
}

Представление Unix:

[centos@ec2-instance ~]$ df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/nvme0n1p1         20G  3.4G   16G  19% /
tmpfs                 3.7G     0  3.7G   0% /dev/shm
/dev/nvme1n1p1         94G  6.1G   83G   7% /opt/data
fs-XXXXXXXX.eu-west-3.amazonaws.com:/
              8.0E  5.3G  8.0E   1% /EFS

[centos@ec2-instance ~]$]$ ls -l /EFS/data
-rw-r--r-- 1 centos centos 2796 Sep 15 12:18 efs_file1.txt
-rw-r--r-- 1 centos centos 2812 Sep 15 12:18 efs_file2.txt
-rw-r--r-- 1 centos centos 3625 Sep 15 12:18 efs_file3.txt
-rw-r--r-- 1 centos centos 2768 Sep 15 12:18 efs_file4.txt

[centos@ec2-instance ~]$]$ ls -l /home/centos
-rw-rw-r-- 1 centos centos 2796 Sep 15 14:15 local_file1.txt
-rw-rw-r-- 1 centos centos 2812 Sep 15 14:15 local_file2.txt
-rw-rw-r-- 1 centos centos 3625 Sep 15 14:15 local_file3.txt
-rw-rw-r-- 1 centos centos 2768 Sep 15 14:15 local_file4.txt
-rw-r--r-- 1 centos centos   792 Sep 15 14:21 test_dir.c
-rwxrwxr-x 1 centos centos  7392 Sep 15 14:22 test_dir

Когда я компилирую test_dir.c в 32-битном режиме совместимости, нет результатов для каталога EFS:

[centos@ec2-instance ~]$ gcc test_dir.c -o test_dir -m32
[centos@ec2-instance ~]$ ./test_dir
EFS dir : /EFS/data

local filesystem dir : /home/centos
test_dir
.
..
local_file1.txt
local_file2.txt
local_file3.txt
local_file4.txt
test_dir.c

Но для 64-битного исполняемого файла это нормально:

[centos@ec2-instance ~]$ gcc test_dir.c -o test_dir
[centos@ec2-instance ~]$ ./test_dir
EFS dir : /EFS/data
.
..
efs_file1.txt
efs_file2.txt
efs_file3.txt
efs_file4.txt

local filesystem dir : /home/centos
test_dir
.
..
local_file1.txt
local_file2.txt
local_file3.txt
local_file4.txt
test_dir.c

Кто-нибудь имеет представление о том, что здесь происходит? Спасибо.

Изменить (решение): сжать 64-битное число индексов до 32-х бит с опцией ядра nfs.enable_ino64 = 0

[root@eai ~]# cat /etc/modprobe.d/nfs.conf
options nfs enable_ino64=0
[root@eai ~]# reboot

И готово! Спасибо DNT.

1
Julien 15 Сен 2020 в 15:48

1 ответ

Лучший ответ

Функция readdir возвращает индексный дескриптор. В вашей 32-битной сборке он ожидает найти 32-битные inodes. Но с файловой системой с 64-битными индексными дескрипторами произойдет сбой, если конкретный номер индексного дескриптора не может быть выражен в 32-битном формате.

Чтобы увидеть номера inode, вы можете использовать ls -li /EFS/data/efs_file1.txt. Крайний левый номер - это номер inode, и если он превышает 4294967295, то он 64-битный, и 32-битный readdir не может его обработать.

1
DNT 15 Сен 2020 в 13:34