
В качестве одного из своих увлечений я помогаю людям восстанавливать данные со старых ленточных кассет, например, QIC-80, которые в 90-е годы часто применялись для резервного копирования. Ими пользовались отдельные люди, компании, операторы досок объявлений и не только. К ленточным кассетам я испытываю очень тёплые чувства. Есть нечто особое в том тактильном ощущении, которое возникает, когда держишь эту кассету в руках. Нечто такое, что делает сам процесс её использования приятным, несмотря на все огрехи дизайна, которыми славилась технология QIC. Причём, если вникнуть в процесс и воссоздать все необходимые условия, то данные на этих лентах, даже спустя столько времени, вполне можно восстановить.

Когда мне поручают снять информацию с очередной кассеты QIC-80, я запускаю свою старенькую рабочую станцию, к которой подключён подходящий ленточный накопитель, и загружаю очень старую версию Linux (а именно CentOS 3.5). Только в ней я могу использовать драйвер ядра ftape
, необходимый для взаимодействия с этим накопителем и сброса на ПК двоичного содержимого ленты.
Суть в том, что накопитель подключается к контроллеру дисковода на материнской плате. Этот ловкий хак я реализовал из соображений экономии. Вместо того, чтобы покупать отдельный SCSI-адаптер (стандартный интерфейс для использования ленточных устройств последнего поколения), можно просто подключить накопитель к контроллеру дисковода, который доступен на большинстве ПК. Причём работать он сможет даже параллельно с дисководом — через общий шлейф! Естественно, есть здесь и недостаток — скорость передачи данных ограничена скоростью дисковода, то есть составляет где-то 500 Кб/с (именно килобит).
Ещё один минус в том, что протокол для взаимодействия с этими ленточными накопителями очень небрежный, нестандартный и не особо поддерживается. В итоге я проделал «хак» во всех смыслах. BIOS материнки понятия не имеет, что за устройство к ней подключили, и именно пользовательское ПО должно понимать, как оперировать его портами ввода/вывода, таймингами, прерываниями и прочим, чтобы контроллер отправлял ему правильные команды.

Было создано немного проприетарных инструментов для работы с этими накопителями под MS-DOS и Windows 3.x/9x, и лишь одна опенсорсная реализация под Linux — тот самый ftape
. Естественно, можно использовать для чтения лент оригинальные инструменты DOS/Windows, но лишь ftape
позволяет прочитать «сырое» содержимое, каким бы проприетарным ПО оно ни было изначально записано. Собственно, поэтому я предпочитаю делать дамп содержимого с помощью него и уже потом заниматься декодированием проприетарной структуры данных, извлекая файлы.
Проблема в том, что драйвер ftape
не обслуживается где-то с 2000 года, и из ядра Linux его давно удалили. Вот мне и приходится заводить эту древнюю ОС всякий раз, когда я работаю с одним из таких ленточных накопителей. Круто, если бы ftape
работал в современных дистрибутивах. Это бы обеспечило массу удобств и возможностей.
***
Перейдём ближе к делу. Пару недель назад мне в голову пришла идея обратиться к Claude Code с простым запросом:
> Вот репозиторий, который содержит код драйвера ядра Linux, отвечающего за взаимодействие с устаревшими ленточными накопителями, подключёнными к контроллеру дисковода (FDC) на материнской плате. К сожалению, этот драйвер уже давно не обслуживается и может компилироваться только в ядре версии 2.4. Я хочу модернизировать этот драйвер, чтобы он компилировался с помощью последних версий ядра.
● Я помогу вам модернизировать этот драйвер ядра Linux для устаревших ленточных накопителей. Это серьёзная задача, которая потребует обновить код, чтобы драйвер работал с современными API ядра и отвечал всем последним требованиям.
И спустя несколько итераций доработок Claude выдала мне готовый драйвер ядра, который компилировался без ошибок. Фишка в том, что эта модель может итеративно получать вывод компилятора и вносить необходимые изменения, пока компиляция не завершится успешно. В ходе анализа кода драйвера Claude обнаружила длинный список функций и структур ядра, которые по понятным причинам за период между версией 2.4 и 6.8 устарели или были замещены. Поразительно, но Claude нашла все устаревшие фрагменты и заменила их корректными современными аналогами, потребовав лишь несколько ручных доработок кода (подробнее об этом чуть позже).
Вот только на этом этапе драйвер по-прежнему нужно было компилировать в рамках всего дерева ядра, а я хотел, чтобы он стал отдельным загружаемым модулем. Но и с этим проблем не возникло:
> А можно как-то скомпилировать только этот модуль на месте, не копируя его в дерево исходного кода ядра?
● Да! Вы можете компилировать модули ядра вне дерева, не копируя их в его исходный код. Я создам подходящую отдельную систему сборки для драйвера ftape.
…И создала. Причём без дополнительных промтов. В итоге у меня на руках был загружаемый модуль ядра (.ko
), который я мог начать использовать с реальным железом. Вполне ожидаемо модуль ещё не «работал» — он загружался, но что-то мешало ему корректно взаимодействовать с ленточным накопителем. Я же был настойчив.
Поскольку загрузка/выгрузка модулей ядра требует sudo, с этого момента я больше не мог доверять Claude столь чувствительные операции. К счастью, драйвер ftape уже был щедро усыпан сообщениями логирования (вызовами printk()
, результат которых выводился в dmesg
). Поэтому я загрузил модуль сам и поочерёдно вставлял вывод dmesg
в Claude, чтобы она сравнивала его с заведомо правильным логом dmesg, который я ранее сохранил после успешного чтения ленты. Потребовалось несколько итераций, и Claude нашла оставшиеся фрагменты, которые мешали модулю работать с железом.
● Прекрасно! У модуля есть параметры, которые можно настраивать. Проблема в том, что без настройки все базовые адреса по умолчанию устанавливаются на
-1
, который в функции конфигурации преобразуется в0xffff
, из-за чего обнаружение проваливается.● Ошибка «No such device or address» (ENXIO) возникает, потому что модуль
ftape-internal
не настроен на корректный базовый адрес порта ввода-вывода контроллера дисковода.Проблема крылась в
fdc-internal.c:735-737
: еслиfdc->sra == 0xffff
, возвращается-ENXIO
. А поскольку настройки установлены не были, все значения по умолчанию оказывались–1
, то есть превращались в0xffff
....
Наконец-то у меня был модуль ядра, который мог а) загружаться, б) обнаруживать ленточный накопитель и в) сбрасывать содержимое ленты на ПК.

***
Итак, буквально за пару вечеров мне удалось решить, казалось, безнадёжную задачу по использованию драйвера ftape в современных версиях ядра.
Но есть здесь и важный нюанс. У меня имеется некоторый опыт работы с модулями ядра, и я хорошо разбираюсь в общих принципах языка С, поэтому перехваливать успех Claude в этом сценарии не стану. По факту для получения рабочего модуля потребовалось не три промта, а несколько этапов диалога и ручные правки кода. Без базового понимания внутренней структуры модуля ядра подобная затея оказалась бы невозможной.
Кроме того, в результате этого интересного опыта у меня родилось несколько рекомендаций по использованию современных ИИ-помощников для программирования:
Будьте открыты к полноценному сотрудничеству с этими инструментами.
Работа с Claude Code напоминала реальное сотрудничество с коллегой-разработчиком. Люди часто приводят в сравнение работу с джуниорами, и я думаю, что в целом так оно и есть: модель делает то, что ты ей скажешь, стремится угодить, высказывается самоуверенно, легко извиняется и хвалит тебя за «абсолютную правоту», когда ты указываешь ей на ошибку… В итоге именно ты (человек) всё так же остаёшься ответственным за направление диалога, принятие основных решений, установку архитектурных требований и указание потенциальных проблем на ранних этапах.
Будьте максимально конкретными и используйте в описании задачи термины из предметной области
Я не утверждаю, что являюсь экспертом по промт-инжинирингу, но на моём опыте самыми эффективными оказались запросы, в которых я чётко описывал структуру нужной функции, после чего указывал на недочёты в этой структуре, которые LLM должна была восполнить. (Почему-то на ум ассоциативно приходит образ структуры стволовых клеток, из которых можно вырастить человеческое ухо).
Вырабатывайте интуицию, чтобы понимать, какие именно задачи по силам решить тому или иному агенту
Все эти агенты не волшебные джинны, и они не могут сделать буквально всё, о чём вы их попросите. Если вы дадите модели задачу, для которой её не готовили, то расстроитесь полученному результату и откажетесь от использования этих инструментов, даже не дав им возможности проявить себя. В этом смысле будет полезно изучить принцип работы LLM, чтобы иметь представление об их сильных и слабых сторонах.
Используйте эти инструменты как множитель для ваших собственных навыков
При достаточном желании и усердии я бы мог проделать всю эту модернизацию сам. Но тогда мне бы потребовалось изучить особенности разработки ядра, которые были актуальны 25 лет назад. Пришлось бы несколько недель копаться в документации, которая на сегодня уже является абсолютно бесполезным знанием. Вместо этого я буквально за пару дней в ходе простого диалога добился от агента нужного результата со всеми сопутствующими пояснениями.
Естественно, я проверял и тестировал все вносимые им изменения и попутно освоил много нового, что действительно пригодится мне в будущем. Это и современные соглашения о разработке ядра, и интересные детали об архитектуре x86, и несколько полезных команд терминала, которые я взял на вооруже��ие.
Используйте эти инструменты для ускоренного знакомства с новыми фреймворками
Я совсем не разработчик ядра, но опыт с апгрейдом драйвера разжёг во мне интерес к этому направлению. Да и по факту программирование ядра вовсе не такая сложная задача, как может показаться. У меня был ещё один эпизод вайб-кодинга, не связанный с этим. В нём я создал приложение Flutter, не имея опыта работы с этим фреймворком. Если вы, как и я, предпочитаете учиться на практике, то эти инструменты сильно ускорят освоение новых фреймворков, освободив время для более высокоуровневого продумывания архитектуры.
***
Как бы то ни было, оглядываясь назад, я могу с удовлетворением сказать, что ftape получил вторую жизнь! Спустя 25 лет со своего последнего официального релиза, он снова может компилироваться и стал пригоден для использования в современных системах Linux. Я ещё продолжаю вносить в него некоторые доработки, но уже убедился, что он отлично работает с ленточными накопителями из моей коллекции, а также с приводами, подключающимися к параллельному порту, которые он тоже поддерживает.

Физическая схема подключения осталась очень похожей, но в качестве ОС теперь используется Xubuntu 24.04, а не CentOS 3.5.
До встречи!
Комментарии (3)
hddscan
12.09.2025 15:19Суть в том, что накопитель подключается к контроллеру дисковода на материнской плате. Этот ловкий хак я реализовал из соображений экономии.
о да
Вместо того, чтобы купить SCSI Adaptec 2940 за страшные $20, мы будем трахаться с написанием драйвера под старое железо. Э- Экономия
MaFrance351
12.09.2025 15:19Автор тут имел в виду, что были стримеры, которые с завода рассчитаны на подключение к контроллеру флоппика. Были такие бюджетные (практически SOHO-уровня) аппараты. Когда-то я писал про них.
В своё время была куча проприетарного софта под DOS для работы с ними. И вот задача автора оригинала как раз в восстановлении данных с записанных на таких стримерах кассет.
sintech
Вот когда KDE под Freebsd он сможет пропатчить, тогда мы и получим AGI.