我定期创建整个文件系统快照(使用 BTRFS)。我需要防止我的脚本在系统处于不一致状态时拍摄快照,例如在应用程序安装或完整系统升级期间。
- 我怎样才能可靠地检测到此类行为?
就像我们不能调用多个apt
实例一样,我也想为apt install
(或任何其他包管理软件)创建一个锁,以确保快照操作已经完成(可能需要几秒钟,具体取决于磁盘 IO)。
- 如何暂时阻止任何包管理应用程序运行?
我定期创建整个文件系统快照(使用 BTRFS)。我需要防止我的脚本在系统处于不一致状态时拍摄快照,例如在应用程序安装或完整系统升级期间。
就像我们不能调用多个apt
实例一样,我也想为apt install
(或任何其他包管理软件)创建一个锁,以确保快照操作已经完成(可能需要几秒钟,具体取决于磁盘 IO)。
我正在调试新安装的电池的剩余电池百分比报告不准确的情况。
关于我上一个问题的回答,各种工具直接从电池本身查询电池信息。/sys/class/power_supply/BAT1/voltage_now
但是,电池电压的输出在和之间有所不同upower
:
# upower
voltage: 10.974 V
# /sys/...
10500000
此外,upower
每 2 分钟更新一次统计信息,其中/sys/class/power_supply/BAT1/voltage_now
似乎是实时更新的。这也表明这两个数据源的来源可能不同。
那么,这两个数据源的数据源是什么?
很抱歉,由于记错了串联的细胞计数而提出了这个问题。串联的不是4个电池,而是3个电池。傻我。对于串联的 3 节电池,最大电池电压应该是4.2V * 3 = 12.6V
,这里看起来很一致,所以问题的“电压计算部分”是不准确的。
我正在使用 LXDE,电池小程序显示 100% 作为电池状态。其他命令支持该百分比:
ceremcem@cca-erik:~$ acpi
Battery 0: Full, 100%
ceremcem@cca-erik:~$ upower -i `upower -e | grep bat`
native-path: BAT1
vendor: LGC
model: DELL 49VTP27J
serial: 7849
power supply: yes
updated: Fri 17 Jan 2020 11:46:50 AM +03 (105 seconds ago)
has history: yes
has statistics: yes
battery
present: yes
rechargeable: yes
state: fully-charged
warning-level: none
energy: 73.26 Wh
energy-empty: 0 Wh
energy-full: 73.26 Wh
energy-full-design: 48.84 Wh
energy-rate: 0.0111 W
voltage: 12.014 V
percentage: 100%
capacity: 100%
technology: lithium-ion
icon-name: 'battery-full-charged-symbolic'
实际问题是标称电池电压为14.4V(3.6V/cell,4串)。这意味着在 100% SOC(充电状态)下,电池应该处于 batteryuniversity.com ,它处于 0% SOC(完全空) :4.2 * 4 = 16.8V
. 如果您看到该battery -> voltage
部分,它当前为 12.0V,这意味着每个电池为 3.0V,这意味着根据
这些命令如何决定 SOC?他们是直接问电池吗?我们如何重新校准这种不匹配?
由于 UUID 是在分区阶段(由软件)分配的,因此没有可用于整个磁盘的 UUID。
但是,/dev/disk/by-id/
包含用于相同目的的有希望的信息。我们可以获得“UUID”路径 - 例如。/dev/sdb/
经过:
$ disk=sdb; ls /dev/disk/by-id/ -l | grep "/$disk$" | awk '{print "/dev/disk/by-id/"$9}'
/dev/disk/by-id/ata-ST1000LM048-2E7172_WKP6XK95
/dev/disk/by-id/wwn-0x5000c500ccbb7485
但是,如您所见,同一个驱动器有多个条目。结尾WKP6XK95
更有意义,因为它物理地写在产品标签上,在“序列号”部分。
如何获得可能写入磁盘的唯一值?换句话说,wwn-...
id是如何生成的,那么我怎样才能安全地忽略这个条目呢?忽略此条目... | grep -v wwn
是否安全?
来自https://manpages.debian.org/wheezy/multistrap/multistrap.1:
--no-auth - 允许使用未经身份验证的存储库。与 noauth=true 相同
我从这个定义中了解到的是multistrap
不会尝试进行身份验证,因此可能会安装不安全的软件。
但是似乎并非如此:设置noauth=true
引发以下错误:
Get:1 http://ftp.uk.debian.org/debian buster InRelease [122 kB]
Err:1 http://ftp.uk.debian.org/debian buster InRelease
The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 04EE7237B7D453EC NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY DCC9EFBF77E11517
Reading package lists... Done
W: GPG error: http://ftp.uk.debian.org/debian buster InRelease: The following signatures couldn't be verified because the public key is not available: NO_PUBKEY 04EE7237B7D453EC NO_PUBKEY 648ACFD622F3D138 NO_PUBKEY DCC9EFBF77E11517
E: The repository 'http://ftp.uk.debian.org/debian buster InRelease' is not signed.
N: Updating from such a repository can't be done securely, and is therefore disabled by default.
N: See apt-secure(8) manpage for repository creation and user configuration details.
apt update failed. Exit value: 100
有趣的是,设置noauth=false
解决了这个问题。
究竟是什么noauth
原因造成的?
事实证明,我正在尝试创建一个便携式发行版,同时为任何类型的硬件故障做好准备。
我正在通过multistrap(或从我的备份)创建(或恢复)一个 Debian 发行版,并要求生成的磁盘可以在新的(大部分兼容的)硬件上启动,包括VirtualBox machine。
正如我之前所问的,“便携式发行版”为数不多的必需品之一就是处理网络接口的名称。
例如,在真机上,第一个以太网设备被命名为enp2s0
,而在 VirtualBox 中,它被命名为enp0s3
. 我应该如何/etc/network/interfaces
在启动时生成文件?
是否有更通用的方法来重新映射网络接口名称(可能通过符号链接)并让每个应用程序使用这些名称(角色名称)而无需知道底层硬件的真实网络接口名称?
在https://wiki.debian.org/Multistrap#Steps_for_Squeeze_and_later中,需要在 chroot 环境中运行以下命令:
/var/lib/dpkg/info/dash.preinst install
此命令在 Stretch 中运行,但/var/lib/dpkg/info/dash.preinst
在 Buster 中找不到文件。
在 Buster 中完成安装的等效命令可能是什么?
git clone https://github.com/ceremcem/multistrap-example
cd multistrap-example
./build.sh buster
我正在尝试从头开始手动将 Debian 安装到实时 Debian CD 中的外部磁盘。
我按照此处 ( 44fbcc
)中的说明通过 multistrap 创建了一个 Debian Stretch rootfs 。
在内部chroot
环境中,在安装 Grub 时,我将 Grub2 安装到 MBR:
debian:~# grub-install /dev/sdX --boot-directory=/boot
命令运行没有错误。当我需要创建时/boot/grub/grub.cfg
,它会引发以下错误:
debian:~# grub-mkconfig
/usr/sbin/grub-probe: error: cannot find a device for / (is /dev mounted?).
是的,/dev
与/sys
,/proc
和/run
这里一起安装。
如何生成grub.cfg
内部chroot
环境?
我的磁盘空间不足,所以我像往常一样清理了旧快照。这一次,df -h /
坚持显示“没有可用空间”,同时btrfs fi df /
显示几个 GB 的空间,所以我决定运行btrfs balance
.
btrfs balance
由于“空间不足”错误而失败,我搜索了网络并定向到此博客文章,该文章建议通过临时添加一个能够运行的小型设备(甚至是 USB 随身碟)来解决此问题btrfs balance
,然后在完成后将其删除。
我将 pendrive 添加到我的 rootfs:
btrfs dev add /dev/sdc1 /
没有显示错误,现在我有一些可用空间。我跑btrfs balance
了,当它完成后,我试图移除 pendrive:
sudo btrfs dev del /dev/sdc1 /
ERROR: error removing device '/dev/sdc1': unable to go below two devices on raid1
BTRFS 以某种方式决定将 RAID1 配置文件中的驱动器用于元数据和系统数据:
$ sudo btrfs fi usage /
Overall:
Device size: 864.53GiB
Device allocated: 857.05GiB
Device unallocated: 7.48GiB
Device missing: 0.00B
Used: 830.28GiB
Free (estimated): 24.93GiB (min: 21.23GiB)
Data ratio: 1.00
Metadata ratio: 2.00
Global reserve: 512.00MiB (used: 0.00B)
Data,single: Size:828.01GiB, Used:810.56GiB
/dev/mapper/masa-root 828.01GiB
Data,RAID1: Size:2.02GiB, Used:2.01GiB
/dev/mapper/masa-root 2.02GiB
/dev/sdc1 2.02GiB
Data,DUP: Size:2.00GiB, Used:1.94GiB
/dev/sdc1 4.00GiB
Metadata,RAID1: Size:2.97GiB, Used:131.61MiB
/dev/mapper/masa-root 2.97GiB
/dev/sdc1 2.97GiB
Metadata,DUP: Size:7.50GiB, Used:5.78GiB
/dev/mapper/masa-root 15.01GiB
System,RAID1: Size:32.00MiB, Used:128.00KiB
/dev/mapper/masa-root 32.00MiB
/dev/sdc1 32.00MiB
Unallocated:
/dev/mapper/masa-root 1.97GiB
/dev/sdc1 5.51GiB
如何正确移除此临时设备?
运行后btrfs scrub
,可以检测到损坏的文件。为了确定无法纠正的文件,我们可以尝试读取磁盘上的每个文件:
sudo find / -type f -exec cp -v {} /dev/null \; 2> corrupted-files.txt
该命令的输出满足需要。但是需要几个小时才能完成。
Arch Linux wiki 建议使用以下命令来确定损坏的文件:
sudo journalctl --output cat | grep 'BTRFS .* i/o error' | sort | uniq
它可以快速获取结果。但是,文件路径是相对于它们的子卷路径的,因此对于从备份中修复文件非常宝贵:
BTRFS warning (device dm-2): i/o error at logical 69945753600 on dev /dev/mapper/zeytin-root, sector 142920640, root 636, inode 172280, offset 238682112, length 4096, links 1 (path: home/aea/couchdb/couchdb/data/shards/60000000-7fffffff/client2.1533443496.couch)
BTRFS warning (device dm-2): i/o error at logical 70045958144 on dev /dev/mapper/zeytin-root, sector 143116352, root 422, inode 172296, offset 307662848, length 4096, links 1 (path: home/aea/couchdb/couchdb/data/shards/e0000000-ffffffff/client2.1533443496.couch)
BTRFS warning (device dm-2): i/o error at logical 70045958144 on dev /dev/mapper/zeytin-root, sector 143116352, root 636, inode 172296, offset 307662848, length 4096, links 1 (path: home/aea/couchdb/couchdb/data/shards/e0000000-ffffffff/client2.1533443496.couch)
BTRFS warning (device dm-2): i/o error at logical 70138376192 on dev /dev/mapper/zeytin-root, sector 143296856, root 423, inode 100548, offset 688631808, length 4096, links 1 (path: var/log/auth.log)
BTRFS warning (device dm-2): i/o error at logical 70138425344 on dev /dev/mapper/zeytin-root, sector 143296952, root 423, inode 100548, offset 688644096, length 4096, links 1 (path: var/log/auth.log)
BTRFS warning (device dm-2): i/o error at logical 70138441728 on dev /dev/mapper/zeytin-root, sector 143296984, root 423, inode 100548, offset 688648192, length 4096, links 1 (path: var/log/auth.log)
BTRFS warning (device dm-2): i/o error at logical 70138449920 on dev /dev/mapper/zeytin-root, sector 143297000, root 419, inode 818783, offset 95145984, length 4096, links 1 (path: var/log/daemon.log)
BTRFS warning (device dm-2): i/o error at logical 70138564608 on dev /dev/mapper/zeytin-root, sector 143297224, root 419, inode 818783, offset 95154176, length 4096, links 1 (path: var/log/daemon.log)
BTRFS warning (device dm-2): i/o error at logical 70138884096 on dev /dev/mapper/zeytin-root, sector 143297848, root 419, inode 818783, offset 95174656, length 4096, links 1 (path: var/log/daemon.log)
有没有办法通过使用值来确定子卷路径sector XXXXXXX, root XXX, inode XXXXXXX, offset XXXXXXXX
?
什么可能会阻止我从笔记本电脑上拆下当前的硬盘并购买一台新笔记本电脑,安装磁盘并从我离开的地方继续?换句话说,是什么阻止了我当前的 Debian 9 安装被算作可移植?
/dev/sdaX
or (hd0,1)
)新笔记本电脑应该会启动(在我的情况下正在启动)。
在最坏的情况下,驱动程序可能会丢失,但我的意图是创建一个名为的脚本switch-to-new-hardware.sh
,它将安装:
切换到新硬件时应该考虑什么?
btrfs sub snap foo bar
创建与 subvolume 完全相同的 subvolume 内容foo
,bar
除了foo
.
我想要的是从输出(bar
)中也排除一些常规文件夹,例如node_modules
and tmp
; 就像rsync --exclude ...
那样。
有几种方法可以实现这一点,例如:
node_modules
在这种情况下)除了上述之外,我们可以在创建快照时应用程序化过滤器吗?
我正在 initramfs 中启动 dropbear ssh 服务器,以便能够通过 SSH *解锁加密分区。
在 Debian Jessie 中,一切都很好,但在 Buster 中,dropbear 似乎并没有在 之后停止switch_root
,这会阻止 OpenBSD ssh 服务器启动。
apt-get purge dropbear
没有帮助,which dropbear
打印/usr/bin/dropbear
和ps -ef | grep dropbear
打印/sbin/dropbear
;这说明这个过程是在 initramfs 阶段开始的,并且没有停止。
作为一种解决方法,我正在killall dropbear
使用 SSH 服务脚本,但在切换根分区之前将其终止会更合适。
那时我该如何运行脚本?
在尝试编译软件时,apt-get
抛出一个错误,说它找不到包libpyside-dev
。我在网上搜索了那个包,它在https://packages.debian.org/sid/libpyside-dev上找到。我不知道应该添加到哪个存储库/etc/apt/sources.list
才能通过apt-get
.
该页面上的 sources.list 条目在哪里?
我的apt-cache policy
输出在这里。
我的 Debian 版本 ( cat /etc/debian_version
) 是:buster/sid
添加deb https://deb.debian.org/debian/ sid main contrib non-free
似乎解决了这个问题(以及其他有问题的包),但我不确定这是否是正确的方法。