Mat*_*nco 5 filesystems kernel-modules proc sysfs linux-kernel
在正在运行的 Linux 系统上,有什么可移植的(在 Linux 发行版中)方法来找出当前内核已编译(不通过模块)支持哪些文件系统?
以我当前的 Ubuntu x86_64 内核为例3.11.0-24-generic #41-Ubuntu:例如,它有 no /proc/config.gz,否则这将是我的第一个想法。
我感兴趣的原因是我想(以编程方式)使用当前内核和内核能够加载/安装的初始 ramdisk 构建一个救援环境。
/proc/filesystems 是不是就跟 比较一样简单lsmod?
如果是这样:模块是否始终具有lsmod与文件系统名称(中的最后一列)完全相同的名称(输出的第一列/proc/filesystems)?
是否有一种更现代的方式,例如/sys代替/proc寻找信息?
我目前的方法如下。有人可以确认它是正确的,或者建议如何做吗?:
for fscand in $(awk '{print $NF}' /proc/filesystems)
do
if test $(lsmod | grep -c -e '^'${fscand}'[^a-z0-9_-]') -eq 0
then
candlist="${fscand} ${candlist}"
fi
done
for fscand in $candlist
do
echo $fscand is compiled-in
done
Run Code Online (Sandbox Code Playgroud)
\n\n\n\n
/proc/filesystems是不是就跟比较一样简单lsmod?
不:
\n\n$ comm -31 <(lsmod | awk \'NR!=1 {print $1}\' |sort) \\\n <(</proc/filesystems awk \'{print $NF}\' |sort) | fmt\nanon_inodefs autofs bdev cgroup cpuset debugfs devpts devtmpfs ext2 ext3\nfuseblk fusectl hugetlbfs mqueue nfs4 pipefs proc pstore ramfs rootfs\nrpc_pipefs securityfs sockfs sysfs tmpfs\nRun Code Online (Sandbox Code Playgroud)\n\n其中许多都没有内置到该系统的内核中。autofs由名为 的模块提供autofs4,而nfs4由名为 的模块提供nfs。该ext4模块提供ext2和;提供和。(不要与 混淆)由 提供。ext3ext4fusefuseblkfusectlrpc_pipefspipefssunrpc
然而,您的系统能够按需加载文件系统的模块:当您运行时mount -t foo \xe2\x80\xa6,如果foo不是受支持的文件系统类型,Linux 会尝试加载提供此文件系统的模块。其工作方式是内核检测到该foo文件系统不受支持,并调用modprobe加载名为 的模块fs-foo。该机制类似于pci:\xe2\x80\xa6通过 PCI ID 加载 PCI 硬件外设的驱动程序的别名,usb:\xe2\x80\xa6类似于 USB \xe2\x80\x94\xc2\xa0see如何将 USB 驱动程序分配给设备,Debian 不检测串行 PCI 卡重新启动后以获得更多解释。模块fs-\xe2\x80\xa6别名记录在/lib/$(uname -r)/modules.alias. 该文件是在构建内核时生成的。
在正常情况下,您可以使用它来确定模块提供了哪些文件系统。通过消除,模块未提供的文件系统被内置到内核中。在极少数情况下,这种方法不起作用,例如,如果您修改或删除了文件modules.alias,或者文件系统既由模块提供又以编译形式提供。我不知道有什么方法可以处理这些情况,除非编写一些内核代码并将其作为模块加载。
for fs in $(</proc/filesystems awk \'{print "fs-" $NF}\' |sort); do\n /sbin/modprobe -n $fs 2>/dev/null || echo "$fs is built in"\ndone\nRun Code Online (Sandbox Code Playgroud)\n
| 归档时间: |
|
| 查看次数: |
2404 次 |
| 最近记录: |