bash.im ithappens.me zadolba.li
9671

Пляски с бубном под дудку начальства

Есть у нас на предприятии лазерный принтер формата А3, верой и правдой служащий с конца девяностых. Сам принтер работает без особых глюков, расходники добывать пока удаётся. По нелепому стечению обстоятельств аппарату не хватало одной буквы в конце названия, чтобы иметь свой собственный Ethernet-порт, а поддержка сети ему жизненно необходима ввиду очень разношёрстного и склочного коллектива отдела, в котором он эксплуатируется. Вовремя нужный модуль расширения купить не успели, аппаратные принт-серверы тогда стоили дюже дорого. В результате аппарат оказался подключён к скромному Pentium-233, который в течение какого то времени исполнял роль общественной печатной машинки, а затем был вообще заброшен. Работал комп под управлением Win98, но так как полноценно его никто не использовал, в IT-отдел он попадал только во время эпидемий сетевых червей.

Некоторое время назад случилось страшное: уволился человек, который каждый вечер штатно выключал эту машинку. Остальным сотрудникам было лень возится, и они начали тушить компьютер с кнопки, что в случае системного блока AT означало каждодневное нештатное завершение работы системы. Win98 такие шутки понимал плохо, в результате чего машинка начала приезжать к нам на ремонт с интервалом в пару недель. Неисправности, естественно, однотипные: разрушение файловой системы, разрушение реестра или всё сразу.

Очередной приезд машины сопроводился очень неприятной «телегой» на весь IT-отдел. Объясниться перед руководством оказалось просто, а вот вразумить пользователей не удалось. В результате мне была поставлена задача: сделать так, чтобы всё работало, несмотря на неадекватность пользователей, однако денег на покупку даже самого дешёвого принт-сервера выделено не было.

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

Я отыскал микродистрибутив, занимающий в минимальной конфигурации под 20 МБ, но при этом с полноценной поддержкой сети и возможностью прикрутить CUPS. Установленная система на диске держала только папку BOOT и два архива: в первом корневая файловая система, во втором опциональные модули и файлы настроек. Такая конфигурация позволяла монтировать жёсткий диск только на чтение, следовательно, при аварийном завершении работы ничего страшного не происходило.

На виртуальной машине всё отработало как по учебнику, но установка на реальную машину оказалась делом куда более интересным. Сначала я опробовал штатный способ установки. Созданный раздел оказался повреждён и не подлежал восстановлению, загрузчик не установился. Создал разделы вручную и подсунул их инсталлятору — результат был аналогичен предыдущей попытке. Оказалось, что на реальной древней машине инсталляционный скрипт криво создаёт разделы, а при установке загрузчика в MBR убивает даже те, что есть. На более современном компьютере с тем же винтом всё устанавливалось без единого косяка, из чего я сделал вывод: инсталляционный скрипт считает, что любая машина обязана понимать, что такое LBA32, а BIOS материнки искренне думает, что LBA28 (а может, и что подревнее) — до сих пор самый модный метод адресации.

Уменьшение размеров загрузочного раздела до 50 МБ ситуацию не облегчало. Возня с мануалами ни к чему не привела. Способ объяснить загрузчику метод адресации явно существовал, но за давностью лет упоминаний о нём было мало. В конце концов я нашёл другое решение: поставить на машину полноценный дистрибутив линукса, который точно работает на подобных материнках, подсадить к нему в конфигурацию загрузки файлы микродистрибутива, а потом удалить всё лишнее.

Инсталляционный скрипт полноценного дистрибутива подтвердил, что BIOS, несмотря на обновление до последней версии, дико крив, и для установки загрузчика будет использован какой то очень коварный метод. По завершении всех манипуляций я больше удивился не тому, что всё загрузилось, а тому, что двухгиговый винт начал определятся в BIOS (причём на любой машине) как 524-метровый, причём после загрузки системы оказывалось, что реальная ёмкость диска всё-таки 2 ГБ.

Обрадованный победой, закинул на место подготовленные конфиги и стал пытаться достучаться до CUPS по сети. Интерфейс оказался недоступен, в списке процессов соответствующего демона не наблюдалось, в логах ошибок ничего подозрительного не нашлось. Как только винт был переставлен обратно на более свежую машину, CUPS запустился. Оказалось, создатели этого чудо-дистрибутива затолкали в него самую распоследнюю версию CUPS, да ещё и откомпилированную под 686 архитектуру. Зачем в микродистрибутив пихать модуль, минимальные требования которого серьёзно круче всего остального хозяйства, для меня до сих пор загадка.

Разбираться, как собирать опциональные модули для этого микрочуда, было уже выше моих сил. В куче хлама отрыл AT-материнку под Pentium II и соответствующий процессор. Вся возня с загрузчиком оказалась напрасной: на эту мать всё встало без особых проблем.

Но это был не конец приключений. CUPS не имел встроенных драйверов на нужный принтер, а значит, нужно было искать подходящий PPD-файл. На сайте изготовителя принтера рекомендовалось взять его из виндовых драйверов PostScript. Файл быстро нашёлся, однако CUPS заявил о том, что не может его использовать по непонятным причинам. Правильным решением оказалось взять этот файл из драйверов под Mac OS.

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