[ПРОЙДЕН] pacman: квест (драконий уровень)

vs220
ну да, такое есть... в таком случаи я брал только первое, возможно в некоторых случаях это будет критично((
но таких пересечений в официальном репозитории не так уж и много.

vs220
Не уверен но вроде есть пакеты только с конфигами
вполне возможно, но я не встречал
Ошибки в тексте-неповторимый стиль автора©
Я бы, в случае аналогичной проблемы и отсутствия файла pacman.log проделал бы все проще.
Приведу подробный разбор, возможно что то похожее когда-нибудь и пригодится.
Делаю на системе при наличии данных папок - но если бы они были удалены и после этого ничего бы на диск не записывалось, то принцип тот же самый - информация на диске не пропала, исчезли просто имена файлов, а информация вся на месте.
Главное узнать начало файлов /var/lib/pacman/local/<paket>/desc, у которых первые две строчки равны
%NAME%
<paket>
Узнать можно используя дисковый редактор, например, DMDE, а можно и методом тыка (интуитивно) - правда не всегда все так гладко, нужен опыт и интуиция. Но мы все-таки попробуем данный способ.
Итак, приступим.
Предположение - так как файлы находятся в директории /var/lib/pacman/, то разумно предположить, что номера блоков с файлами будут поблизости от блока с инодой, соответствующей директории /var/lib/pacman/ - или после или до ...
Узнаем иноду /var/lib/pacman
stat /var/lib/pacman | grep Инода
Устройство: 803h/2051d Инода: 1835014 Ссылки: 4
Узнаем блок занимаемый иноде 1835014
sudo debugfs -R "blocks <1835014>" /dev/sda3
7348261 ….. (7348261*4096=30098477056)
Начинаем поиск методом тыка - начнем поиск со смещения 30098477056
sudo hexdump -C -s 30098477056 -n 1000K /dev/sda3 | grep %NAME%
…. мимо ….. пробуем увеличим выборку (добавим 1 нолик)
sudo hexdump -C -s 30098477056 -n 10000K /dev/sda3 | grep %NAME%
…. опять мимо, пробуем опять увеличим выборку (добавим еще 1 нолик)
sudo hexdump -C -s 30098477056 -n 100000K /dev/sda3 | grep %NAME%
708023000  25 4e 41 4d 45 25 0a 66  6f 72 65 6d 6f 73 74 0a  |%NAME%.foremost.|
708025000  25 4e 41 4d 45 25 0a 68  61 72 66 62 75 7a 7a 2d  |%NAME%.harfbuzz-|
70802a000  25 4e 41 4d 45 25 0a 6c  69 62 65 76 64 65 76 0a  |%NAME%.libevdev.|
………. и так далее ……
Поймали, уточняем с количеством пакетов
sudo hexdump -C -s 0x708023000 -n 1000K /dev/sda3 | grep %NAME% | wc -l
44
sudo hexdump -C -s 0x708023000 -n 10000K /dev/sda3 | grep %NAME% | wc -l
361
sudo hexdump -C -s 0x708023000 -n 100000K /dev/sda3 | grep %NAME% | wc -l
661
sudo hexdump -C -s 0x708023000 -n 200000K /dev/sda3 | grep %NAME% | wc -l
661
Можно и остановится, значение 661 не увеличивается - ну и делаем вывод в файл
sudo hexdump -C -s 0x708023000 -n 100000K /dev/sda3 | grep %NAME% > ~/pkg.txt
Но неплохо бы проверить до смещения 30098477056, пробуем
sudo hexdump -C -s 30100000000 -n 100000K /dev/sda3 | grep %NAME%
708023000  25 4e 41 4d 45 25 0a 66  6f 72 65 6d 6f 73 74 0a  |%NAME%.foremost.|
708025000  25 4e 41 4d 45 25 0a 68  61 72 66 62 75 7a 7a 2d  |%NAME%.harfbuzz-|
70802a000  25 4e 41 4d 45 25 0a 6c  69 62 65 76 64 65 76 0a  |%NAME%.libevdev.|
Отловили ту же самую строку
708023000 25 4e 41 4d 45 25 0a 66 6f 72 65 6d 6f 73 74 0a |%NAME%.foremost.|
Будем считать, что ДО ничего нет.

Приступим к обработке полученного файла ~/pkg.txt - преобразуем его в удобный вид
Удаляем все до фразы "*%NAME%.", включая саму фразу
sed 's|.*%NAME%.||' ~/pkg.txt > ~/pkg1.txt
Удаляем все после точки, включая саму точку (если точки нет, останется символ | , означающий что имя файла не полное
sed -r 's/\..+//' ~/pkg1.txt > ~/pkg2.txt
Получили файл следующего вида
cat ~/pkg2.txt | head -3
foremost
harfbuzz-|
libevdev

PS - Остается дополнить полное имя опредеденных пакетов, которых 286 штук
grep "|" ~/pkg2.txt | wc -l
286
Но делается это легко - пример
cat ~/pkg.txt | grep harfbuzz
708025000 25 4e 41 4d 45 25 0a 68 61 72 66 62 75 7a 7a 2d |%NAME%.harfbuzz-|
7085f3000 25 4e 41 4d 45 25 0a 68 61 72 66 62 75 7a 7a 0a |%NAME%.harfbuzz.|
и уточняем полное имя пакета
sudo hexdump -C -s 0x708025000 -n 32 /dev/sda3
708025000 25 4e 41 4d 45 25 0a 68 61 72 66 62 75 7a 7a 2d |%NAME%.harfbuzz-|
708025010 69 63 75 0a 0a 25 56 45 52 53 49 4f 4e 25 0a 32 |icu..%VERSION%.2|
то есть полное имя пакета harfbuzz-icu

Как то так - вообщем то и не долго.
Ошибки не исчезают с опытом - они просто умнеют
vasek, пакеты могут достаточно часто добавляться/удаляться, твой вариант может восстановить и то что не нужно (было удалено).
Псевдографический инсталлятор Arch Linux ver. 3.8.2
Благодарности принимаются на ЯД 410012815723874
nafanja
твой вариант может восстановить и то что не нужно (было удалено).
Согласен, но это уже издержки. Другого простого и лучшего пути не вижу.
Насколько я понимаю в данном случае важна информация и, конечно не 100% , о пакетах, стоящих в системе.
Плюс к этому, не забываем, что здесь будут и пакеты, установленные как зависимости других пакетов.

PS - Просто привел в качестве примера, как можно восстановить определенную информацию (и даже файлы) ручным методом.
Ошибки не исчезают с опытом - они просто умнеют
Погуглил на en - оказывается есть Wiki Pacman/Restore local database - привожу цитату из нее
Firstly, make sure pacman's log file is present:
$ ls /var/log/pacman.log
If it does not exist, it is not possible to continue with this method. You may be able to use "Xyne's package detection script" to recreate the database. If not, then the likely solution is to re-install the entire system.
PS - скрипт Xyne's package detection script

EDIT 1 - рекомендую заглянуть в китайскую и японскую версии Wiki - есть отличия
Ошибки не исчезают с опытом - они просто умнеют
indeviral
Ну если вы уверены что в .log есть все пакеты то парсер написать в принципе не проблема.
ну а почему бы им там не быть, на сколько я знаю если вручную его не удалять то история должна вестись от сотворения мираначала установки
а на счет парсера, то я так и сделал, результат выложу ниже
vasek
У меня все работает, система 64-bit. Прога для Linux консольная (Version 3.4.4.740 (2018-08-03), запускаю командой
$ file dmde
dmde: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, stripped
$ pacman -Fs ld-linux.so.2
core/lib32-glibc 2.29-3
    usr/lib/ld-linux.so.2
    usr/lib32/ld-linux.so.2
в общем заработало после установки пакета lib32-glibc

vasek
Я бы, в случае аналогичной проблемы и отсутствия файла pacman.log проделал бы все проще.
спасибо за подробное описание, возможно действительно когда нибудь пригодится, но так как файл pacman.log присутствует то на данный момент его разбор представляется наилучшим решением

vasek
Погуглил на en - оказывается есть Wiki Pacman/Restore local database - привожу цитату из нее
да, vall уже упоминал об этом
привожу своё решение
условие: должен быть в наличии файл /var/log/pacman.log в котором содержаться непрерывная история с начала установки системы и до текущего момента (если вы его спецом не удаляли и не чистили то по умолчанию так оно есть)

Первый этап
awk '$4=="installed" || $4=="removed" {print i++,$4,$5}' /var/log/pacman.log |sort -k3 -k1n |cat - <<< '' |awk '{if (a=="installed" && b!=$3) print b;a=$2;b=$3}' > packages.all.txt

awk '$4=="installed" || $4=="removed" {print i++,$4,$5}' /var/log/pacman.log |sort -k3 -k1n | awk '{print} END{print ""}' |awk '{if (a=="installed" && b!=$3) print b;a=$2;b=$3}' > packages.all.txt
здесь мы разбираем pacman.log и собираем список только тех пакетов которые были установлены и присутствуют в системе на данный момент.

Второй этап
pacman -Sp $(cat packages.all.txt) 2>&1 | awk '{print $NF}' > packages.aur.txt
отделяем зерна от плевел, то есть вычленяем те пакеты которые установлены помимо репозиториев указанных в /etc/pacman.conf

Третий этап
comm -3  packages.all.txt packages.aur.txt > packages.txt
пакеты которые установлены из репозиториев указанных в /etc/pacman.conf

Четвертый этап
sudo pacman -S --force $(cat packages.txt)
переустанавливаем пакеты из рапозиториев
yay -S --force $(cat packages.aur.txt)
переустанавливаем пакеты из АУРа, для упрощения воспользуемся одним из помощников по АУРу(AUR helper) утилитой yay

в принципе последние три этапа можно было бы при желании объединить в
yay -S --force $(cat packages.all.txt)
но для большего контроля и понимания я их разделил

п.с.
из минусов некоторые(?) конфиги могут слететь, например .zshrc (как я понял сам пакет zsh его не трогал а задела переустановка каких-то сопутствующих пакетов, в общем надо разбираться)
red
Первый этап
awk '$4=="installed" || $4=="removed" {print i++,$4,$5}' /var/log/pacman.log |sort -k3 -k1n |cat - <<< '' |awk '{if (a=="installed" && b!=$3) print b;a=$2;b=$3}' > packages.all.txt
здесь мы разбираем pacman.log и собираем список только тех пакетов которые были установлены и присутствуют в системе на данный момент.
awk '$4=="installed" || $4=="removed" {print i++,$4,$5}' /var/log/pacman.log |sort -k3 -k1n |cat - это работает (но очень много файлов, примерно 1700)
А вот при передаче на 2-ую часть что то у меня не сработало (пустой вывод после передачи <<< '' |awk '{if (a=="installed" && b!=$3) print b;a=$2;b=$3}') - разбираться не стал

Посмотрел китайский скрипт (показало около 900 файлов) - но все проверять не стал, просто посмотрел мельком - в принципе понравилось.
Ошибки не исчезают с опытом - они просто умнеют
vasek
я тестил под zsh, ща попробовал под баш и получил пустой вывод как у тебя, чуть позже разберусь и подправлю
на баш не работает конкретно
cat - <<< ''
которая в текстовом потоке добавляет в конец пустую строку (необходима для следующего этапа действия)
можно заменить например на
awk '{print} END{print ""}'
ну или что-то более красившее под башем
 
Зарегистрироваться или войдите чтобы оставить сообщение.