为什么 Linux 允许 'init=/bin/bash'?
我读了这个,答案是说它是运行这个初始化程序的内核。
然后我开始怀疑,Linux通常带有一个initramfs,它最终会mount和pivot_root到真正的根文件系统。那么这个init
论点是什么意思呢?initramfs中的路径?或者就像我猜的那样,它不是由内核读取,而是由 initramfs 的 init 来执行真正的 init。
另外,root=UUID=xxxx
论点,是真正由内核读取还是仅由 initramfs 的 init 读取以找到真正的根文件系统?
似乎我可以将我想要的任何参数作为内核参数传递,那么它们是否都被内核读取,或者至少其中一些只对用户空间程序有意义?
我想将一个文件从 A 复制到 B,它可能位于不同的文件系统上。
还有一些额外的要求:
我认为这很接近:
cp A B.part && \
ln B B.part && \
rm B.part
Run Code Online (Sandbox Code Playgroud)
但是 3. 如果 B.part 存在(即使使用 -n 标志),则 cp 不会失败。随后 1. 如果另一个进程“赢得”cp 并且链接到位的文件不完整,则可能会失败。B.part 也可能是一个不相关的文件,但我很高兴在这种情况下没有尝试其他隐藏名称而失败。
我认为 bash noclobber 有帮助,这是否完全有效?有没有办法在没有 bash 版本要求的情况下获得?
#!/usr/bin/env bash
set -o noclobber
cat A > B.part && \
ln B.part B && \
rm B.part
Run Code Online (Sandbox Code Playgroud)
后续,我知道一些文件系统无论如何都会失败(NFS)。有没有办法检测这样的文件系统?
其他一些相关但不完全相同的问题:
有没有办法在 eMMC 上以原子方式将文件和目录从 tempfs 移动到 ext4 分区
https://rcrowley.org/2010/01/06/things-unix-can-do-atomically.html
实验1
从命名空间外部,cat /proc/self/mountinfo
给出
291 34 0:37 / /tmp/IMJUSTTMP rw,relatime shared:152 - tmpfs tmpfs rw,size=102400k
34 23 0:32 / /tmp rw,nosuid,nodev shared:16 - tmpfs tmpfs rw
Run Code Online (Sandbox Code Playgroud)
然后我运行unshare -mU --map-root-user --propagation private /usr/bin/zsh
在命名空间内获取一个新的 shell,但在新创建的安装命名空间内,我无法 umount /tmp/IMJUSTTMP
,umount
只是告诉我它尚未安装。虽然我可以通过 检查新创建的挂载命名空间cat /proc/self/mountinfo
,它提供了私有挂载
290 263 0:32 / /tmp rw,nosuid,nodev - tmpfs tmpfs rw
302 290 0:37 / /tmp/IMJUSTTMP rw,relatime - tmpfs tmpfs rw,size=102400k
Run Code Online (Sandbox Code Playgroud)
那么为什么umount: /tmp/IMJUSTTMP: not mounted.
当我尝试/tmp/IMJUSTTMP
在命名空间内卸载时会出现这种情况呢?
我正在使用 5.0.9-arch1-1-ARCH,带有kernel.unprivileged_userns_clone = 1
.
实验2 …
我想从带有叙利亚文字的文件中删除重复的行。源文件有 3 行,第 1 行和第 3 行相同。
$ cat file.txt
????
????
????
Run Code Online (Sandbox Code Playgroud)
当我使用sort
and 时uniq
,结果假定所有 3 行都相同,这是错误的:
$ cat file.txt | sort | uniq -c
3 ????
Run Code Online (Sandbox Code Playgroud)
将语言环境显式设置为叙利亚语也无济于事。
$ LC_COLLATE=syr_SY.utf8 cat file.txt | sort | uniq -c
3 ????
Run Code Online (Sandbox Code Playgroud)
为什么会这样?如果重要的话,我正在使用 Kubuntu 18 和 bash。
Linux有稳定的系统调用ABI,但NT没有,Windows只是确保Win32 ABI稳定,不会立即陷入内核空间。Windows 的较低级别功能(如 nt.dll)可能会在 Windows 更新或 Windows 版本之间发生变化。
我想知道对于其他内核,例如 FreeBSD 内核或 Mach,它们是否提供稳定的系统调用或仅提供 POSIX 接口的稳定 ABI?
我该如何理解 的输出dig
?
DNS 服务器存储资源记录的数据库。
是否dig
返回某个 DNS 服务器的数据库中的资源记录?如果是,dig
返回的是哪个 DNS 服务器的数据库资源记录?
例如,dig
似乎没有返回 DNS 服务器数据库中的资源记录a.edu-servers.net
。
$ dig @a.edu-servers.net robot.cs.washington.edu
; <<>> DiG 9.11.3-1ubuntu1.3-Ubuntu <<>> @a.edu-servers.net robot.cs.washington.edu
; (2 servers found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 2401
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 3, ADDITIONAL: 7
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: …
Run Code Online (Sandbox Code Playgroud) 当linux有execve()
一个ELF时,它会将该ELF映射到进程的内存空间中,并从入口点开始运行代码。但是内核是如何决定ELF的加载地址和入口点的呢?
如果禁用 ASLR,它将查找.p_vaddr
每个 PT_LOAD 段并使用.e_entry
ELF 标头作为入口点。
但是如果启用 ASLR 会怎样呢?内核是否会简单地向上述所有内容添加随机移位,但保持它们的相对位置?
ELF的内容会影响内核的行为吗?就像.p_vaddr
PT_LOAD 段的最小值是零还是非零?比如.e_type
ELF header是ET_DYN还是ET_EXEC?
我特别谈论的是 x86_64。
当进程使用 成功获取 fd 时open(flags=O_RDWR)
,只要 fd 未关闭(本地文件系统上的常规文件),它就能够读/写该文件,即使其他进程使用 chmod 取消读/写对应用户的权限。Linux 内核是否检查 inode 上的文件权限或打开的文件描述?但是当进程尝试使用 执行该文件时execveat
,内核是否会读取磁盘以检查 x 位和 suid 位权限?打开文件描述中记录了什么样的权限,它是否包含完整的 ACL 或简单的可读/可写位,以便每个操作 else( execveat
、fchdir
、fchmod
等) 都会检查磁盘信息?
如果我将此 fd 传输到另一个进程,该进程的 fsuid 在该文件上没有读/写/执行位(根据磁盘文件系统信息),该接收进程是否能够读/写/执行通过fd文件?
在我的 Archlinux 上,/dev/pts
是由 devpts 挂载的,那么谁创建了 /dev/pts/ptmx
设备节点?这个节点的目的是什么?它与 相同(Major=5 Minor=2)设备节点/dev/ptmx/
,但访问模式不同,这是为了什么?