使用qemu创建ubuntu-base文件系统,并安装PM相关内核模块

目录

  • 一、配置镜像
  • 二、使用qemu模拟nvdimm(安装PM相关内核模块)
    • 运行记录
  • 遇到的一些问题
    • 1、ext4文件系统损坏
        • 问题:系统启动时,遇到ext4的报错信息
        • 解决办法:
        • 2、内核模块未成功加载
        • 3、qemu报错
        • 4、主机终端无法正常打开
        • 5、模块与内核版本不一致

流程简述:
(镜像基本的文件系统配置)
1、下载ubuntu-base的镜像
2、挂载镜像,配置镜像的网络,并安装各类软件
(PM模块配置)
3、编译内核模块,并拷贝到镜像中
4、启动qemu
5、安装内核模块,并配置相关软件

一、配置镜像

1、使用qemu-img创建image镜像(此处起名为ubuntu14.04.raw 20G

# [可选] sudo apt install qemu
qemu-img create -f raw ubuntu-rootfs-raw-20G.image 20G

注意:此处需要是raw类型,否则后续无法正常格式化(因为qcow2类型没有预先分配空间)。报错信息如下

$ sudo mkfs.ext4 ubuntu-rootfs-qcow2-20G.image
mke2fs 1.45.5 (07-Jan-2020)
ubuntu-rootfs-qcow2-20G.image: Not enough space to build proposed filesystem while setting up superblock

2、格式化镜像文件为ext4的文件系统

# 格式化
sudo mkfs.ext4 ubuntu-rootfs-raw-20G.image
# 检查
file ubuntu-rootfs-raw-20G.image

3、创建一个空目录,镜像的挂载点;然后将镜像挂载上去

mkdir ubuntu-rootfs-dir
sudo mount ubuntu-rootfs-raw-20G.image ubuntu-rootfs-dir

4、下载ubuntu-base-20.04.1-base-amd64.tar.gz镜像,并将其解压到ubuntu-rootfs-dir文件夹中(实质就是向镜像中塞文件,因为当前镜像已经被挂载到文件夹了)
(1)下载地址,https://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.1-base-amd64.tar.gz。
也可以自行选择其他版本:https://cdimage.ubuntu.com/ubuntu-base/releases/,

wget https://cdimage.ubuntu.com/ubuntu-base/releases/20.04/release/ubuntu-base-20.04.1-base-amd64.tar.gz

(2)解压到ubuntu-rootfs-dir

sudo tar -xzvf ubuntu-base-20.04.1-base-amd64.tar.gz -C ubuntu-rootfs-dir

5、拷贝主机中的网络配置信息到镜像中,方便后续用apt安装软件

sudo cp /etc/resolv.conf ubuntu-rootfs-dir/etc/

6、自行修改source.list文件,设置apt镜像进行加速

假设主机与客服机都是基于ubuntu 20.04,则可以直接拷贝主机的source.list,
否则需要自行配置
sudo cp /etc/apt/source.list ubuntu-rootfs-dir/etc/apt/source.list 

7、使用chrootubuntu-rootfs-dir暂时设置为根目录(与docker类似),并启动终端

sudo chroot ubuntu-rootfs-dir

8、安装软件

apt update\
&& apt upgrade\
&& apt install linux-image-kvm init vim -y 

9、设置密码之类的

update-initramfs -u
echo root:root | chpasswd
echo ttyS0 > /etc/securetty
systemctl enable serial-getty@ttyS0.service

10、退出并卸载

sudo umount ubuntu-rootfs-dir

11、后续扩展
(1)如果需要重新安装软件,可以重复第7步骤,挂载镜像,然后chroot进去。
(2)镜像扩容操作

qemu-img resize ubuntu-rootfs-raw-20G.image +10G

二、使用qemu模拟nvdimm(安装PM相关内核模块)

如果要运行PM
1、安装软件包(安装到镜像里面)

apt install -y systemd numactl ndctl daxctl

2、编译内核时,编译相关模块

make -j16 vmlinux bzImage
make M=drivers/dax -j16
make M=drivers/nvdimm/ -j16
make M=drivers/dax/pmem -j16

3、将编译好的模块复制到镜像中

# 1、挂载镜像
# 略

# 2、设置路径(路径根据需要进行修改)
image_dir_path=/home/my/my_images/ubuntu-base/ubuntu-rootfs-dir
module_path=$image_dir_path/root/my_modules
sudo mkdir $module_path

# 3、拷贝编译的内核模块到镜像中
cd linux-5.15.114
sudo cp -r ./drivers/dax $module_path/drivers/dax
sudo cp -r ./drivers/nvdimm $module_path/drivers/nvdimm

# 4、卸载镜像
# 略

3、运行qemu

qemu-system-x86_64 \
    -machine pc,nvdimm=on \
    -m 2G,slots=4,maxmem=32G \
    -nographic -kernel bzImage \
    -smp cores=4,threads=1,sockets=2 \
    -hda ubuntu_rootfs.ext4 \
    -object memory-backend-ram,id=mem0,size=1G  \
    -object memory-backend-ram,id=mem1,size=1G  \
    -numa node,memdev=mem0,cpus=0-3,nodeid=0 \
    -numa node,memdev=mem1,cpus=4-7,nodeid=1 \
    -numa node,nodeid=2 -numa node,nodeid=3 \
    -object memory-backend-ram,id=nvdimm1,size=4G\
    -device nvdimm,memdev=nvdimm1,id=nv1,unarmed=off,node=2 \
    -object memory-backend-ram,id=nvdimm2,size=4G\
    -device nvdimm,memdev=nvdimm2,id=nv2,unarmed=off,node=3 \
    -append "console=ttyS0 crashkernel=256M root=/dev/sda rootfstype=ext4 rw loglevel=8"

4、安装模块(注意模块之间的依赖)

insmod /root/my_modules/drivers/dax/device_dax.ko
insmod /root/my_modules/drivers/dax/kmem.ko

insmod /root/my_modules/drivers/dax/pmem/dax_pmem_core.ko
insmod /root/my_modules/drivers/dax/pmem/dax_pmem.ko
insmod /root/my_modules/drivers/dax/pmem/dax_pmem_compat.ko

insmod /root/my_modules/drivers/nvdimm/nd_btt.ko
insmod /root/my_modules/drivers/nvdimm/nd_blk.ko
insmod /root/my_modules/drivers/nvdimm/nd_pmem.ko
insmod /root/my_modules/drivers/nvdimm/nd_virtio.ko
insmod /root/my_modules/drivers/nvdimm/virtio_pmem.ko

# check
lsmod

此处注意:模块之间可能存在依赖,需要按照一定的顺序。如果顺序不对,可能出现如下报错信息insmod: ERROR: could not insert module device_dax.mod: Invalid module format。此时,使用dmesg | tail可以查看详细日志信息,使用modinfo ./dax_pmem.ko | grep depend 可以查看模块的依赖。

$ modinfo ./dax_pmem.ko | grep depend 
depends:        dax_pmem_core
# 可以看到dax_pmem.ko依赖dax_pmem_core模块

5、配置nvdimm

# 首次配置
daxctl migrate-device-model
echo offline > /sys/devices/system/memory/auto_online_blocks
ndctl create-namespace -f --mode devdax --continue
daxctl reconfigure-device --mode=system-ram all

# 重启后重新配置
echo offline > /sys/devices/system/memory/auto_online_blocks
ndctl disable-namespace all
ndctl destroy-namespace all
ndctl create-namespace -f --mode devdax --continue
daxctl reconfigure-device --mode=system-ram all

6、合并四五步
后续可以创建一个init.sh文件放到镜像中,启动时自动运行

# init.sh
# 用于image镜像中挂载内核模块等

insmod /root/my_modules/drivers/dax/device_dax.ko
insmod /root/my_modules/drivers/dax/kmem.ko

insmod /root/my_modules/drivers/dax/pmem/dax_pmem_core.ko
insmod /root/my_modules/drivers/dax/pmem/dax_pmem.ko
insmod /root/my_modules/drivers/dax/pmem/dax_pmem_compat.ko

insmod /root/my_modules/drivers/nvdimm/nd_btt.ko
insmod /root/my_modules/drivers/nvdimm/nd_blk.ko
insmod /root/my_modules/drivers/nvdimm/nd_pmem.ko
insmod /root/my_modules/drivers/nvdimm/nd_virtio.ko
insmod /root/my_modules/drivers/nvdimm/virtio_pmem.ko


# 首次配置
# daxctl migrate-device-model
# echo offline > /sys/devices/system/memory/auto_online_blocks
# ndctl create-namespace -f --mode devdax --continue
# daxctl reconfigure-device --mode=system-ram all

# 重启后重新配置
echo offline > /sys/devices/system/memory/auto_online_blocks
ndctl disable-namespace all
ndctl destroy-namespace all
ndctl create-namespace -f --mode devdax --continue
daxctl reconfigure-device --mode=system-ram all

运行记录

root@localhost:~/my_modules/drivers/nvdimm/nvdimm# echo offline > /sys/devices/system/memory/auto_online_blocks
root@localhost:~/my_modules/drivers/nvdimm/nvdimm# ndctl create-namespace -f --mode devdax --continue
{
  "dev":"namespace1.0",
  "mode":"devdax",
  "map":"dev",
  "size":"3.94 GiB (4.23 GB)",
  "uuid":"12f978b1-c1f4-4be8-a67d-aa076e0a4152",
  "daxregion":{
    "id":1,
    "size":"3.94 GiB (4.23 GB)",
    "align":2097152,
    "devices":[
      {
        "chardev":"dax1.0",
        "size":"3.94 GiB (4.23 GB)",
        "target_node":3,
        "mode":"devdax"
      }
    ]
  },
  "align":2097152
}
{
  "dev":"namespace0.0",
  "mode":"devdax",
  "map":"dev",
  "size":"3.94 GiB (4.23 GB)",
  "uuid":"0529e940-38b1-45fd-a0b1-43fcf95192ce",
  "daxregion":{
    "id":0,
    "size":"3.94 GiB (4.23 GB)",
    "align":2097152,
    "devices":[
      {
        "chardev":"dax0.0",
        "size":"3.94 GiB (4.23 GB)",
        "target_node":2,
        "mode":"devdax"
      }
    ]
  },
  "align":2097152
}
created 2 namespaces
root@localhost:~/my_modules/drivers/nvdimm/nvdimm# daxctl reconfigure-device --mode=system-ram all
[
  {
    "chardev":"dax0.0",
    "size":4225761280,
    "target_node":2,
    "mode":"system-ram",
    "movable":true
  }
]

非首次运行:

root@localhost:~/my_modules/drivers/nvdimm# echo offline > /sys/devices/system/memory/auto_online_blocks
oy-namespace all
ndctl create-namespace -f --mode devdax --continue
daxctl reconfigure-device --moderoot@localhost:~/my_modules/drivers/nvdimm# ndctl disable-namespace all
=system-ram alldisabled 2 namespaces
root@localhost:~/my_modules/drivers/nvdimm# ndctl destroy-namespace all
destroyed 0 namespaces
root@localhost:~/my_modules/drivers/nvdimm# ndctl create-namespace -f --mode devdax --continue
{
  "dev":"namespace1.0",
  "mode":"devdax",
  "map":"dev",
  "size":"3.94 GiB (4.23 GB)",
  "uuid":"8259f939-0c3d-43c4-89cb-6e89653c290f",
  "daxregion":{
    "id":1,
    "size":"3.94 GiB (4.23 GB)",
    "align":2097152,
    "devices":[
      {
        "chardev":"dax1.0",
        "size":"3.94 GiB (4.23 GB)",
        "target_node":3,
        "mode":"devdax"
      }
    ]
  },
  "align":2097152
}
{
  "dev":"namespace0.0",
  "mode":"devdax",
  "map":"dev",
  "size":"3.94 GiB (4.23 GB)",
  "uuid":"41d3381f-cd6a-4c02-b8d1-c97cd2633cb4",
  "daxregion":{
    "id":0,
    "size":"3.94 GiB (4.23 GB)",
    "align":2097152,
    "devices":[
      {
        "chardev":"dax0.0",
        "size":"3.94 GiB (4.23 GB)",
        "target_node":2,
        "mode":"devdax"
      }
    ]
  },
  "align":2097152
}
created 2 namespaces
root@localhost:~/my_modules/drivers/nvdimm# daxctl reconfigure-device --mode=system-ram all
[
  {
    "chardev":"dax0.0",
    "size":4225761280,
    "target_node":2,
    "mode":"system-ram",
    "movable":true
  }
]
reconfigured 2 devices

遇到的一些问题

1、ext4文件系统损坏

问题:系统启动时,遇到ext4的报错信息

[ 3.630969] EXT4-fs error (device sda): htree_dirblock_to_tree:1080: inode #393220: comm systemd-tmpfile: Directory block failed checksum

这还会导致其它的问题,例如:

  • 有文件删不掉
rm: cannot remove 'directory': Bad message
  • 文件变成目录,还删不掉
# 提示双重目录(因为daxctl.conf变成了目录)
conf_files_filter_out: Directories inside directories are not supported: /etc/modprobe.d/daxctl.conf
# 删除不了
"cannot remove 'daxctl.conf': Directory not empty"

解决办法:

使用e2fsck工具扫描并修复一下文件系统,基本全程按y确定,即可。(按我看到的信息,貌似是一些文件的ref没有更新,导致文件出错)

e2fsck -y ubuntu-rootfs-raw-20G.image

其中,
-f 选项用于强制检查文件系统,即使文件系统处于已挂载状态。
-y 选项用于自动回答所有修复问题为 “yes”,以便自动修复文件系统错误。
检查:

$ e2fsck ubuntu-rootfs-raw-20G.image
e2fsck 1.45.5 (07-Jan-2020)
ubuntu-rootfs-raw-20G.image: clean, 13654/1310720 files, 321042/5242880 blocks

2、内核模块未成功加载

出错信息

$ ndctl create-namespace -f --mode devdax --continue
libkmod: ERROR ../libkmod/libkmod-module.c:838 kmod_module_insert_module: could not find module by name='dax_pmem'
原因:lsmod检查一下,应该是dax_pmem模块没有成功加载。
root@localhost:~# depmod -a
depmod: ERROR: could not open directory /lib/modules/5.15.114+: No such file or directory

原因:我一开始忘记把内核模块放到镜像里了。

3、qemu报错

# qemu环境中,执行关机命令
$ shutdown now
....
systemd-journald[202]: Failed to send stream file descriptor to service manager: Connection refused

猜测:可能是这里有文件没有写完,qemu就被我关了。说不定前面文件系统出错就是因为这个原因。

4、主机终端无法正常打开

不知道具体什么原因(猜测是因为我有时挂载了/dev目录,然后导致终端无法打开,vscode远程链接的终端也无法打开),报错信息如下:

There was an error creating the child proces for this terminalFailed to open PTY: No such device

在这里插入图片描述
解决办法:
1、想办法进入系统,通过安全模式或者启动盘,或者什么的,反正只要能运行boot-repair
2、下载boot-repair
3、运行boot-repair进行修复。

$ sudo apt install boot-repair
$ boot-repair

5、模块与内核版本不一致

insmod时出错,然后dmesg | tail可查到报错信息,大致如下:

device_dax: disagrees about version of symbol vmf_insert_mixed
 : unknown symbol kmalloc_caches (err -22)

原因:为了编译更快一点,我的编译命令是make -j16 vmlinux,因此只有vmlinux被更新了,其它的模块没有被更新。

tips(备忘录)
假如存在目录a/c和目录b/c,现在a/c下面添加了1.txt,而我想把这个1.txt同步到b/c下面。
首先, cp -r a/c b/ccp -r a/c b/c/都不行,它们会把a/c复制到b/c下面,出现了一个b/c/c的文件夹
然后,网上提出了一些方案:https://stackoverflow.com/questions/23698183/how-to-force-cp-to-overwrite-directory-instead-of-creating-another-one-inside,但是我觉得都不太优雅。。。

  1. 先rm旧文件夹,再cp新文件夹。简单,但是缺点是文件夹很大的话就很慢吧?
  2. 使用rsync同步文件夹。很好,唯一缺点:我用rsync用得没那么熟,而且我不确定rsync是否在所有服务器上都默认已经安装了
  3. 使用-T参数,将目标目录视为文件对象。缺点:很少用到这个参数,而且将文件夹视为文件这个功能,我怕我乱用之后,自己以后脑子都记不清了。
  4. cp -r a/c/* b/c/*。缺点:我平时用肯定会选这个,但是写在脚本里就不太方便,因为第一次运行得时候,b/c文件夹是不存在的,那这个命令就会报错。因此我写脚本的时候,需要判断这种情况,然后再用不同命令处理。

解决办法:
(1)在编译内核的时候同时编译相关模块

# 默认会编译所有代码
make -j16

(2)将新编译的模块替换旧的模块,为了方便这里写了个脚本。脚本内容就是先挂载镜像,然后拷贝文件,最后卸载镜像。只不过为了安全起见,加了一些check的代码(担心有参数是空的,然后路径变成/什么的)。

linux_kernel_root=.
image_root=/home/mingyang/my_images/ubuntu-base
image_path=$image_root/ubuntu-rootfs-raw-20G.image
mount_dir=$image_root/ubuntu-rootfs-dir

# check
if [[ ! -d $image_root ]]
then
    echo $image_root" not exists"
    exit
fi
if [[ ! -f $image_path ]]
then
    echo $image_path" not exists"
    exit
fi
if [[ ! -d $mount_dir ]]
then
    echo $mount_dir" not exists"
    exit
fi


# mount
sudo mount $image_path $mount_dir
ret=$?
if [[ ! ret ]]
then
    echo "mount $image_path to $mount_dir failed"
    exit
fi
echo "success mounting $image_path to $mount_dir"

# copy
module_path=$mount_dir"/root/my_modules"

sudo mkdir -p $module_path/drivers/dax
sudo mkdir -p $module_path/drivers/nvdimm

sudo rm -r $module_path/drivers/dax
sudo rm -r $module_path/drivers/nvdimm

sudo cp -r $linux_kernel_root/drivers/dax $module_path/drivers/dax
sudo cp -r $linux_kernel_root/drivers/nvdimm $module_path/drivers/nvdimm

echo "success copying modules to $module_path"

# umount
sudo umount $mount_dir
if [[ ! ret ]]
then
    echo "umount $mount_dir failed"
    exit
fi
echo "success umounting $image_path to $mount_dir"

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

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

相关文章

【Spring 】执行流程解析:了解Bean的作用域及生命周期

哈喽,哈喽,大家好~ 我是你们的老朋友:保护小周ღ 今天给大家带来的是 Spring 项目的执行流程解析 和 Bean 对象的6 种作用域以及生命周期,本文将为大家讲解,一起来看看叭~ 本期收录于博主的专栏:JavaEE_保…

数据库应用:MySQL高级语句(一)

目录 一、理论 1.常用查询 2.函数 3.进阶查询 二、实验 1.普通查询 2.函数 3.进阶查询 三、问题 1.MySQL || 运算符不生效 四、总结 一、理论 1.常用查询 常用查询包括:增、删、改、查; 对 MySQL 数据库的查询,除了基本的查询外…

网络安全能力成熟度模型介绍

一、概述 经过多年网络安全工作,一直缺乏网络安全的整体视角,网络安全的全貌到底是什么,一直挺迷惑的。目前网络安全的分类和厂家非常多,而且每年还会冒出来不少新的产品。但这些产品感觉还是像盲人摸象,只看到网络安…

09_SPI-Flash 页写实验

09_SPI-Flash 页写实验 1. 实验目标2. 操作时序3. 模块框图3.1 顶层模块3.2 页写模块 4. 波形图5. RTL5.1 flash_pp_ctrl5.2 spi_flash_pp 6. Testbench6.1 tb_flash_pp_ctrl6.2 tb_spi_flash_pp 1. 实验目标 使用页写指令,向 Flash 中写入 N 字节数据,…

Linux查看某进程所部署的目录路径

1.首先查看系统中正在跑的进程都有什么 ps -ef 2.然后通过抓取你要看的进程名,比如哪些服务 ps -ef | grep xxxxx(服务名) Linux在启动一个进程时,系统会在 /proc 下创建一个以PID命名的文件夹; 在该文件夹下会有我们的进程的信息&#…

高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测教程

详情点击链接:高时空分辨率、高精度一体化预测技术之风、光、水能源自动化预测 第一:预测平台及安装 一、高精度气象预测基础 综合气象观测数值模拟模式; 全球预测模式、中尺度数值模式; 二、自动化预测平台 Linux系统 Crontab…

redis 相关

redis相关面试题 redis支持哪几种数据形式? String,hash,set,zset,list redis主要消费什么物理资源? 内存,key-value的形式, redis 具有快速和数据持久化的特征,如果不将数据放在内存中,磁盘 I/O 速度为严…

PWM呼吸灯+流水灯设计

完成任务: 在流水灯基础上加入pwm呼吸灯设计,关于pwm呼吸灯设计可以看博主上一篇博客PWM呼吸灯设计 ,开发板上灯每两秒进行一次切换,每一个的亮灭间隔为一秒。 代码参考: module pwm_led_change(input wire …

element-ui select数据回显显示数字的问题 el-select校验失效出现阿拉伯数字问题

初始化参数 return {fields: [{"title":"景区","id":0},{"title":"酒店","id":1}],evaluates: [{"title":"好评","id":0},{"title":"中评","id":1…

Spring Data JPA使用规则和审计的学习

一、引入依赖 完整的pom文件如下所示: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation"http…

css3的新特性

动画效果 过渡 transition 鼠标放上去瞬间变大 过渡是变大的过程慢慢变化 第一个参数&#xff1a;对哪些值进行过渡。all为hover中所有&#xff0c;也可以指定属性 第二个参数&#xff1a;让动画过渡多长时间。要添加单位&#xff08;s秒&#xff09; 第三个参数&#xff1…

Chat GPT是什么,初学者怎么使用Chat GPT,需要注意些什么

目录 Chat GPT是什么 初学者怎么使用Chat GPT 使用Chat GPT需要注意什么 一些简单的prompt示例 Chat GPT是什么 Chat GPT是由OpenAI开发的一种大型语言模型&#xff0c;它基于GPT&#xff08;Generative Pre-trained Transformer&#xff09;架构。GPT是一种基于深度学习的…

微信小程序音频播放失败:TypeError: Cannot read property ‘duration‘ of undefined

报错截图 最下面这个this.setData()报错可不用理会&#xff0c;是this取值的问题 解决 需要播放和暂停功能时&#xff0c;需要把audio以及他的src放在Page外面。不能缺少 audioCtx.onPlay() 和 audioCtx.onError()两个方法&#xff0c;且需要放在play()方法之前如果在wx.crea…

ChatGPT助力DevOps的优势与局限

一、前言 DevOps 是一种方法论&#xff0c;旨在提高软件开发和 IT 运营团队的协作和效率。DevOps 涉及各种任务和流程的自动化&#xff0c;例如规划、编码、测试、部署、监控和故障排除。然而&#xff0c;其中一些任务和流程仍然有大量任务需要人工手动处理&#xff0c;而这会…

关于WIN10创建系统映像时D盘为系统盘的解决方案

文章目录 问题&#xff1a;使用WIN10自带备份工具时&#xff0c;创建系统映像时&#xff0c;D盘被识别为系统盘的解决方案。方法一&#xff08;传统方法&#xff0c;删盘符&#xff09;方法二&#xff08;对症下药&#xff0c;找原因&#xff09;第一个选项是暂时将服务的Image…

广西学子复读15年,不服从分配。网友:完全是浪费时间

广西学子复读15年&#xff0c;不服从分配。网友&#xff1a;完全是浪费时间 唐尚珺的复读行为引起了网友们的不同解读。有人认为他是一个执念深重的人&#xff0c;目标是考上清华北大&#xff0c;但这个说法是否真实&#xff0c;我们无法确定。无论如何&#xff0c;我们必须认识…

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb

DBeaver连接华为高斯数据库 DBeaver连接Gaussdb数据库 DBeaver connect Gaussdb 一、概述 华为GaussDB出来已经有一段时间&#xff0c;最近工作中刚到Gauss数据库。作为coder&#xff0c;那么如何通过可视化工具来操作Gauss呢&#xff1f; 本文将记录使用免费、开源的DBeaver来…

ARM 架构是什么?

ARM&#xff08;Advanced RISC Machines&#xff09;架构是一种处理器架构&#xff0c;它是一种精简指令集计算机&#xff08;RISC&#xff09;架构。ARM架构最初由ARM Holdings&#xff08;现在是SoftBank Group的子公司&#xff09;开发&#xff0c;并在1980年代末和1990年代…

MySQL 第七天作业 nosql作业

作业一&#xff1a;string list hash结构中&#xff0c;每个至少完成5个命令&#xff0c;包含插入 修改 删除 查询&#xff0c;list 和hash还需要增加遍历的操作命令 1、 string类型数据的命令操作&#xff1a; &#xff08;1&#xff09; 设置键值&#xff1a; set key1 re…

存储服务的演化与MySQL分库分表

文章目录 一、存储服务的演化1.单体结构2.单表单库的数据量膨胀 -> 分库分表3.单个MySQL的读写压力过大 -> MySQL索引优化4.进一步缓解MySQL读写压力 -> 读写分离5.冷热数据分离 -> 使用Redis缓存 二、MySQL分库分表1.策略2.需要注意的问题 一、存储服务的演化 1.…