Запуск скрипта оболочки при монтировании новой файловой системы NFS

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

Я ищу способ запустить оболочку скрипт при подключении новой файловой системы NFS. Это будет использоваться на системах Ubuntu 16/20.

Причина этого заключается в том, что время от времени соединение с сервером NFS теряется (перезагрузка, задержка сети), и данные записываются в основное подключение. Оболочка скрипта, которую я написал, изменит основное подключение, чтобы предотвратить это (chmod 400) и заставит приложение выдать ошибку. Я ищу способ вызвать этот скрипт каждый раз, когда создается новая точка монтирования NFS.

Это будет развернуто на тысячах систем, и я не буду знать точки монтирования заранее, поэтому запуск этого скрипта по правилам udev, вероятно, не сработает.

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

Чтобы настроить выполнение shell-скрипта при монтировании новой файловой системы NFS на системах Ubuntu 16 и 20, рассмотрим процесс, который зависит от эффективного управления событиями монтирования. Поскольку мы имеем дело с большими масштабами внедрения (тысячи систем), необходимо разработать универсальное и надежное решение, которое будет работать независимо от заранее известных точек монтирования.

1. Использование системного демона systemd

В современных версиях Ubuntu можно использовать systemd, который поддерживает триггеры событий монтирования. Мы можем создать mount unit файл, который будет отвечать за выполнение скрипта каждый раз, когда новое NFS-устройство монтируется.

Шаги для реализации:

  1. Создание shell-скрипта:
    Убедитесь, что ваш скрипт your_script.sh находится в доступном месте (например, в /usr/local/bin/) и имеет разрешения на выполнение.

    #!/bin/bash
    chmod 400 /path/to/underlying/mount
    # Другие действия, которые необходимо выполнить

    Не забудьте сделать его исполняемым:

    chmod +x /usr/local/bin/your_script.sh
  2. Создание службы systemd:
    Создайте файл службы, например /etc/systemd/system/nfs-mount-listener.service со следующим содержимым:

    [Unit]
    Description=Trigger script on NFS mount
    
    [Service]
    Type=oneshot
    ExecStart=/usr/local/bin/your_script.sh
    
    [Install]
    WantedBy=multi-user.target
  3. Настройка триггеров для монтирования:
    Создайте файлы для триггера в /etc/systemd/system или в папке переопределения, чтобы systemd знал, когда запускать вашу службу. Например, создайте файл /etc/systemd/system/mnt-nfs.mount. Имя файла должно совпадать с требуемым точкой монтирования NFS.

    Если вы не знаете заранее имена точек монтирования, можете использовать шаблон, например:

    [Unit]
    Description=NFS Mount Trigger
    
    [Install]
    Also=nfs-mount-listener.service
    

    Это позволяет автоматически привязывать триггер к службе.

  4. Перезагрузка демон systemd:
    После всех изменений необходимо перезагрузить systemd, чтобы он применил изменения:

    systemctl daemon-reload
  5. Тестирование:
    Чтобы протестировать, выполните монтирование NFS и посмотрите, выполняется ли ваш скрипт. Для проверки вы можете использовать команды systemctl status nfs-mount-listener.service.

2. Использование inotify для мониторинга

Если systemd не подходит, вы можете использовать inotifywait, который будет следить за изменениями в /proc/mounts:

  1. Установите inotify-tools, если они не установлены:

    sudo apt-get install inotify-tools
  2. Затем создайте скрипт для мониторинга:

    #!/bin/bash
    while true; do
       inotifywait -e create /proc/mounts
       /usr/local/bin/your_script.sh
    done
  3. Запустите этот скрипт в фоне или создайте его службу systemd для управления.

Заключение

Настройка триггера для выполнения shell-скрипта при монтировании NFS на системах Ubuntu 16/20 может быть выполнена с помощью systemd, что гарантирует надежность и эффективность решения, особенно в условиях масштабируемости. Выбор подхода необходимо делать в зависимости от конкретных требований системы и окружения. Важно провести тестирование всех изменений на небольшом числе систем перед развертыванием на всех платформах.

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

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