/sys文件系统最重要的目录结构
① /sys/devices
该目录下是全局设备结构体系,包含所有被发现的注册在各种总线上的各种物理设备。一般来说,所有的物理设备都按其在总线上的拓扑结构来显示,但有两个例外,即platform devices和system devices。platform devices一般是挂在芯片内部的高速或者低速总线上的各种控制器和外设,它们能被CPU直接寻址;system devices不是外设,而是芯片内部的核心结构,比如CPU,timer等,它们一般没有相关的驱动,但是会有一些体系结构相关的代码来配置它们。
② /sys/dev
该目录下有字符设备(block)和块设备(char)两个子目录,里面全是以主次设备号(major:minor)命名的链接文件,链接到/sys/devices。
③ /sys/class (按功能分类设备)
该目录下包含所有注册在kernel里面的设备类型,每个设备类型表达具有一种功能的设备。每个设备类型子目录下是具体设备的符号链接,这些链接指向/sys/devices/…下的具体设备。设备类型和设备并没有一一对应的关系,一个物理设备可能具备多种设备类型;一个设备类型只表达具有一种功能的设备,比如:系统所有输入设备都会出现在/sys/class/input之下,而不论它们是以何种总线连接到系统的。(/sys/class也是构成linux统一设备模型的一部分)
④ /sys/block (从linux2.6.26版本开始已经移到了/sys/class/block)
代表着系统中当前被发现的所有块设备。按照功能来说防止在/sys/class下会更合适,但由于历史遗留因素而一直存在于/sys/block,但从linux2.6.22内核开始这部分就已经标记为过去时,只有打开了CONFIG_SYSFS_DEPRECATED配置编译才会有这个目录存在,并且其中的内容在从linux2.6.26版本开始已经正式移到了/sys/class/block,旧的接口/sys/block为了向后兼容而保留存在,但其中的内容已经变为了指向它们在/sys/devices/中真实设备的符号链接文件。
⑤ /sys/bus (按总线类型分类设备)
一般来说每个子目录(总线类型)下包含两个子目录,一个是devices,另一个是drivers;其中devices下是这个总线类型下的所有设备,这些设备都是符号链接,它们分别指向真正的设备(/sys/devices/…下);而drivers下是所有注册在这个总线上的驱动,每个driver子目录下 是一些可以观察和修改的driver参数。 (它也是构成linux统一设备模型的一部分)
⑥ /sys/module
该目录包含所有被载入Kernel的模块,无论这些模块是以内联(inlined)方式编译到内核映像文件中还是编译为外模块(.ko文件)
⑦ /sys/fs
该目录用来描述系统中所有的文件系统,包括文件系统本身和按照文件系统分类存放的已挂载点。
⑧ /sys/kernel
该目录下存放的是内核中所有可调整的参数
⑨ /sys/firmware
该目录下包含对固件对象(firmware object)和属性进行操作和观察的接口,即这里是系统加载固件机制的对用户空间的接口.(关于固件有专用于固件加载的一套API)
⑩/sys/power
该目录下有几个属性文件可以用于控制整个机器的电源状态,如向其中写入控制命令让机器关机/重启等等。
sys目录是一个虚拟文件系统,它包含了与内核相关的文件。这些文件通常是只读的,因此在sys目录下创建或编辑文件是不被支持的,也不会生效。如果您需要在启动时执行一些操作,可以考虑使用/etc/rc.local或者其他的系统启动脚本来实现。但是请注意,修改内核相关的配置或文件可能会导致系统不稳定或无法启动,因此在进行此类操作时应当非常谨慎并备份数据。
sys目录下的文件通常是只读的,因为这些文件包含了与内核相关的信息,不建议直接修改。如果您需要修改内核参数或配置,请使用sysctl命令或者在/etc/sysctl.conf文件中进行修改。对于其他的sys目录下的文件,建议不要随意修改。如果您一定需要修改,可以考虑使用initramfs技术,在系统启动时加载一个自定义的initramfs镜像,其中包含了您需要修改的文件。这样可以避免重启后还原。但是请注意,修改内核相关的配置或文件可能会导致系统不稳定或无法启动,因此在进行此类操作时应当非常谨慎并备份数据。
Initramfs(Initial RAM Filesystem)是一个用于在Linux系统启动时加载临时根文件系统的技术。它包含了必要的内核模块和文件,可以在系统启动时使用。如果您需要在启动时修改sys目录下的文件并使其生效,可以考虑使用initramfs技术。
initramfs技术前提
在Linux系统中,initramfs是一个内核自带的功能,因此不需要单独安装。initramfs是在操作系统启动时由内核自动加载的,用于初始化和加载内核模块、挂载根文件系统等操作。用户可以通过编辑initramfs文件,添加、删除或修改其中的内容,以满足自己的需求。
另外,建议在使用initramfs技术前先了解相关知识和经验,并备份好系统数据,以防出现操作失误或其他问题。在对initramfs文件进行任何修改之前,请确保您已经完全理解其中的文件结构和内容,以及其作用和影响。
确认系统内核支持initramfs。在Linux内核的配置中,可以通过CONFIG_INITRAMFS_SOURCE选项来启用initramfs功能。您可以使用以下命令查看当前内核是否支持initramfs:
zgrep CONFIG_INITRAMFS_SOURCE /proc/config.gz
如果该命令输出“# CONFIG_INITRAMFS_SOURCE is not set”信息,则表示当前内核不支持initramfs。否则,该选项将列出其相应的值(通常是一个文件路径)。
准备基本的initramfs环境。在创建自己的initramfs之前,您需要准备一个包含必要驱动和工具程序的基本initramfs环境,以便在启动时加载。可以使用命令创建一个基本的initramfs,详情参考技术方法2
sudo update-initramfs -c -k $(uname -r)
initramfs技术方法1
下面是一个基本的步骤:
创建一个新的目录,用于存放initramfs镜像的文件
mkdir my_initramfs
cd my_initramfs
在该目录下创建一个名为init的脚本,并添加需要修改的sys目录下的文件。例如,假设您需要修改sys/kernel/debug/tracing/trace_clock文件:
#!/bin/sh
mount -t sysfs none /sys
mount -t debugfs none /sys/kernel/debug
echo local > /sys/kernel/debug/tracing/trace_clock
umount /sys/kernel/debug
umount /sys
#脚本说明
这个脚本的作用是启用Linux内核的跟踪功能,它会执行以下操作:
挂载sysfs和debugfs文件系统到/sys和/sys/kernel/debug目录。
具体来说,这个命令使用了mount工具程序,并指定以下选项:
-t sysfs:指定要挂载的文件系统类型为sysfs。sysfs是一种特殊的文件系统,它提供了一种用户空间访问和管理内核数据结构的接口。
none:表示要挂载的设备或文件系统不存在。在这里,我们并没有指定任何设备节点或文件路径,而是直接将sysfs文件系统挂载到/sys目录下。
/sys:表示挂载点(即目标目录),也就是我们要将sysfs文件系统挂载到的目录。在Linux系统中,/sys目录通常被用于显示当前系统硬件及其状态信息。
因此,当您执行这个命令时,系统会将sysfs文件系统挂载到/sys目录下,并在该目录中显示与当前系统相关的内核数据结构、设备和驱动程序等信息。通过/sys目录,用户可以方便地查看和管理系统中的各种硬件和软件资源,从而更好地理解和调试Linux系统。
将trace_clock设置为“local”,以便在跟踪数据中使用本地时钟。
卸载debugfs和sysfs文件系统。
sysfs文件系统提供了一种获取系统信息的接口,而debugfs文件系统则提供了访问内核调试信息的接口。在这个脚本中,通过挂载这两个文件系统并修改相应的内核参数,可以启用Linux内核的跟踪功能,从而帮助开发人员诊断和调试系统问题。
请注意,需要具有root权限才能运行这个脚本,并且对于不同版本的Linux内核,可能需要进行适当的修改才能正确地启用跟踪功能。
将该脚本赋予执行权限:
chmod +x init
使用find
命令将需要的文件复制到initramfs目录中:
find . | cpio --create --format='newc' > ../my_initramfs.cpio
#命令说明
这个命令的作用是将当前目录(包括子目录)中的所有文件和文件夹打包成一个initramfs文件。
具体来说,这个命令使用了两个工具程序:find和cpio。
find命令:用于查找当前目录(包括子目录)中的所有文件和文件夹,并将它们输出到标准输出中。其中,“.”表示当前目录,“|”表示管道符号,将find的输出传递给cpio命令。
cpio命令:用于创建或提取归档文件。在这个命令中,使用了以下选项:
--create:表示创建新的归档文件。
--format='newc':指定归档文件的格式为“newc”,这是一种特定于Linux内核的压缩格式。
../my_initramfs.cpio:将归档文件的输出重定向到上级目录中的名为“my_initramfs.cpio”的文件中。如果该文件不存在,则会自动创建;如果存在,则会覆盖原有内容。
因此,这个命令执行后会将当前目录中的所有文件和文件夹打包成一个名为“my_initramfs.cpio”的initramfs文件,该文件可以被用于启动和初始化Linux系统。
修改GRUB配置文件,以加载initramfs镜像文件。打开/etc/default/grub文件,在GRUB_CMDLINE_LINUX_DEFAULT行中添加initrd=/path/to/my_initramfs.cpio
,例如:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash initrd=/path/to/my_initramfs.cpio"
更新GRUB配置文件并重启:
sudo update-grub
sudo reboot
在系统重新启动后,您修改的sys目录下的文件应该已经生效了。请注意,使用initramfs技术需要一定的Linux系统知识,并且修改内核相关的配置或文件可能会导致系统不稳定或无法启动,因此在进行此类操作时应当非常谨慎并备份数据。
注意!!!
initramfs技术方法2
使用initramfs技术在启动时修改/sys目录下的文件并使其生效的步骤如下:
创建一个临时的initramfs环境。可以使用以下命令创建一个包含必要驱动和工具程序的基本initramfs:
sudo update-initramfs -c -k $(uname -r)
#命令说明
这个命令的作用是生成当前系统正在运行的内核版本的initramfs文件,以供启动时使用。
具体来说,这个命令使用了update-initramfs工具程序,并指定以下选项:
sudo:以超级用户权限执行该命令。
update-initramfs:用于更新或创建initramfs文件的工具程序。
-c:表示创建新的initramfs文件。
-k (uname−r):指定要操作的内核版本号。(uname−r):指定要操作的内核版本号。(uname -r)会输出当前正在运行的内核版本号。因此,使用-k选项和$(uname -r)参数,可以确保生成与当前正在运行的内核版本相对应的initramfs文件。
因此,当您执行这个命令时,系统会在/initrd.img目录(也可能是其他目录)下创建一个名为“initrd.img-<kernel_version>”(例如,initrd.img-5.4.0-89-generic)的initramfs文件。该文件包含了必要的驱动、工具程序和文件系统信息,用于在Linux系统启动时初始化和加载内核模块,以及挂载根文件系统。
将/sys目录及其子目录(如果有)添加到initramfs中。可以使用以下命令创建一个脚本,并将其存储在/etc/initramfs-tools/scripts/init-top/目录中:
sudo vim /etc/initramfs-tools/scripts/init-top/add_sys_directory.sh
然后,在该脚本中输入以下内容:
#!/bin/sh
mount --bind /sys /root/sys
这个脚本的作用是将/sys目录挂载到initramfs根目录下的/sys目录中。
- 修改需要修改的/sys目录下的文件。您可以使用任何编辑器进行修改。
- 在initramfs中添加修改后的文件。可以使用以下命令创建一个脚本,并将其存储在/etc/initramfs-tools/scripts/init-top/目录中:
sudo nano /etc/initramfs-tools/scripts/init-top/copy_modified_files.sh
然后,在该脚本中输入以下内容:
#!/bin/sh
cp /sys/path/to/modified/file /root/sys/path/to/modified/file
这个脚本的作用是将修改后的文件复制到initramfs中/sys目录下。
- 保存并关闭脚本文件,并设置其可执行权限:
sudo chmod +x /etc/initramfs-tools/scripts/init-top/add_sys_directory.sh
sudo chmod +x /etc/initramfs-tools/scripts/init-top/copy_modified_files.sh
- 重新生成initramfs文件。可以使用以下命令重新生成initramfs:
sudo update-initramfs -u -k $(uname -r)
其中,-u选项表示更新当前内核版本的initramfs;-k选项后面跟随当前内核版本号。
- 重启系统以使更改生效。在启动时,initramfs环境会自动加载修改过的/sys目录和文件。
第二种方法(要充分了解模块或驱动)
确认您所要修改的文件属于/sys目录。可以使用以下命令查看文件的路径和属性信息:
ls -l /sys/path/to/file
找到控制该文件的内核模块或驱动程序。可以使用以下命令查看与该文件相关的进程和模块信息:
sudo lsof /sys/path/to/file
sudo lsmod | grep module_name
卸载与该文件相关的内核模块或驱动程序,以停止文件的操作。可以使用以下命令卸载模块:
sudo rmmod module_name
修改文件内容,并保存更改。
编辑系统配置文件,以在每次启动时自动加载修改后的内核模块或驱动程序。具体来说,在/etc/modules-load.d/目录下创建一个新的模块加载文件,例如"my_module.conf",并将模块名称添加到该文件中。例如:
# /etc/modules-load.d/my_module.conf
my_module
重启系统以使更改生效。文章来源:https://www.toymoban.com/news/detail-754111.html
请注意,对/sys目录下的文件进行不正确的修改可能会导致系统崩溃或其他严重问题。因此,在进行任何更改之前,请确保您已经完全理解了该文件的含义和作用,并备份好系统数据。建议在修改/sys目录下的文件之前先了解相关知识和经验。文章来源地址https://www.toymoban.com/news/detail-754111.html
到了这里,关于修改linux的/sys目录下内核参数、模块...的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!