有人告诉我Linux可以在不支持多任务的CPU上运行。
但如果只有一个核心,不支持多任务,那么Linux如何实现多任务呢?
假设我想运行两个程序,每个程序都需要 1 小时才能终止。Linux 如何在约 100 毫秒后暂停第一个程序以切换到第二个程序?
我能想到的有两种情况:
- 不可能同时运行多个任务。
- Linux 使用硬件定时器来中断正在运行的进程。
有人告诉我Linux可以在不支持多任务的CPU上运行。
但如果只有一个核心,不支持多任务,那么Linux如何实现多任务呢?
假设我想运行两个程序,每个程序都需要 1 小时才能终止。Linux 如何在约 100 毫秒后暂停第一个程序以切换到第二个程序?
我能想到的有两种情况:
我正在尝试/dev/mem
并发现即使作为 root 用户,如果CONFIG_STRICT_DEVMEM=y
.
对我来说,有一些机制可以阻止 root 用户做他喜欢做的事情,这对我来说是新的。
但作为 root,我可以简单地更改 Linux 内核映像并重新启动(以禁用限制)。如果内核映像文件受到某种保护,我仍然可以写入/dev/sda
主磁盘或任何主磁盘。
所以我的问题是设置是否CONFIG_STRICT_DEVMEM=y
安全或者 root 用户是否可以轻松绕过?
假设我丢失了一个 LUKS 加密的 USB 笔式驱动器。我认为文件系统类型 (ext4/fat32/...) 不起作用。一个外国人发现了它。当然他不能访问我的数据,因为他没有密码。但他可以更改“原始”数据中间的单个字节,从而损坏数据。
U盘退还给我后,是否可以验证我的数据是否损坏?
我认为读取整个映射器设备会导致 I/O 错误,但不幸的是它不会。我也检查过dmesg
。
# create an all zero 100MiB file
dd if=/dev/zero of=moh bs=100M count=1
# format it as LUKS device
/usr/sbin/cryptsetup luksFormat moh
# map it to /dev/mapper/moh
sudo cryptsetup luksOpen moh moh
# initialize mapper file to zero
sudo dd if=/dev/zero of=/dev/mapper/moh
# close LUKS device
sudo cryptsetup luksClose moh
# overwrite 1MiB with zeroes at offset 10MiB. After this the LUKS device is damaged.
sudo dd if=/dev/zero of=moh conv=notrunc bs=1M seek=10 count=1
# open LUKS device and see if it complains
sudo cryptsetup luksOpen moh moh
# read all data to see if it complains
sudo dd if=/dev/mapper/moh of=/dev/null
上述命令证明打开和读取损坏的 LUKS 设备不会产生任何错误。
请注意,我不想执行任何文件系统检查。相反,我想验证 LUKS 设备的加密级别是否未受影响。
因为我正在寻找一个单一的命令来验证 luks 设备我希望你明白这不是一个更适合 SO 的编程问题。
我试过这个:
find /usr/lib -print0 | grep zip | xargs -0 -I{} echo "found file: {}"
find /usr/lib -print0 | grep --null zip | xargs -0 -I{} echo "found file: {}"
但它不起作用,因为 grep 只说有一个二进制文件匹配。我希望 grep 输出空终止行。
是否可以在不更改整个命令的情况下解决此问题?我知道可以使用find -name ... -exec ...
. 但是,如果我现有的命令可以被修复,那就太好了。
有 Supermicro X10DAi 主板,手册在这里。在第 1-11 页,您可以看到每个 CPU 都有自己的 RAM。
假设program A
是通过本地套接字提供 API /var/run/socketapi
。该程序在 CPU 1 上启动。
然后program B
连接到这个套接字,它在 CPU 2 上启动。
当program B
向套接字写入命令时,内核通常会将数据从 的内存空间复制program B
到 的内存空间program A
。
但是因为程序运行在不同的 CPU 上,CPU 之间不共享内存,所以出现了问题。
在最近的 Linux 下如何解决这个问题?也许 CPU 1 的整个内存都使用手册中显示的 QPI 接口内存映射到 CPU 2?
或者程序 IPC 无法运行并发生错误?
请提供一些对 Linux 源代码或文档的参考。
我这里有一个 Intenso 外置 1TB 2.5" HDD。它有点故障(在 Windows 上随机断开连接)所以我决定运行这个命令来检查它:
dd if=/dev/sdb of=/dev/null bs=4M status=progress
运行时的输出如下所示:
715099471872 Bytes (715 GB, 666 GiB) kopiert, 16115 s, 44,4 MB/s
除了 44.4 MB/s 对于 USB3 磁盘来说太慢之外,奇怪的是时钟仅每 12 秒滴答一次。(“16115 s”是 dd 时钟。)在健康的磁盘上运行相同的命令时,它每秒滴答作响。
我试着strace
看看为什么它会阻塞这么久,但它似乎是通过内存映射读取磁盘的,所以我什么也看不到。
磁盘在读取时也不可能只阻塞 12s。因为速度是 44.4 MB/s,块大小是 4 MB。所以 dd 每秒有 11 次机会更新时钟。
那么这里到底发生了什么?
(我对磁盘出了什么问题不感兴趣,而是想知道为什么 dd 时钟滴答得这么慢。所以我希望我在 SE Unix 上是对的。)
已经有Nimbus ExaDrive 100TB SSD,200TB SSD即将推出。正如您在此处所读到的, ext4 最多支持 256 TB。硬件达到这个限制只是时间问题。
他们会更新 ext4 还是会有 ext5?会发生什么?
我的交换分区在 /etc/crypttab 中有这一行:
luks-4205519b-f3fe-468f-b05e-44f25f6882a4 UUID=4205519b-f3fe-468f-b05e-44f25f6882a4 /crypto_keyfile.bin luks,keyscript=/bin/cat
我把它注释掉了,所以它现在看起来像这样:
# luks-4205519b-f3fe-468f-b05e-44f25f6882a4 UUID=4205519b-f3fe-468f-b05e-44f25f6882a4 /crypto_keyfile.bin luks,keyscript=/bin/cat
我重新启动但映射器文件/dev/mapper/luks-4205519b-f3fe-468f-b05e-44f25f6882a4
仍然被创建。为什么?
在 Windows 上,可以在不使用任何交换的情况下使用休眠。
我想知道这在 Linux 上是否可行?
因为在我的 Debian 11 上,我在 /etc/default/grub 中找到了这一行
GRUB_CMDLINE_LINUX_DEFAULT="... resume=/dev/mapper/luks-4205519b-f3fe-468f-b05e-44f25f6882a4"
如您所见,“resume=”选项指定用于休眠的交换分区。
现在,如果我删除这个交换分区(以禁用交换),我要在 /etc/default/grub 中写入什么?
是否可以像在 Windows 上一样使用休眠文件?
因为我有 32GB RAM,如果我只将 32GB 交换分区用于休眠,那就是浪费空间。
我的磁盘是 sda,我有这些大小的文件:
/sys/dev/block/8:0/size
/sys/class/block/sda/size
/sys/block/sda/size
我应该使用哪一个?第一个被使用lsblk
。有什么不同吗?
我的盘是sda。有大小文件/sys/dev/block/8:0/size
。它的单位是扇区。当我运行时,strace lsblk
我可以看到它正在读取这个文件。
但是 lsblk 如何获得扇区大小以便稍后以字节为单位显示总磁盘大小?因为我看不到 lsblk 正在读取文件hw_sector_size
,也看不到physical_block_size
.
我有一个 luks 设备,它在启动时由 /etc/crypttab 打开。lsblk 看起来像这样:
sdc 8:32 1 114,6G 0 disk
└─luks-672dcc74-d002-47dc-b61b-525baf91dc7c 253:2 0 114,6G 0 crypt
我像这样安装设备:
pmount /dev/mapper/luks-672dcc74-d002-47dc-b61b-525baf91dc7c
我这样卸载它(两者都有效):
pumount /dev/mapper/luks-672dcc74-d002-47dc-b61b-525baf91dc7c
pumount /media/mapper_luks-672dcc74-d002-47dc-b61b-525baf91dc7c
但是在 pumount lsblk 之后看起来像这样:
sdc 8:32 1 114,6G 0 disk
为什么 pumount 关闭了 luks 设备?从 pumount 的手册页上说:
Normally, pumount will not luksClose (see cryptsetup(1)) a device pmount did not open.
luks 设备在启动时由 /etc/crypttab 打开,而不是由 pmount 打开!为什么 pumount 会关闭 luks 设备?这是一个错误吗?
我在 debian 靶心上。
我尝试了以下内容:
user1@debian-desktop:/home/user1$ sudo add-apt-repository ppa:cdemu/ppa
Unofficial CDEmu packages
More info: https://launchpad.net/~cdemu/+archive/ubuntu/ppa
Press [ENTER] to continue or ctrl-c to cancel adding it
gpg: Die "Keybox" `/tmp/tmpknhcngga/pubring.gpg' wurde erstellt
gpg: /tmp/tmpknhcngga/trustdb.gpg: trust-db erzeugt
gpg: Schlüssel 423A2125D782A00F: Öffentlicher Schlüssel "Launchpad PPA for CDEmu" importiert
gpg: Anzahl insgesamt bearbeiteter Schlüssel: 1
gpg: importiert: 1
Warning: apt-key is deprecated. Manage keyring files in trusted.gpg.d instead (see apt-key(8)).
gpg: Keine gültigen OpenPGP-Daten gefunden.
user1@debian-desktop:/home/user1$ sudo apt-get update
....
Ign:5 http://ppa.launchpad.net/cdemu/ppa/ubuntu lunar InRelease
Fehl:6 http://ppa.launchpad.net/cdemu/ppa/ubuntu lunar Release
404 Not Found [IP: 2620:2d:4000:1::3e 80]
Paketlisten werden gelesen… Fertig
E: Das Depot »http://ppa.launchpad.net/cdemu/ppa/ubuntu lunar Release« enthält keine Release-Datei.
N: Eine Aktualisierung von solch einem Depot kann nicht auf eine sichere Art durchgeführt werden, daher ist es standardmäßig deaktiviert.
N: Weitere Details zur Erzeugung von Paketdepots sowie zu deren Benutzerkonfiguration finden Sie in der Handbuchseite apt-secure(8).
我认为重要的是:
404 Not Found [IP: 2620:2d:4000:1::3e 80]
为什么会出现此错误?
当我运行 cd-info 时,曲目列表如下所示:
CD-ROM Track List (1 - 1)
#: MSF LSN Type Green? Copy?
1: 00:02:00 000000 data false no
170: 68:17:27 307152 leadout (688 MB raw, 599 MB formatted)
LSN 是什么意思,它代表什么?我检查了手册页和谷歌,一无所获!
我想检测应用程序执行逻辑中的错误。例如:
free()
返回的地址malloc()
open()
open()
poll()
write()
调用了未打开写入的 fdopen()
例如 open("/etc/fstab", 4)close()
无效的 fd我认为还有数百个。
也许该工具可以类似于ftrace
or运行strace
,但包含错误调用的内核日志也足够了。