Назад | Перейти на главную страницу

При установке пакета в другое место с помощью dpkg без прав root возникают ошибки с разрешениями.

Я использую командную строку

dpkg --force-not-root --root  /some/other/location -i the_package.deb

но я получаю ошибку

dpkg: could not open log '/var/log/dpkg.log': Permission denied

Я ожидал, что журнал будет записан на

/some/other/location/var/log/dpkg.log

С помощью rpm вы можете создать альтернативную базу данных, но я не вижу, как это сделать с помощью dpkg. Чтобы добраться до вышеуказанного состояния, я вручную добавил (возможно, не самый мудрый подход) следующее.

mkdir -p /some/other/location/var/lib/dpkg/updates
mkdir -p /some/other/location/var/lib/dpkg/triggers
mkdir -p /some/other/location/var/lib/dpkg/info
touch /some/other/location/var/lib/dpkg/status
touch /some/other/location/var/lib/dpkg/available

Если я попытаюсь запустить как root, чего я бы предпочел не делать в этом случае

sudo dpkg --force-not-root --root  /some/other/location -i the_package.deb

он идет дальше и устанавливает deb в моем альтернативном месте, но затем терпит неудачу с

dpkg (subprocess): unable to execute installed post-installation script (/var/lib/dpkg/info/the_package.postinst): No such file or directory

но этот файл был записан приведенной выше командой dpkg в

/some/other/location/var/lib/dpkg/info/the_package.postinst

Я считаю, что не использую базу данных dpkg для машин, потому что это программное обеспечение, устанавливаемое на сетевой диск, доступное нескольким пользователям. Возможно, лучшим подходом будет просто извлечение содержимого пакета и установка вручную. Конкретный программный пакет не имеет перечисленных внешних зависимостей.

Программа управления пакетами Debian 'dpkg' версии 1.18.2 (amd64)

Использовать --log=filename чтобы изменить место входа.

Если вы используете --root=/foo вам нужно настроить /foo как действующий корень. Например., sudo chroot /foo /bin/sh работает.

«Нет такого файла или каталога» означает, что the_package.postinst скрипту требуется что-то, чего нет в chroot (скорее всего /bin/sh и множество других вещей). Это запускается изнутри chroot, поэтому вы не видите /foo в пути.

Вы могли бы использовать --no-triggers для предотвращения срабатывания триггеров. Однако теперь вы должны увидеть, во что это превращается. dpkg сильно склонен думать, что вы хотите запустить пакет на машине, на которой вы его устанавливаете, а корневая файловая система находится в /.

«[J] Просто извлеките содержимое пакета и установите его вручную». Да, похоже, вы устанавливаете его на файловый сервер, который не предназначен для его запуска.

Изменить: хотя это строго решает вашу проблему, «современный» метод распространения программного обеспечения заключается в использовании программного обеспечения для оркестрации (например, chef) для установки пакетов непосредственно на клиентах, а не совместного использования программного обеспечения через файловый сервер. Диски дешевые.