当前位置: 首页 > news >正文

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) 。

相关文章:

ubuntu20.04 调试bcache源码

搭建单步调试bcache的环境&#xff0c;/dev/sdb作为backing dev&#xff0c; /dev/sdc作为cache dev。 一、宿主机环境 1&#xff09;安装ubuntu 20.04 &#xff1a; 参考ubuntu20.04 搭建kernel调试环境第一篇--安装系统_ubuntu kernel-CSDN博客安装&#xff0c;其中的第六…...

xss csrf怎么预防?

一、XSS&#xff08;跨站脚本攻击&#xff09;预防 XSS 是指攻击者向目标网站注入恶意脚本&#xff0c;从而在用户浏览器中执行。 1. 输入过滤 清理用户输入&#xff1a; 拦截或清理HTML特殊字符&#xff08;如 <, >, , ", &&#xff09;。使用安全库&#x…...

near-synonym反义词生成(2):Prompt +Bert-MLM(FT)

near-synonym之反义词生成方法二 near-synonym, 中文反义词/近义词/同义词(antonym/synonym)工具包. 方法一为(neg_antonym): Word2vec -> ANN -> NLI -> Length 方法二为(mlm_antonym): Prompt Bert-MLM(FT) Beam-Search 项目地址 github: https://github.com/yon…...

【服务器项目部署】⭐️将本地项目部署到服务器!

目录 &#x1f378;前言 &#x1f37b;一、服务器选择 &#x1f379; 二、服务器环境部署 2.1 java 环境部署 2.2 mysql 环境部署 &#x1f378;三、项目部署 3.1 静态页面调整 3.2 服务器端口开放 3.3 项目部署 ​ &#x1f379;四、测试 &#x1f378;前言 小伙伴们大家好…...

Neo4j Desktop无法打开

解决方案——断网 9号——周一早上就开始打不开&#xff0c;后面去他官网找解决方案&#xff0c;看他们老外解决方法都是重新安装&#xff0c;但是都没彻底解决&#xff0c;我试着重新下载安装桌面版&#xff1a;1.6.1版本&#xff0c;9号晚上7.30的时候经过两次重新安装可以打…...

【编程语言】Kotlin快速入门 - 泛型

Kotlin的泛型与Java十分类似&#xff0c;也是使用这种的语法结构&#xff1a; class Fruit<T> {fun eat(f : T): Unit {println("eat...")}fun <T> buy(p : T): T {return p} }泛型限制 和Java一样&#xff0c;Kotlin也允许泛型是某个类的子类 fun &l…...

【PostgreSQL】入门篇——在不同操作系统上安装 PostgreSQL

PostgreSQL在 Windows、macOS 和 Linux&#xff08;以 Ubuntu 为例&#xff09;的安装步骤&#xff0c;以及可能出现的问题和解决办法。 一、在 Windows 上安装 PostgreSQL 1. 下载 PostgreSQL 安装程序 访问 PostgreSQL 官方网站&#xff1a;PostgreSQL Downloads点击“Dow…...

【Docker】部署MySQL容器

关于docker&#xff0c;Windows上使用Powershell/CMD执行指令&#xff0c;Linux系统直接使用终端执行指令。 拉取MySQL 也可以跳过拉取步骤&#xff0c;直接run&#xff0c;这样本地容器不存在的话&#xff0c;会自动拉取最新/指定的版本。 # 默认拉取最新版本 docker pull …...

mysql9.0windows安装

第一步下载 官网地址&#xff1a;https://dev.mysql.com/downloads/mysql/ 点击后&#xff0c;选择不登录下载 第二步安装 双击下载的msi文件进行安装。打开后页面如下&#xff0c;选择安装类型&#xff0c;选择自定义安装。点击Next下一步。 自行选择安装目录 选好后点击…...

word中文献引用[]符号的上下标格式修改

word中文献引用[]符号的上下标格式修改 百度网址 1、查找打开使用通配符&#xff0c;输入[[][0-9]{1,2}[]]&#xff0c;即可匹配所有的字[1],[12]这些字符&#xff0c;然后鼠标点击替换为的空白处&#xff0c;再点击特殊格式–>“字体”&#xff0c;选中上标&#xff0c;最…...

计算机毕设-基于springboot的游戏创意工坊与推广平台的设计与实现(附源码+lw+ppt+开题报告)

博主介绍&#xff1a;✌多个项目实战经验、多个大型网购商城开发经验、在某机构指导学员上千名、专注于本行业领域✌ 技术范围&#xff1a;Java实战项目、Python实战项目、微信小程序/安卓实战项目、爬虫大数据实战项目、Nodejs实战项目、PHP实战项目、.NET实战项目、Golang实战…...

kafka的备份策略:从备份到恢复

文章目录 一、全量备份二、增量备份三、全量恢复四、增量恢复 前言&#xff1a;Kafka的备份的单元是partition&#xff0c;也就是每个partition都都会有leader partiton和follow partiton。其中leader partition是用来进行和producer进行写交互&#xff0c;follow从leader副本进…...

【畅购商城】微信支付之支付回调和支付状态

目录 Nuxt.js IP 启动 支付回调 回调接口 后端实现 查看支付状态 后端实现 前端实现 ​​​​​​​前置技术&#xff1a;RabbitMQ ​​​​​​​更新订单状态 ​​​​​​​Nuxt.js IP 启动 "config": {"nuxt": {"host": "0.0…...

【Compose multiplatform教程18】多平台资源的设置和配置

要正确配置项目以使用多平台资源&#xff0c;请执行以下操作&#xff1a; 添加库依赖项。 为每种资源创建必要的目录。 为限定资源创建其他目录&#xff08;例如&#xff0c;深色 UI 主题或本地化字符串的不同图像&#xff09;。 依赖项和目录设置 要访问多平台项目中的资源…...

MT6765核心板_MTK6765安卓核心板规格参数_联发科MTK模块开发

MTK6765安卓核心板是基于联发科高效八核处理器平台开发的一款强大硬件解决方案。这款核心板的核心是采用12纳米工艺打造的MTK6765 CPU&#xff0c;具备四个主频高达2.3GHz的CORTEX-A53核心和四个主频为1.8GHz的CORTEX-A53核心&#xff0c;提供了卓越的处理性能。用户可以根据需…...

conda常用维护命令

文章目录 1. 初始化和更新 Conda更新 Conda初始化 Conda&#xff08;如果需要&#xff09; 2. 管理环境创建新环境激活环境停用当前环境列出所有环境删除环境 3. 管理包安装包卸载包更新包更新所有包查找包列出已安装包 4. 导入导出环境导出环境配置从文件创建环境 5. 管理通道…...

Html——10 关键字和描述

<!DOCTYPE html> <html><head><meta charset"UTF-8"><title>淘宝网</title><meta name"keywords" content"我要自学网,自学HTML,自学CSS"/><meta name"description" content"要设置…...

Mysql(MGR)和ProxySQL搭建部署-Docker版本

项目路径&#xff1a;D:\study\backend\mysql\mgr 一、Mysql(MGR) 1.1 docker-compose.yaml volumes: # MySQL配置文件目录 - "./mysql-1/conf.d/my.cnf:/etc/mysql/my.cnf" # MySQL工作目录 - "./mysql-1/data:/var/lib/mysql" …...

QML学习(一) Qt Quick和QML介绍以及适用场景说明

一.介绍 1.Qt Quick 介绍 Qt Quick 提供了一套高动态&#xff0c;丰富的 QML 元素来定制用户界面的说明性框架。Qt Quick 有助于程序开发员与界面设计员的合作为便携式设备建立流畅的用户界面&#xff0c;例如&#xff1a;移动电话、媒体播放器&#xff0c;机顶盒以及上网本等…...

深入理解 PyTorch 的 view() 函数:以多头注意力机制(Multi-Head Attention)为例 (中英双语)

深入理解 PyTorch 的 view() 函数&#xff1a;以多头注意力机制&#xff08;Multi-Head Attention&#xff09;为例 在深度学习模型的实现中&#xff0c;view() 是 PyTorch 中一个非常常用的张量操作函数&#xff0c;它能够改变张量的形状&#xff08;shape&#xff09;而不改…...

Python实现prophet 理论及参数优化

文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候&#xff0c;写过一篇简单实现&#xff0c;后期随着对该模型的深入研究&#xff0c;本次记录涉及到prophet 的公式以及参数调优&#xff0c;从公式可以更直观…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

回溯算法学习

一、电话号码的字母组合 import java.util.ArrayList; import java.util.List;import javax.management.loading.PrivateClassLoader;public class letterCombinations {private static final String[] KEYPAD {"", //0"", //1"abc", //2"…...

PAN/FPN

import torch import torch.nn as nn import torch.nn.functional as F import mathclass LowResQueryHighResKVAttention(nn.Module):"""方案 1: 低分辨率特征 (Query) 查询高分辨率特征 (Key, Value).输出分辨率与低分辨率输入相同。"""def __…...

【iOS】 Block再学习

iOS Block再学习 文章目录 iOS Block再学习前言Block的三种类型__ NSGlobalBlock____ NSMallocBlock____ NSStackBlock__小结 Block底层分析Block的结构捕获自由变量捕获全局(静态)变量捕获静态变量__block修饰符forwarding指针 Block的copy时机block作为函数返回值将block赋给…...

goreplay

1.github地址 https://github.com/buger/goreplay 2.简单介绍 GoReplay 是一个开源的网络监控工具&#xff0c;可以记录用户的实时流量并将其用于镜像、负载测试、监控和详细分析。 3.出现背景 随着应用程序的增长&#xff0c;测试它所需的工作量也会呈指数级增长。GoRepl…...

ABAP设计模式之---“Tell, Don’t Ask原则”

“Tell, Don’t Ask”是一种重要的面向对象编程设计原则&#xff0c;它强调的是对象之间如何有效地交流和协作。 1. 什么是 Tell, Don’t Ask 原则&#xff1f; 这个原则的核心思想是&#xff1a; “告诉一个对象该做什么&#xff0c;而不是询问一个对象的状态再对它作出决策。…...

联邦学习带宽资源分配

带宽资源分配是指在网络中如何合理分配有限的带宽资源&#xff0c;以满足各个通信任务和用户的需求&#xff0c;尤其是在多用户共享带宽的情况下&#xff0c;如何确保各个设备或用户的通信需求得到高效且公平的满足。带宽是网络中的一个重要资源&#xff0c;通常指的是单位时间…...

安全领域新突破:可视化让隐患无处遁形

在安全领域&#xff0c;隐患就像暗处的 “幽灵”&#xff0c;随时可能引发严重事故。传统安全排查手段&#xff0c;常常难以将它们一网打尽。你是否好奇&#xff0c;究竟是什么神奇力量&#xff0c;能让这些潜藏的隐患无所遁形&#xff1f;没错&#xff0c;就是可视化技术。它如…...

【Ragflow】26.RagflowPlus(v0.4.0):完善解析逻辑/文档撰写模式全新升级

概述 在历经半个月的间歇性开发后&#xff0c;RagflowPlus再次迎来一轮升级&#xff0c;正式发布v0.4.0。 开源地址&#xff1a;https://github.com/zstar1003/ragflow-plus 更新方法 下载仓库最新代码&#xff1a; git clone https://github.com/zstar1003/ragflow-plus.…...