-e linux_linux目录结构和文件属性管理

Linux文件系统详解

一、FHS介绍

Filesystem Hierarchy Standard(文件系统层次化标准)的缩写,多数Linux版本采用这种文件组织形式,类似于Windows操作系统中c盘的文件目录,FHS采用树形结构组织文件。FHS定义了系统中每个区域的用途、所需要的最小构成的文件和目录,同时还给出了例外处理与矛盾处理。

FHS定义了两层规范,第一层是, / 下面的各个目录应该要放什么文件数据,例如/etc应该要放置设置文件,/bin与/sbin则应该要放置可执行文件等等。第二层则是针对/usr及/var这两个目录的子目录来定义。例如/var/log放置系统登录文件、/usr/share放置共享数据等等。

二、linux目录结构介绍

整个Linux系统最重要的地方就是在于目录树架构,所谓的目录树架构就是以根目录为主, 然后向下呈现分支状的目录结构的一种档案架构。下图给出了linux的目录结构,那这些目录都有什么作用呢?

a5f6a600-5d13-eb11-8da9-e4434bdf6706.png

三、linux目录的作用

根目录(/)

最高一级目录,所有目录都是根目录衍生出来,只有root用户具有写权限,一般根目录下只存放目录,不要存放件

/bin目录 – 用户二进制文件

包含二进制的可执行文件,你需要的常见的Linux命令都位于此目录下。

/sbin目录 – 系统二进制文件

这个目录下的命令通常由系统管理员使用, 对系统进行维护。

/etc– 配置文件

包含所有程序所需要的配置文件,也包含用于启动/停止单个程序的起动和关闭shell脚本。

/dev-设备文件

包含设备文件,包括终端设备、USB或连接到系统的任何设备,如网卡等。

/proc-进程信息文件

这是一个虚拟的文件系统,包含有关正在运行的进程信息。

/usr-用户程序

包含二进制文件、库文件、文档和二级程序的源代码。

/usr/bin中包含用户程序的二进制文件。如果你在/bin中找不到用户二进制文件,到/usr/bin目录看看。
/usr/sbin中包含系统管理员的二进制文件。如果你在/sbin中找不到系统二进制文件,到/usr/sbin目录看看。
/usr/lib中包含了/usr/bin和/usr/sbin用到的库。
/usr/local中包含了从源安装的用户程序。

/home -HOME目录

包含所有用户的个人档案,Linux是多用户的系统,所以用该目录保存各用户的信息。

/boot -引导加载程序

包含引导加载程序相关的文件。

/lib -系统库

包含支持位于/lib和/sbin下的二进制文件的库文件。

/opt -可选的附加应用程序

给主机额外安装软件所摆放的目录,以前的 Linux 系统中,习惯放置在 /usr/local 目录下

/mnt /media -挂载目录

光盘默认挂载点,通常光盘挂载于 /mnt/cdrom 下,也不一定,可以选择任意位置进行挂载。

在这里我们所介绍的目录是在linux系统中常见的目录,不同厂商的linux有所差异,有的版本中会出现有额外作用的目录,这个就需要具体问题具体对待了。

四、目录和设备节点

我们已经知道目录是用来存放文件的,不同的目录存放的文件作用不同,那么我们来看下设备节点是什么?一个设备节点其实就是一个文件,Linux中称为设备文件。有一点必要说明的是,在Linux中,所有的设备访问都是通过文件的方式,一般的数据文件程序普通文件,设备节点称为设备文件,而这些设备节点,或者说是设备文件都统一存放在/dev目录下,简单来说,设备节点是一种特殊的文件,只不过这个文件存放的不是一般的数据,而是和你计算机中的设备想关联的。

五、.和..

在linux系统中,使用ls -a命令时,你会发现每一个目录下都包含两个目录,这两个目录就是.和..,其中"."表示是的是当前目录,也就是你使用pwd所查看到的路径,而".."表示的上一级目录,也就是父目录。

六、绝对路径和相对路径

linux的路径书写方式有两种,绝对路径:路径的写法一定是由根目录 / 写起的,以根目录为起点;相对路径:路径的写法不是由根目录 / 写起的,不以根目录为起点。例如,你知道你的朋友在四楼,而你在五楼,如果你的朋友询问你的位置,你就有两种回答方式,绝对路径的方式就是你告诉对方你在五楼,相对路径的方式就是你告诉对方你在对方楼上。至于优缺点方面没有绝对的答案,不同情况使用不同的路径罢了。看完这个我们来看下linux的文件是如何保存的。

七、linux的文件保存

假如有一个用户在linux系统中编辑了一个文件,编辑完内容后,关闭编辑器时会问用户改如何命名这个文件,设置完名称之后会选择一个目录将该文件保存到指定目录下,在这个例子中包含了linux系统中与文件相关的三个组成部分

数据:就是文件的内容,保存在一个叫data(数据块)的结构中

元数据:保存一个文件的特征的系统数据,用来保存除了文件内容和文件名以外的与文件相关的信息, 诸如文件的创建者,日期,大小等等,保存在一个叫inode(i节点)的结构中。

文件名:用来保存文件名称,文件名保存在一个叫dentry(目录项)的结构中。

在这里面我们提到了一个东西叫inode下面一起来看下inode

八、i节点介绍

通过前面的课程我们知道,inode是用来保存文件的元数据的,除此之外还保存文件相关属性信息,如链接数等。我们通过类似stat hello.txt这条命令查看指定文件的inode信息。

i节点我们就介绍到这里,接下来我们看一下链接

九、链接介绍

Linux中如果用户想把同一个文件保存在两个地方,或用两个不同的文件名保存,除了复制之外还有另外一种选择,就是链接,在linux系统中链接分为硬链接,软链接,空链接,递归链接等

硬链接:允许一个文件拥有多个有效路径名,这样用户就可以建立硬链接到重要的文件,以防止“误删”源数据,不过硬链接只能在同一文件系统中的文件之间进行连接

软链接 : 也叫符号链接,类似于windows系统中的快捷方式,与硬链接不同,软链接就是一个普通文件,软链接可对文件或目录创建。

这是概念上的描述,我们用一句话来将这两种链接进行总结,硬链接不能链目录,不能跨文件系统,软链接可以;源文件删除后软链接失效,硬链接依然可用,我们通过下面的例子可以看到硬链接和软链接的创建方式以及基本对比

a6f6a600-5d13-eb11-8da9-e4434bdf6706.png

除了上面我们说到的硬链接和软链接之外还有

空链接,所谓的空链接就是软链接指向的源文件不存在了,包括源文件被删除,改名。

递归链接:递归链接不如空链接常见,如果想看的话几乎需要专门寻找,如果用户创建两个软链接,linka与linkb关联,而linkb又与linka关联,这时候就会出现递归链接,比如

a8f6a600-5d13-eb11-8da9-e4434bdf6706.png

绝对软链接和相对软链接:主要指的是用户在创建软链接的时候使用的是绝对路径还是相对路径来指定链接目标,如果链接创建完成之后不会移动,那么这两种方法可以随意使用,但是如果链接文件需要被移动,那么建议还是使用绝对路径,比如

abf6a600-5d13-eb11-8da9-e4434bdf6706.png

好了链接我们就说到这里,下面我们看一下时间戳

十、时间戳

时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数。通俗的讲, 时间戳是一份能够表示一份数据在一个特定时间点已经存在的完整的可验证的数据。 它的提出主要是为用户提供一份电子证据, 以证明用户的某些数据的产生时间。 当我们使用stat命令查看文件的时候除了创建时间你会发现有三个跟时间戳相关的信息

adf6a600-5d13-eb11-8da9-e4434bdf6706.png

aef6a600-5d13-eb11-8da9-e4434bdf6706.png

缩写命令目的Atime访问时间文件数据每次被阅读后的更新Ctime改变时间文件的i-节点信息每次被改变后都更新Mtime修改时间文件数据每次被改变后的更新

十一、常用目录管理命令介绍

ls:
    -a: 全部文件,包括隐藏文件一起列出
    -d: 仅列出目录本身,而不是列出目录内的文件数据
    -l:列出文件的属性与权限等
cp:
    -i: 若文件存在,询问是否覆盖
    -p:联通文件的属性一起复制,而非复制文件本身
    -r:递归复制
rm:
    -f: force,强制删除
    -i:删除前询问是否删除
    -r:递归删除
cat:
    -n:打印行号
mkdir:
    -p:递归
<think>我们正在讨论嵌入式系统电源管理中的两个重要结构体指针:battery->usb_psy battery->ac_psy。这些在Linux内核的电源子系统(power_supply)框架中扮演关键角色。 ### 一、基本概念 在Linux内核的电源管理子系统中: - `power_supply` 是内核为各种电源设备(如电池、USB电源、交流适配器)定义的抽象结构- `battery->usb_psy` `battery->ac_psy` 是指向其他`power_supply`设备的指针,分别代表: - `usb_psy`:USB类型电源(如手机充电器) - `ac_psy`:交流适配器电源(如笔记本电源适配器) ### 二、核心作用 #### 1. 电源状态联动(关键机制) 当电池驱动需要知道当前是否连接了USB或AC电源时,通过这两个指针访问关联电源的状态: ```c // 典型代码示例(简化版): int is_charging(struct battery_device *bat) { union power_supply_propval val; // 检查USB电源状态 power_supply_get_property(bat->usb_psy, POWER_SUPPLY_PROP_ONLINE, &val); if (val.intval) return 1; // USB供电中 // 检查AC电源状态 power_supply_get_property(bat->ac_psy, POWER_SUPPLY_PROP_ONLINE, &val); return val.intval; // AC供电状态 } ``` 这样实现: - 电池驱动**不需要直接处理硬件寄存器**即可获取供电状态 - 符合内核“高内聚低耦合”设计原则[^4] #### 2. 充电状态决策(业务逻辑核心) 在电池管理线程中(如引用[2]描述的`BAT_thread`): ```c // 伪代码基于引用[2]: void battery_thread() { while (1) { mt_battery_GetBatteryData(); // 获取电池数据 if (usb_psy->online || ac_psy->online) { // 检查外部电源 start_charging(); // 启动充电流程 } else { stop_charging(); // 停止充电 } ... } } ``` #### 3. 事件通知链(自动响应) 当USB电源插入/拔出时: 1. USB驱动调用`power_supply_changed(usb_psy)` 2. 内核自动通知所有**依赖此电源的设备**(包括电池) 3. 电池驱动通过注册的回调函数更新状态: ```mermaid graph LR A[USB插入事件] --> B[usb_psy状态更新] B --> C[通知battery->usb_psy监听者] C --> D[电池驱动更新充电状态] D --> E[触发/sys/class/power_supply/battery属性更新] ``` ### 三、实际驱动中的实现 #### 1. 指针初始化(通常在probe函数中) ```c // 引用[3]的扩展实现: static int battery_probe(struct platform_device *pdev) { struct battery_device *bat = ...; // 通过名称获取usb_psy bat->usb_psy = power_supply_get_by_name("usb"); if (!bat->usb_psy) dev_warn(&pdev->dev, "Failed to get USB power supply\n"); // 获取ac_psy bat->ac_psy = power_supply_get_by_name("ac"); ... } ``` #### 2. 状态监控(典型应用场景) ```c // 当需要判断充电类型时: if (bat->usb_psy && bat->usb_psy->online) { // USB充电模式(限流500mA) set_charge_current(500000); } else if (bat->ac_psy && bat->ac_psy->online) { // AC充电模式(全速2A) set_charge_current(2000000); } ``` ### 四、故障排查要点 当`battery->usb_psy/ac_psy`失效时: 1. **设备注册顺序问题**:电池驱动可能在USB/AC驱动之前加载 - 解决方案:在电池驱动的`probe`函数中延迟获取,或使用`power_supply_reg_notifier()` 2. **设备树关联缺失**:未正确建立电源设备间关联 ```dts battery { compatible = "vendor,battery-driver"; power-supplies = <&usb_phy>, <&ac_phy>; // 关键属性! }; ``` 3. **权限问题**:某些内核配置下需要`CONFIG_SYSFS_DEPRECATED=n` ### 五、与用户空间的交互 这些关联直接影响sysfs文件: - `/sys/class/power_supply/battery/status`:显示`Charging`/`Discharging` - `/sys/class/power_supply/usb/online`:USB电源状态(0/1) 当用户插入USB时: 1. USB驱动更新`usb/online=1` 2. 通过`battery->usb_psy`联动,电池驱动更新`battery/status=Charging` 3. 触发uevent通知用户空间程序(如Android BatteryService) > 总结:`battery->usb_psy``battery->ac_psy`是连接电池与外部电源的**核心桥梁**,实现了: > - 电源状态共享 > - 充电流程自动化 > - 系统级电源管理协同 §§相关问题§§ 1. 如何在Linux设备树中正确配置多个电源供应器之间的依赖关系? 2. 当电源供应器(如USB)的状态变化时,内核通过什么机制通知电池驱动程序? 3. 在嵌入式Linux系统中,如何设计多电源(电池/USB/无线充电)的优先级管理逻辑?</think>在嵌入式系统电源管理中,`battery->usb_psy` `battery->ac_psy` 是两个关键的结构体指针,它们在 Linux 内核的电源子系统(power_supply)框架中扮演着核心角色。以下是它们的意义作用分析: ### 一、基本概念 1. **`power_supply` 结构体** 内核中表示电源设备的抽象结构(如电池、USB电源、AC适配器等),包含设备属性、状态操作函数[^4]。 2. **`battery->usb_psy`** 指向 **USB电源设备** 的指针,用于监测USB供电状态(如手机充电器、USB-PD电源)。 3. **`battery->ac_psy`** 指向 **交流适配器电源** 的指针,用于监测AC插座供电状态(如笔记本电源适配器)。 ### 二、核心作用 #### 1. 电源状态监测与联动 ```c // 伪代码示例:检查电源状态 if (battery->usb_psy->online) { // USB电源已连接 start_usb_charging(); } else if (battery->ac_psy->online) { // AC电源已连接 start_ac_charging(); } else { // 无外部电源 enter_discharging_mode(); } ``` - **实时检测**:通过指针直接访问USB/AC电源的`online`属性(0/1值),判断供电状态[^2] - **状态联动**:当USB/AC状态变化时,触发电池充放电状态切换(如引用[2]中的`mt_battery_charging_algorithm()`) #### 2. 充电策略控制 ```c // 伪代码:不同电源的充电策略 void charging_algorithm() { if (battery->ac_psy->online) { set_charge_current(2000); // AC模式:2A快充 } else if (battery->usb_psy->online) { set_charge_current(500); // USB模式:500mA慢充 } } ``` - **充电电流控制**:AC电源通常支持更大电流(快充),USB电源限制电流(防止过载) - **充电协议协商**:通过`power_supply_get_property()`获取电源能力(如PD协议电压档位) #### 3. 事件通知机制 ```c // 当USB插入时触发 void usb_plug_event() { power_supply_changed(battery->usb_psy); // 通知内核状态变化 power_supply_changed(battery->psy); // 更新电池状态 } ``` - **状态同步**:USB/AC状态变化通过`power_supply_changed()`触发uevent[^4] - **用户空间通知**:生成`/sys/class/power_supply/usb/uevent`事件,通知Android框架等 ### 三、实际工作流程(结合引用[2]) 在电池管理线程中(如`BAT_thread`): 1. **检测电源状态** ```c mt_battery_GetBatteryData(); if (battery->usb_psy->online || battery->ac_psy->online) { charger_exist = true; } ``` 2. **执行充电逻辑** ```c if (charger_exist) { mt_battery_CheckBatteryStatus(); // 检查电压/温度 mt_battery_charging_algorithm(); // 根据电源类型选择策略 } ``` 3. **状态更新** ```c mt_battery_update_status(); // 更新sysfs节点 ``` ### 四、软件架构意义 1. **解耦设计** - 电池驱动无需知道USB/AC硬件的细节,只需通过指针访问接口 - 新增电源类型(如无线充电)只需注册新的`power_supply`设备 2. **统一管理** ```mermaid graph TD A[USB PHY] -->|注册| B(usb_psy) C[AC适配器] -->|注册| D(ac_psy) B -->|指针关联| E[battery_driver] D -->|指针关联| E E -->|状态同步| F[/sys/class/power_supply/] ``` ### 五、典型问题排查 当`battery->usb_psy`失效时: 1. 检查设备树关联: ```dts battery { power-supplies = <&usb_phy>, <&ac_phy>; // 必须声明关联 }; ``` 2. 验证驱动初始化顺序: ```bash dmesg | grep "power_supply" # 查看注册顺序 ``` 3. 动态获取指针: ```c battery->usb_psy = power_supply_get_by_name("usb"); ``` > **总结**:`battery->usb_psy``battery->ac_psy`是连接电池驱动与外部电源的**核心枢纽**,实现了: > 1. 多电源类型的统一管理 > 2. 充电策略的动态切换 > 3. 系统级电源状态同步[^4]
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值