ubuntu20.04 调试bcache源码

搭建单步调试bcache的环境,/dev/sdb作为backing dev, /dev/sdc作为cache dev。

一、宿主机环境

1)安装ubuntu 20.04 :

参考ubuntu20.04 搭建kernel调试环境第一篇--安装系统_ubuntu kernel-CSDN博客安装,其中的第六节(安装qemu)、第七节(安装apache服务)安装完成即可。

2)配置网络

host(ubuntu系统)和guest(qemu运行的系统,待调试)之间需共享文件,所以需要配置网络。

参考ubuntu20.04 搭建kernel调试环境第六篇(上)--网络配置_ubuntu20 menuconfig-CSDN博客,按其中的第三节(ubuntu宿主机配置步骤)、第4节(buildroot配置)、第五节(启动虚拟机)配置,最终能ping通外网就行。

二、静态编译bcache-tools工具

guest运行的kernel是我们自己编译的,busybox只支持一些简单的命令,动态库也很少,所以无法使用apt-get install bcache-tools方式安装bcache的用户态工具。需要自己下载源码,然后用静态方式编译出可执行文件。

1)git下载bcache-tools源码:
git clone https://github.com/g2p/bcache-tools.git

2) Makefile改成静态编译

root@linux:/home/gsf/code/bcache-tool-git/bcache-tools# git diff Makefile
diff --git a/Makefile b/Makefile
index c824ae3..ccea7ee 100644
--- a/Makefile
+++ b/Makefile
@@ -3,7 +3,8 @@ PREFIX=/usr
 UDEVLIBDIR=/lib/udev
 DRACUTLIBDIR=/lib/dracut
 INSTALL=install
-CFLAGS+=-O2 -Wall -g
+CFLAGS+=-O2 -Wall -g -static
+

3)编译bcache-tools

root@linux:/home/gsf/code/bcache-tool-git/bcache-tools# make

root@linux:/home/gsf/code/bcache-tool-git/bcache-tools# make install
install -m0755 make-bcache bcache-super-show    /usr/sbin/  (关注这一行中的两个文件)
install -m0755 probe-bcache bcache-register        /lib/udev/
install -m0644 69-bcache.rules    /lib/udev/rules.d/
install -m0644 -- *.8 /usr/share/man/man8/
install -D -m0755 initramfs/hook    /usr/share/initramfs-tools/hooks/bcache
install -D -m0755 initcpio/install    /usr/lib/initcpio/install/bcache
install -D -m0755 dracut/module-setup.sh /lib/dracut/modules.d/90bcache/module-setup.sh

可能遇到的错误1:

Perhaps you should add the directory containing `uuid.pc'
to the PKG_CONFIG_PATH environment variable
No package 'uuid' found
Package blkid was not found in the pkg-config search path.
Perhaps you should add the directory containing `blkid.pc'
to the PKG_CONFIG_PATH environment variable
No package 'blkid' found
make-bcache.c:11:10: fatal error: blkid.h: No such file or directory
   11 | #include <blkid.h>
      |          ^~~~~~~~~

解决:apt-get install libblkid-dev

可能遇到的错误2:

root@linux:/home/gsf/code/bcache-tools/bcache-tools-master# make
cc -O2 -Wall -g `pkg-config --cflags uuid blkid`    make-bcache.c bcache.o  `pkg-config --libs uuid blkid` -o make-bcache
/usr/bin/ld: /tmp/ccsteIC1.o: in function `write_sb':
/home/gsf/code/bcache-tools/bcache-tools-master/make-bcache.c:277: undefined reference to `crc64'
collect2: error: ld returned 1 exit status
make: *** [<builtin>: make-bcache] Error 1

解决:源码bcache.c中的crc_table数组、crc64函数复制一份,放在bcache.h前面。

三、kernel编译

在编译kernel前,需通过make menuconfig打开以下选项:

<*> Block device as cache

[*] Bcache debugging

 kernel编译参考:

ubuntu20.04 搭建kernel调试环境第三篇--kernel编译及运行_在qemu中运行f2fs-CSDN博客

四、qemu启动guest系统

以下命令在host即ubuntu中执行!

1)生成cache盘img,大小3G

root@linux:/home/gsf/linux-5.18.11# qemu-img create -f raw disk_raw_3G_C.qcow 3G

2)生成backing盘img,大小5G

qemu-img create -f raw disk_raw_5G_B.qcow 5G

3)生成用于测试nvme的img

qemu-img create -f raw disk10G.qcow 5G

3)启动guest系统

root@linux:/home/gsf/linux-5.18.11# qemu-system-x86_64 -kernel arch/x86_64/boot/bzImage -drive file=rootfs.f2fs,if=ide,format=raw,id=myid0 --nographic -append "root=/dev/sda console=ttyS0" -hdb disk_raw_5G_B.qcow -hdc disk_raw_3G_C.qcow -device nvme,drive=nvme1,serial=deadbeaf,num_queues=8 -drive file=disk10G.qcow,if=none,id=nvme1 -smp 4 -net nic,macaddr=52:54:00:12:34:56,model=e1000 -net bridge,id=net0,helper=/usr/lib/qemu/qemu-bridge-helper,br=virbr0

红色字段,创建/dev/sdb,在guest起来后,该设备会格式化成backing dev

蓝色字段,创建/dev/sdc,在guest起来后,该设备会格式化成cache dev

黄色字段,创建/dev/nvme0,作为nvme测试使用,bcache用不到。

guest系统启动后,输入root登录,dev文件如下:

# ls /dev  (guest中执行的命令)

cpu_dma_latency sda tty26 tty56

fd sda1 tty27 tty57

full sdb tty28 tty58  ---sdb

fuse sdc tty29 tty59  ---sdc

nvme0 tty17 tty47 vcsu1

nvme0n1 tty18 tty48 vga_arbiter

nvme0n1p1 tty19 tty49 zero

五、拷贝bcache-tools到guset系统

1)将make-bcache拷贝到guest中

host系统中执行:

root@linux:/var/www/html# cp /usr/sbin/make-bcache ./

root@linux:/var/www/html# cp /usr/sbin/bcache-super-show ./

host系统中执行:

root@linux:/home/gsf# ifconfig

找到virbr0的ip地址,比如

virbr0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500
        inet 192.168.122.1  netmask 255.255.255.0  broadcast 192.168.122.255
        ether 52:54:00:5e:c9:bb  txqueuelen 1000  (Ethernet)
        RX packets 299  bytes 25524 (25.5 KB)
        RX errors 0  dropped 0  overruns 0  frame 0
        TX packets 431  bytes 1335005 (1.3 MB)
        TX errors 0  dropped 0 overruns 0  carrier 0  collisions 0

guest系统中执行:

# wget http://192.168.122.1/make-bcache (上面ifconfig看到的ip地址)
Connecting to 192.168.122.1 (192.168.122.1:80)
saving to 'make-bcache'
make-bcache          100% |********************************| 1273k  0:00:00 ETA
'make-bcache' saved
# wget http://192.168.122.1/bcache-super-show
Connecting to 192.168.122.1 (192.168.122.1:80)
saving to 'bcache-super-show'
bcache-super-show    100% |********************************|  908k  0:00:00 ETA
'bcache-super-show' saved

# chmod 777 make-bcache
# chmod 777 bcache-super-show
# ls
bcache-super-show  make-bcache

六、配置bcache磁盘

以下命令在guest中执行!

1)格式化bcache设备

# /root/make-bcache -B /dev/sdb
UUID:            3a5fa145-1cc9-44e0-b91c-1beaf245355f
Set UUID:        25fceacc-0546-4c32-80d0-5c9881a1d67f
version:        1
block_size:        1
data_offset:        16
#
# /root/make-bcache -C /dev/sdc
UUID:            c66b56a8-bb3e-4d8e-9b9f-3b402cd6b258
Set UUID:        fe0af6ee-67e8-49c3-bfec-5633ba05f782
version:        0
nbuckets:        6144
block_size:        1
bucket_size:        1024
nr_in_set:        1
nr_this_dev:        0
first_bucket:        1

2)注册backing device

# echo /dev/sdb > /sys/fs/bcache/register
[ 2157.866302] bcache: register_bdev() registered backing device sdb

#


# 命令完成后,dev目录中会生成bcache0设备
# ls /dev/
autofs           ptmx             tty21            tty51
bcache0          pts              tty22            tty52
bsg              random           tty23            tty53

3)注册cache device

# echo /dev/sdc > /sys/fs/bcache/register
[  146.450348] bcache: bch_journal_replay() journal replay done, 0 keys in 1 entries, seq 4
[  146.453397] bcache: register_cache() registered cache device sdc

如果不注册cache device,就执行attach命令,会报下面错误:

# echo "fe0af6ee-67e8-49c3-bfec-5633ba05f782" > /sys/block/bcache0/bcache/attach
[  114.804472] bcache: __cached_dev_store() Can't attach fe0af6ee-67e8-49c3-bfec-5633ba05f782
[  114.804472] : cache set not found
sh: write error: No such file or directory

4)绑定backing dev到cache dev上

格式化的时候,/dev/sdb格式化成了backing dev, /dev/sdc格式化成了cache dev,通过bcache-super-show找到cache dev的cset.uuid值。

# /root/bcache-super-show /dev/sdc
sb.magic        ok
sb.first_sector        8 [match]
sb.csum            5E71456A3E5F13A8 [match]
sb.version        3 [cache device]

dev.label        (empty)
dev.uuid        c66b56a8-bb3e-4d8e-9b9f-3b402cd6b258
dev.sectors_per_block    1
dev.sectors_per_bucket    1024
dev.cache.first_sector    1024
dev.cache.cache_sectors    6290432
dev.cache.total_sectors    6291456
dev.cache.ordered    yes
dev.cache.discard    no
dev.cache.pos        0
dev.cache.replacement    0 [lru]

cset.uuid        fe0af6ee-67e8-49c3-bfec-5633ba05f782  (该值用于写入backing dev的attach文件中)

执行绑定指令:

# echo "fe0af6ee-67e8-49c3-bfec-5633ba05f782" > /sys/block/bcache0/bcache/attach
[  151.527075] bcache: bch_cached_dev_run() cached dev sdb is running already
[  151.528160] bcache: bch_cached_dev_attach() Caching sdb as bcache0 on set fe0af6ee-67e8-49c3-bfec-5633ba05f782

5)backing dev格式化成具体的文件系统(比如f2fs)

# mkfs.f2fs /dev/bcache0

    F2FS-tools: mkfs.f2fs Ver: 1.13.0 (2019-09-24)

Info: Disable heap-based policy
Info: Debug level = 0
Info: Trim is enabled
Info: [/dev/bcache0] Disk Model: QEMU HARDDISK   
Info: Segments per section = 1
Info: Sections per zone = 1
Info: sector size = 512
Info: total sectors = 10485744 (5119 MB)
Info: zone aligned segment0 blkaddr: 512
Info: format version with
  "Linux version 5.18.11-g50a65f78b667 (root@linux) (gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0, GNU ld (GNU Binutils for Ubuntu) 2.34) #20 SM"
Info: [/dev/bcache0] Discarding device
Info: This device doesn't support BLKSECDISCARD
Info: Discarded 5119 MB
Info: Overprovision ratio = 2.810%
Info: Overprovision segments = 148 (GC reserved = 79)
Info: format successful
[ 1491.536112] mkfs.f2fs (194) used greatest stack depth: 13264 bytes left

6)挂载/dev/bcache0

# mkdir /mnt/bcachemp  创建一个目录用于挂载/dev/bcache0


# mount /dev/bcache0 /mnt/bcachemp
[ 1672.244480] F2FS-fs (bcache0): Found nat_bits in checkpoint
[ 1672.366811] F2FS-fs (bcache0): Mounted with checkpoint version = 19642f45
[ 1672.371205] mount (196) used greatest stack depth: 13144 bytes left

# df -h
Filesystem                Size      Used Available Use% Mounted on
/dev/root                98.0M     74.5M     23.5M  76% /
devtmpfs                 44.9M         0     44.9M   0% /dev
tmpfs                    46.8M         0     46.8M   0% /dev/shm
tmpfs                    46.8M     52.0K     46.7M   0% /tmp
tmpfs                    46.8M     20.0K     46.8M   0% /run
/dev/nvme0n1p1           10.0G      3.4G      6.6G  34% /mnt/nvmemp
/dev/bcache0              5.0G    340.0M      4.7G   7% /mnt/bcachemp  (bcache 挂载成功

bcache设备挂载成功,可通过gdb调试代码(gdb调试可参考https://blog.csdn.net/geshifei/article/details/128235389) 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/944525.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

从零搭建SpringBoot3+Vue3前后端分离项目基座,中小项目可用

文章目录 1. 后端项目搭建 1.1 环境准备1.2 数据表准备1.3 SpringBoot3项目创建1.4 MySql环境整合&#xff0c;使用druid连接池1.5 整合mybatis-plus 1.5.1 引入mybatis-plus1.5.2 配置代码生成器1.5.3 配置分页插件 1.6 整合swagger3&#xff08;knife4j&#xff09; 1.6.1 整…

支持最新 mysql9的workbench8.0.39 中文汉化教程来了

之前在 B 站上发布了 mysql8 workbench 汉化教程&#xff0c;一年多来帮助很多初学者解决了不熟悉英文的烦恼。 汉化视频可以访问&#xff1a; 2024最新版mysql8.0.39中文版mysql workbench汉化 中文升级 旧版汉化报错解决_哔哩哔哩_bilibili MySql Workbench汉化_哔哩哔哩_…

JavaWeb期末复习

目录 学习通题目Web技术与应用&#xff08;2024秋&#xff09;第二章 绪论课前测试一.选择题二.填空题 课后巩固 第三章 HTML基础课前测试一.单选题二.填空题 课后巩固一.单选题二.填空题 第四章 CSS课前测试二.单选题三.填空题 4.5 浮动与清理一.单选题 课后巩固二.单选题 第五…

云手机与Temu矩阵:跨境电商运营新引擎

云手机与 Temu 矩阵结合的基础 云手机技术原理 云手机基于先进的 ARM 虚拟化技术&#xff0c;在服务器端运行 APP。通过在服务器上利用容器虚拟化软件技术&#xff0c;能够虚拟出多个独立的手机操作系统实例&#xff0c;每个实例等同于一部单独的手机&#xff0c;可独立运行各…

【每日学点鸿蒙知识】Text填充父控件、Native接收数组、js逻辑不执行问题、UIAbility上下文问题、页面跳转路由栈

1、HarmonyOS 如何使Text组件填充满父组件&#xff1f; build() {Row() {Row() {Text(this.str).constraintSize({ maxWidth: 100%, minHeight: "30vp" }).backgroundColor(Color.Gray).fontSize(24vp)}.key(row1).constraintSize({ maxWidth: 100%}).backgroundCol…

Sqoop的使用

每个人的生活都是一个世界&#xff0c;即使最平凡的人也要为他那个世界的存在而战斗。 ——《平凡的世界》 目录 一、sqoop简介 1.1 导入流程 1.2 导出流程 二、使用sqoop 2.1 sqoop的常用参数 2.2 连接参数列表 2.3 操作hive表参数 2.4 其它参数 三、sqoop应用 - 导入…

基于Java+Springboot+Vue开发的旅游景区管理系统,实习作品

项目简介 该项目是基于JavaSpringbootVue开发的旅游景区管理系统&#xff08;前后端分离&#xff09;&#xff0c;这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能&#xff0c;同时锻炼他们的项目设计与开发能力。通过学习基于Java的旅…

十二月第五周python

第一个程序&#xff0c;熟悉转换器&#xff0c;把加法计算器变成exe# // 1,制作加法计算器&#xff0c; # 输入两个数字得到相加结果并输出aint(input("输入数字&#xff1a;"))#int()是把输入的内容转换成整数&#xff0c; bint(input("输入数字&#xff1a;&…

【视觉惯性SLAM:十一、ORB-SLAM2:跟踪线程】

跟踪线程是ORB-SLAM2的核心之一&#xff0c;其主要任务是实时跟踪相机的位姿变化和场景的变化&#xff0c;以维持地图的更新和相机轨迹的估计。ORB-SLAM2的跟踪线程通过多种方式&#xff08;参考关键帧跟踪、恒速模型跟踪、重定位跟踪、局部地图跟踪&#xff09;处理跟踪丢失、…

在字节5年被优化,太难了。。。

先简单说下&#xff0c;涵哥是某不知名 985 的本硕&#xff0c;17 年毕业加入字节&#xff0c;以“人员优化”的名义无情被裁员&#xff0c;之后跳槽到了有赞&#xff0c;一直从事软件测试的工作。还差几个月也7年了吧&#xff0c;算是在这行的资深划水员。7年的时间也让涵哥从…

阿里云-将旧服务器数据与配置完全迁移至新服务器

文章目录 一&#xff1a;创建镜像二&#xff1a;将创建好的镜像复制到新服务器所在的目标地域&#xff08;如果新服务器与镜像在同一地域就不用进行这一操作&#xff09;三&#xff1a;将镜像配置到新服务器上四&#xff1a;导出安全组&#xff08;如果新服务器与旧服务器使用同…

Spark SQL DML语句

【图书介绍】《Spark SQL大数据分析快速上手》-CSDN博客 《Spark SQL大数据分析快速上手》【摘要 书评 试读】- 京东图书 Spark本地模式安装_spark3.2.2本地模式安装-CSDN博客 DML&#xff08;Data Manipulation Language&#xff0c;数据操作语言&#xff09;操作主要用来对…

路过石岩浪心古村

周末常去的七彩城堡儿童乐园附近经常有老房子&#xff0c;没想到老房子最多的地方还是浪心古村。而且越看越有历史。 见到一座写着《序西书室》的房子&#xff0c;我最开始以为是一个古代的学校。但是查了百度更加不知道什么意思了哈。‌“序西书室”‌是指《文心雕龙》中的一个…

运行Zr.Admin项目(后端)

1.下载Zr.Admin代码压缩包 https://codeload.github.com/izhaorui/Zr.Admin.NET/zip/refs/heads/main 2.打开项目 我这里装的是VS2022社区版 进入根目录&#xff0c;双击ZRAdmin.sln打开项目 3.安装.net7运行时 我当时下载的代码版本是.net7的 点击安装 点击安装&#xff0…

Wordly Wise 3000 国际背单词01 介绍 + 测词汇量

&#x1f4da; Wordly Wise 3000 国际背单词01 介绍 测词汇量 &#x1f31f; 大家好&#xff01;我们正式启动背Wordly Wise 3000单词&#xff0c;旨在利用国际资源和科学的学练方法&#xff0c;帮助大家更得效地坚持学练单词。我们将通过图文和Video等多种形式与大家分享经验…

HarmonyOS Next 实现登录注册页面(ARKTS) 并使用Springboot作为后端提供接口

1. HarmonyOS next ArkTS ArkTS围绕应用开发在 TypeScript &#xff08;简称TS&#xff09;生态基础上做了进一步扩展&#xff0c;继承了TS的所有特性&#xff0c;是TS的超集 ArkTS在TS的基础上扩展了struct和很多的装饰器以达到描述UI和状态管理的目的 以下代码是一个基于…

3.微服务灰度发布落地实践(组件灰度增强)

文章目录 前言调用链示图dubbo服务之间的的调链cloud 服务之间的调用链 网关servlet容器: 标签续传1.定义插件2.实现灰度增强拦截 线程池: 标签续传1.拦截Runnable或Callable,接口增强实现标签续传;Callable 插件定义Runnable 插件定义拦载Callabl或Runnable构造(可共用)拦载ru…

不修改内核镜像的情况下,使用内核模块实现“及时”的调度时间片超时事件上报

一、背景 之前的博客 不修改内核镜像的情况下&#xff0c;使用内核模块实现高效监控调度时延-CSDN博客 里&#xff0c;我们讲了不修改内核镜像高效监控每次的调度时延的方法。这篇博客里&#xff0c;我们对于调度时间片也做这么一个不修改内核镜像的改进。关于调度时间片过长的…

机器视觉中的单线程、多线程与跨线程:原理与应用解析

在机器视觉应用中&#xff0c;程序的运行效率直接影响到系统的实时性和稳定性。随着任务复杂度的提高&#xff0c;单线程处理往往无法满足高性能需求&#xff0c;多线程技术因此被广泛应用。此外&#xff0c;跨线程操作&#xff08;如在多线程中更新界面或共享资源&#xff09;…

喜报 | 擎创科技入围上海市优秀信创解决方案

近日&#xff0c;由上海市经信委组织的“2024年上海市优秀信创解决方案”征集遴选活动圆满落幕&#xff0c;擎创科技凭借实践经验优秀的《擎创夏洛克智能预警与应急处置解决方案》成功入选“2024年上海市优秀信创解决方案”名单。 为激发创新活力&#xff0c;发挥标杆作用&…