我正在编写一些 shell 脚本来处理一些磁盘映像,我需要使用循环设备来访问一些磁盘映像。但是,我不确定如何在不将我的程序暴露于竞争条件的情况下正确分配循环设备。
我知道我可以losetup -f
用来获取下一个未分配的循环设备,然后像这样分配该循环设备:
ld=$(losetup -f)
sudo losetup $ld myfile.img
dostuffwith $ld
Run Code Online (Sandbox Code Playgroud)
但是,在我想同时运行多个程序实例的情况下,这几乎是竞争条件的教科书示例,这让我非常困扰。如果我有这个程序的多个实例正在运行,或者其他程序也试图获得一个循环设备,那么每个进程可能无法在下一个调用之前分配循环设备losetup -f
,在这种情况下,两个进程都会认为同一个循环设备可用,但只有一个人可以得到它。
我可以为此使用外部同步,但我想(如果可能)避免额外的复杂性。此外,使用循环设备的其他程序可能不会尊重我可能提出的任何同步。
我怎样才能避免这种潜在的竞争条件?理想情况下,我希望能够以原子方式发现和绑定循环设备,例如使用如下命令:
ld=$(sudo losetup -f myfile.img)
dostuffwith $ld
Run Code Online (Sandbox Code Playgroud)
但是,当我这样做时,$ld
不会被分配到循环设备路径,并sudo
移出,因为在sudo ld=$(losetup -f myfile.img)
给出权限错误。
我目前在我的 Ubuntu 安装上设置了 LVM 缓存,如https://rwmj.wordpress.com/2014/05/22/using-lvms-new-cache-feature/ 中所述。(我确实必须安装一些生动的/建议的软件包才能使其工作,但我做到了。)
我能够通过以下方式成功地将我的逻辑卷之一转换为缓存卷:
# lvconvert --type cache --cachepool anson-TA75MH2/lv_cache anson-TA75MH2/root
Logical volume anson-TA75MH2/root is now cached.
Run Code Online (Sandbox Code Playgroud)
但是,执行此操作后,我无法调整缓存分区的大小。
当我尝试扩展缓存分区(在本例中名为root
,因为它将成为我的文件系统的根目录)时,我收到一条错误消息:
# lvextend anson-TA75MH2/root -L +250G
Unable to resize logical volumes of cache type.
Run Code Online (Sandbox Code Playgroud)
如何关闭缓存,以便我可以调整它的大小?
以供参考:
sda 是我的主要 1TB 硬盘驱动器,包含一个大 LVM 分区和一个缩小的 ext4 分区,我计划将其移入 lvm。sdb 是一个便宜的 32GB SSD,有一个 500MB 的 ext2 /boot 分区,一个大的 lvm 分区和 8GB 的交换空间。
# vgs
VG #PV #LV #SN Attr VSize VFree
anson-TA75MH2 2 3 0 wz--n- 803.46g 499.96g
# pvs …
Run Code Online (Sandbox Code Playgroud) 我的计算机设置为通过 UEFI 启动 Ubuntu 15.04。我有两个磁盘。我的第一个磁盘/dev/sda
是一个 128 GB 的 ssd,格式化为 GPT,包含一个 EFI 分区和一个 btrfs 分区,子卷@
挂载为“/”。第二个磁盘是一个 1 TB 硬盘,格式化为 GPT,带有一个 btrfs 分区,子卷@home
挂载为/home
.
在欢迎程序启动后,我在没有登录的情况下按下了计算机上的硬重置按钮重新启动系统,因为我记得我想检查 grub 菜单中的某些内容。
下次开机我按住shift,但是GRUB启动菜单没有打开,电脑卡在紫屏上。
按压ctrl+ alt+F1切换到这一个空白的终端,然后ctrl+ alt+F7切换到另一个终端中显示:
starting version 219
Scanning for Btrfs filesystems
Run Code Online (Sandbox Code Playgroud)
然后等待大约 2 分钟后,它在此屏幕上添加了一条错误消息:
[ 239.845714] INFO: task exe:169 blocked for more than 120 seconds.
[ 239.845740] Not tainted 3.19.9-16-generic #16-Ubuntu
[ 239.845757] "echo 0 > /proc/sys/kernek/hung_task_timeout_secs" disables this …
Run Code Online (Sandbox Code Playgroud) 任何时候我尝试运行ps
使其输出任何进程的参数的方式运行该命令或另一个类似命令时,该命令都会运行并生成输出,但随后会冻结,进入永远不会退出的“不间断睡眠”状态。
目前,我有 17 个冻结进程仍然坐在那里(摘自top -u $USER
):
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND\n 8807 foo_user 20 0 28912 2984 2680 D 0.0 0.0 0:00.10 ps\n14040 foo_user 20 0 29124 3108 2796 D 0.0 0.0 0:00.14 ps\n14342 foo_user 20 0 28912 2972 2668 D 0.0 0.0 0:00.10 ps\n15528 foo_user 20 0 28912 3028 2724 D 0.0 0.0 0:00.10 ps\n16677 foo_user 20 0 28912 2992 2692 D 0.0 0.0 0:00.11 ps\n18723 …
Run Code Online (Sandbox Code Playgroud) 我不小心删除了主目录中的一些文件,但我不知道到底删除了哪些文件。如何获取所有缺少相应文件的备份文件的列表?(相当于,名称以波浪号结尾的文件,而同一目录中没有另一个具有相同名称且没有尾随波浪号的文件?)
到目前为止我尝试了一些事情;虽然我不记得确切的标志,但它是这样的:
grep -Rlv '(.*)\n\\1~|.*(?!~)'
Run Code Online (Sandbox Code Playgroud)
那没有用,也没有:
ls -R | grep -v '(.*)\n\\1~|.*(?!~)'
Run Code Online (Sandbox Code Playgroud)
我怎样才能找到这些文件?
backup ×1
bash ×1
btrfs ×1
concurrency ×1
file-search ×1
grep ×1
kill ×1
loop-device ×1
lvm ×1
partition ×1
process ×1
ps ×1
shell-script ×1
ubuntu ×1
uefi ×1