Jack Huang's Blog


  • 首页

  • 标签

  • 归档

  • 搜索

Linux磁盘克隆方法

发表于 2024-11-19 | 更新于 2024-12-05

最近公司的一台 CentOS 服务器需要克隆一下,以便在另一台服务器或者虚拟机上运行,因此,研究了一下Linux的磁盘克隆方法。

基本常识

UEFI 与 BIOS 区别

UEFI引导与BIOS引导在结构上的区别:

  • BIOS引导的结构相对简单,由3个部分组成:BIOS程序、MBR(主引导记录)和操作系统引导程序。其中BIOS程序是由计算机制造商预装在ROM芯片中的,MBR是位于磁盘的名列前茅个扇区,用于存储操作系统引导程序的位置信息,操作系统引导程序则是由用户安装的操作系统自带的。

  • UEFI引导的结构相对复杂,由多个部分组成:UEFI固件、GPT(GUID分区表)、EFI系统分区、操作系统引导程序。其中UEFI固件是由计算机制造商预装在主板上的,GPT是磁盘分区表,EFI系统分区是用于存储操作系统引导程序和其他UEFI应用程序的特殊分区,操作系统引导程序则是由用户安装的操作系统自带的。

MBR (Master Boot Record,主引导记录)

主引导扇区是硬盘的第一扇区。它由三个部分组成,主引导记录MBR、硬盘分区表DPT和硬盘有效标志。在总共512字节的主引导扇区里MBR占446个字节,偏移地址0000H–0088H),它负责从活动分区中装载,并运行系统引导程序;第二部分是Partition table区(DPT分区表),占64个字节;第三部分是Magic number,占2个字节。

GPT 分区格式

GPT分区格式包含传统MBR(主引导记录)、分区表头、分区表、备份分区表头、备份分区表以及数据区。

使用工具

  • fdisk, 查看磁盘分区情况,或者用于磁盘分区,注意 fdisk 只支持 MBR 分区格式,只支持 2T 以下的磁盘

  • lsblk, 查看磁盘分区情况

  • blkid, 获取分区 UUID ,用于编辑 /etc/fstab 永久挂在分区

  • parted, 查看磁盘分区情况,或者用于磁盘分区,支持 MBR 或者 GPT 分区格式,支持 2T 以上的磁盘

  • mkfs.ext4, 用于分区后的磁盘文件系统格式化

  • mount, 挂载磁盘分区

  • dd, 磁盘克隆的工具

1
2
3
# 读取硬盘的mbr扇区
dd if=/dev/sdb of=mbr.bin bs=512 count=1 | hexdump
dd if=/dev/sdb of=mbr.bin bs=1 count=512 | hexdump

以上命令的使用方法请参考:

  • fdisk 管理磁盘分区

解决方案

目标磁盘大于原磁盘

需要磁盘克隆的服务器,其硬盘有4T大小,但只使用了不到512G,用于克隆的目标磁盘同样有4T大小。因此考虑先生成原磁盘的镜像文件,再向目标磁盘克隆。具体步骤如下:

  • 挂载目标磁盘,GPT分区,并ext4格式化。
  • 生成原磁盘的镜像文件
1
2
# /media/nvme1n1 为目标磁盘挂载目录
dd if=/dev/nvme0n1 status=progress bs=32M | gzip -c -9 > /media/nvme1n1/nvme0n1.dd.gz
  • 将生成的原磁盘镜像文件复制到原磁盘的 root 目录
1
mv /media/nvme1n1/nvme0n1.dd.gz /root
  • 使用原磁盘的镜像文件克隆磁盘
1
gzip -dc /root/nvme0n1.dd.gz | dd of=/dev/nvme1n1

目标磁盘小于原磁盘

如果目标磁盘小于原磁盘,就不能简单的使用dd命令进行全盘克隆了。好在原磁盘实际使用的空间不大,因此,采用的步骤如下:

  • 在目标磁盘安装同样的CentOS操作系统
  • 使用 dd 命令克隆 root 分区

对于 home 分区,应根据不同情况不同处理:

  • 如果 home 分区文件系统占有空间相对较小,可使用 tar 命令压缩 home 分区的文件,然后解压到目标磁盘的 home 分区,并更改 home 分区文件夹的所有者。
  • 如果 home 分区文件系统占用空间相对很大,那干脆用 dd 命令克隆 home 分区更省事。
  • 如果 home 分区为 ext 文件系统,可考虑使用 resize2f 缩小文件系统,在缩小文件系统后,在使用 fdsik 或者 parted 缩小 home 分区大小,没有问题后,考虑使用 dd 命令克隆 home 分区。
  • 如果 home 分区为 xfs 文件系统,由于 xfs 文件系统不支持缩小,可以考虑使用 xfsdump 备份,等缩小 home 分区后,使用 xfsrestore 还原 home 分区。

参考链接

  1. linux下使用fdisk进行磁盘分区详解,by 人生的哲理.
  2. fdisk 管理磁盘分区,by gnu.
  3. UEFI是什么意思?UEFI和BIOS的区别是什么?,by 小橙7.
  4. UEFI是什么?与BIOS的区别在哪?,by 平凡而伟大(心之所向).
  5. 装机、做系统必备:秒懂MBR和GPT分区表,by 张伟.
  6. GPT 磁盘分区格式简介及解析示例,by 一柯.
  7. GUID Partition Table (GPT) Disk Layout,by uefi.
  8. Linux下使用dd命令备份硬盘,by zuyunfei.
  9. How to gzip and keep original file on Unix or Linux command line,by Vivek Gite .
  10. BIOS 与 UEFI 引导流程,by LARRY1024.
  11. LVM原理与实现,by 戴思达.
  12. CentOS 7 调整 XFS 格式的 LVM 分区大小,by Tom Ma.
  13. CentOS 8 逻辑卷管理LVM详解(扩容、快照等),by 把倒立的世界腾空.
  14. resize2fs 缩小根分区 linux缩小根分区大小,by 编程小匠人.
  15. Linux下对LVM逻辑卷分区大小调整 [针对xfs和ext4文件系统],by 散尽浮华.
  16. Linux无损调整分区大小,by anuoua.
  17. 无损扩容Linux磁盘分区容量,by orchidflower.

Linux重启后进入initramfs导致无法开机的解决方案

发表于 2024-11-14 | 更新于 2024-11-15

最近遇到 Linux 重启后进入 initramfs 导致无法开机的问题,虽然问题没有解决,但是记录一下过程。

通用解决方法

在initramfs命令行接口下,输入如下命令:

1
2
3
4
5
# 使用如下命令查看和识别磁盘、分区或文件系统的信息
blkid

# fsck命令是用于检查和修复Linux文件系统中的错误
fsck -y -t ext4 /dev/sda1

由于无法修复文件系统中错误,linux 还是无法开机。

SuperBlock修复

1
2
3
4
sudo fdisk -l
sudo fsck.ext4 -v /dev/xxx
sudo mke2fs -n /dev/xxx
sudo e2fsck -b block_number /dev/xxx

参考链接

  1. Ubuntu重启后进入initramfs导致无法开机解决方案,by 修己xj.
  2. linux操作系统故障处理-ext4文件系统超级块损坏修复,by zhangatong.
  3. HOWTO: Repair a broken Ext4 Superblock in Ubuntu,by linuxexpresso.
  4. linux 检测SSD寿命,by 高压锅_1220.

Qt_Quick_3D加载3d模型的方法

发表于 2024-11-14

最近工作中使用的一个基于QT开发三维程序中有很多以 .mesh 扩展名结尾的三维模型,搜索了一下,原来是 QtQuick3D 使用的专有三维模型格式。

QtQuick3D 附带Balsam导入工具,用于将常见格式转换为QtQuick3D支持的格式。

Balsam的目的是让可以轻松获取在常用工具(Blender,Maya,或3dsMax)中创建的资源,并在QtQuick3D中使用它们。

通过balsamui导出mesh文件和qml文件。

参考链接

  1. Qt Quick 3D系列(一):加载3d模型,by 喵喵叫的猴.
  2. Qt Quick 3D模块初探,by 龚建波.
  3. Qt Quick 3D中将3D场景(如.obj)转换为.mesh,by 喵喵叫的猴.
  4. 12、Qt Quick 3D —– 模型加载,by weixin_41392061.

深度学习中注意力机制学习笔记

发表于 2024-11-03

学习理解注意力机制的目的是为了更好的掌握深度学习模型,指导实践。

注意力机制的优点

之所以要引入 Attention 机制,主要是3个原因:

  • 参数少

模型复杂度跟 CNN、RNN 相比,复杂度更小,参数也更少。所以对算力的要求也就更小。

  • 速度快

Attention 解决了 RNN 不能并行计算的问题。Attention机制每一步计算不依赖于上一步的计算结果,因此可以和CNN一样并行处理。

  • 效果好

在 Attention 机制引入之前,有一个问题大家一直很苦恼:长距离的信息会被弱化,就好像记忆能力弱的人,记不住过去的事情是一样的。

Attention 是挑重点,就算文本比较长,也能从中间抓住重点,不丢失重要的信息。

参考链接

  1. 一文看懂 Attention(本质原理+3大优点+5大类型),by easyAI-人工智能知识库.
  2. 一文搞定注意力机制(Attention),by markconca的博客.
  3. 注意力机制(Attention mechanism)基本原理详解及应用,by Jerry_Jin.
  4. 什么是词向量?(NPL入门),by mawenqi0729.
  5. 词向量Word Embedding原理及生成方法,by getui.
  6. 注意力机制,by wikipedia.

NTP协议学习笔记

发表于 2024-10-30 | 更新于 2024-11-02

最近遇到一个问题,需要程序进行严格的时间同步,因此学习一下网络时间协议。

NTP同步原理

网络时间协议NTP(Network Time Protocol)是TCP/IP协议族里面的一个应用层协议,用来使客户端和服务器之间进行时钟同步,提供高精准度的时间校正。NTP服务器从权威时钟源(例如原子钟、GPS)接收精确的协调世界时UTC,客户端再从服务器请求和接收时间。
NTP基于UDP报文进行传输,使用的UDP端口号为123。

NTP最典型的授时方式是Client/Server方式:

  1. 客户端首先向服务端发送一个NTP请求报文,其中包含了该报文离开客户端的时间戳t1;
  2. NTP请求报文到达NTP服务器,此时NTP服务器的时刻为t2。当服务端接收到该报文时,NTP服务器处理之后,于t3时刻发出NTP应答报文。该应答报文中携带报文离开NTP客户端时的时间戳t1、到达NTP服务器时的时间戳t2、离开NTP服务器时的时间戳t3;
  3. 客户端在接收到响应报文时,记录报文返回的时间戳t4。

客户端用上述4个时间戳参数就能够计算出2个关键参数:

  • NTP报文从客户端到服务器的往返延迟delay。

$delay=(t_4-t_1)-(t_3-t_2)$

  • 客户端与服务端之间的时间差offset。

联立方程组:

$t_2=t_1+offset+delay/2$

$t_4=t_3+offset+delay/2$

可得:

$offset=((t_2-t_1)+(t_3-t_4))/2$

NTP客户端根据计算得到的offset来调整自己的时钟,实现与NTP服务器的时钟同步。

NTP时间同步频率

NTP时间同步频率修改请参考:

  • windows修改ntp同步时间间隔

NTP时间同步精度

打开站点 https://time.is/ 可查看机器的时间精度。

参考链接

  1. 六千字详细图解网络时间协议(NTP),带你领略NTP的魅力!,by 网络技术联盟站.
  2. 什么是NTP?,by 高洋洋.
  3. 北斗授时原理及应用,by 西安同步.
  4. 各种Windows系统ntp客户端配置详解,by 西安同步.
  5. windows修改ntp同步时间间隔,by 梳碧湖的少年.

多网卡收UDP组播的问题分析

发表于 2024-10-27 | 更新于 2024-10-30

最近遇到一个问题,某个程序默认使用第一个网卡绑定组播地址,如果网卡顺序不对,将导致无法从组播地址上接收和发送数据。因此,必须指定某个网口绑定一个组播地址。具体方法有两种:

  • 调整网络高级设置,通过调整网卡顺序,使组播地址绑定在正确的网卡上
  • 修改网卡跃点数,通过修改网卡跃点数,使组播地址绑定在正确的网卡上

下面重点介绍第二种方法,修改网卡跃点数来调整组播地址绑定的网卡。

所谓“跃点”,即路由。一个路由为一个跃点。数据传输过程中需要经过多个网络,每个被经过的网络设备点(有能力路由的)叫做一个跃点,地址就是它的IP。

如果电脑中存在多个连接,哪个连接的跃点数小,哪个优先级就高。多播地址就会绑定在跃点数最小的网卡上。

参考链接

  1. Windows和Linux查看组播通信的方法,by huangwang.
  2. 多网卡的情况下收udp组播数据的坑,by 小鼬就是我.
  3. multiple multicast on multiple interfaces,by stackoverflow.
  4. Win10:如何修改双网卡的优先级?,by xosg.

HSV转RGB的效率问题探讨

发表于 2024-10-12

最近朋友遇到一个技术难题,我也没相关经验,只能记录以下,方便以后解决。

问题描述

朋友想高效地在一块嵌入式的板子上实现 640*480 HSV格式的图片转换成 RGB格式的图片,要求处理时延不能超过20ms。

解决方案

朋友试了很多中解决方案,包括:

  • 使用OpenCV的cvtColor函数,性能太差,可能是嵌入式板子的CPU处理器性能差的原因。
  • 使用OpenGL进行图像格式转换,性能还是不够。
  • 采用GPU加速图像处理,性能还是不够,GPU可能能够快速处理图像,但是图像数据在CPU和GPU之间的数据搬运也很耗时。
  • 使用OpenGL帧缓存双缓冲,性能还是不够

最后建议优化HSV转RGB格式的算法,提高CPU执行效率。

参考链接

  1. 数字图像处理——RGB与HSV图像互相转换原理,by 萌萌哒程序猴.
  2. OpenGL帧缓存,by 先锋小牛.
  3. OpenCV 自学笔记21. RGB色彩空间和HSV色彩空间的理解,by 两鬓已不能斑白.
  4. opencv中使用cuda加速图像处理,by 我是一个对称矩阵.

多传感器多目标跟踪方法研究学习笔记

发表于 2024-09-28

最近遇到一个问题,需要将多传感器多目标跟踪获得的航迹进行关联,因此学习研究一下。

关键技术

分布式多传感器多目标跟踪涉及的目标跟踪、传感器配准、航迹关联、数据融合4项关键技术。

目标跟踪

目标跟踪是指利用传感器获得的带噪声量测数据,对目标的状态和个数进行估计的过程。

目标跟踪按目标探测个数可分为单目标跟踪和多目标跟踪,通常它们都基于贝叶斯框架进行递归滤波。

单目标跟踪

多目标跟踪

传感器配准

在分布式多传感器多目标跟踪过程中,需要把来自多个传感器的数据转换到相同的时空参照系中。由于不同传感器传输速率及采样周期不同,而且存在传感器系统偏差和量测误差,直接进行转换会降低数据融合精度,因此在对多传感器数据处理时需要进行传感器时空配准。

时间配准

时间配准就是将各传感器对同一目标的异步量测信息配准到同一时刻。

空间配准

空间配准是利用多传感器对空间公共目标的探测信息对传感器的系统偏差进行估计和补偿的过程,它可以提高信息融合精度。

航迹关联

由于传感器间的探测区域存在重叠,来自不同系统的航迹可能代表同一目标。因此,如何找出同一目标对应的航迹就是分布式数据融合系统中的航迹关联问题。

航迹关联算法主要分为两类,一类是基于统计类的方法,一类是基于模糊数学的方法。

数据融合

分布式多传感器多目标跟踪又称分布式多传感器数据融合。在该系统中,各局部传感器首先基于单传感器多目标跟踪算法,形成各自目标航迹,
接着各传感器将目标航迹送入融合中心完成时空配准与航迹关联,然后融合中心基于某种融合准则对来自同一目标的航迹进行估计融合,最终形成稳定、
高精度的全局航迹。

参考链接

  1. 分布式多传感器多目标跟踪方法综述,by 曾雅俊, 王俊, 魏少明, 等.

HTML视频点击自动最大化播放技术学习

发表于 2024-09-23 | 更新于 2024-09-25

最近遇到一个小需求,就是在网页前端实现点击视频播放的同时,实现视频最大化,简单学习一下。

技术原理

网页前端实现点击视频播放的同时,实现视频最大化的技术原理如下:

  • 捕捉点击视频播放的事件,在该事件中执行视频最大化方法

技术实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
<!doctype html>
<html>
<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>视频技术测试</title>
<style>
html, body {
width: 100%;
height: 100%;
margin: 0;
padding:0;
}

#max{
margin: 5% auto;
width: 600px;
}
</style>
</head>

<body>
<div id="max">
<video id="media" controls width="600">
<source src="./media/cc0-videos/flower.webm" type="video/webm" />

<source src="./media/cc0-videos/flower.mp4" type="video/mp4" />

Download the
<a href="./media/cc0-videos/flower.webm">WEBM</a>
or
<a href="./media/cc0-videos/flower.mp4">MP4</a>
video.
</video>
</div>
</body>

<script>
const video = document.querySelector("#media");

video.addEventListener("play", (event) => {
video.requestFullscreen();
});

</script>

</html>

参考链接

  1. 深入理解HTML5视频标签:掌握全方位的播放控制和交互技巧,by 未闻花名_review.

HTML图片自动轮播技术学习

发表于 2024-09-23 | 更新于 2024-09-25

最近遇到一个小需求,就是在网页前端实现图片自动轮播,简单学习一下。

技术原理

网页前端实现图片自动轮播的技巧如下:

  • 图片所在容器元素采用绝对定位,从而实现所有图片叠加到一块。
  • 通过CSS实现左右箭头
  • 通过js调整图片所在容器的透明度,从而实现图片的轮播。同时调整播放顺序按钮的背景色,从而实现顺序指示的功能。

技术实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
<!DOCTYPE html>
<html>

<head>
<meta http-equiv=Content-Type content="text/html; charset=utf-8">
<title>图片轮播技术测试</title>
<style>
html,
body {
width: 100%;
height: 100%;
margin: 0;
padding: 0;
}

#max {
width: 900px;
margin: 0 auto;
margin-top: 0%;
}

.re {
position: relative;
}

.arrow {
height: 20px;
width: 20px;
border: solid #333;
border-width: 0 4px 4px 0;
display: inline-block;
padding: 3px;
}

.left {
transform: rotate(135deg);
cursor: pointer;
margin-top: 240px;
margin-left: 20px;
float: left;
}

.right {
transform: rotate(-45deg);
cursor: pointer;
margin-top: 240px;
margin-right: 10px;
float: right;
}

.re ul {
list-style-type: none;
padding: 0;
margin: 0;
}

.re ul>li {
position: absolute;
transition: 2s;
opacity: 0;
}

.re ul>li img {
width: 900px;
height: 500px;
border-radius: 1%;
border: 5px solid #fffbd6;
}

#max ol {
position: relative;
display: grid;
grid-template-columns: repeat(5, 75px);
grid-template-rows: auto;
grid-gap: 1em;
gap: 1em;
float: right;
margin-top: 450px;
list-style: none;
top: 0;
left: 0;
}

#max ol li {
width: 20px;
height: 20px;
font-size: 15px;
line-height: 20px;
float: left;
text-align: center;
border-radius: 2em;
border: 5px solid #999999;
}
</style>
</head>

<body>
<div id="max">
<div class="re" onmouseover="mouseover()" onmouseout="mouseout()">
<ul>
<li><img src="./pic/big_size/p1.jpg" alt=""></li>
<li><img src="./pic/big_size/p2.jpg" alt=""></li>
<li><img src="./pic/big_size/p3.jpg" alt=""></li>
<li><img src="./pic/big_size/p4.jpg" alt=""></li>
<li><img src="./pic/big_size/p5.jpg" alt=""></li>
</ul>
<div class="arrow left" onClick="prev()"></div>
<div class="arrow right" onClick="next()"></div>
<ol>
<li></li>
<li></li>
<li></li>
<li></li>
<li></li>
</ol>
</div>
</div>
</body>

<script>
function fun(i, j) {//转换图片函数,就是把透明度改了一下
lik[i].style.opacity = 1;
lik[j].style.opacity = 0;
lik[i + 5].style.backgroundColor = "#ffffff";//改一下小图标
lik[j + 5].style.backgroundColor = "#00000000"
}

function auto() {//轮播循环函数
if (++i >= 5) {
i = 0;
fun(0, 4);
}
else fun(i, i - 1);
}

function mouseover(){
console.log('clear timer!');
clearInterval(timer);
}

function mouseout(){
console.log('set timer!');
timer = setInterval(auto, transition); //调用定时器
}

function prev(){
if (--i < 0) {
i = 4;
fun(4, 0);
}
else fun(i, i + 1);
}

function next(){
if (++i >= 5) {
i = 0;
fun(0, 4);
}
else fun(i, i - 1);
}

var transition = 5000;
var box = this.document.getElementsByClassName("re")[0];
var lik = box.getElementsByTagName("li");

fun(0, 1);//初始化下
var i = 0;

timer = this.setInterval(auto, transition);

var j = 0;
for (; j < 5; j++) {//点击小图标也可以转换图片
lik[j + 5].ind = j;
lik[j + 5].onclick = function () {
fun(this.ind, i)
i = this.ind;
}
}
</script>

</html>

参考链接

  1. 超简单全面的html图片自动轮播,by 学习是人类进化的阶梯.
  2. 简单的HTML网页图片轮播自动切换,by 时钟与夏蝉.
  3. 利用CSS实现上下左右箭头,by 墨初.
上一页1234…52下一页

Jack Huang

519 日志
66 标签
© 2025 Jack Huang
由 Hexo 强力驱动
|
主题 — NexT.Muse