linux开机后首先加载的几个文件介绍

先来一段通用的解释:

/etc/profile:

此文件为系统的每个用户设置环境信息,当用户第一次登录时,该文件被执行.并从/etc/profile.d目录的配置文件中搜集shell的设置

/etc/bashrc:

为每一个运行bash shell的用户执行此文件.当bash shell被打开时,该文件被读取

~/.bash_profile:

每个用户都可使用该文件输入专用于自己使用的shell信息,当用户登录时,该文件仅仅执行一次!默认情况下,他设置一些环境变量,执行用户的.bashrc文件

~/.bashrc:

该文件包含专用于你的bash shell的bash信息,当登录时以及每次打开新的shell时,该该文件被读取

~/.bash_logout:当每次退出系统(退出bash shell)时,执行该文件.

另外,/etc/profile中设定的变量(全局)的可以作用于任何用户,而~/.bashrc等中设定的变量(局部)只能继承/etc/profile中的变量,他们是”父子”关系.

~/.bash_profile 是交互式、login 方式进入 bash 运行的

~/.bashrc 是交互式 non-login 方式进入 bash 运行的通常二者设置大致相同,所以通常前者会调用后者

然后看一下应用场景:

每次bash作为login shell启动时会执行.bash_profile,主要有以下几种情况:

  1. 每次登录服务器时默认启动的shell
  2. su -l [USER]进入的shell
  3. bash –login进入的shell

每次bash作为普通的交互shell(interactice shell)启动时会执行.bashrc,主要有以下几种情况:

  1. su [USER]进入的shell
  2. 直接bash命令进入的shell

注意:

  1. shell脚本中#!/usr/bin/bash进入的shell,因为这里的bash不是交互式bash,所以不执行.bashrc
  2. 一般,惯例上,.bash_profile里会显式调用.bashrc,代码像这样

    if [ -f ~/.bashrc ]; then 

    . ~/.bashrc

    fi

最后说说su [USER]和su – [USER]的区别:
其实su – [USER]就是su -l [USER],以登录的方式进入bash,会运行.bash_profile,而su [USER]不会,所以有时候会遇到su root切换后无法找到useradd等命令的情况,就是这个原因造成的了


<think>嗯,用户想了解Linux开机后重新加载.ko文件的方法,这个问题很明确。根据提供的引用内容,用户应该是在系统启动后需要手动触发加载操作,可能是为了调试模块或者应用更新后的模块。 用户引用的资料[1]和[2]提到了模块加载的基本命令insmod和modprobe,这正是核心解决方案。不过要注意用户特别强调“开机后”这个时间点,说明ta不需要配置开机自启,而是需要临时操作命令。 引用[2]中展示的完整操作流程很有参考价值:先卸载旧驱动(rmmod),再安装新驱动(insmod),最后更新依赖(depmod)。这个流程可以解决用户“重新加载”的需求,特别是驱动有更新时。另外引用[4]提到的权限问题也值得注意,有些设备节点可能需要额外设置权限。 考虑到用户可能是开发者或运维人员,准备在回答中强调几个实用细节:一是用lsmod检查当前加载状态,二是模块路径选择(/lib/modules/$(uname -r)/路径最规范),三是依赖处理(modprobe比insmod更智能)。对于需要频繁操作的情况,还准备建议写个简单的reload脚本。 用户引用的资料里有提到CentOS 7和较旧的内核版本(2.6.32),说明ta的环境可能比较传统。不过现代发行版的操作命令其实是一致的,这点可以不用特别区分。倒是准备提醒用户注意模块签名问题,因为较新内核有安全限制。 最后考虑设计几个相关问题:模块黑名单、系统服务重启这些进阶操作应该能帮用户延伸学习。特别是systemd时代的模块管理方式(modprobe.d配置)和传统方式的区别,这个很多资料都没讲清楚。 </think>在Linux系统中,若需在开机后手动重新加载内核模块(.ko文件),请按以下步骤操作: --- ### **重新加载.ko文件的步骤** 1. **卸载现有模块** 先检查模块是否已加载,并卸载旧版本: ```bash lsmod | grep <模块名> # 查看模块是否加载(如查usbserial: lsmod | grep usbserial) sudo rmmod <模块名> # 卸载模块(若存在依赖,需先卸载依赖模块) ``` 2. **加载新模块** 使用`insmod`或`modprobe`加载新模块: ```bash sudo insmod /path/to/module.ko # 指定绝对路径加载(需自行处理依赖) # 或 sudo modprobe <模块名> # 自动处理依赖(需提前将模块复制到标准路径) ``` 3. **验证加载状态** ```bash dmesg | tail -n 20 # 查看内核日志,确认加载是否成功 lsmod | grep <模块名> # 检查模块是否在运行中 ``` --- ### **关键操作说明** | **操作** | **命令示例** | **适用场景** | |------------------------|--------------------------------------|----------------------------------| | **卸载模块** | `sudo rmmod usbserial` | 需先卸载依赖模块时逐层操作 | | **强制卸载¹** | `sudo rmmod -f cp210x` | 常规卸载失败时(可能导致不稳定) | | **路径加载** | `sudo insmod /lib/modules/$(uname -r)/kernel/drivers/usb/serial/cp210x.ko` | 模块未放入标准路径时 | | **依赖加载** | `sudo modprobe cp210x` | 模块已通过`depmod`注册到系统 | > ✅ **推荐流程**: > ```bash > sudo rmmod old_module # 卸载旧模块 > sudo insmod new_module.ko # 加载新模块 > sudo depmod -a # 更新依赖关系(若模块位置变化)[^2] > ``` --- ### **常见问题解决** - **依赖错误**: 若`insmod`报错`Unknown symbol`,需先加载依赖模块(如`usbserial.ko`): ```bash sudo insmod /path/to/dependent_module.ko sudo insmod /path/to/target_module.ko ``` - **权限问题**: 加载后设备节点权限可能重置,需在`/etc/rc.local`或`/etc/profile`中添加权限命令[^4]: ```bash echo "chmod 777 /dev/device_node" | sudo tee -a /etc/profile ``` - **模块签名冲突**: 若内核启用安全启动,需对模块签名或禁用验证: ```bash sudo mokutil --disable-validation # 临时禁用(需重启) ``` --- ### **自动化脚本示例** 创建重新加载脚本`reload_ko.sh`: ```bash #!/bin/bash MODULE_NAME="cp210x" MODULE_PATH="/lib/modules/$(uname -r)/kernel/drivers/usb/serial/$MODULE_NAME.ko" # 卸载模块 sudo rmmod $MODULE_NAME 2>/dev/null # 加载新模块 sudo insmod $MODULE_PATH # 检查结果 if lsmod | grep -q $MODULE_NAME; then echo "✅ $MODULE_NAME 重新加载成功!" else echo "❌ 加载失败,请检查 dmesg | tail 获取错误信息" fi ``` 运行:`sudo ./reload_ko.sh` --- ### **引用说明** [^1]: 手动加载模块是重新加载的前提步骤,需确保模块路径正确。 [^2]: 将模块放入`/lib/modules/$(uname -r)/`标准路径并用`depmod`注册,可简化操作。 [^4]: 设备节点权限需通过脚本或系统配置文件持久化。 --- ### **相关问题** 1. **如何解决`rmmod`报错"Module is in use"?** > 终止占用模块的进程: > ```bash > sudo lsof /dev/device_node # 查找占用进程 > sudo kill -9 <进程ID> # 强制结束进程 > ``` 2. **模块版本与内核不兼容怎么办?** > 重新编译模块: > ```bash > cd /path/to/module_source > make -C /lib/modules/$(uname -r)/build M=$(pwd) modules > ``` 3. **如何设置模块开机自动加载?** > 将模块名加入`/etc/modules`或创建`/etc/modules-load.d/<模块名>.conf`文件[^1]。 4. **`modprobe`和`insmod`有何区别?** > `modprobe`自动解析依赖,而`insmod`需手动按顺序加载依赖模块。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值