![在持久实时启动系统(ubuntu 16.04 LTS)中执行 sudo apt update 时出错](https://linux22.com/image/1150821/%E5%9C%A8%E6%8C%81%E4%B9%85%E5%AE%9E%E6%97%B6%E5%90%AF%E5%8A%A8%E7%B3%BB%E7%BB%9F%EF%BC%88ubuntu%2016.04%20LTS%EF%BC%89%E4%B8%AD%E6%89%A7%E8%A1%8C%20sudo%20apt%20update%20%E6%97%B6%E5%87%BA%E9%94%99.png)
在尝试安装 opencv 和 python 包时执行 sudo apt-get update 时遇到以下问题:
root@ubuntu:~# apt-get update
Ign:1 cdrom://Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2) xenial InRelease
Hit:2 cdrom://Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2) xenial Release Ign:4 http://dl.google.com/linux/chrome/deb stable InRelease Hit:5 http://dl.google.com/linux/chrome/deb stable Release Get:6 http://security.ubuntu.com/ubuntu xenial-security InRelease [102 kB] Hit:8 http://archive.ubuntu.com/ubuntu xenial InRelease Get:9 http://archive.ubuntu.com/ubuntu xenial-updates InRelease [102 kB] Get:10 http://security.ubuntu.com/ubuntu xenial-security/main amd64 DEP-11 Metadata [60.2 kB] Ign:11 http://www.openprinting.org/download/printdriver/debian lsb3.2 InRelease Get:12 http://security.ubuntu.com/ubuntu xenial-security/main DEP-11 64x64 Icons [57.6 kB] Get:13 http://security.ubuntu.com/ubuntu xenial-security/universe amd64 DEP-11 Metadata [49.7 kB] Get:14 http://security.ubuntu.com/ubuntu xenial-security/universe DEP-11 64x64 Icons [80.0 kB] Hit:15 http://www.openprinting.org/download/printdriver/debian lsb3.2 Release Get:17 http://archive.ubuntu.com/ubuntu xenial-updates/main amd64 DEP-11 Metadata [305 kB] Get:18 http://archive.ubuntu.com/ubuntu xenial-updates/main DEP-11 64x64 Icons [217 kB] Get:19 http://archive.ubuntu.com/ubuntu xenial-updates/universe amd64 DEP-11 Metadata [173 kB] Get:20 http://archive.ubuntu.com/ubuntu xenial-updates/universe DEP-11 64x64 Icons [240 kB] Get:21 http://archive.ubuntu.com/ubuntu xenial-updates/multiverse amd64 DEP-11 Metadata [5,892 B]
Fetched 1,392 kB in 1s (1,068 kB/s)
** (appstreamcli:7142): CRITICAL **: Error while moving old database out of the way.
AppStream cache update failed.
Reading package lists... Done W: http://www.openprinting.org/download/printdriver/debian/dists/lsb3.2/Release.gpg: Signature by key F8897B6F00075648E248B7EC24CBF5474CFD1E2F uses weak digest algorithm (SHA1)
为了缓解 AppStream 缓存问题,我参考了这篇文章:无法在持久的 Ubuntu 16.04 USB 上运行“apt-get dist-upgrade”并运行以下命令:
root@ubuntu:~# sudo chmod -R a+rX,u+w /var/cache/app-info/xapian/default
root@ubuntu:~# apt-get update
Ign:1 cdrom://Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2) xenial InRelease
Hit:2 cdrom://Ubuntu 16.04.2 LTS _Xenial Xerus_ - Release amd64 (20170215.2) xenial Release Ign:4 http://dl.google.com/linux/chrome/deb stable InRelease Hit:5 http://dl.google.com/linux/chrome/deb stable Release Hit:7 http://security.ubuntu.com/ubuntu xenial-security InRelease Hit:8 http://archive.ubuntu.com/ubuntu xenial InRelease Hit:9 http://archive.ubuntu.com/ubuntu xenial-updates InRelease Ign:10 http://www.openprinting.org/download/printdriver/debian lsb3.2 InRelease Hit:11 http://www.openprinting.org/download/printdriver/debian lsb3.2 Release
Reading package lists... Done W: http://www.openprinting.org/download/printdriver/debian/dists/lsb3.2/Release.gpg: Signature by key F8897B6F00075648E248B7EC24CBF5474CFD1E2F uses weak digest algorithm (SHA1)
我不确定到底是什么导致了这个问题。因此,我也尝试了 apt get upgrade,并在命令行中得到了以下内容:
root@ubuntu:~# apt-get upgrade
Reading package lists... Done
Building dependency tree
Reading state information... Done
Calculating upgrade... Done
The following packages have been kept back:
gnome-software gnome-software-common libegl1-mesa libgbm1 libgl1-mesa-dri libinput10 libmirclient9 libwayland-egl1-mesa libxatracker2
linux-generic-hwe-16.04 linux-headers-generic-hwe-16.04 linux-image-generic-hwe-16.04 linux-signed-generic-hwe-16.04
linux-signed-image-generic-hwe-16.04 python3-software-properties python3-update-manager software-properties-common software-properties-gtk
ubuntu-software update-manager update-manager-core update-notifier update-notifier-common xserver-xorg-core-hwe-16.04
xserver-xorg-hwe-16.04 xserver-xorg-input-evdev-hwe-16.04 xserver-xorg-input-synaptics-hwe-16.04 xserver-xorg-input-wacom-hwe-16.04
xserver-xorg-video-amdgpu-hwe-16.04 xserver-xorg-video-ati-hwe-16.04 xserver-xorg-video-fbdev-hwe-16.04 xserver-xorg-video-intel-hwe-16.04
xserver-xorg-video-nouveau-hwe-16.04 xserver-xorg-video-qxl-hwe-16.04 xserver-xorg-video-radeon-hwe-16.04 xserver-xorg-video-vesa-hwe-16.04
xserver-xorg-video-vmware-hwe-16.04
0 upgraded, 0 newly installed, 0 to remove and 37 not upgraded.
3 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Do you want to continue? [Y/n] Y
Setting up cryptsetup (2:1.6.6-5ubuntu2.1) ...
update-initramfs is disabled since running on read-only media
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
insserv: Service checkroot has to be enabled to start service cryptdisks-early
insserv: exiting now!
update-rc.d: error: insserv rejected the script header
dpkg: error processing package cryptsetup (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of ubiquity:
ubiquity depends on cryptsetup; however:
Package cryptsetup is not configured yet.
dpkg: error processing package ubiquity (--configure):
dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of ubiquity-frontend-gtk:
ubiquity-frontend-gtk depends on ubiquity (= 2.21.63.4); however:
Package ubiquity is not configured yet.
dpkg: error processing package ubiquity-frontend-gtk (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
cryptsetup
ubiquity
ubiquity-frontend-gtk
E: Sub-process /usr/bin/dpkg returned an error code (1)
我还尝试了以下命令(参考:https://askubuntu.com/a/899786/484475):
root@ubuntu:~# sudo apt-get autoremove && sudo apt-get autoclean
Reading package lists... Done
Building dependency tree
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 37 not upgraded.
3 not fully installed or removed.
After this operation, 0 B of additional disk space will be used.
Setting up cryptsetup (2:1.6.6-5ubuntu2.1) ...
update-initramfs is disabled since running on read-only media
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
insserv: Service checkroot has to be enabled to start service cryptdisks-early
insserv: exiting now!
update-rc.d: error: insserv rejected the script header
dpkg: error processing package cryptsetup (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of ubiquity:
ubiquity depends on cryptsetup; however:
Package cryptsetup is not configured yet.
dpkg: error processing package ubiquity (--configure):
dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of ubiquity-frontend-gtk:
ubiquity-frontend-gtk depends on ubiquity (= 2.21.63.4); however:
Package ubiquity is not configured yet.
dpkg: error processing package ubiquity-frontend-gtk (--configure):
dependency problems - leaving unconfigured
No apport report written because the error message indicates its a followup error from a previous failure.
No apport report written because the error message indicates its a followup error from a previous failure.
Errors were encountered while processing:
cryptsetup
ubiquity
ubiquity-frontend-gtk
E: Sub-process /usr/bin/dpkg returned an error code (1)
我再次提到另一个链接update-rc.d: 错误:insserv 拒绝了脚本头 dpkg:util-linux 包处理错误(--configure):但我没有发现 cryptsetup 缺少 init 标头。另一个答案说问题出在启动顺序上:https://unix.stackexchange.com/questions/289667/unable-to-install-anything-using-apt-get-because-of-insserv但我没有发现标题有什么问题。我推断包之间存在依赖关系,因此尝试了以下命令(参考链接:执行 sudo-apt 升级时出现 cryptsetup 错误):
root@ubuntu:~# sudo dpkg --configure cryptsetup
Setting up cryptsetup (2:1.6.6-5ubuntu2.1) ...
update-initramfs is disabled since running on read-only media
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
insserv: Service checkroot has to be enabled to start service cryptdisks-early
insserv: exiting now!
update-rc.d: error: insserv rejected the script header
dpkg: error processing package cryptsetup (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
Cryptsetup
修复该问题的另一种尝试:
root@ubuntu:~# sudo dpkg --configure --pending
Setting up cryptsetup (2:1.6.6-5ubuntu2.1) ...
update-initramfs is disabled since running on read-only media
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
insserv: Service checkroot has to be enabled to start service cryptdisks-early
insserv: exiting now!
update-rc.d: error: insserv rejected the script header
dpkg: error processing package cryptsetup (--configure):
subprocess installed post-installation script returned error exit status 1
dpkg: dependency problems prevent configuration of ubiquity:
ubiquity depends on cryptsetup; however:
Package cryptsetup is not configured yet.
dpkg: error processing package ubiquity (--configure):
dependency problems - leaving unconfigured
dpkg: dependency problems prevent configuration of ubiquity-frontend-gtk:
ubiquity-frontend-gtk depends on ubiquity (= 2.21.63.4); however:
Package ubiquity is not configured yet.
dpkg: error processing package ubiquity-frontend-gtk (--configure):
dependency problems - leaving unconfigured
Errors were encountered while processing:
cryptsetup
ubiquity
ubiquity-frontend-gtk
我尝试的任何操作(包括 clean 语句)都会将我重定向到同一个问题:
Errors were encountered while processing:
cryptsetup
ubiquity
ubiquity-frontend-gtk
作为最后一次尝试,我尝试搜索问题所在,并在网上找到了这个https://superuser.com/questions/903142/how-to-run-update-initramfs-from-bootable-usb检查问题的原因update-initramfs is disabled since running on read-only media
并找到超出我理解范围的解决方案。
sudo dpkg --configure cryptsetup
Setting up cryptsetup (2:1.6.6-5ubuntu2.1) ...
update-initramfs is disabled since running on read-only media
update-rc.d: warning: start and stop actions are no longer supported; falling back to defaults
insserv: Service checkroot has to be enabled to start service cryptdisks-early
insserv: exiting now!
update-rc.d: error: insserv rejected the script header
dpkg: error processing package cryptsetup (--configure):
subprocess installed post-installation script returned error exit status 1
Errors were encountered while processing:
cryptsetup
由于 dpkg reconfigure cryptsetup 依赖于 checkroot,我不确定该怎么做。我已发布 checkroot.sh 的内容:
#! /bin/sh
### BEGIN INIT INFO
# Provides: checkroot mtab
# Required-Start: mountdevsubfs hostname
# Required-Stop:
# Should-Start: keymap hwclockfirst hdparm bootlogd
# Should-stop:
# Default-Start: S
# Default-Stop:
# X-Interactive: true
# Short-Description: Check to root file system.
### END INIT INFO
# Include /usr/bin in path to find on_ac_power if /usr/ is on the root
# partition.
PATH=/sbin:/bin:/usr/bin
FSCK_LOGFILE=/var/log/fsck/checkroot
[ "$FSCKFIX" ] || FSCKFIX=no
[ "$SULOGIN" ] || SULOGIN=no
. /lib/init/vars.sh
. /lib/lsb/init-functions
. /lib/init/mount-functions.sh
do_start () {
# Trap SIGINT so that we can handle user interrupt of fsck.
trap "" INT
#
# Set SULOGIN in /etc/default/rcS to yes if you want a sulogin to
# be spawned from this script *before anything else* with a timeout,
# like sysv does.
#
[ "$SULOGIN" = yes ] && sulogin -t 30 $CONSOLE
KERNEL="$(uname -s)"
MACHINE="$(uname -m)"
read_fstab
#
# Activate the swap device(s) in /etc/fstab. This needs to be done
# before fsck, since fsck can be quite memory-hungry.
#
ENABLE_SWAP=no
case "$KERNEL" in
Linux)
if [ "$NOSWAP" = yes ]
then
[ "$VERBOSE" = no ] || log_warning_msg "Not activating swap as requested via bootoption noswap."
ENABLE_SWAP=no
else
if [ "$swap_on_lv" = yes ]
then
[ "$VERBOSE" = no ] || log_warning_msg "Not activating swap on logical volume."
elif [ "$swap_on_file" = yes ]
then
[ "$VERBOSE" = no ] || log_warning_msg "Not activating swap on swapfile."
else
ENABLE_SWAP=yes
fi
fi
;;
*)
ENABLE_SWAP=yes
;;
esac
if [ "$ENABLE_SWAP" = yes ]
then
if [ "$VERBOSE" = no ]
then
log_action_begin_msg "Activating swap"
swapon -a -e >/dev/null 2>&1
log_action_end_msg $?
else
log_daemon_msg "Activating swap"
swapon -a -v
log_end_msg $?
fi
fi
#
# Does the root device in /etc/fstab match with the actual device ?
# If not we try to use the /dev/root alias device, and if that
# fails we create a temporary node in /run.
#
# Do this only on Linux. Neither kFreeBSD nor Hurd have
# /dev/root and the device ids used here are specific to
# Linux.
KERNEL="$(uname)"
if [ "$rootcheck" = yes ] && [ "$KERNEL" = Linux ]
then
ddev="$(mountpoint -qx $rootdev)"
rdev="$(mountpoint -d /)"
if [ "$ddev" != "$rdev" ] && [ "$ddev" != "4:0" ]
then
if [ "$(mountpoint -qx /dev/root)" = "4:0" ]
then
rootdev=/dev/root
else
if \
rm -f /run/rootdev \
&& mknod -m 600 /run/rootdev b ${rdev%:*} ${rdev#*:} \
&& [ -e /run/rootdev ]
then
rootdev=/run/rootdev
else
rootfatal=yes
fi
fi
fi
fi
#
# Bother, said Pooh.
#
if [ "$rootfatal" = yes ]
then
log_failure_msg "The device node $rootdev for the root filesystem is missing or incorrect
or there is no entry for the root filesystem listed in /etc/fstab.
The system is also unable to create a temporary node in /run.
This means you have to fix the problem manually."
log_warning_msg "A maintenance shell will now be started.
CONTROL-D will terminate this shell and restart the system."
# Start a single user shell on the console
if ! sulogin $CONSOLE
then
log_failure_msg "Attempt to start maintenance shell failed.
Will restart in 5 seconds."
sleep 5
fi
[ "$VERBOSE" = no ] || log_action_msg "Will now restart"
reboot -f
fi
# See if we're on AC Power. If not, we're not gonna run our
# check. If on_ac_power (in /usr/) is unavailable, behave as
# before and check all file systems needing it.
# Disabled AC power check until fsck can be told to only check the
# file system if it is corrupt when running on battery. (bug #526398)
# if which on_ac_power >/dev/null 2>&1 && [ "$rootcheck" = yes ]
# then
# on_ac_power >/dev/null 2>&1
# if [ "$?" -eq 1 ]
# then
# log_warning_msg "On battery power, so skipping file system check."
# rootcheck=no
# fi
# fi
#
# See if we want to check the root file system.
#
FSCKCODE=0
if [ -e /run/initramfs/fsck-root ]
then
rootcheck=no
fi
if is_fastboot_active
then
[ "$rootcheck" = yes ] && log_warning_msg "Fast boot enabled, so skipping root file system check."
rootcheck=no
fi
if which findmnt >/dev/null 2>&1
then
if [ "$(findmnt -f -n -o FSTYPE /)" = "btrfs" ]
then
[ "$rootcheck" = yes ] && log_warning_msg "btrfs root detected, so skipping root file system check."
rootcheck=no
fi
fi
if [ "$rootcheck" = yes ]
then
#
# Ensure that root is quiescent and read-only before fsck'ing.
#
# mount -n -o remount,ro / would be the correct syntax but
# mount can get confused when there is a "bind" mount defined
# in fstab that bind-mounts "/" somewhere else.
#
# So we use mount -n -o remount,ro $rootdev / but that can
# fail on older kernels on sparc64/alpha architectures due
# to a bug in sys_mount().
#
# As a compromise we try both.
#
if \
! mount -n -o remount,ro $rootdev / \
&& ! mount -n -o remount,ro -t dummytype $rootdev / 2>/dev/null \
&& ! mount -n -o remount,ro / 2>/dev/null
then
log_failure_msg "Cannot check root file system because it is not mounted read-only."
rootcheck=no
fi
fi
#
# The actual checking is done here.
#
if [ "$rootcheck" = yes ]
then
if [ -f /forcefsck ] || grep -q -s -w -i "forcefsck" /proc/cmdline
then
force="-f"
else
force=""
fi
if [ "$FSCKFIX" = yes ]
then
fix="-y"
else
fix="-a"
fi
spinner="-C"
case "$TERM" in
dumb|network|unknown|"")
spinner="" ;;
esac
# This Linux/s390x special case should go away.
if [ "${KERNEL}:${MACHINE}" = Linux:s390x ]
then
spinner=""
fi
if [ "$VERBOSE" = no ]
then
log_action_begin_msg "Checking root file system"
logsave -s $FSCK_LOGFILE fsck $spinner $force $fix -t $roottype $rootdev
FSCKCODE=$?
if [ "$FSCKCODE" = 0 ]
then
log_action_end_msg 0
else
log_action_end_msg 1 "code $FSCKCODE"
fi
else
log_daemon_msg "Will now check root file system"
logsave -s $FSCK_LOGFILE fsck $spinner $force $fix -V -t $roottype $rootdev
FSCKCODE=$?
log_end_msg $FSCKCODE
fi
fi
#
# If there was a failure, drop into single-user mode.
#
# NOTE: "failure" is defined as exiting with a return code of
# 4 or larger. A return code of 1 indicates that file system
# errors were corrected but that the boot may proceed. A return
# code of 2 or 3 indicates that the system should immediately reboot.
#
if [ "$FSCKCODE" -eq 32 ]
then
log_warning_msg "File system check was interrupted by user"
elif [ "$FSCKCODE" -gt 3 ]
then
# Surprise! Re-directing from a HERE document (as in "cat << EOF")
# does not work because the root is currently read-only.
log_failure_msg "An automatic file system check (fsck) of the root filesystem failed.
A manual fsck must be performed, then the system restarted.
The fsck should be performed in maintenance mode with the
root filesystem mounted in read-only mode."
log_warning_msg "The root filesystem is currently mounted in read-only mode.
A maintenance shell will now be started.
After performing system maintenance, press CONTROL-D
to terminate the maintenance shell and restart the system."
# Start a single user shell on the console
if ! sulogin $CONSOLE
then
log_failure_msg "Attempt to start maintenance shell failed.
Will restart in 5 seconds."
sleep 5
fi
[ "$VERBOSE" = no ] || log_action_msg "Will now restart"
reboot -f
elif [ "$FSCKCODE" -gt 1 ]
then
log_failure_msg "The file system check corrected errors on the root partition
but requested that the system be restarted."
log_warning_msg "The system will be restarted in 5 seconds."
sleep 5
[ "$VERBOSE" = no ] || log_action_msg "Will now restart"
reboot -f
fi
#
# Remount root to final mode (rw or ro).
#
# See the comments above at the previous "mount -o remount"
# for an explanation why we try this twice.
#
if ! mount -n -o remount,$rootopts,$rootmode $fstabroot / 2>/dev/null
then
mount -n -o remount,$rootopts,$rootmode /
fi
# If possible, migrate /etc/mtab to be a symlink to
# /proc/mounts. Note that not all systems e.g. Hurd currently
# support this.
if [ "$rootmode" != "ro" ]; then
mtab_migrate
fi
if selinux_enabled && [ -x /sbin/restorecon ] && [ -r /etc/mtab ]
then
restorecon /etc/mtab
fi
#
# Remove /run/rootdev if we created it.
#
rm -f /run/rootdev
# Update mount options for mounts created in early boot
# S01mountkernfs.sh
/etc/init.d/mountkernfs.sh reload
# S03mountdevsubfs.sh
/etc/init.d/mountdevsubfs.sh reload
}
do_status () {
# If / is read-write or swap is enabled, this script have done
# its job.
rootrw=false
swapon=false
if [ -f /etc/mtab ] ; then
if grep " / " /etc/mtab |grep -q rw ; then
rootrw=true
fi
fi
if [ -f /proc/swaps ] ; then
if [ "$(cat /proc/swaps |grep -v ^Filename)" ] ; then
swapon=true
fi
fi
if [ true = "$rootrw" ] || [ true = "$swapon" ] ; then
return 0
else
return 4
fi
}
case "$1" in
start|"")
do_start
;;
restart|reload|force-reload)
echo "Error: argument '$1' not supported" >&2
exit 3
;;
stop)
# No-op
;;
status)
do_status
exit $?
;;
*)
echo "Usage: checkroot.sh [start|stop]" >&2
exit 3
;;
esac
:
请帮我解决上述问题。我是 Linux 新手。如果能提供简单的答案,我将不胜感激。
答案1
简单的答案是,你正在滥用持久性机制,你需要停止=)
稍微长一点的答案是持久性使用 COW(写时复制)机制 -https://en.wikipedia.org/wiki/Copy-on-write
抱歉,维基百科链接 =)
因此,iso(严格来说是根文件系统,squashfs)是只读文件系统。此“iso”或根文件系统永远无法更改或重制 iso。
引入持久性的概念,即一种创建覆盖的机制。因此,如果您更新系统或进行更改,则更改将应用于文件(持久性),而不是 iso。
这对于简单的任务非常有效,例如调整界面、自定义桌面、保存一些数据、保存无线密码。
但是 COW 系统会崩溃,您会不断更改。因此,您有一个基本的 RO 文件系统,并且您会sudo apt-update
反复运行,COW 系统不是数据库,无法跟踪所有这些更改,最终会失败。
解决方法如下:
谨慎使用持久性,并尽可能少做更改,例如存储用户设置、无线密码以及一次性安装某些应用程序。但不要滥用它,将其视为已安装的系统并尝试运行
sudo apt update && sudo apt upgrade
,COW 无法处理对数百个软件包的多次更改。只需进行常规安装。这可能是最好的主意,因为你显然打算继续使用 Ubuntu。
希望这个答案不是太技术性,并且我希望我没有过度简化情况。
答案2
我遇到了和你同样的问题(我也在 USB 驱动器上的持久 Linux 上)。
看来这个包cryptsetup
是负责任的。(正如 Panther 所说,您无法加密原始 iso 文件)
为了升级其余软件包,您可以执行以下操作:
sudo apt-mark hold cryptsetup
以防止该包升级。
然后您可以再次运行常规操作sudo apt-get upgrade
,它对我来说非常完美。