
Я перепостил это наask.fedora.orgпоскольку я все еще не уверен, у той или иной стороны большая база пользователей Fedora.
Уже несколько дней не могу установить обновления из-за этой ошибки:
# env LC_ALL=C dnf update
Last metadata expiration check: 0:18:57 ago on Wed Jan 23 16:16:14 2019.
Traceback (most recent call last):
File "/usr/bin/dnf", line 58, in <module>
main.user_main(sys.argv[1:], exit_code=True)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 179, in user_main
errcode = main(args)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 64, in main
return _main(base, args, cli_class, option_parser_class)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 99, in _main
return cli_run(cli, base)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 123, in cli_run
ret = resolving(cli, base)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 146, in resolving
base.resolve(cli.demands.allow_erasing)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 760, in resolve
self._transaction = self._goal2transaction(goal)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 681, in _goal2transaction
ts.add_upgrade(pkg, upgraded, obs)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 269, in add_upgrade
ti_new = self.new(new, libdnf.transaction.TransactionItemAction_UPGRADE)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 222, in new
reason = self.get_reason(pkg)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 237, in get_reason
return self.history.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
File "/usr/lib64/python3.7/site-packages/libdnf/transaction.py", line 788, in resolveRPMTransactionItemReason
return _transaction.Swdb_resolveRPMTransactionItemReason(self, name, arch, maxTransactionId)
RuntimeError: Step: database disk image is malformed in
SELECT
ti.action as action,
ti.reason as reason
FROM
trans_item ti
JOIN
trans t ON ti.trans_id = t.id
JOIN
rpm i USING (item_id)
WHERE
t.state = 1
/* see comment in TransactionItem.hpp - TransactionItemAction */
AND ti.action not in (3, 5, 7, 10)
AND i.name = 'python2-rpkg'
AND i.arch = 'noarch'
ORDER BY
ti.trans_id DESC
LIMIT 1
Я обнаружил, что для исправления этой проблемы необходимо выполнить следующие команды, и я попробовал, но это не решило проблему.
dnf clean all
dnf makecache
rpm --buildddb
НаСпросите Fedora, кто-то предложилчто dnf не может восстановиться после этого и что базу данных SQLite придется восстанавливать вручную.
Я попытался выполнить данную команду,
sqlite3 history-<date>.sqlite ".dump" | sqlite3 history-<new date>.db && rm history-<date>.sqlite
Выполнение этого на /var/lib/dnf/history/history-2015-10-25.sqlite
не дало никакого эффекта. Выполнение этого на /var/lib/dnf/history.sqlite
привело к новой ошибке:
# dnf update
Letzte Prüfung auf abgelaufene Metadaten: vor 1:22:29 am Mi 23 Jan 2019 16:39:44 CET.
Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 64, in main
return _main(base, args, cli_class, option_parser_class)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 99, in _main
return cli_run(cli, base)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 123, in cli_run
ret = resolving(cli, base)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 146, in resolving
base.resolve(cli.demands.allow_erasing)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 760, in resolve
self._transaction = self._goal2transaction(goal)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 657, in _goal2transaction
ts.add_install(pkg, obs, reason)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 256, in add_install
ti_new = self.new(new, libdnf.transaction.TransactionItemAction_INSTALL, reason)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 219, in new
rpm_item = self._pkg_to_swdb_rpm_item(pkg)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 210, in _pkg_to_swdb_rpm_item
rpm_item = self.history.swdb.createRPMItem()
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 291, in swdb
self._swdb = libdnf.transaction.Swdb(self.dbpath)
File "/usr/lib64/python3.7/site-packages/libdnf/transaction.py", line 729, in __init__
this = _transaction.new_Swdb(*args)
RuntimeError: Exec failed: malformed database schema (1467577792)
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/bin/dnf", line 58, in <module>
main.user_main(sys.argv[1:], exit_code=True)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 179, in user_main
errcode = main(args)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 64, in main
return _main(base, args, cli_class, option_parser_class)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 121, in __exit__
self.close()
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 472, in close
self._finalize_base()
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 455, in _finalize_base
self.history.close()
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 305, in close
self.swdb.closeTransaction()
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 291, in swdb
self._swdb = libdnf.transaction.Swdb(self.dbpath)
File "/usr/lib64/python3.7/site-packages/libdnf/transaction.py", line 729, in __init__
this = _transaction.new_Swdb(*args)
RuntimeError: Exec failed: malformed database schema (1467577792)
Если вникнуть в суть вопроса глубже sqlite3 .dump
, то я вижу следующее:
/var/lib/dnf# sqlite3 history.sqlite .dump
PRAGMA foreign_keys=OFF;
BEGIN TRANSACTION;
/**** ERROR: (10) disk I/O error *****/
ROLLBACK; -- due to errors
Однако, когда я копирую это history.sqlite
и /tmp
выполняю это .dump
там, я получаю разумно выглядящую базу данных. Также открытие ее с помощью GUI sqliteman
работает нормально. Кажется, что сама база данных в порядке.
Если сбросить базу данных в новый файл в другом месте и скопировать ее обратно, то получится следующее:
/v/l/dnf# dnf update
Letzte Prüfung auf abgelaufene Metadaten: vor 0:30:51 am Sa 26 Jan 2019 13:21:13 CET.
Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 64, in main
return _main(base, args, cli_class, option_parser_class)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 99, in _main
return cli_run(cli, base)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 123, in cli_run
ret = resolving(cli, base)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 146, in resolving
base.resolve(cli.demands.allow_erasing)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 760, in resolve
self._transaction = self._goal2transaction(goal)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 650, in _goal2transaction
reason_obsolete = ts.get_reason(obsolete)
File "/usr/lib/python3.7/site-packages/dnf/db/group.py", line 237, in get_reason
return self.history.swdb.resolveRPMTransactionItemReason(pkg.name, pkg.arch, -1)
File "/usr/lib64/python3.7/site-packages/libdnf/transaction.py", line 788, in resolveRPMTransactionItemReason
return _transaction.Swdb_resolveRPMTransactionItemReason(self, name, arch, maxTransactionId)
RuntimeError: Step: disk I/O error in
SELECT
ti.action as action,
ti.reason as reason
FROM
trans_item ti
JOIN
trans t ON ti.trans_id = t.id
JOIN
rpm i USING (item_id)
WHERE
t.state = 1
/* see comment in TransactionItem.hpp - TransactionItemAction */
AND ti.action not in (3, 5, 7, 10)
AND i.name = 'libmodulemd'
AND i.arch = 'x86_64'
ORDER BY
ti.trans_id DESC
LIMIT 1
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "/usr/bin/dnf", line 58, in <module>
main.user_main(sys.argv[1:], exit_code=True)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 179, in user_main
errcode = main(args)
File "/usr/lib/python3.7/site-packages/dnf/cli/main.py", line 64, in main
return _main(base, args, cli_class, option_parser_class)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 121, in __exit__
self.close()
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 473, in close
self.reset(sack=True, repos=True, goal=True)
File "/usr/lib/python3.7/site-packages/dnf/base.py", line 504, in reset
self.history.close()
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 305, in close
self.swdb.closeTransaction()
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 291, in swdb
self._swdb = libdnf.transaction.Swdb(self.dbpath)
File "/usr/lib64/python3.7/site-packages/libdnf/transaction.py", line 729, in __init__
this = _transaction.new_Swdb(*args)
RuntimeError: Exec failed: disk I/O error
Exception ignored in: <function SwdbInterface.__del__ at 0x7f28b02e4510>
Traceback (most recent call last):
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 262, in __del__
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 305, in close
File "/usr/lib/python3.7/site-packages/dnf/db/history.py", line 291, in swdb
File "/usr/lib64/python3.7/site-packages/libdnf/transaction.py", line 729, in __init__
RuntimeError: Exec failed: disk I/O error
Я также восстановил метки SELinux, но это ничего не изменило, это
-rw-r--r--. 1 root root unconfined_u:object_r:rpm_var_lib_t:s0 29M 26. Jan 13:52 history.sqlite
Пользователь root также может прочитать файл:
/v/l/dnf# head -c 1000 history.sqlite
SQLite format 3@ ,�,.,P��⏎
Как это работает в Fedora 29? Можно ли это исправить?
решение1
Я попробовал этот дамп снова после перезапуска системы. Возможно, восстановление меток SELinux нужно было настроить. Теперь обновления, похоже, снова работают.
решение2
Я разрабатываю образ Docker для какой-то Centos-подобной ОС и столкнулся с этой ошибкой. Вы можете поиграться с ней, используя мой образ:
docker run --rm -it pasaopasen/redos7.3:2023-12-07_22-19 bash
Попробуйте выполнить:
dnf update -y
dnf install nginx -y
и вы увидите ту же ошибку.
Ничего не помогло мне решить эту проблему, похоже, это результат плохих глобальных обновлений rpm
и python3
т. д. Я решил ее только через глобальное обновление из какой-то старой резервной копии экземпляра виртуальной машины