本地搭建 Bootlin elixir 查阅内核代码

平时经常使用elixir.bootlin.com查看内核源码,很方便。但是苦于该站点服务器在国外,国内用起来很卡很慢,所以想着自己在本地搭一个。

使用环境

Host:Ubuntu 20.04 (Kernel 5.15)

Docker:ubuntu:latest

准备工作

安装依赖
apt-get -y install python3 python3-pip python3-jinja2 python3-bsddb3 python3-pytest perl git libjansson4 libyaml-0-2 wget
pip3 install falcon
下载两个特殊依赖并安装
wget https://bootlin.com/pub/elixir/universal-ctags_0+git20200526-0ubuntu1_amd64.deb
wget https://bootlin.com/pub/elixir/Pygments-2.6.1.elixir-py3-none-any.whl
dpkg -i universal-ctags_0+git20200526-0ubuntu1_amd64.deb
pip3 install Pygments-2.6.1.elixir-py3-none-any.whl
配置环境变量
  • 修改/etc/profile,在末尾增加(具体路径可改为其它)
export LXR_REPO_DIR=/srv/elixir-data/linux/repo
export LXR_DATA_DIR=/srv/elixir-data/linux/data
  • 使环境变量生效
source /etc/profile
下载配置kernel源码
  • 下载kernel源码(建议使用清华大学开源镜像站:https://mirrors.tuna.tsinghua.edu.cn/kernel/)

(以5.15内核为例,可以根据需要自行调整)

wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v5.x/linux-5.15.33.tar.gz
  • 建立相应目录
mkdir -p $LXR_REPO_DIR
mkdir -p $LXR_DATA_DIR
  • 解压至$LXR_REPO_DIR
tar -zvxf linux-5.15.33.tar.gz  --strip-components 1 -C $LXR_REPO_DIR

配置apache服务器

安装依赖
apt install -y apache2 libapache2-mod-wsgi-py3 
  • 修改/etc/apache2/sites-available/000-default.conf

(默认监听80端口,可以按照自己需要调整)

<Directory /usr/local/elixir/http/>
    Options +ExecCGI
    AllowOverride None
    Require all granted
    SetEnv PYTHONIOENCODING utf-8
    SetEnv LXR_PROJ_DIR /srv/elixir-data
</Directory>
<Directory /usr/local/elixir/api/>
    SetHandler wsgi-script
    Require all granted
    SetEnv PYTHONIOENCODING utf-8
    SetEnv LXR_PROJ_DIR /srv/elixir-data
</Directory>
AddHandler cgi-script .py
<VirtualHost *:80>
    ServerName MY_LOCAL_IP
    DocumentRoot /usr/local/elixir/http
    WSGIScriptAlias /api /usr/local/elixir/api/api.py
    AllowEncodedSlashes On
    RewriteEngine on
    RewriteRule "^/$" "/linux/latest/source" [R]
    RewriteRule "^/(?!api|acp).*/(source|ident|search)" "/web.py" [PT]
    RewriteRule "^/acp" "/autocomplete.py" [PT]
</VirtualHost>
  • 配置apache.conf
echo -e "\nHttpProtocolOptions Unsafe" >> /etc/apache2/apache.conf
  • 开启依赖模块
a2enmod cgi rewrite
  • 启动apache
/usr/sbin/apache2ctl -D FOREGROUND

安装配置bootlin/exilir

  • 进入$LXR_REPO_DIR目录,更改REPO目录以及www-data的用户目录所有者为www-data
cd $LXR_REPO_DIR
cd ..
chown -R www-data ./repo 
cd /var
chown -R www-data ./www
  • 切换账号到www-data操作(避免一些权限问题引起的错误)

修改/etc/passwd,使其可以登录。找到www-data一行,将其改为

www-data:x:33:33:www-data:/var/www:/bin/bash

修改www-data用户密码(自己设置一个)

passwd www-data

切换至www-data(可能提示输入密码,输入上面设置的就行)

su www-data
  • 回到$LXR_REPO_DIR,进行git初始化(带有v5.15版本号的可以根据自己需要调整)
cd $LXR_REPO_DIR
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
git init
git add .
git commit -m 'v5.15'
git tag v5.15
  • 切换回管理员用户,如su ubuntu,将bootlin/elixir项目clone下载
git clone https://github.com/bootlin/elixir.git /usr/local/elixir/

(最好不要修改/usr/local/elixir/

  • 生成索引
git config --global --add safe.directory $LXR_REPO_DIR
cd /usr/local/elixir/
python3 update.py

(大约需等待一小时左右)

  • 大功告成,在浏览器输入对应地址即可查看~

在这里插入图片描述

官方给出了dockerfile:https://github.com/bootlin/elixir/tree/master/docker,但笔者使用这个安装后打开浏览器是空白页面,推测是权限问题,所以选择了手动配置。

Ref

bootlin/elixir:https://github.com/bootlin/elixir

More about me

欢迎关注 「barryX的技术笔记」 微信公众号

在这里插入图片描述

<think>好的,用户现在的问题是关于Linux内核6.14.3中找不到drivers/nvme/host/admin.c文件的原因。首先,我需要回顾之前的对话历史。用户之前询问如何在线查看admin.c文件,我提供了通过GitHub和代码搜索平台的方法,并提到了版本一致性的重要性。现在用户提到在6.14.3版本中找不到该文件,需要分析可能的原因。 首先,用户可能在官方仓库中导航到6.14.3标签时没有找到该文件,这可能意味着该文件在特定版本中被移除、重命名或路径发生了变化。另外,用户可能混淆了版本号,比如6.14和6.14.3的区别。需要检查不同版本的内核源码结构是否有变化。 接下来,我需要考虑可能的几个原因:文件被移动或重命名、版本号错误、内核配置选项影响该文件的编译,或者该文件在某个版本中被合并到其他文件中。比如,NVMe驱动可能在某个版本中进行了重构,导致文件路径变化。另外,用户可能没有正确切换到对应的版本标签,或者该版本尚未在镜像站点更新。 此外,用户提供的引用[1]中提到了Linux Kernel 6.14的下载链接,但用户实际需要的是6.14.3,可能存在版本差异。需要指出用户可能下载了错误的版本,或者该文件在6.14.3中确实不存在。 接下来,我应该建议用户通过Git命令直接克隆仓库并切换到正确的标签,确认文件是否存在。同时,检查该文件在主线内核中的提交历史,看看是否有相关的修改记录。还可以推荐使用Bootlin Elixir这样的工具来交叉引用不同版本的文件是否存在。 最后,需要提醒用户注意版本一致性,并确认他们使用的源码是否完整,没有部分文件缺失的情况。可能还需要指导用户如何正确使用GitHub的分支切换功能,或者检查官方仓库的发布日志,查找相关变更信息。</think>### 一、问题分析:为何 Linux 6.14.3 中 `drivers/nvme/host/admin.c` 文件未找到? 根据您的描述和版本信息(**Linux 6.14.3**),以下是可能的原因及验证方法: --- #### **1. 版本标签混淆** - **关键点**:Linux 内核的版本标签命名规则为 `vX.Y.Z`(例如 `v6.14.3`),但 GitHub 官方仓库的 `master` 分支可能尚未同步到该版本。 - **验证步骤**: 1. 访问 [Linux 内核 GitHub 仓库](https://github.com/torvalds/linux/tags),检查是否存在 `v6.14.3` 标签。 2. 若标签不存在,说明该版本可能是第三方维护者构建的分支(如引用[1]中的 `kernel-6.14-1.el9.x86_64.rpm` 并非官方版本)。 3. **官方 6.14.3 源码路径**:确认文件是否存在于官方仓库中: ``` https://github.com/torvalds/linux/blob/v6.14.3/drivers/nvme/host/admin.c ``` *(若链接返回 404,则说明该版本标签未发布或路径错误)*[^1]。 --- #### **2. 文件路径变更或重构** - **可能原因**: - NVMe 驱动模块在 6.x 版本中可能经历了代码重构(例如文件合并或拆分)。 - `admin.c` 被重命名(如 `nvme-admin.c`)或移至其他子目录(如 `drivers/nvme/core/`)。 - **验证方法**: 1. 使用 `git log` 搜索文件历史(需本地克隆仓库): ```bash git clone https://github.com/torvalds/linux.git cd linux git checkout v6.14.3 # 若标签存在 find . -name "admin.c" # 全局搜索文件 ``` 2. 若未找到,通过提交记录查找删除/移动操作: ```bash git log --all --full-history -- "drivers/nvme/host/admin.c" ``` --- #### **3. 内核配置选项影响** - **关键点**:某些驱动文件可能因内核编译配置(`CONFIG_*`)被排除。例如: - `CONFIG_NVME_CORE` 或 `CONFIG_NVME_HOST` 未启用时,相关代码不会编译。 - **验证方法**: 1. 检查目标内核的 `.config` 文件: ```bash zgrep CONFIG_NVME /proc/config.gz # 若系统支持 ``` 2. 确认 `CONFIG_NVME_HOST=y` 是否启用。 --- ### 二、解决方案 #### **1. 通过 Bootlin Elixir 交叉验证** 访问 [Bootlin Elixir for 6.14.3](https://elixir.bootlin.com/linux/v6.14.3/source/drivers/nvme/host/admin.c): - 若页面显示文件存在,则说明您的本地环境或镜像仓库版本不一致。 - 若页面返回错误,则表明该文件在 6.14.3 中已被移除或重构[^2]。 --- #### **2. 官方仓库版本对比** 1. **主线分支(master)**: - 查看 `drivers/nvme/host/admin.c` 是否存在: [GitHub 主线文件](https://github.com/torvalds/linux/blob/master/drivers/nvme/host/admin.c) - 若存在,说明文件在更高版本中恢复或未被删除。 2. **历史版本对比**: 使用 GitHub 的对比功能(例如 `v6.14` vs `v6.14.3`),检查文件变动: ``` https://github.com/torvalds/linux/compare/v6.14...v6.14.3 ``` --- ### 三、扩展问题排查 1. **第三方构建问题**: - 引用[1]中的 RPM 包(`kernel-6.14-1.el9.x86_64.rpm`)可能基于上游代码裁剪了部分模块(如 NVMe 驱动)。 - 建议直接从 [kernel.org](https://www.kernel.org/) 下载官方源码。 2. **文件路径差异**: - CentOS/RHEL 等发行版可能自定义内核代码路径,与上游不一致。 --- ### 四、总结建议 1. **优先使用官方源码**: ```bash wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.14.3.tar.xz tar -xf linux-6.14.3.tar.xz find linux-6.14.3 -name "admin.c" ``` 2. **若文件确实不存在**: - 提交 Issue 至 [Linux Kernel Bugzilla](https://bugzilla.kernel.org/) 或查阅邮件列表(如 LKML)。 --- [^1]: Linux 内核版本标签发布规则 [^2]: Bootlin Elixir 版本覆盖范围说明
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

barryX__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值