Почему моя bash-глоб не работает, как ожидалось?

Вопрос или проблема

У меня есть 2 сервера AIX.

сервер A: монтирует NFS с nfs_server_A в /some_location/
сервер B: монтирует NFS с nfs_server_B в /some_location/
Оба используют одни и те же параметры: "bg,hard,rsize=262144,timeo=600,vers=3,proto=tcp"
Оба NFS-сервера идентичны (версия, установка и т.д.)
Оба сервера A и B "идентичны" (одна и та же ОС, одинаковые уровни обновлений, один и тот же метод установки)
Различие: смонтированная ФС на сервере B имеет больший размер
bash одинаковой версии на обоих серверах, из одних и тех же пакетов, set -o отображает ту же информацию (на обоих "noglob" выключен) и т.д.

Что меня беспокоит:

  • на сервере B: когда я нахожусь где-то в /some_location (= на смонтированном NFS, в любой директории и с минимум 1 файлом или с несколькими сотнями):
    • ls *, echo *, echo foo?bar.txt: всё работает, как в ksh, так и в bash.
  • на сервере A: когда я нахожусь где-то в /some_location (= на смонтированном NFS, в любой директории и с минимум 1 файлом или с несколькими сотнями):
    • ls *, echo *, echo foo?bar.txt: работает только в ksh и не работает в bash
    • в bash для “ls *” отображается: ls: 0653-341 Файл * не существует (то есть, bash не смог расширить глоб)
      • в любой директории вне смонтированных NFS: глобы bash работают идеально

Я попробовал: ( cd /some_location && truss bash -c 'ls ./somefile*' ) > truss_info 2>&1 на обоих:

Кажется, единственная разница видна сразу после очень раннего успешного statx("./" ...) =0:

  • на сервере A есть getdirent(3, ...) Err#127 EOVERFLOW
  • на сервере B есть getdirent(3, ...) = 892

Я в недоумении, в чем может быть разница (такая же ОС, те же уровни обновлений, одна и та же версия и пакет bash, одинаковые NFS, одна и та же установка NFS-серверов) (единственное отличие, которое я смог найти: ФС больше на сервере B, но именно этот сервер работает…, на сервере A происходит переполнение при чтении getdirent() с меньшей ФС?), и был бы признателен за советы, на что обратить внимание.

Ответ или решение

Пользователю сталкиваются с проблемой, когда глобальные шаблоны bash на сервере A не работают должным образом в NFS-каталоге, в то время как на сервере B все в порядке. При этом система и стороннее ПО на обоих серверах идентичны. Основная проблема проявляется в том, что bash не может развернуть глобальные шаблоны на сервере A, сообщая об отсутствии файлов, даже если они существуют. Исследуем возможные причины и решения этой проблемы.

Форест: Объяснение текущей ситуации

F (The Feeling) – Ваши переживания

Несмотря на одинаковые условия среды и конфигурации, вы теряете временные ресурсы из-за неожиданной проблемы. Это поражает доверие к системам и их надежности, особенно при работе с идентичными серверами. Это разочаровывающее ограничение продуктивности требует понятного и действенного решения.

O (The Opportunity) – Ваша возможность

Эту проблему можно использовать как возможность углубленного изучения взаимодействия файловых систем и поведения bash при работе с NFS. Успешное решение укрепит уверенность в ваших навыках и повысит надежность вашей инфраструктуры.

Рекомендации по устранению проблемы

R (The Resolution) – Решение

  1. Размер файловой системы и размер inode: Разные размеры файловых систем могут влиять на количество доступных inode, что может вызвать переполнение в некоторых системных вызовах. Убедитесь, что inode имеют одинаковую структуру и что нет недостатка в них.

  2. Версия glibc и параметры компиляции: Время от времени различия в поведении могут возникать из-за различных версий библиотек или параметров компиляции. Проверьте, одинаковы ли версии версий libc и параметры на обоих серверах.

  3. NFS-протокол и параметры: Ошибка getdirent связана с NFS. Проверьте, возможно, проблема в корректности монтирования или использованием другого подпротокола. Хотя параметры монтирования выглядят одинаково, стоит убедиться, что все тонкие настройки и ограничения сервера (например, максимальный размер файлов, поддерживаемый в NFS) аналогичны.

  4. Системные пределы и ulimit: Убедитесь, что системные параметры, такие как ulimit, выставлены корректно и однородно на обоих серверах.

  5. Отладка через dtrace или аналогичные утилиты: Для лучшего понимания выполнения системных вызовов используйте dtrace или аналогичные возможности для более глубокой диагностики.

E (The Example) – Пример правильной работы

Постоянное тестирование различных аспектов системной конфигурации, процессов монтирования и сетевых коммуникаций позволит обеспечить гладкую и стабильную работу. Попробуйте создать ограниченные и управляемые тестовые кейсы с меньшим объемом данных, что может облегчить выявление основного источника проблемы.

S (Step Forward) – Следующий шаг

Проведите аудит вышеуказанных аспектов и начните тестирование поочередно. Ваш финальный шаг — сравнить результаты с обеими серверами после потенциальных изменений, особенно в конфигурации NFS и bash. Это обеспечит гладкую работу и позволит устранить любые идентифицированные проблемы.

Заключение

Понимание того, как системное окружение и конфигурационные нюансы могут повлиять на интерпретатор команд shell, является ключевым шагом к устойчивой работе серверов. Решая эту проблему, вы не только выстраиваете эффективные рабочие процессы, но и закрепляете свою экспертность в управлении инфраструктурой.

Внимательное изучение этих рекомендаций поможет устранить вашу текущую проблему и предотвратить аналогичные сложности в будущем.

Оцените материал
Добавить комментарий

Капча загружается...