Почему мой пакет deb, созданный вручную, не удается установить из-за невозможности создания файлов?

Я сделал Perl-скрипт, который создает двоичный пакет deb с нуля. Я создал данные, элементы управления и т. Д. Но когда я запускаю dpkg -i в моем пакете deb, он жалуется, что не может получать файлы из данных. Пример: невозможно создать '.dpkg-new' (во время обработки ''): нет такого файла или каталога.

Я загрузил несколько пакетов .deb, чтобы посмотреть, и они не используют сценарий preinst для создания структуры каталогов.

Я думаю, что делаю что-то не так, я считаю, что нужно создавать свои собственные каталоги в preinst, но это кажется неправильным ... возможно, я что-то упускаю?

Должен ли я создавать каталоги, в которые мои файлы с данными будут копироваться в preinst sh, или dpkg должен это делать, а я делаю что-то не так?


person 19021programmer    schedule 30.12.2010    source источник


Ответы (5)


Не следует пытаться вручную создать двоичный пакет .deb. В Руководстве для новых сопровождающих Debian рассказывается, как начать создание пакета Debian с использованием правильных инструменты.

Ваш созданный вручную пакет может показаться вам правильным, но поскольку он не устанавливается, он явно испорчен либо незначительным образом, который вы не заметили, либо более серьезным образом, который вам не виден (например, большинство людей не понимают .deb на самом деле является архивом ar).

person Arrowmaster    schedule 22.01.2011
comment
Сказать «не делай этого» на самом деле не решает проблему желания знать, как работает dpkg. - person Gavin Brock; 19.01.2012

У меня была такая же проблема с написанным мной сценарием Ruby.

Я создавал список файлов для передачи в tar при создании архива data.tar.gz. Когда я разархивирую и распаковываю архив вручную, он сдувается нормально, но dpkg не работает.

Оказывается, список файлов также должен включать все создаваемые каталоги.

Обратите внимание, что при создании data.tar.gz я построил его с почти теми же параметрами, что и dpkg-deb / build.c в исходном коде dpkg-1.15.8.11.

execlp(TAR, "tar", "-cf", "-", "--format=gnu", "--null", "-T", "-", "--no-recursion", NULL);

Вместо этого я использовал

IO.popen("gnutar -czf - --format=gnu -T - --no-recursion", "r+")

person simulacre    schedule 19.01.2012

Помимо того, что сказал @Arrowmaster, проверьте http://www.debian.org/doc/debian-policy/ для более подробного описания файлов. После сборки самого пакета вы можете проверить его с помощью lintian инструмента, чтобы увидеть, есть ли что-нибудь очевидное, что вы могли пропустить.

person viraptor    schedule 22.01.2011

Если кто-то ищет решение проблемы:
«Создайте пакет deb из файла спецификации rpm».
Посмотрите здесь http://www.deepnet.cx/debbuild/

Я сделал свой собственный сценарий сборки Perl намного проще, чем упомянутый, поэтому я могу легко его поддерживать.

Некоторые полезные знания, полученные в процессе:
0. deb - это архив ar, содержащий 3 файла, порядок файлов важен.
1. сценарии из control.tar.gz должны быть выполнены исполняемыми.
2. Хорошо иметь сценарий предварительной установки для создания каталогов, если каталоги не существуют.
3. Иногда dpkg решает разархивировать ваши zip-архивы (это происходило, если zip-архив был единственным файлом в data.tar. gz), так что проверьте это в сценарии postinstall.
4. Когда вы используете tar.gz, некоторые файлы обязательно переместите chmod в каталог, который содержит структуру каталогов для вашего tar.

person 19021programmer    schedule 02.02.2011

Для этого есть масса причин. Вам действительно нужно запустить:

dpkg -i -D1110 mydeb.deb

И опубликуйте результат, чтобы иметь любую надежду, что кто-то сможет решить проблему.

person Doug    schedule 20.06.2012