amarao (amarao_san) wrote,
amarao
amarao_san

Categories:

nfs - время монтирования

Мистика продолжается. На этот раз я умудрился не увидеть шару даже после sleep'а на 15 секунд. При этом запуск руками скрипта успешен.

И при этом после окончания загрузки подмонтированной шары просто не было! Такого не может быть, потому что такого не может быть.

Либо я делаю какой-то феерический очевидный косяк, либо оно работает не так, как я ожидаю, либо это какая-то несусветная бага...

При этом в тесте из двух шар подключается только одна (одна и та же шара в два места монтируется) на NFS-сервер уходит только один запрос...

Ок, чушь локализовалась в районе "не монтируется".

Пробуем воспроизвести проблему в отвязке от процесса загрузки...


Ровно тот же скрипт в ручном запуске отрабатывает каждый раз. КАЖДЫЙ. То есть суть проблемы сводится к тому, что NFS-шара не монтируется КАЖДЫЙ раз при загрузке (3 из 3).


ОК, пробуем обратно: пишем в /etc/fstab, и делаем несколько ребутов, контролируя наличие шары после каждого ребута. Монтирование стабильное 4 из 4.

Возвращаемся к исходной проблеме:

ls -a1 /opt >/var/log/listing в /etc/rc.local. (если кого-то волнует, -e в /bin/sh в начале убрано, чтобы не путалось).

Только пустые точки.

ЧТО ЗА ХЕРНЯ?

Ок, гипотеза, проблема в том, когда и как отрабатывает rc.local.

Текущее:

# find /etc/rc*.d -name "*rc.local"
/etc/rc2.d/S20rc.local
/etc/rc3.d/S20rc.local
/etc/rc4.d/S20rc.local
/etc/rc5.d/S20rc.local


Тест: слинукем скрипт в /etc/rc.2d/S20arc. Так делать нельзя, но если очень хочется, то можно, скрипт просто запустится. В выводе обоих скриптов - пустые каталоги.

Ок, грязный хак - пропишем то же самое в /etc/init.d/rc (перед exit 0) и посмотрим, что у нас будет в выводе...

ребутимся, смотрим:

Дважды пустой каталог, один раз "то что надо". Итого, скрипт (rc) запускался трижды. (один раз при нашем предыдущем шатдауне и в S->2 при загрузке).

... А на каком уровне у нас rc.local отрабатывает? Добавляем who -r в вывод скрипта...

run-level 2 Feb 8 23:23 last=S

Ок, имеем следующую проблему: По окончании S маунт не отработал и шары нет. ПО окончании отработки 2, каталог есть. Где-то в середине - его нет.

Но у нас шары монтируются ещё на S-уровне. Не в этом ли причина? Ведь, по-идее, мы должны увидеть шары после S-уровня:
на S-уровне:
S13networking
S14portmap
S15nfs-common
S16mountnfs.sh
S17mountnfs-bootclean.sh

Это стоит проверки. А давайте-ка глянем на вывод в /lib/init/bootclean, есть ли в этот момент шары? По правилам - да, т.к. montnfs ждёт, когда все bg шары подмонтируются, перед переходном на следующий уровень... ребутимся, ага!

Шара-то пустая! А должна быть!

Итого: сбой либо в mountnfs, либо ip-updown.d/nfsmount....

Но почему сбой? Ведь в итоге-то шара подмонтирована? Или это таки чистый race и если мы тут поспим прилично, то оно появится? Стоит проверки. Ставлю слип 60, для вящей уверенности.


Не помогло. В конце bootclean NFS не подмаунчен, даже если учесть 60с паузу. Однако, после логина - всё подмаунчено.


Итак, чудо монтировки (h/l, молчать) происходит где-то на втором уровне.

Что в ассортименте?

S01bootlogs 14portmap S15nfs-common S17rsyslog S18bind9 S18ssh S19cron S20arc.local S20rc.local S20rmnologin S20stop-bootlogd

bootlogs, portmap, nfs-common продолжаются с предыдущего, имеем, что в S20r всё ещё плохо, ок, пробуем в stop-bootlogd.

Ребутимся.

ПУСТО!

Внимание: в /etc/init.d/rc мы фиксировали, что оно запущено.

Что же за фигня? Ведь последним на 2 выполняется S20stop-bootlogd - и у него шары ещё нет.

ОК, поскольку ssh запускается раньше, пробуем залогиниться до окончания загрузки (добавили sleep 360 в stop-bootlogd)

Мистика - с шелла мы его видим. Из скрипта

sleep 360
ls -a1 /opt >/var/log/listing-bootlogd

Есть.

Таймаут в 360 - сила.

Ок, делаем таймаут 60. Аналогично, глазками из ssh, и из скрипта. Традиционно: локально оно на месте,у bootlogd - тоже.

Убираем таймаут (мы это уже делали, но что за херня?)

О! Воспроизводим багу: локально ssh кажет, в скрипте нет.

Ставим таймаут 40

[и про себя гипотеза, что таймаут ни при чём, а дело в какой-то мистике с фактом логина человека разумного]

локально кажет, залогинись до завершения скрипта. Скрипт видит.

То же самое, но не логинимся до завершения скрипта.

Видит. То есть логин ни при чём.

Ок, уменьшаем тайаут. СТавим 20. - видит.

10... без проблем.


[пока гипотеза, что скрипт mountnfs глючный, ибо он ждёт бэкграунд монтирования от nfsmount из ip-updown]

Снова убираем sleep - бага. Радует только то, что строго повторима.


Возвращаем sleep, на этот раз 5. ...хорошо.

Ставим sleep 1 ... хорошо.

Итого, достаточно sleep 1. Очевидный race и баги в nfs-обвзяке.



На этом первичный лог заканчивается, дальше я переползаю в freemind, который потом выложу.
Tags: linux, nfs, грабли
Subscribe

  • Post a new comment

    Error

    default userpic

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 5 comments