Linux的dev/ 和 sys/ 和 proc/ 目录

linux精神:
一切设备皆文件。
设备被抽象成文件

1、 /dev :

该目录放的设备文件,是应用程序和内核的交互文件,应用程序对这些文件的读写控制可以直接访问到实际的设备
应用程序通过mknod创建的文件,如果底层驱动对mknod的设备号有对应的驱动,那么应用程序读写节点时就会调用到底层驱动
一些较复杂的设备通常使用设备节点dev的方式

2、 /sys :

是个文件系统,sysfs的挂载点,sysfs是一个虚拟文件系统(还有其他的vfs,如usbfs、procfs),内核设备驱动中有调用kobj_add函数的,就会在sys下对应目录创建相应的文件
它作用是将内核注册的device、device_driver、bus通过链表组成一个树形结构,表示内核有哪些驱动和设备,以及所属总线,便于管理,应用层也可以通过读写sys下的文件的内核交互(ktype)
一般简单点的设备会用sysfs方式操控

3、 /sys/devices :

实际存放device和driver的,按照设备挂接的总线类型,组织成层次结构,保存了系统所有的设备
devices中所有设备都是连接于某种总线之下,每一种总线之下可以找到具体设备的符号链接

4、/sys/dev :

下面有两个子目录,block和char,存放的是块设备和字符设备的主次号,格式为: major:minor,但都是链接,指向sys/devices目录下的实际设备

5、ATTR 和 file_operation:

使用DEVICE_ATTR,可以实现驱动在sys目录自动创建文件,我们只需要实现show和store函数即可
应用层可以通过cat和echo命令来对sys创建出来的文件进行读写设备属性文件,实现交互
file_operation是字符设备驱动实现的零一用方式: 用户进程,在对设备文件进行read、write等操作时,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给该函数,这是linux的设备驱动程序工作的基本原理

6、sysfs和 /dev 的关系:

sysfs最主要用来描绘kernel2.6中的设备驱动模型,用户态的后台程序(mdev、udev)会动态周期性的扫描 /sys 目录中的属性项来自动管理设备文件(设备节点),从而在 /dev 目录会建立或者删除对应的设备文件

7、总结:

/dev 目录存放的是应用与内核交互的设备文件,而/sys/dev目录存放的是系统的所有设备,这些设备由文件系统管理
应用层操控底层两种方式:
1、/dev 目录下的设备文件(设备节点) :复杂点的设备, LCD,摄像头等
2、/sys 目录下设备的属性文件 :简单点的设备, led、gpio等

8、/proc :

正在运行的内核信息映射,主要输出信息为:进程信息,内存资源信息,磁盘分区信息等

/proc下文件基本都是只读的,除了/proc/sys目录,它是可写的(查看和修改内核的运行参数)
/proc下数字命令的目录就是对于PID的进程目录
/proc/cmdline 启动时传递给kernel的参数信息(就是bootargs信息)
/proc/cpuinfo cpu的信息
/proc/crypto 内核使用的所有已安装的加密密码及细节
/proc/devices 已经加载的设备并分类
/proc/dma 已注册使用的ISA DMA频道列表
/proc/execdomains Linux 内核当前支持的execution domains
/proc/fb 帧缓冲设备列表,包括数量和控制它的驱动
/proc/filesystems 内核当前支持的文件系统类型
/proc/interrupts x86架构中的每个IRQ中断数
/proc/iomem 每个物理设备当前在系统内存中的映射
/proc/ioports 一个设备的输入输出所使用的注册端口范围
/proc/kcore 代表系统的物理内存,存储为核心文件格式,里边显示的是字节数,等于RAM大小加上4kb
/proc/kmsg 记录内核生成的信息,可以通过/sbin/klogd或/bin/dmesg来处理
/proc/loadavg 根据过去一段时间内CPU和IO的状态得出的负载状态,与uptime命令有关
/proc/locks 内核锁住的文件列表
/proc/mdstat 多硬盘,RAID配置信息(md=multiple disks)
/proc/meminfo RAM使用的相关信息
/proc/misc 其他的主要设备(设备号为10)上注册的驱动
/proc/modules 所有加载到内核的模块列表
/proc/mounts 系统中使用的所有挂载
/proc/partitions 分区中的块分配信息
/proc/pci 系统中的PCI设备列表
/proc/slabinfo 系统中所有活动的 slab 缓存信息
/proc/stat 所有的CPU活动信息
/proc/uptime 系统已经运行了多久
/proc/swaps 交换空间的使用情况
/proc/version Linux内核版本和gcc版本
/proc/bus 系统总线(Bus)信息,例如pci/usb等
/proc/driver 驱动信息
/proc/fs 文件系统信息
/proc/ide ide设备信息
/proc/irq 中断请求设备信息
/proc/net 网卡设备信息
/proc/scsi scsi设备信息
/proc/tty tty设备信息
/proc/net/dev 显示网络适配器及统计信息
/proc/vmstat 虚拟内存统计信息
/proc/vmcore 内核panic时的内存映像
/proc/diskstats 取得磁盘信息
/proc/schedstat kernel调度器的统计信息
/proc/zoneinfo 显示内存空间的统计信息,对分析虚拟内存行为很有用

以下是/proc目录中进程N的信息
/proc/N/cmdline 进程启动命令
/proc/N/cwd 链接到进程当前工作目录
/proc/N/environ 进程环境变量列表
/proc/N/exe 链接到进程的执行命令文件
/proc/N/fd 包含进程相关的所有的文件描述符 (ls /proc//fd | wc -l 查看某个进程打开多少FD)
/proc/N/maps 与进程相关的内存映射信息
/proc/N/mem 指代进程持有的内存,不可读
/proc/N/root 链接到进程的根目录
/proc/N/stat 进程的状态
/proc/N/statm 进程使用的内存的状态
/proc/N/status 进程状态信息,比stat/statm更具可读性
/proc/self 链接到当前正在运行的进程

<think> 我们之前已经讨论过,在chroot环境中查看网络接口(如eth0)需要挂载虚拟文件系统,特别是/sys。用户提到已经执行了以下挂载操作: - mount -t proc /proc proc/ - mount -t sysfs /sys sys/ - mount -o bind /dev dev/ - mount -o bind /dev/pts dev/pts/ 但是,用户仍然无法查看网络接口(执行`ls /sys/class/net/`只显示`ens33 lo`,而没有eth0)。用户询问是否需要挂载`/etc`来解决这个问题。 ### 核心问题分析 1. **挂载`/etc`的作用**:`/etc`目录主要包含配置文件(如DNS配置`resolv.conf`、网络接口配置`interfaces`等)。挂载`/etc`可以解决网络配置问题(例如DNS解析),但**不会影响网络接口设备信息的暴露**。 2. **网络接口设备信息来源**:网络接口(如eth0)的信息由内核通过`sysfs`文件系统(挂载在`/sys`)提供。因此,如果`/sys/class/net/`下没有eth0,问题通常与`/sys`的挂载或驱动加载有关,而与`/etc`无关。 3. **当前情况**:用户已经挂载了`/sys`,但`ls /sys/class/net/`没有显示eth0,可能的原因有: - 物理机或虚拟机中不存在名为`eth0`的接口(可能已被重命名,如ens33、enp0s3等)。 - 网卡驱动未加载或硬件未识别。 ### 解决方案 #### 步骤1:确认网络接口名称 在chroot环境中执行: ```bash ls /sys/class/net/ ``` 观察输出。如果输出中有`ens33`(如用户之前所见),则说明该接口存在,只是名称不是`eth0`。现代Linux系统通常使用可预测的网络接口名称(如ens33),而非传统的eth0。 #### 步骤2:查看ens33的MAC地址 既然接口存在(名为ens33),则可以直接查看其地址: ```bash cat /sys/class/net/ens33/address ``` #### 步骤3:无需挂载`/etc`来解决此问题 挂载`/etc`主要用于解决网络配置(如DNS、静态IP等),**不会**帮助生成新的网络接口设备节点。因此,针对查看网络接口的问题,无需挂载`/etc`。 ### 补充建议 - **网络接口名称问题**:如果必须使用`eth0`,可以修改系统规则文件(如`/etc/udev/rules.d/70-persistent-net.rules`)或使用`net.ifnames=0`内核参数禁用可预测命名。但这需要在主机系统中操作,且修改后需重启。 - **检查驱动加载**:在chroot环境中,检查驱动是否加载: ```bash lsmod | grep -i e1000 # 对于Intel网卡,具体驱动名根据硬件而定 ``` 如果未加载,则需要在主机系统中确保驱动已加载(chroot环境无法直接加载驱动)。 ### 结论 无需挂载`/etc`来解决网络接口显示问题。问题的核心在于接口命名规则或驱动加载状态,而这两者不受`/etc`挂载的影响。 --- §§相关问题§§ 1. 如何修改Linux网络接口名称(如将ens33改为eth0)? 2. 如何在chroot环境中加载内核模块? 3. 为什么现代Linux系统使用可预测的网络接口名称? </think> ### 问题分析与解决方案 您已正确执行了以下关键挂载操作: ```bash sudo mount -t proc /proc proc/ sudo mount -t sysfs /sys sys/ sudo mount -o bind /dev dev/ sudo mount -o bind /dev/pts dev/pts/ ``` **挂载 `/etc` 对解决网络接口识别问题没有帮助**,原因如下: 1. `/etc` 目录作用: - 存储配置文件(如 DNS `resolv.conf`、网络配置 `interfaces`) - 不包含硬件设备识别信息 - ✘ **不影响内核暴露硬件接口** 2. 问题根源定位: ```mermaid graph TD A[网络接口识别失败] --> B{可能原因} B --> C[内核未暴露设备] B --> D[驱动未加载] B --> E[设备命名差异] C -->|检查| F[/sys/class/net 内容] D -->|检查| G[lsmod | grep eth] E -->|检查| H[ip -br link show] ``` ### 验证与排查步骤 #### 1. 检查 `/sys` 挂载有效性 ```bash # 在 chroot 内执行 mount | grep sysfs # 应显示 sysfs 挂载点 ls /sys/class/net # 列出所有内核暴露的接口 ``` - 若输出为空 → 内核未暴露设备(非挂载问题) - 若有接口名(如 `ens33`)→ 需使用实际名称 #### 2. 确认接口命名 ```bash ip -br link show # 查看实际接口名 ``` 输出示例: ``` lo UNKNOWN 00:00:00:00:00:00 <LOOPBACK,UP,LOWER_UP> ens33 UP 00:0c:29:12:34:56 <BROADCAST,MULTICAST,UP,LOWER_UP> ``` - ✍ 现代 Linux 使用可预测接口名(非固定 `eth0`) #### 3. 检查驱动加载状态 ```bash lsmod | grep -i e1000 # Intel 网卡驱动示例 ``` - 无输出 → 驱动未加载(需在主机操作) ### 解决方案 1. **使用实际接口名操作**(非 `eth0`): ```bash cat /sys/class/net/ens33/address # 替换为实际接口名 ``` 2. **强制加载网卡驱动**(主机操作): ```bash sudo modprobe e1000 # 根据硬件替换驱动名 ``` 3. **检查设备树路径**: ```bash find /sys/devices -name net -exec ls {} \; ``` ### 关键结论 $$\begin{cases} \text{挂载 /etc} & \rightarrow \text{解决配置问题(DNS/静态IP)} \\ \text{挂载 /sys} & \rightarrow \text{解决硬件识别问题} \end{cases}$$ 您已正确挂载 `/sys`,**无需挂载 `/etc`** 来解决接口识别问题。问题本质是: 1. 接口名不符预期(如 `ens33` 替代 `eth0`) 2. 网卡驱动未加载 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值