Преобразование пакетов RPM для Debian не выполняется «из-за метасимволов оболочки»
Я пытаюсь преобразовать RPM-пакеты MegaRAID Storage Manager в пакеты debian dep. Для этого я использую пакет Alien, как описано здесь:
https://hosting-tutorials.co.uk/tutorials/linux/installing-megaraid-storage-manager-on-debian
Это пакет, который я пытаюсь преобразовать:https://docs.broadcom.com/docs-and-downloads/17.05.06.00_MSM_Linux-x64.zip
Пакет «lib-utils2_1.00-12_all» нормально преобразуется в .deb, но «MegaRAID_Storage_Manager-17.05.06-00.noarch.rpm» — нет:
# alien --scripts *.rpm
lib-utils2_1.00-12_all.deb generated
Package build failed. Here's the log:
dh binary
dh_update_autotools_config
dh_autoreconf
create-stamp debian/debhelper-build-stamp
dh_testroot
dh_prep
debian/rules override_dh_auto_install
make[1]: Entering directory '/root/MSM/disk/MegaRAID_Storage_Manager-17.05.06'
mkdir -p debian/megaraid-storage-manager
# Copy the packages's files.
find . -maxdepth 1 -mindepth 1 -not -name debian -print0 | \
sed -e s#'./'##g | \
xargs -0 -r -i cp -a ./{} debian/megaraid-storage-manager/{}
make[1]: Leaving directory '/root/MSM/disk/MegaRAID_Storage_Manager-17.05.06'
dh_installdocs
dh_installchangelogs
dh_perl
dh_usrlocal
dh_usrlocal: error: Cannot generate a correct shell script for /usr/local/MegaRAID Storage Manager due to shell metacharacters
make: *** [debian/rules:7: binary] Error 25
Я не знаю, как исправить ошибку «Невозможно создать правильный сценарий оболочки для /usr/local/MegaRAIDStorageManager из-за метасимволов оболочки», и буду признателен за любую помощь.
Я пробовал хосты Debian 10 и Debian 11, все Arch amd64 и запущенную оболочку «bash». Я также попробовал оболочку «sh».
2 ответа
TL;DR: пробелы и другие метасимволы не поддерживаются для каталогов, которые будут находиться в файлах .
содержит пробелы. Очевидно, что этот пакет не соответствует передовой практике в мире *nix (вина в этом LSI/Broadcom).
Вместо этого вы можете конвертировать чужеродный файл в tar или извлечь его напрямую, используяrpm2cpio
, выяснить, как используются и подходят сценарии установки, чтобы увидеть, как их повторно использовать, при необходимости посмотреть, можно ли переименовать каталог с пробелами, если любую ссылку на него также можно легко заменить, и напрямую собрать двоичный пакет, используяdpkg-deb -b
который не будет затронут такой проблемой, но создаст пакет, не соответствующий политике Debian.
пояснения ниже...
Политика Debian требует, чтобы пакет не устанавливал ничего, кроме некоторых каталогов, косвенным методом:
9.1.2. Программы для конкретного сайта
Согласно требованиям FHS, пакеты не должны помещать какие- либо файлы в файлы .
dpkg
или манипулируя ими в сценариях сопровождающего.Однако пакет может создавать пустые каталоги ниже , чтобы системный администратор знал, где размещать файлы, специфичные для сайта. Это не каталоги в , а дочерние каталоги в . Эти каталоги (
/usr/local/*/dir/
) следует удалять при удалении пакета, если они пусты.Обратите внимание, что это относится только к каталогам ниже , а не к каталогам .
[...]
Таким образом, этот пакет в любом случае не может быть совместимым, например файл/usr/local/MegaRAID Storage Manager/startmonitorhelp.sh
не соответствует требованиям: это файл, упакованный где-то в/usr/local
.
alien
используетпомощник сборки для автоматического преобразования (по-прежнему совместимых) каталогов для добавления в сценарии сопровождающего (т. е. в Debianpreinst
,postinst
и т. д. скрипты, которые заархивированы отдельно в архиве .deb ar и будут храниться в/var/lib/dpkg/info/
позже), который затем выполнит несколькоmkdir
команды при установке:
dh_usrlocal
— это программа debhelper, которую можно использовать для сборки пакетов, которые при установке предоставляют подкаталог в /usr/local .Он находит подкаталоги usr/local в каталоге сборки пакета и удаляет их, заменяя фрагментами сценариев сопровождающего (если только
-n
используется) для создания каталогов во время установки и удаления их при удалении пакета в соответствии с политикой Debian. Эти фрагменты вставляются в сценарии сопровождающегоdh_installdeb
.
Содержание/usr/bin/dh_usrlocal
Perl-скрипт включает в себя:
# Detect some obvious cases of "this will not end # well". We rely on what "while read dir ... ; do" # can handle for correctness. if ($fn =~ m{[\s!'"\$()*#;<>?@\[\]\\`|]}) { error("Cannot generate a correct shell script for $fn due to shell metacharacters"); }
\s
это означает, что любой пробел в PCRE является частью запрещенных метасимволов и вызывает ошибку при синтаксическом анализе./usr/local/MegaRAID Storage Manager
.
Потратив слишком много времени на попытки обойти вышеуказанные проблемы, понял, что существует
rpm
пакет, который можно установить
Потом просто побежал:
rpm -i MegaRAID_Storage_Manager-17.05.06-00.noarch.rpm --nodeps
/etc/init.d/vivaldiframeworkd start
Вроде работает, в системном журнале появилось как минимум два сообщения:
Jan 10 21:03:21 Xba MR_MONITOR[214454]: <MRMON044> Controller ID: 0 Time established since power on: Time 2023-01-08, 05:11:32 33 Seconds
Jan 10 21:03:51 Xba MR_MONITOR[214454]: <MRMON044> Controller ID: 0 Time established since power on: Time 2023-01-10, 21:03:51 255169 Seconds
Теперь нужно установить xterm и xpra, чтобы я мог попробовать запуститьsu -c /usr/local/MegaRAID Storage Manager/startupui.sh
... вы все тоже так делаете?
Ну, я не смог запустить его с последней установленной версией Java 17, поэтому я установил Java 11 и добился немного большего успеха... Вам нужно добавить следующее в:
JRE_HOME="/usr/lib/jvm/java-11-openjdk-amd64"
export JRE_HOME
Окно MSM откроется, но сеанс X завершится, как только я войду в систему... это могут быть проблемы с моей стороны с моими библиотеками GTK или что-то в этом роде. Я постараюсь получить больше журналов позже. Я также попробовал использовать старую версию Java 8 от Adoptium. В этом случае я использовал:
JRE_HOME="/usr/lib/jvm/jdk8u352-b08-jre"
export JRE_HOME
но это не помогло. Теперь, когда я бегуstartupui.sh
Я просто вижу черное окно, попробовал перезапустить платформу Vivaldi (на самом деле это требуется каждый раз, когда вы меняете версию Java, поскольку она использует/etc/init.d/msm_profile
для запуска).
Надеюсь, вам повезет больше, чем мне, дайте нам знать, как все прошло!