Сохранить файлы, сгенерированные RPM, после перезапуска rpm -e

Можно ли сохранить содержимое RPM в файловой системе после удаления?

По сути, я не хочу стирать файлы, созданные RPM, когда кто-то запускает rpm -e, но все же удалить пакет из списка установленных RPM. Я хочу вручную удалить свое приложение с сервера и не могу найти способ сделать это.

Заранее спасибо.


person Daddou    schedule 03.05.2012    source источник
comment
Что вы подразумеваете под «сохранением» RPM-контента? Вы установили с помощью rpm -i package.rpm, это, по сути, «извлекает» содержимое пакета в нужные места в вашей системе. Сам package.rpm остается на месте. Когда вы делаете rpm -e package (не package.rpm), это, по сути, «удаляет» то, что было извлечено ранее. Файл пакета остается нетронутым.   -  person ArjunShankar    schedule 03.05.2012
comment
Да, я хотел знать, можно ли сохранить извлеченные файлы в файловой системе после rpm -e. Я хочу иметь возможность удалять их вручную.   -  person Daddou    schedule 03.05.2012
comment
Не лучше ли не запускать rpm -e? Когда я запускаю rpm -e, я хочу удалить файлы. Вы бы нарушили «принцип наименьшего удивления», если бы ваши обороты были в чем-то особенными. Например, системные администраторы были бы очень раздражены этим.   -  person ArjunShankar    schedule 03.05.2012
comment
Что мне делать, если я хочу переустановить RPM, но сохранить старый контент? Обновление все равно удалит старые файлы.   -  person Daddou    schedule 03.05.2012
comment
Чтобы было ясно, поведение, которое вы хотите, следующее: когда кто-то запускает rpm -e для удаления вашего пакета в системе, где он установлен, вы не хотите удалять файлы, но вы хотите, чтобы пакет для удаления из системного списка установленных пакетов. Если это так, я думаю, вам следует специально отредактировать и упомянуть об этом в своем вопросе. Там непонятно. Во всяком случае, как я уже сказал, звучит как плохая идея для меня (если это вообще возможно)   -  person ArjunShankar    schedule 03.05.2012
comment
Контент меняется после установки? Если да, то где этот контент находится после установки? Что это за контент?   -  person ArjunShankar    schedule 03.05.2012
comment
Это именно то, что я хочу, да. Я перефразирую свой вопрос, чтобы было понятнее.   -  person Daddou    schedule 03.05.2012
comment
Вы можете рассказать о том, почему вы хотите это сделать. Последние несколько ваших комментариев о переустановке звучат так, как будто вы делаете это для решения какой-то другой проблемы. Также: Контент меняется после установки? Если да, то где этот контент находится после установки? Что это за контент?   -  person ArjunShankar    schedule 03.05.2012
comment
Контент представляет собой просто приложение PHP, упакованное в пользовательский RPM. Я не могу иметь две установки, работающие параллельно, поэтому я обязан удалить свой старый RPM перед развертыванием нового. Но я хочу заархивировать все свои установки на случай, если что-то пойдет не так. Я не могу этого сделать, когда rpm -e удаляет мои старые файлы, и я не могу удалить rpm из списка установленных пакетов без него.   -  person Daddou    schedule 03.05.2012
comment
@Daddou Вы можете сохранить установленные файлы где-нибудь перед удалением. В качестве альтернативы просто сохраните старый RPM, с помощью которого вы сможете восстановить старое состояние.   -  person glglgl    schedule 05.05.2012
comment
То, что вы хотите, неправильно на многих уровнях. rpms должны быть спроектированы так, чтобы никогда не касаться файлов/каталогов, которые были изменены после установки. И приложение должно помещать динамические данные в правильные каталоги (скорее всего /var). Конечно, никогда в /usr. Файлы конфигурации помещаются в /etc и помечаются как %config в файлах спецификаций... Этот список можно продолжить.   -  person Stan    schedule 09.05.2012


Ответы (3)


Создание спецфайла

С этой точки зрения, как создатель пакета, вы можете помечать файлы как конфигурации. У Джона Уорбрика из Кембриджского университета есть хороший обзор различных маркировок файлов. которые можно использовать в спецификации RPM, и как они ведут себя во время обновления.

Файлы с пометкой %config, если они были изменены, это:

  • оставлен после удаления, но переименован с расширением .rpmsave
  • не изменяется при обновлении или переустановке, но копия полезной нагрузки устанавливается с расширением .rpmnew

Warbrick не занимается прямым удалением пакетов: если файл с пометкой %config неизменен, при удалении пакета этот файл будет удален. (Помните, что согласно порядку скриптлетов RPM, RPM update или переустановка начинается со стирания старого пакета до того, как будут установлены новые файлы. То есть старая неизмененная конфигурация заменяется новой конфигурацией.)

Было бы злоупотреблением классификацией файлов RPM пометить что-то %config, что на самом деле не является конфигурацией. Это важно, потому что системные администраторы должны иметь возможность доверять полезной нагрузке пакета. Кроме того, вы, вероятно, не хотите, чтобы такой файл был переименован с расширением.

Ваша лучшая надежда — создать файл во время RPM %post. Файлы, скопированные в файловую систему в %install, проверяются по списку %files и сохраняются в базе данных RPM, но файлы, созданные в %post, не проверяются. Опять же, это злоупотребление форматом файла спецификации RPM, но если вы упомянете об этом в %description и любой другой документации, особенно если это логически ожидаемое поведение в контексте вашего пакета, вы < em>может быть получить некоторое сочувствие.


Существующие пакеты

Для системных администраторов, желающих удалить пакет, не удаляя его полезную нагрузку, вы используете rpm --justdb. Сначала проверьте список файлов:

# rpm -ql $PACKAGE | tee $PACKAGE.payload
[rpm returns list of files, tee saves it in the file $PACKAGE.payload]

# rpm -e --justdb $PACKAGE

(На этом этапе вы можете получить жалобу на отказ, поэтому повторите с --nodeps, если необходимо.)

И, наконец, проверьте, что пакет пропал, но полезная нагрузка осталась:

# rpm -q $PACKAGE
package $PACKAGE is not installed
# ls -l $(<$PACKAGE.payload)
[ls queries list of files saved in $PACKAGE.payload]

(Или для более надежного ls, если имена файлов содержат пробелы, что было бы недобросовестно в RPM.)

# cat $PACKAGE.payload|xargs -d '\n' ls -l

Другие наблюдения

Обратите внимание, что для пакета, созданного с использованием метода, описанного в верхней части моего ответа, попытка перечислить файлы, которыми он владеет, с помощью rpm -ql $PACKAGE не покажет эти постоянные файлы. Еще одним последствием сброса файлов во время %post является то, что другой пакет, который "владеет" этими файлами, может неожиданно перезаписать их - они не указаны в базе данных RPM, поэтому они не защищены.

Два метода, которые я описал, нарушают лучшие практики как для создания пакетов RPM, так и для системного администратора. Пожалуйста, будьте очень осторожны при использовании этого опасного "небольшого знания". Может быть, есть что-то еще, что вы могли бы сделать, чтобы создать желаемую ситуацию.

(Наконец-то я знаю, что это вопрос четырехлетней давности. На него не было ответа. Он требовал ответа. Ура.)

person Rich    schedule 12.05.2016
comment
Возможно, помогите о неправильном использовании %config: fedoraproject.org/wiki/PackagingDrafts/Logfiles - person Onilton Maciel; 19.09.2018

rpm -e --repackage package_name удалит повторно устанавливаемую копию в /var/spool/repackage. Вы можете извлечь из этого rpm, используя rpm2cpio, если вам нужны эти файлы обратно по отдельности.

person Aaron D. Marasco    schedule 05.05.2012
comment
Теоретически да. Но AFAIR это оставляет RPM с неправильными контрольными суммами или что-то в этом роде. (По крайней мере, когда-то был соответствующий выпуск...) - person glglgl; 05.05.2012
comment
Этого я не слышал, но да, если OP изменил файлы, их контрольные суммы (и временные метки и т. д.) были бы недействительными при проверке rpm при установке или при извлечении. - person Aaron D. Marasco; 05.05.2012

Одно из преимуществ RPMS именно в этом: вы можете легко деинсталлировать (удалить) все файлы. Если вы хотите установить файлы, предоставляемые RPM, вручную, просто распакуйте RPM как root с помощью:

cd / && rpm2cpio *.rpm | cpio -idmv

Это не очень хорошая идея, но вы можете распаковать RPMS в другом месте (например, в ${HOME}), и это очень полезно. Однако вам может потребоваться настроить некоторые переменные среды. Вы не загрязняете базу данных RPM, но по-прежнему используете содержимое RPM. Конечно, ваше приложение может сломаться из-за системных обновлений, потому что оно не защищено зависимостями. В любом случае, именно так вы «устанавливаете» и RPM, если вы не root. Удаление также легко (если путь установки выбран соответствующим образом).

person marcindulak    schedule 14.06.2012