it-консалтинг и аутсорсинг
что мы делаем контакты блог

nodename nor servname provided

Кирилл Воронин 22.10.2010

“Добрая гончая собака должна быть средней величины, иметь передние ноги покороче задних, голову толстую и длинный хвост, паче же тонкое чутье и громкий складной голос”.
Ниже абсолютно красноглазая ерунда, недостойная вашего внимания (к тому же, опять про старый Mac OS X 10.5 Server). Опубликовано, на случай, если кто-то нагуглит эту заметку в минуту крайнего отчаяния.

Зато мы (я и мои коллеги) на следующей неделе начнем публиковать на сайте DeepApple целую серию гораздо более сексапильных статей про Mac OS X Server. Тут заметки, как Линус Торвальдс, а там будут, как Моника Белуччи (на фото Линус).


Звонок от клиента. Проблемы с одним из xserve – благодаря торрентам (!!!) переполнился системный диск, после перезагрузки не работает ряд служб.
Администратор нажимает в Server Admin на Start AFP, Stop AFP, кнопочка загорается (или тухнет) и ничего не происходит. Используя чудеса сети Internet, молниеносно приходим к нему на помощь.
Что, в конце концов, делает Server Admin? Да то же самое, что и утилита командной строки serveradmin.

smolensk-2a:~ ladmin$ sudo serveradmin start afp
afp:state = "RUNNING"
afp:status = 0

Хм, сервис как бы запускается, но подключиться нельзя. В списке процессов AppleFileServer не появляется (это нормально, он запустится при подключении первого пользователя),
netstat -na не показывает родной 548 порт в списке портов, которые слушает наша машина.

Ну хорошо, что, в конце концов, делает serveradmin – да просто запускает программу, используя launchd.

smolensk-2a:~ ladmin$ sudo launchctl load -w /System/Library/LaunchDaemons/com.apple.AppleFileServer.plist
getaddrinfo(): nodename nor servname provided, or not known

Хмм! Что бы это значило!
Ну да ладно, что, в конце концов, делает launchd? Запускает программу. Сделаем это руками:

smolensk-2a:~ ladmin$ sudo /usr/sbin/AppleFileServer

Ого, все работает, и, судя по логам, к серверу сразу же подключился кто-то из изголодавшихся пользователей.

Но так дело не пойдет!
Смотрим на AppleFileServer.plist (оставлю только интересующий нас кусочек)

[[code]]czozNTE6XCJzbW9sZW5zay0yYTp+IGxhZG1pbiQgY2F0IC9TeXN0ZW0vTGlicmFyeS9MYXVuY2hEYWVtb25zL2NvbS5hcHBsZS5BcHB7WyYqJl19bGVGaWxlU2VydmVyLnBsaXN0DQombHQ7a2V5Jmd0O1NvY2tldHMmbHQ7L2tleSZndDsNCiZsdDtkaWN0Jmd0Ow0KCSZsdDtrZXkmZ3tbJiomXX10O0xpc3RlbmVyJmx0Oy9rZXkmZ3Q7DQoJJmx0O2RpY3QmZ3Q7DQoJCSZsdDtrZXkmZ3Q7Qm9uam91ciZsdDsva2V5Jmd0Ow0KCQkme1smKiZdfWx0O3RydWUvJmd0Ow0KCQkmbHQ7a2V5Jmd0O1NvY2tTZXJ2aWNlTmFtZSZsdDsva2V5Jmd0Ow0KCQkmbHQ7c3RyaW5nJmd0O2FmcG97WyYqJl19dmVydGNwJmx0Oy9zdHJpbmcmZ3Q7DQoJJmx0Oy9kaWN0Jmd0Ow0KJmx0Oy9kaWN0Jmd0Ow0KXCI7e1smKiZdfQ==[[/code]]

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

Заменим afpovertcp на 548. Снова,
launchctl /System/Library/LaunchDaemons/com.apple.AppleFileServer.plist

Чудеса, все запускается.
Но так дело не пойдет!

Это могло бы быть прекрасным местом для рассказа о DirectoryService и их роли в жизни Mac OS X. Вместо этого скажу спасибо Амиту Сингху и Алексею Проскурякову.
Да, товарищи, дело-то гораздо интереснее, чем не запускающиеся службы!

smolensk-2a:~ ladmin$ telnet localhost afpovertcp
localhost: nodename nor servname provided, or not known

Прибегаем к гуглению (не находим ничего), killall -USR1 Directory Service, tail -f /Library/Logs/DirectoryService/DirectoryService.debug.log, dscacheutil, удаляем (сделав копию) /Library/Preferences/DirectoryService, killall DirectoryService. Ничего не помогает.

Так, что это за индексы? Для чего они? Может что-то произошло с ними при переполнении диска и попытке записи в них? Дата модификации подходит. Удаляем (сделав копию).

smolensk-2a:~ ladmin$ sudo rm /var/db/dslocal/indices/Default/index
smolensk-2a:~ ladmin$ sudo killall DirectoryService

Не помогает.

Так, а что это за странный файл? Для чего он?

smolensk-2a:~ ladmin$ file /var/db/DirectoryService/flatfile.db
smolensk-2a:~ ladmin$ sqlite3 /var/db/DirectoryService/flatfile.db
SQLite version 3.7.2
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> .tables
/etc/aliases                 dsRecTypeStandard:Aliases
/etc/group                   dsRecTypeStandard:Groups
/etc/hosts                   dsRecTypeStandard:Hosts
/etc/networks                dsRecTypeStandard:Networks
/etc/passwd                  dsRecTypeStandard:Protocols
/etc/protocols               dsRecTypeStandard:RPC
/etc/rpc                     dsRecTypeStandard:Services
/etc/services                dsRecTypeStandard:Users
FileTimestamps
sqlite> .quit

О, hosts! О, services! “Предчувствие меня не обмануло!”
Удаляем (сделав копию). Перезапускаем DirectoryService.

smolensk-2a:~ ladmin$ telnet localhost
Trying 127.0.0.1...
telnet: connect to address 127.0.0.1: Connection refused
telnet: Unable to connect to remote host

Ура, все работает!