<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>未分类 &#8211; 岁月细碎点滴快查</title>
	<atom:link href="https://blog.mutadecheng.com/category/uncategorized/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.mutadecheng.com</link>
	<description></description>
	<lastBuildDate>Sun, 04 Jan 2026 10:35:47 +0000</lastBuildDate>
	<language>zh-Hans</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9</generator>
	<item>
		<title>浅谈视觉运动检测中光流法和帧差法</title>
		<link>https://blog.mutadecheng.com/2025/12/30/%e6%b5%85%e8%b0%88%e8%a7%86%e8%a7%89%e8%bf%90%e5%8a%a8%e6%a3%80%e6%b5%8b%e4%b8%ad%e5%85%89%e6%b5%81%e6%b3%95%e5%92%8c%e5%b8%a7%e5%b7%ae%e6%b3%95/</link>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Tue, 30 Dec 2025 01:05:16 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">https://blog.mutadecheng.com/?p=646</guid>

					<description><![CDATA[光流法和帧差法都是视频图像处理领域常用的运动检测/分析方法，但它们的原理、输出和适用场景有明显区别。下面详细对 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>光流法和帧差法都是视频图像处理领域常用的运动检测/分析方法，但它们的原理、输出和适用场景有明显区别。下面详细对比说明：</p>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">1. 原理区别</h3>



<p><strong>帧差法（Frame Difference）</strong></p>



<ul class="wp-block-list">
<li><strong>基本思想</strong>：直接对连续两帧图像的像素灰度值做差分，若差值大于阈值，则判定为运动区域。</li>



<li><strong>输出结果</strong>：主要得到运动的“掩膜”或“区域”，即哪个像素发生了变化。</li>



<li><strong>适用场景</strong>：简单的运动检测和目标分割。</li>
</ul>



<p><strong>光流法（Optical Flow）</strong></p>



<ul class="wp-block-list">
<li><strong>基本思想</strong>：基于亮度一致性假设，通过分析连续帧间像素灰度分布的变化，估计每个像素的速度矢量（即运动方向和幅度）。</li>



<li><strong>输出结果</strong>：每个像素的运动矢量场（速度场），可进一步分析位移、速度、振动等物理量。</li>



<li><strong>适用场景</strong>：需要精确估计物体运动、结构振动、速度场、位移场等场景。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">2. 结果对比</h3>



<figure class="wp-block-table"><table class="has-fixed-layout"><thead><tr><th>方法</th><th>输出类型</th><th>能否得出运动方向</th><th>能否得出运动幅值</th><th>适用场景</th></tr></thead><tbody><tr><td>帧差法</td><td>二值/灰度掩膜</td><td>否</td><td>否</td><td>运动检测、目标分割</td></tr><tr><td>光流法</td><td>运动矢量场</td><td>是</td><td>是</td><td>振动分析、速度估计、模态识别</td></tr></tbody></table></figure>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">3. 优缺点对比</h3>



<p><strong>帧差法：</strong></p>



<ul class="wp-block-list">
<li><strong>优点</strong>：实现简单，计算速度快，适合实时检测。</li>



<li><strong>缺点</strong>：只能检测运动区域，无法准确估计运动的方向和幅度，易受光照变化影响，对微小运动不敏感。</li>
</ul>



<p><strong>光流法：</strong></p>



<ul class="wp-block-list">
<li><strong>优点</strong>：可获得像素级别的运动方向和幅度信息，适合微小运动（如结构振动、模态识别、运动放大）。</li>



<li><strong>缺点</strong>：计算复杂度高，对噪声和光照变化较敏感，需较好的视频质量。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">4. 应用举例</h3>



<ul class="wp-block-list">
<li><strong>帧差法</strong>：适合用于安防监控中检测是否有物体进入画面，或简单的运动目标检测。</li>



<li><strong>光流法</strong>：适合用于结构健康监测、桥梁/建筑物振动检测、模态参数识别、运动放大等需要高精度运动分析的场景。</li>
</ul>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h3 class="wp-block-heading">5. 总结</h3>



<p><strong>帧差法</strong>更偏向于“有没有运动”的检测，而<strong>光流法</strong>则能“量化运动”，包括运动的方向和幅度。在结构振动、模态识别、运动放大等需要定量分析运动的场景，光流法明显优于帧差法。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>测试页面</title>
		<link>https://blog.mutadecheng.com/2025/12/23/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2/</link>
					<comments>https://blog.mutadecheng.com/2025/12/23/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2/#respond</comments>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Tue, 23 Dec 2025 08:50:14 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">https://blog.mutadecheng.com/?p=585</guid>

					<description><![CDATA[这是一个测试页面,什么都可能发生]]></description>
										<content:encoded><![CDATA[
<p>这是一个测试页面,什么都可能发生</p>



<!-- 引入 model-viewer 组件 -->
<script type="module" src="https://unpkg.com/@google/model-viewer/dist/model-viewer.min.js"></script>

<!-- 3D模型展示 -->
<model-viewer
  src="https://blog.mutadecheng.com/wp-content/uploads/2026/01/Duck.glb"
  alt="Duck 3D模型"
  auto-rotate
  camera-controls
  ar
  style="width: 500px; height: 400px; background: white; border-radius: 10px; box-shadow: 0 4px 20px rgba(0,0,0,0.1); display: block; margin: 40px auto;"
></model-viewer>

]]></content:encoded>
					
					<wfw:commentRss>https://blog.mutadecheng.com/2025/12/23/%e6%b5%8b%e8%af%95%e9%a1%b5%e9%9d%a2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>工作记录-ROS雷达开发示例(改变颜色)</title>
		<link>https://blog.mutadecheng.com/2025/09/22/%e5%b7%a5%e4%bd%9c%e8%ae%b0%e5%bd%95-ros%e9%9b%b7%e8%be%be%e5%bc%80%e5%8f%91%e7%a4%ba%e4%be%8b%e6%94%b9%e5%8f%98%e9%a2%9c%e8%89%b2/</link>
					<comments>https://blog.mutadecheng.com/2025/09/22/%e5%b7%a5%e4%bd%9c%e8%ae%b0%e5%bd%95-ros%e9%9b%b7%e8%be%be%e5%bc%80%e5%8f%91%e7%a4%ba%e4%be%8b%e6%94%b9%e5%8f%98%e9%a2%9c%e8%89%b2/#respond</comments>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Mon, 22 Sep 2025 02:26:18 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">https://blog.mutadecheng.com/?p=377</guid>

					<description><![CDATA[前提 雷达驱动已经在发布点云数据（&#160;/cx/lslidar_point_cloud） Python实 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<h2 class="wp-block-heading">前提</h2>



<p>雷达驱动已经在发布点云数据（&nbsp;<code>/cx/lslidar_point_cloud</code>）</p>



<h2 class="wp-block-heading">Python实现步骤（简单示例）</h2>



<h3 class="wp-block-heading">a. 安装依赖</h3>



<p>确保你有<code>pcl_ros</code>、<code>sensor_msgs</code>、<code>rospy</code>。</p>



<p>新建包</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd ~/catkin_ws/src
catkin_create_pkg colorize_cloud rospy std_msgs sensor_msgs pcl_ros" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/catkin_ws/src</span></span>
<span class="line"><span style="color: #DCDCAA">catkin_create_pkg</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">rospy</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">std_msgs</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">sensor_msgs</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">pcl_ros</span></span></code></pre></div>



<p>然后新建文件夹</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd ~/catkin_ws/src/colorize_cloud
mkdir scripts launch" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/catkin_ws/src/colorize_cloud</span></span>
<span class="line"><span style="color: #DCDCAA">mkdir</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">scripts</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">launch</span></span></code></pre></div>



<h3 class="wp-block-heading">a. 目录结构</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="colorize_cloud/
├── CMakeLists.txt
├── package.xml
├── launch/
│   └── colorize_cloud.launch
└── scripts/
    └── colorize_cloud.py" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">colorize_cloud/</span></span>
<span class="line"><span style="color: #DCDCAA">├──</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">CMakeLists.txt</span></span>
<span class="line"><span style="color: #DCDCAA">├──</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">package.xml</span></span>
<span class="line"><span style="color: #DCDCAA">├──</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">launch/</span></span>
<span class="line"><span style="color: #DCDCAA">│</span><span style="color: #D4D4D4">   </span><span style="color: #CE9178">└──</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud.launch</span></span>
<span class="line"><span style="color: #DCDCAA">└──</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">scripts/</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #DCDCAA">└──</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud.py</span></span></code></pre></div>



<h3 class="wp-block-heading">b. 新建节点代码</h3>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="#!/usr/bin/env python3
import rospy
from sensor_msgs.msg import PointCloud2, PointField
import sensor_msgs.point_cloud2 as pc2

def colorize_point_cloud(msg):
    # 收到原始点云
    new_points = []
    for p in pc2.read_points(msg, field_names=(&quot;x&quot;, &quot;y&quot;, &quot;z&quot;), skip_nans=True):
        x, y, z = p[0], p[1], p[2]
        distance = (x ** 2 + y ** 2 + z ** 2) ** 0.5
        # 设定区间，比如距离在3~5米的点变红
        if 3 &lt; distance &lt; 5:
            # RGB转float
            r, g, b = 255, 0, 0
            rgb = (r &lt;&lt; 16) | (g &lt;&lt; 8) | b
            rgb = struct.unpack('f', struct.pack('I', rgb))[0]
        else:
            r, g, b = 0, 255, 0
            rgb = (r &lt;&lt; 16) | (g &lt;&lt; 8) | b
            rgb = struct.unpack('f', struct.pack('I', rgb))[0]
        new_points.append([x, y, z, rgb])

    fields = [
        PointField('x', 0, PointField.FLOAT32, 1),
        PointField('y', 4, PointField.FLOAT32, 1),
        PointField('z', 8, PointField.FLOAT32, 1),
        PointField('rgb', 12, PointField.FLOAT32, 1)
    ]
    header = msg.header
    pc2_msg = pc2.create_cloud(header, fields, new_points)
    pub.publish(pc2_msg)

if __name__ == '__main__':
    import struct
    rospy.init_node('colorize_cloud')
    pub = rospy.Publisher('/colorized_cloud', PointCloud2, queue_size=1)
    rospy.Subscriber('/cx/lslidar_point_cloud', PointCloud2, colorize_point_cloud)
    rospy.spin()
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #6A9955">#!/usr/bin/env python3</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> rospy</span></span>
<span class="line"><span style="color: #C586C0">from</span><span style="color: #D4D4D4"> sensor_msgs.msg </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> PointCloud2, PointField</span></span>
<span class="line"><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> sensor_msgs.point_cloud2 </span><span style="color: #C586C0">as</span><span style="color: #D4D4D4"> pc2</span></span>
<span class="line"></span>
<span class="line"><span style="color: #569CD6">def</span><span style="color: #D4D4D4"> </span><span style="color: #DCDCAA">colorize_point_cloud</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">msg</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #6A9955"># 收到原始点云</span></span>
<span class="line"><span style="color: #D4D4D4">    new_points = []</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> p </span><span style="color: #C586C0">in</span><span style="color: #D4D4D4"> pc2.read_points(msg, </span><span style="color: #9CDCFE">field_names</span><span style="color: #D4D4D4">=(</span><span style="color: #CE9178">&quot;x&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;y&quot;</span><span style="color: #D4D4D4">, </span><span style="color: #CE9178">&quot;z&quot;</span><span style="color: #D4D4D4">), </span><span style="color: #9CDCFE">skip_nans</span><span style="color: #D4D4D4">=</span><span style="color: #569CD6">True</span><span style="color: #D4D4D4">):</span></span>
<span class="line"><span style="color: #D4D4D4">        x, y, z = p[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">], p[</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">], p[</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        distance = (x ** </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> + y ** </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4"> + z ** </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">) ** </span><span style="color: #B5CEA8">0.5</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #6A9955"># 设定区间，比如距离在3~5米的点变红</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4"> &lt; distance &lt; </span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #6A9955"># RGB转float</span></span>
<span class="line"><span style="color: #D4D4D4">            r, g, b = </span><span style="color: #B5CEA8">255</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">            rgb = (r &lt;&lt; </span><span style="color: #B5CEA8">16</span><span style="color: #D4D4D4">) | (g &lt;&lt; </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">) | b</span></span>
<span class="line"><span style="color: #D4D4D4">            rgb = struct.unpack(</span><span style="color: #CE9178">&#39;f&#39;</span><span style="color: #D4D4D4">, struct.pack(</span><span style="color: #CE9178">&#39;I&#39;</span><span style="color: #D4D4D4">, rgb))[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #C586C0">else</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">            r, g, b = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">255</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span></span>
<span class="line"><span style="color: #D4D4D4">            rgb = (r &lt;&lt; </span><span style="color: #B5CEA8">16</span><span style="color: #D4D4D4">) | (g &lt;&lt; </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">) | b</span></span>
<span class="line"><span style="color: #D4D4D4">            rgb = struct.unpack(</span><span style="color: #CE9178">&#39;f&#39;</span><span style="color: #D4D4D4">, struct.pack(</span><span style="color: #CE9178">&#39;I&#39;</span><span style="color: #D4D4D4">, rgb))[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">]</span></span>
<span class="line"><span style="color: #D4D4D4">        new_points.append([x, y, z, rgb])</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    fields = [</span></span>
<span class="line"><span style="color: #D4D4D4">        PointField(</span><span style="color: #CE9178">&#39;x&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">, PointField.FLOAT32, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        PointField(</span><span style="color: #CE9178">&#39;y&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">, PointField.FLOAT32, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        PointField(</span><span style="color: #CE9178">&#39;z&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">8</span><span style="color: #D4D4D4">, PointField.FLOAT32, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">),</span></span>
<span class="line"><span style="color: #D4D4D4">        PointField(</span><span style="color: #CE9178">&#39;rgb&#39;</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">12</span><span style="color: #D4D4D4">, PointField.FLOAT32, </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    ]</span></span>
<span class="line"><span style="color: #D4D4D4">    header = msg.header</span></span>
<span class="line"><span style="color: #D4D4D4">    pc2_msg = pc2.create_cloud(header, fields, new_points)</span></span>
<span class="line"><span style="color: #D4D4D4">    pub.publish(pc2_msg)</span></span>
<span class="line"></span>
<span class="line"><span style="color: #C586C0">if</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">__name__</span><span style="color: #D4D4D4"> == </span><span style="color: #CE9178">&#39;__main__&#39;</span><span style="color: #D4D4D4">:</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">import</span><span style="color: #D4D4D4"> struct</span></span>
<span class="line"><span style="color: #D4D4D4">    rospy.init_node(</span><span style="color: #CE9178">&#39;colorize_cloud&#39;</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    pub = rospy.Publisher(</span><span style="color: #CE9178">&#39;/colorized_cloud&#39;</span><span style="color: #D4D4D4">, PointCloud2, </span><span style="color: #9CDCFE">queue_size</span><span style="color: #D4D4D4">=</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">    rospy.Subscriber(</span><span style="color: #CE9178">&#39;/cx/lslidar_point_cloud&#39;</span><span style="color: #D4D4D4">, PointCloud2, colorize_point_cloud)</span></span>
<span class="line"><span style="color: #D4D4D4">    rospy.spin()</span></span>
<span class="line"></span></code></pre></div>



<h3 class="wp-block-heading">c. 使用RViz显示颜色</h3>



<ol class="wp-block-list">
<li>在RViz中(添加)订阅&nbsp;<code>/colorized_cloud</code>&nbsp;话题。</li>



<li>在点云显示属性里，将颜色模式设置为“RGB”。</li>
</ol>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">4. 启动方法</h2>



<ol class="wp-block-list">
<li>保存脚本为&nbsp;scripts/<code>colorize_cloud.py</code>，加执行权限<br><code>chmod +x colorize_cloud.py</code></li>



<li>在launch文件中添加节点：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;node pkg=&quot;colorize_cloud&quot; type=&quot;colorize_cloud.py&quot; name=&quot;colorize_cloud&quot; output=&quot;screen&quot;/&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">&lt;node pkg=</span><span style="color: #CE9178">&quot;colorize_cloud&quot;</span><span style="color: #D4D4D4"> type=</span><span style="color: #CE9178">&quot;colorize_cloud.py&quot;</span><span style="color: #D4D4D4"> name=</span><span style="color: #CE9178">&quot;colorize_cloud&quot;</span><span style="color: #D4D4D4"> output=</span><span style="color: #CE9178">&quot;screen&quot;</span><span style="color: #D4D4D4">/&gt;</span></span></code></pre></div>



<ol start="3" class="wp-block-list">
<li>每次新建包或改了 CMakeLists.txt 都要编译一次：</li>



<li>启动你的launch文件</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="cd ~/catkin_ws
catkin_make
source devel/setup.bash

# 启动雷达驱动
roslaunch lslidar_driver lslidar_cx.launch

# 启动新包
rosrun colorize_cloud colorize_cloud.py" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">cd</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">~/catkin_ws</span></span>
<span class="line"><span style="color: #DCDCAA">catkin_make</span></span>
<span class="line"><span style="color: #DCDCAA">source</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">devel/setup.bash</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 启动雷达驱动</span></span>
<span class="line"><span style="color: #DCDCAA">roslaunch</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">lslidar_driver</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">lslidar_cx.launch</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955"># 启动新包</span></span>
<span class="line"><span style="color: #DCDCAA">rosrun</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud.py</span></span></code></pre></div>



<p>3. 启动你的着色节点</p>



<p><strong>方法一：直接用rosrun</strong></p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="rosrun colorize_cloud colorize_cloud.py" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">rosrun</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud.py</span></span></code></pre></div>



<p><strong>方法二：用launch文件启动</strong><br>比如你建了&nbsp;<code>colorize_cloud/launch/colorize_cloud.launch</code>，内容如下：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="&lt;launch&gt;
  &lt;node pkg=&quot;colorize_cloud&quot; type=&quot;colorize_cloud.py&quot; name=&quot;colorize_cloud&quot; output=&quot;screen&quot;/&gt;
&lt;/launch&gt;" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #808080">&lt;</span><span style="color: #569CD6">launch</span><span style="color: #808080">&gt;</span></span>
<span class="line"><span style="color: #D4D4D4">  </span><span style="color: #808080">&lt;</span><span style="color: #569CD6">node</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">pkg</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;colorize_cloud&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">type</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;colorize_cloud.py&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">name</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;colorize_cloud&quot;</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">output</span><span style="color: #D4D4D4">=</span><span style="color: #CE9178">&quot;screen&quot;</span><span style="color: #808080">/&gt;</span></span>
<span class="line"><span style="color: #808080">&lt;/</span><span style="color: #569CD6">launch</span><span style="color: #808080">&gt;</span></span></code></pre></div>



<p>则可以这样启动：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="roslaunch colorize_cloud colorize_cloud.launch" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #DCDCAA">roslaunch</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud</span><span style="color: #D4D4D4"> </span><span style="color: #CE9178">colorize_cloud.launch</span></span></code></pre></div>



<hr class="wp-block-separator has-alpha-channel-opacity"/>



<h2 class="wp-block-heading">5. 效果验证</h2>



<ul class="wp-block-list">
<li>RViz显示&nbsp;<code>/colorized_cloud</code>，你会看到距离在3~5米的点变红色，其余为绿色。</li>
</ul>



<p></p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.mutadecheng.com/2025/09/22/%e5%b7%a5%e4%bd%9c%e8%ae%b0%e5%bd%95-ros%e9%9b%b7%e8%be%be%e5%bc%80%e5%8f%91%e7%a4%ba%e4%be%8b%e6%94%b9%e5%8f%98%e9%a2%9c%e8%89%b2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>机器学习中常见的分类模型及其特点</title>
		<link>https://blog.mutadecheng.com/2024/07/09/%e6%9c%ba%e5%99%a8%e5%ad%a6%e4%b9%a0%e4%b8%ad%e5%b8%b8%e8%a7%81%e7%9a%84%e5%88%86%e7%b1%bb%e6%a8%a1%e5%9e%8b%e5%8f%8a%e5%85%b6%e7%89%b9%e7%82%b9/</link>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Tue, 09 Jul 2024 03:20:19 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">https://blog.mutadecheng.com/?p=198</guid>

					<description><![CDATA[在机器学习中，有多种模型可以用于分类任务，每种模型都有其独特的特点和适用场景。以下是一些常见的分类模型及其特点 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>在机器学习中，有多种模型可以用于分类任务，每种模型都有其独特的特点和适用场景。以下是一些常见的分类模型及其特点：</p>



<h3 class="wp-block-heading">1. 逻辑回归（Logistic Regression）</h3>



<ul class="wp-block-list">
<li><strong>特点</strong>：适用于线性可分的数据集，模型简单，易于解释。</li>



<li><strong>优点</strong>：计算效率高，适合大规模数据集。</li>



<li><strong>缺点</strong>：对非线性数据表现较差。</li>



<li><strong>应用场景</strong>：二分类问题，如垃圾邮件检测、信用卡欺诈检测。</li>
</ul>



<h3 class="wp-block-heading">2. 支持向量机（Support Vector Machine, SVM）</h3>



<ul class="wp-block-list">
<li><strong>特点</strong>：通过找到最佳的超平面来分类数据，支持线性和非线性分类。</li>



<li><strong>优点</strong>：在高维空间中表现良好，适用于复杂的决策边界。</li>



<li><strong>缺点</strong>：计算复杂度高，数据量大时训练时间较长。</li>



<li><strong>应用场景</strong>：文本分类、图像分类。</li>
</ul>



<h3 class="wp-block-heading">3. 决策树（Decision Tree）</h3>



<ul class="wp-block-list">
<li><strong>特点</strong>：通过树状结构进行决策，易于理解和解释。</li>



<li><strong>优点</strong>：处理非线性数据，能够处理缺失值。</li>



<li><strong>缺点</strong>：容易过拟合，特别是深树。</li>



<li><strong>应用场景</strong>：医疗诊断、客户分类。</li>
</ul>



<h3 class="wp-block-heading">4. 随机森林（Random Forest）</h3>



<ul class="wp-block-list">
<li><strong>特点</strong>：由多棵决策树组成的集成模型，通过投票机制得出最终分类结果。</li>



<li><strong>优点</strong>：减少过拟合，具有较高的准确性和鲁棒性。</li>



<li><strong>缺点</strong>：计算复杂度较高，训练时间较长。</li>



<li><strong>应用场景</strong>：金融风险评估、推荐系统。</li>
</ul>



<h3 class="wp-block-heading">5. 梯度提升树（Gradient Boosting Machine, GBM）</h3>



<ul class="wp-block-list">
<li><strong>特点</strong>：通过逐步构建决策树来最小化损失函数。</li>



<li><strong>优点</strong>：高准确性，适用于复杂的数据集。</li>



<li><strong>缺点</strong>：训练时间较长，参数调优复杂。</li>



<li><strong>应用场景</strong>：搜索引擎排序、欺诈检测。</li>
</ul>



<h3 class="wp-block-heading">6. 神经网络（Neural Networks）</h3>



<ul class="wp-block-list">
<li><strong>特点</strong>：通过模拟人脑神经元结构进行学习，适用于处理复杂的非线性关系。</li>



<li><strong>优点</strong>：强大的拟合能力，适用于大规模和复杂的数据集。</li>



<li><strong>缺点</strong>：需要大量数据和计算资源，难以解释。</li>



<li><strong>应用场景</strong>：图像识别、语音识别、自然语言处理。</li>
</ul>



<h2 class="wp-block-heading">例子: 对于齿轮箱断齿建立模型,选择模型的建议</h2>



<p>齿轮箱断齿这种机械故障往往会在振动信号中表现出一些特定的特征。以下是一些可能的特征参数，这些参数在振动信号的时域和频域中都可能体现出断齿的特征：</p>



<h3 class="wp-block-heading">时域特征</h3>



<ol class="wp-block-list">
<li><strong>均值（Mean）</strong>：断齿可能导致振动信号的均值发生变化。</li>



<li><strong>均方根值（RMS）</strong>：断齿通常会增加振动信号的能量，从而提高RMS值。</li>



<li><strong>峰值（Peak Value）</strong>：断齿可能导致振动信号中出现更高的峰值。</li>



<li><strong>峭度（Kurtosis）</strong>：断齿会增加信号中的冲击成分，从而提高峭度。</li>



<li><strong>偏度（Skewness）</strong>：断齿可能导致振动信号的不对称性，从而改变偏度。</li>



<li><strong>方差（Variance）</strong>：断齿可能增加振动信号的波动性，从而提高方差。</li>
</ol>



<h3 class="wp-block-heading">频域特征</h3>



<ol class="wp-block-list">
<li><strong>频率成分（Frequency Components）</strong>：断齿会在特定频率上生成谐波或边带频率，可以通过FFT（快速傅里叶变换）来分析。</li>



<li><strong>频谱能量（Spectral Energy）</strong>：断齿会导致特定频率范围内的能量增加。</li>



<li><strong>频谱峰值（Spectral Peaks）</strong>：断齿可能在频谱中出现显著的峰值。</li>



<li><strong>频谱质心（Spectral Centroid）</strong>：断齿可能导致频谱质心的移动。</li>



<li><strong>频谱峭度（Spectral Kurtosis）</strong>：断齿会增加频谱中的冲击成分，从而提高频谱峭度。</li>
</ol>



<h3 class="wp-block-heading">时频域特征</h3>



<ol class="wp-block-list">
<li><strong>小波变换（Wavelet Transform）</strong>：小波变换可以提供信号在不同尺度上的时频特征，有助于捕捉断齿引起的瞬态变化。</li>



<li><strong>短时傅里叶变换（Short-Time Fourier Transform, STFT）</strong>：STFT可以捕捉信号随时间变化的频率成分。</li>
</ol>



<h3 class="wp-block-heading">其他特征</h3>



<ol class="wp-block-list">
<li><strong>包络分析（Envelope Analysis）</strong>：通过包络分析可以捕捉到振动信号中的调制成分，这对于检测断齿非常有效。</li>



<li><strong>自回归模型（Autoregressive Model, AR）</strong>：通过AR模型可以捕捉信号的时间依赖性变化。</li>
</ol>



<h3 class="wp-block-heading">具体实现</h3>



<p>在代码中，除了现有的FFT特征外，可以考虑添加上述特征。例如：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="public static List&lt;GearboxData&gt; GetGearboxDatas(List&lt;Record&gt; records)
{
    var a1 = records.Select(it =&gt; it.a1).ToArray();
    var a2 = records.Select(it =&gt; it.a2).ToArray();
    var a3 = records.Select(it =&gt; it.a3).ToArray();
    var a4 = records.Select(it =&gt; it.a4).ToArray();

    // FFT转换
    float[] a1_res = FFTConvert.FFT(a1, FFTConvert.MagnitudeType.Vrms);
    float[] a2_res = FFTConvert.FFT(a2, FFTConvert.MagnitudeType.Vrms);
    float[] a3_res = FFTConvert.FFT(a3, FFTConvert.MagnitudeType.Vrms);
    float[] a4_res = FFTConvert.FFT(a4, FFTConvert.MagnitudeType.Vrms);
    // 频率
    float[] frequencyBins = FFTConvert.CalculateFFTFrequencyBins(a4_res.Length, 30);

    // 计算时域特征
    float a1_mean = a1.Average();
    float a1_rms = Math.Sqrt(a1.Select(x =&gt; x * x).Average());
    float a1_peak = a1.Max();
    float a1_kurtosis = a1.Select(x =&gt; Math.Pow(x - a1_mean, 4)).Average() / Math.Pow(a1.Select(x =&gt; Math.Pow(x - a1_mean, 2)).Average(), 2);
    float a1_skewness = a1.Select(x =&gt; Math.Pow(x - a1_mean, 3)).Average() / Math.Pow(a1.Select(x =&gt; Math.Pow(x - a1_mean, 2)).Average(), 1.5);

    var gearboxDatas = new List&lt;GearboxData&gt;();

    for (int i = 0; i &lt; a1_res.Length; i++)
    {
        gearboxDatas.Add(new GearboxData
        {
            A1FFT = a1_res[i],
            A2FFT = a2_res[i],
            A3FFT = a3_res[i],
            A4FFT = a4_res[i],
            Frequency = frequencyBins[i],
            IsFaulty = records[0].failure &gt; 0,
            A1Mean = a1_mean,
            A1RMS = a1_rms,
            A1Peak = a1_peak,
            A1Kurtosis = a1_kurtosis,
            A1Skewness = a1_skewness
        });
    }

    return gearboxDatas;
}

// 扩展 GearboxData 类
public class GearboxData
{
    [LoadColumn(0)]
    public float A1FFT { get; set; }

    [LoadColumn(1)]
    public float A2FFT { get; set; }

    [LoadColumn(2)]
    public float A3FFT { get; set; }

    [LoadColumn(3)]
    public float A4FFT { get; set; }

    [LoadColumn(4)]
    public float Frequency { get; set; }

    [LoadColumn(5)]
    [ColumnName(&quot;Label&quot;)]
    public bool IsFaulty { get; set; }

    // 新增特征
    public float A1Mean { get; set; }
    public float A1RMS { get; set; }
    public float A1Peak { get; set; }
    public float A1Kurtosis { get; set; }
    public float A1Skewness { get; set; }
}
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">static</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">GearboxData</span><span style="color: #D4D4D4">&gt; </span><span style="color: #DCDCAA">GetGearboxDatas</span><span style="color: #D4D4D4">(</span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">Record</span><span style="color: #D4D4D4">&gt; </span><span style="color: #9CDCFE">records</span><span style="color: #D4D4D4">)</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">records</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">ToArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a2</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">records</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">a2</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">ToArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a3</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">records</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">a3</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">ToArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a4</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">records</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">it</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">a4</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">ToArray</span><span style="color: #D4D4D4">();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // FFT转换</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">a1_res</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FFT</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">MagnitudeType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Vrms</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">a2_res</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FFT</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a2</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">MagnitudeType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Vrms</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">a3_res</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FFT</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a3</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">MagnitudeType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Vrms</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">a4_res</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">FFT</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a4</span><span style="color: #D4D4D4">, </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">MagnitudeType</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Vrms</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #6A9955">    // 频率</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4">[] </span><span style="color: #9CDCFE">frequencyBins</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">FFTConvert</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">CalculateFFTFrequencyBins</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a4_res</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">30</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // 计算时域特征</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a1_mean</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Average</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a1_rms</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Sqrt</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> * </span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4">).</span><span style="color: #DCDCAA">Average</span><span style="color: #D4D4D4">());</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a1_peak</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Max</span><span style="color: #D4D4D4">();</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a1_kurtosis</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Pow</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">a1_mean</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">)).</span><span style="color: #DCDCAA">Average</span><span style="color: #D4D4D4">() / </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Pow</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Pow</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">a1_mean</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)).</span><span style="color: #DCDCAA">Average</span><span style="color: #D4D4D4">(), </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">);</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">a1_skewness</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Pow</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">a1_mean</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">)).</span><span style="color: #DCDCAA">Average</span><span style="color: #D4D4D4">() / </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Pow</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">a1</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Select</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> =&gt; </span><span style="color: #9CDCFE">Math</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Pow</span><span style="color: #D4D4D4">(</span><span style="color: #9CDCFE">x</span><span style="color: #D4D4D4"> - </span><span style="color: #9CDCFE">a1_mean</span><span style="color: #D4D4D4">, </span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)).</span><span style="color: #DCDCAA">Average</span><span style="color: #D4D4D4">(), </span><span style="color: #B5CEA8">1.5</span><span style="color: #D4D4D4">);</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">var</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">gearboxDatas</span><span style="color: #D4D4D4"> = </span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">List</span><span style="color: #D4D4D4">&lt;</span><span style="color: #4EC9B0">GearboxData</span><span style="color: #D4D4D4">&gt;();</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">for</span><span style="color: #D4D4D4"> (</span><span style="color: #569CD6">int</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> = </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4"> &lt; </span><span style="color: #9CDCFE">a1_res</span><span style="color: #D4D4D4">.</span><span style="color: #9CDCFE">Length</span><span style="color: #D4D4D4">; </span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">++)</span></span>
<span class="line"><span style="color: #D4D4D4">    {</span></span>
<span class="line"><span style="color: #D4D4D4">        </span><span style="color: #9CDCFE">gearboxDatas</span><span style="color: #D4D4D4">.</span><span style="color: #DCDCAA">Add</span><span style="color: #D4D4D4">(</span><span style="color: #569CD6">new</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">GearboxData</span></span>
<span class="line"><span style="color: #D4D4D4">        {</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A1FFT</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1_res</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A2FFT</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a2_res</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A3FFT</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a3_res</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A4FFT</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a4_res</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">Frequency</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">frequencyBins</span><span style="color: #D4D4D4">[</span><span style="color: #9CDCFE">i</span><span style="color: #D4D4D4">],</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">IsFaulty</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">records</span><span style="color: #D4D4D4">[</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">].</span><span style="color: #9CDCFE">failure</span><span style="color: #D4D4D4"> &gt; </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A1Mean</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1_mean</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A1RMS</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1_rms</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A1Peak</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1_peak</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A1Kurtosis</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1_kurtosis</span><span style="color: #D4D4D4">,</span></span>
<span class="line"><span style="color: #D4D4D4">            </span><span style="color: #9CDCFE">A1Skewness</span><span style="color: #D4D4D4"> = </span><span style="color: #9CDCFE">a1_skewness</span></span>
<span class="line"><span style="color: #D4D4D4">        });</span></span>
<span class="line"><span style="color: #D4D4D4">    }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #C586C0">return</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">gearboxDatas</span><span style="color: #D4D4D4">;</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">// 扩展 GearboxData 类</span></span>
<span class="line"><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">class</span><span style="color: #D4D4D4"> </span><span style="color: #4EC9B0">GearboxData</span></span>
<span class="line"><span style="color: #D4D4D4">{</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">LoadColumn</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A1FFT</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">LoadColumn</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A2FFT</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">LoadColumn</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A3FFT</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">LoadColumn</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">3</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A4FFT</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">LoadColumn</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">4</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">Frequency</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">LoadColumn</span><span style="color: #D4D4D4">(</span><span style="color: #B5CEA8">5</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    [</span><span style="color: #4EC9B0">ColumnName</span><span style="color: #D4D4D4">(</span><span style="color: #CE9178">&quot;Label&quot;</span><span style="color: #D4D4D4">)]</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">bool</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">IsFaulty</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"></span>
<span class="line"><span style="color: #6A9955">    // 新增特征</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A1Mean</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A1RMS</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A1Peak</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A1Kurtosis</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">    </span><span style="color: #569CD6">public</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">float</span><span style="color: #D4D4D4"> </span><span style="color: #9CDCFE">A1Skewness</span><span style="color: #D4D4D4"> { </span><span style="color: #569CD6">get</span><span style="color: #D4D4D4">; </span><span style="color: #569CD6">set</span><span style="color: #D4D4D4">; }</span></span>
<span class="line"><span style="color: #D4D4D4">}</span></span>
<span class="line"></span></code></pre></div>



<p>对于齿轮箱断齿的检测任务，考虑到数据的复杂性和可能存在的非线性关系，以下几种模型可能较为适合：</p>



<ol class="wp-block-list">
<li><strong>随机森林（Random Forest）</strong>：</li>
</ol>



<ul class="wp-block-list">
<li><strong>理由</strong>：随机森林能够处理高维数据和非线性关系，具有较高的准确性和鲁棒性。</li>



<li><strong>实现</strong>：<br><code>csharp var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", nameof(GearboxData.A1FFT), nameof(GearboxData.A2FFT), nameof(GearboxData.A3FFT), nameof(GearboxData.A4FFT), nameof(GearboxData.Frequency)) .Append(mlContext.Transforms.NormalizeMinMax("Features")) .Append(mlContext.BinaryClassification.Trainers.FastForest());</code></li>
</ul>



<ol class="wp-block-list">
<li><strong>梯度提升树（Gradient Boosting Machine, GBM）</strong>：</li>
</ol>



<ul class="wp-block-list">
<li><strong>理由</strong>：GBM在处理复杂数据集和非线性关系方面表现出色，通常具有高准确性。</li>



<li><strong>实现</strong>：<br><code>csharp var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", nameof(GearboxData.A1FFT), nameof(GearboxData.A2FFT), nameof(GearboxData.A3FFT), nameof(GearboxData.A4FFT), nameof(GearboxData.Frequency)) .Append(mlContext.Transforms.NormalizeMinMax("Features")) .Append(mlContext.BinaryClassification.Trainers.LightGbm());</code></li>
</ul>



<ol class="wp-block-list">
<li><strong>支持向量机（Support Vector Machine, SVM）</strong>：</li>
</ol>



<ul class="wp-block-list">
<li><strong>理由</strong>：SVM在处理高维数据和复杂决策边界时表现良好，适用于齿轮箱断齿的数据集。</li>



<li><strong>实现</strong>：<br><code>csharp var dataProcessPipeline = mlContext.Transforms.Concatenate("Features", nameof(GearboxData.A1FFT), nameof(GearboxData.A2FFT), nameof(GearboxData.A3FFT), nameof(GearboxData.A4FFT), nameof(GearboxData.Frequency)) .Append(mlContext.Transforms.NormalizeMinMax("Features")) .Append(mlContext.BinaryClassification.Trainers.LinearSvm());</code></li>
</ul>



<p></p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Modbus RTU 功能码示例</title>
		<link>https://blog.mutadecheng.com/2024/06/27/modbus-rtu-%e5%8a%9f%e8%83%bd%e7%a0%81%e7%a4%ba%e4%be%8b/</link>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Thu, 27 Jun 2024 02:54:10 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">https://blog.mutadecheng.com/?p=191</guid>

					<description><![CDATA[Modbus RTU是Modbus协议的一种实现，它通过串行通信（如RS-485、RS-422、RS-232） [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Modbus RTU是Modbus协议的一种实现，它通过串行通信（如RS-485、RS-422、RS-232）来进行设备间的通信。在Modbus RTU协议中，03、04、06和10分别代表不同的功能码：</p>



<ul class="wp-block-list">
<li>功能码03（Read Holding Registers）：读保持寄存器</li>



<li>功能码04（Read Input Registers）：读输入寄存器</li>



<li>功能码06（Write Single Register）：写单个寄存器</li>



<li>功能码10（Write Multiple Registers）：写多个寄存器</li>
</ul>



<p>以下是使用这些功能码的示例：</p>



<h3 class="wp-block-heading">功能码03：读保持寄存器</h3>



<p>请求：</p>



<pre class="wp-block-code"><code>设备地址 功能码 寄存器起始地址 寄存器数量 CRC校验
   01        03       006B           0003       CRC</code></pre>



<p>这是一个Modbus RTU请求，用来从设备地址为0x01的设备读取保持寄存器。起始地址是0x006B（十进制的107），寄存器数量是0x0003（十进制的3）。CRC是两个字节的循环冗余校验码，用于错误检测。</p>



<p>响应：</p>



<pre class="wp-block-code"><code>设备地址 功能码 字节计数 数据（寄存器值） CRC校验
   01        03       06      02AE 0000 0056    CRC</code></pre>



<p>这是一个响应，表示设备地址为0x01的设备返回了3个寄存器的值，字节计数为0x06（因为每个寄存器2字节，共3个寄存器，所以是6字节）。</p>



<h3 class="wp-block-heading">功能码04：读输入寄存器</h3>



<p>请求：</p>



<pre class="wp-block-code"><code>设备地址 功能码 寄存器起始地址 寄存器数量 CRC校验
   01        04       0008           0001       CRC</code></pre>



<p>这个请求用于从设备地址为0x01的设备读取输入寄存器，起始地址是0x0008（十进制的8），寄存器数量是0x0001（十进制的1）。</p>



<p>响应：</p>



<pre class="wp-block-code"><code>设备地址 功能码 字节计数 数据（寄存器值） CRC校验
   01        04       02      00A1             CRC</code></pre>



<p>这个响应表示设备地址为0x01的设备返回了1个输入寄存器的值，字节计数为0x02（2字节）。</p>



<h3 class="wp-block-heading">功能码06：写单个寄存器</h3>



<p>请求：</p>



<pre class="wp-block-code"><code>设备地址 功能码 寄存器地址 寄存器值 CRC校验
   01        06       0001         0003     CRC</code></pre>



<p>这个请求用于将设备地址为0x01的设备的寄存器0x0001（十进制的1）的值设置为0x0003（十进制的3）。</p>



<p>响应：</p>



<pre class="wp-block-code"><code>设备地址 功能码 寄存器地址 寄存器值 CRC校验
   01        06       0001         0003     CRC</code></pre>



<p>这个响应表示设备接收到命令并将寄存器0x0001的值设置为0x0003。</p>



<h3 class="wp-block-heading">功能码10：写多个寄存器</h3>



<p>请求：</p>



<pre class="wp-block-code"><code>设备地址 功能码 寄存器起始地址 寄存器数量 字节计数 数据 CRC校验
   01        10       0001           0002        04      000A 0002 CRC</code></pre>



<p>这个请求用于将设备地址为0x01的设备的起始寄存器0x0001（十进制的1）开始的2个寄存器的值分别设置为0x000A和0x0002。</p>



<p>响应：</p>



<pre class="wp-block-code"><code>设备地址 功能码 寄存器起始地址 寄存器数量 CRC校验
   01        10       0001           0002       CRC</code></pre>



<p>这个响应表示设备接收到命令并将起始寄存器0x0001开始的2个寄存器的值设置成功。</p>



<p>注意：在实际应用中，CRC校验码是根据整个消息计算得出的，这里没有给出具体的CRC值。在实际编程实现时，需要使用CRC算法来计算和校验消息的正确性。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>消息中间件 NATS Vs RabbitMQ</title>
		<link>https://blog.mutadecheng.com/2024/05/23/%e6%b6%88%e6%81%af%e4%b8%ad%e9%97%b4%e4%bb%b6-nats-vs-rabbitmq/</link>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Thu, 23 May 2024 06:09:18 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">http://61.149.6.59:40030/?p=90</guid>

					<description><![CDATA[NATS 和 RabbitMQ 都是流行的消息中间件系统，但它们设计理念、功能特性以及适用场景有所不同。下面是 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>NATS 和 RabbitMQ 都是流行的消息中间件系统，但它们设计理念、功能特性以及适用场景有所不同。下面是它们之间的一些关键区别：</p>



<h3 class="wp-block-heading">设计理念和目标</h3>



<ul class="wp-block-list">
<li><strong>NATS</strong>：NATS 设计上追求极致的简洁和高性能。它提供了基础的发布/订阅、请求/响应和负载均衡消息队列模式，重点在于高吞吐量和低延迟，适合需要快速消息传递的场景。</li>



<li><strong>RabbitMQ</strong>：RabbitMQ 是基于 AMQP（高级消息队列协议）标准的一个开源消息代理和队列服务器，旨在提供复杂的消息路由、事务、持久化等高级功能。它更加注重消息的可靠传递和多种消息处理模式，适合需要复杂消息处理逻辑的企业级应用。</li>
</ul>



<h3 class="wp-block-heading">核心特性对比</h3>



<ul class="wp-block-list">
<li><strong>性能</strong>：NATS 在设计上更加轻量级，因此在消息吞吐量和延迟方面通常表现更好，尤其是在处理大量的小消息时。RabbitMQ 提供了更多的功能，但这也可能导致相对较高的延迟和资源消耗。</li>



<li><strong>消息模型</strong>：NATS 支持基本的发布/订阅、请求/响应和负载均衡队列。RabbitMQ 提供了更多的消息模型和模式，如点对点、发布/订阅、路由、主题等。</li>



<li><strong>持久化</strong>：RabbitMQ 支持消息的持久化，确保消息不会因为服务重启而丢失。NATS 也支持持久化，但需要使用 NATS Streaming（现在已经被 JetStream 替代），这是一个在 NATS 基础上构建的数据流系统，用于提供持久化消息、消息重放等功能。</li>



<li><strong>事务支持</strong>：RabbitMQ 支持消息的事务处理，这对于需要确保消息处理完整性的应用非常重要。NATS 本身不支持事务，它更注重于高速和简单的消息传递。</li>



<li><strong>客户端和社区支持</strong>：RabbitMQ 由于存在更长时间，拥有更广泛的客户端库和插件支持，社区也相对成熟。NATS 虽然社区相对较小，但近年来也在快速增长，特别是在云原生应用场景中。</li>
</ul>



<h3 class="wp-block-heading">适用场景</h3>



<ul class="wp-block-list">
<li><strong>NATS</strong>：适合需要高性能、高吞吐量、低延迟的场景，如微服务架构的服务间通信、物联网（IoT）消息传递、实时系统等。</li>



<li><strong>RabbitMQ</strong>：适合需要复杂消息路由、事务支持、消息持久化等高级特性的企业级应用，如电子商务、金融服务、大型分布式系统等。</li>
</ul>



<h3 class="wp-block-heading">总结</h3>



<p>选择 NATS 还是 RabbitMQ 取决于具体需求。如果应用需要快速、简单的消息传递，并且对消息的复杂处理需求不高，NATS 可能是一个更好的选择。如果需要一个功能丰富、支持复杂消息处理逻辑的消息系统，RabbitMQ 可能更适合。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>高性能缓存 Memcached Vs Redis</title>
		<link>https://blog.mutadecheng.com/2024/05/23/%e9%ab%98%e6%80%a7%e8%83%bd%e7%bc%93%e5%ad%98-memcached-vs-redis/</link>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Thu, 23 May 2024 05:56:07 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">http://61.149.6.59:40030/?p=88</guid>

					<description><![CDATA[Memcached和Redis都是广泛使用的开源高性能缓存系统，它们都可以用来减少数据库负载、增加应用的响应速 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>Memcached和Redis都是广泛使用的开源高性能缓存系统，它们都可以用来减少数据库负载、增加应用的响应速度。虽然它们在某些方面有相似之处，但也有一些关键的区别。下面是Memcached和Redis之间的一些主要区别：</p>



<h3 class="wp-block-heading">1. 数据类型支持</h3>



<ul class="wp-block-list">
<li><strong>Memcached</strong>：主要提供简单的键值存储。它的值可以是字符串、数字等，但不支持复杂的数据类型。</li>



<li><strong>Redis</strong>：支持更丰富的数据类型，包括字符串（strings）、列表（lists）、集合（sets）、有序集合（sorted sets）、哈希（hashes）、位图（bitmaps）、超日志（hyperloglogs）和地理空间索引（geospatial indexes）。这使得Redis在处理复杂数据结构时更加灵活。</li>
</ul>



<h3 class="wp-block-heading">2. 持久化</h3>



<ul class="wp-block-list">
<li><strong>Memcached</strong>：主要设计为一个纯内存缓存，不提供数据持久化功能，这意味着在服务器重启之后数据会丢失。</li>



<li><strong>Redis</strong>：提供了多种持久化策略，包括RDB（在指定的时间间隔对数据进行快照存储）和AOF（记录每个写操作命令，并在服务器重启时重新执行这些命令）等。这使得Redis可以在系统重启后恢复数据。</li>
</ul>



<h3 class="wp-block-heading">3. 分布式支持</h3>



<ul class="wp-block-list">
<li><strong>Memcached</strong>：虽然可以在多个节点之间分布数据，但它本身不提供原生的分布式数据分片或复制功能。通常需要客户端或者应用层来实现数据的分布式管理。</li>



<li><strong>Redis</strong>：自版本3.0起，Redis引入了集群模式，支持自动分片和数据复制，提供更高的可用性和分布式处理能力。</li>
</ul>



<h3 class="wp-block-heading">4. 性能</h3>



<ul class="wp-block-list">
<li><strong>Memcached</strong>和<strong>Redis</strong>都非常快，它们能够以极低的延迟处理大量请求。性能差异通常取决于具体的使用场景。对于简单的键值存储，Memcached可能略占优势，因为它的设计更加轻量级。而对于需要复杂数据类型和操作的场景，Redis可能会更加合适，尽管这可能会对性能产生一定影响。</li>
</ul>



<h3 class="wp-block-heading">5. 原子操作</h3>



<ul class="wp-block-list">
<li><strong>Memcached</strong>：支持一些基本的原子操作，如增加（incr）和减少（decr）。</li>



<li><strong>Redis</strong>：提供了广泛的原子操作，不仅限于简单的数据增减，还包括对列表、集合等复杂数据类型的操作。</li>
</ul>



<h3 class="wp-block-heading">6. 其他特性</h3>



<ul class="wp-block-list">
<li><strong>Redis</strong>还提供了发布/订阅消息系统、Lua脚本支持、事务等高级功能，这使得Redis不仅仅是一个缓存系统，还可以作为一个多功能的数据处理服务器使用。</li>
</ul>



<p>综上所述，虽然Memcached和Redis都可以作为高效的缓存解决方案，但它们各自的特点和优势使它们适合于不同的场景。如果需要一个简单快速的键值存储系统，Memcached可能是一个好选择。而如果需要更复杂的数据类型支持、数据持久化或分布式功能，Redis可能会是更好的选择。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>Ubuntu 挂载数据盘 &#038; Docker数据存储</title>
		<link>https://blog.mutadecheng.com/2024/05/22/ubtuntu-%e6%8c%82%e8%bd%bd%e6%95%b0%e6%8d%ae%e7%9b%98/</link>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Wed, 22 May 2024 02:42:27 +0000</pubDate>
				<category><![CDATA[Docker]]></category>
		<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">http://61.149.6.59:40030/?p=50</guid>

					<description><![CDATA[在Ubuntu这样的Linux操作系统中，多个磁盘是通过文件系统的挂载点以及特定的设备文件名来区分的。每个磁盘 [&#8230;]]]></description>
										<content:encoded><![CDATA[
<p>在Ubuntu这样的Linux操作系统中，多个磁盘是通过文件系统的挂载点以及特定的设备文件名来区分的。每个磁盘和磁盘分区都会被赋予一个唯一的设备文件名，通常位于<code>/dev</code>目录下。下面是一些关键点帮助理解Ubuntu中如何区分多个磁盘：</p>



<h3 class="wp-block-heading">1. 设备文件名</h3>



<ul class="wp-block-list">
<li><strong>硬盘驱动器</strong>：通常，硬盘驱动器会被命名为<code>/dev/sda</code>、<code>/dev/sdb</code>等，其中<code>/dev/sda</code>通常是第一个连接的硬盘，<code>/dev/sdb</code>是第二个，依此类推。如果是使用NVMe接口的SSD，它们的设备名会是<code>/dev/nvme0n1</code>、<code>/dev/nvme1n1</code>等。</li>



<li><strong>分区</strong>：硬盘上的分区会在硬盘的设备文件名后面加上一个数字来表示。例如，<code>/dev/sda1</code>代表<code>/dev/sda</code>硬盘上的第一个分区，<code>/dev/sda2</code>是第二个分区，依此类推。</li>
</ul>



<h3 class="wp-block-heading">2. UUID</h3>



<p>每个分区还有一个唯一的UUID（Universally Unique Identifier），这提供了另一种方式来区分和引用磁盘分区，而不依赖于它们的设备文件名，这在自动挂载磁盘时特别有用。可以通过<code>blkid</code>命令查看所有磁盘分区的UUID。</p>



<h3 class="wp-block-heading">3. 挂载点</h3>



<p>挂载点是文件系统中的一个位置，系统通过这个位置访问挂载在这个点上的磁盘分区的内容。例如，根文件系统挂载在<code>/</code>，额外的磁盘或分区可能挂载在<code>/mnt/data</code>、<code>/media/username/diskname</code>等位置。你可以通过<code>mount</code>命令查看当前的挂载情况，或者查看<code>/etc/fstab</code>文件来看看有哪些磁盘分区是在系统启动时自动挂载的。</p>



<h3 class="wp-block-heading">4. 使用<code>lsblk</code>和<code>fdisk</code>命令</h3>



<ul class="wp-block-list">
<li><code>lsblk</code>  命令列出了所有可用的存储设备及其分区，以及挂载点等信息，是查看系统中磁盘和分区情况的一个非常有用的工具。</li>



<li><code>fdisk</code>（例如<code>sudo fdisk -l</code>）命令也提供了磁盘分区的详细信息，但它更多用于分区操作。</li>



<li><code>blkid</code>  命令来查看分区实际使用的文件系统类型</li>
</ul>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="root@kvm-muta:~# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0     7:0    0 61.9M  1 loop /snap/core20/1434
loop1     7:1    0 79.9M  1 loop /snap/lxd/22923
loop2     7:2    0 44.7M  1 loop /snap/snapd/15534
sr0      11:0    1  388K  0 rom
vda     252:0    0   50G  0 disk
├─vda1  252:1    0 49.9G  0 part /
├─vda14 252:14   0    4M  0 part
└─vda15 252:15   0  106M  0 part /boot/efi
vdb     252:16   0   90G  0 disk
└─vdb1  252:17   0   90G  0 part
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">root@kvm-muta:~</span><span style="color: #6A9955"># lsblk</span></span>
<span class="line"><span style="color: #569CD6">NAME</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">MAJ</span><span style="color: #D4D4D4">:</span><span style="color: #569CD6">MIN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">RM</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">SIZE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">RO</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">MOUNTPOINTS</span></span>
<span class="line"><span style="color: #D4D4D4">loop0     </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">61</span><span style="color: #D4D4D4">.9M  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loop /snap/core20/</span><span style="color: #B5CEA8">1434</span></span>
<span class="line"><span style="color: #D4D4D4">loop1     </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">79</span><span style="color: #D4D4D4">.9M  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loop /snap/lxd/</span><span style="color: #B5CEA8">22923</span></span>
<span class="line"><span style="color: #D4D4D4">loop2     </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">.7M  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loop /snap/snapd/</span><span style="color: #B5CEA8">15534</span></span>
<span class="line"><span style="color: #D4D4D4">sr0      </span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">  388K  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> rom</span></span>
<span class="line"><span style="color: #D4D4D4">vda     </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">   50G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> disk</span></span>
<span class="line"><span style="color: #D4D4D4">├─vda1  </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">49</span><span style="color: #D4D4D4">.9G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part /</span></span>
<span class="line"><span style="color: #D4D4D4">├─vda14 </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">14</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    4M  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part</span></span>
<span class="line"><span style="color: #D4D4D4">└─vda15 </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">15</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">  106M  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part /boot/efi</span></span>
<span class="line"><span style="color: #D4D4D4">vdb     </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">16</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">   90G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> disk</span></span>
<span class="line"><span style="color: #D4D4D4">└─vdb1  </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">17</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">   90G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part</span></span>
<span class="line"></span></code></pre></div>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="root@kvm-muta:~# sudo blkid
/dev/vdb1: UUID=&quot;1511cf57-a511-47a2-a2ec-de6eb128eebe&quot; BLOCK_SIZE=&quot;4096&quot; TYPE=&quot;ext4&quot; PARTUUID=&quot;000529d5-01&quot;
/dev/sr0: BLOCK_SIZE=&quot;2048&quot; UUID=&quot;2024-05-22-09-26-44-00&quot; LABEL=&quot;cidata&quot; TYPE=&quot;iso9660&quot;
/dev/vda15: LABEL_FATBOOT=&quot;UEFI&quot; LABEL=&quot;UEFI&quot; UUID=&quot;E0AB-332A&quot; BLOCK_SIZE=&quot;512&quot; TYPE=&quot;vfat&quot; PARTUUID=&quot;bd61ce9d-671d-43d7-809c-2976ab205ce9&quot;
/dev/vda1: LABEL=&quot;cloudimg-rootfs&quot; UUID=&quot;2a6b8daa-1d70-43b6-84e1-8d987d9f1411&quot; BLOCK_SIZE=&quot;4096&quot; TYPE=&quot;ext4&quot; PARTUUID=&quot;e58420d6-3a2a-4d04-9f8a-8931390c10fc&quot;
/dev/loop1: TYPE=&quot;squashfs&quot;
/dev/loop2: TYPE=&quot;squashfs&quot;
/dev/loop0: TYPE=&quot;squashfs&quot;
/dev/vda14: PARTUUID=&quot;a980d4b4-bd79-46f1-8fa2-ffa6545d4356&quot;
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">root@kvm-muta:~</span><span style="color: #6A9955"># sudo blkid</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/vdb1: </span><span style="color: #569CD6">UUID</span><span style="color: #D4D4D4">=&quot;1511cf57-a511-47a2-a2ec-de6eb128eebe&quot; </span><span style="color: #569CD6">BLOCK_SIZE</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #B5CEA8">4096</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;ext4&quot; </span><span style="color: #569CD6">PARTUUID</span><span style="color: #D4D4D4">=&quot;000529d5-</span><span style="color: #B5CEA8">01</span><span style="color: #D4D4D4">&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/sr0: </span><span style="color: #569CD6">BLOCK_SIZE</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #B5CEA8">2048</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">UUID</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #B5CEA8">2024</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">05</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">22</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">09</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">26</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">-</span><span style="color: #B5CEA8">00</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">LABEL</span><span style="color: #D4D4D4">=&quot;cidata&quot; </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;iso9660&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/vda15: </span><span style="color: #569CD6">LABEL_FATBOOT</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #569CD6">UEFI</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">LABEL</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #569CD6">UEFI</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">UUID</span><span style="color: #D4D4D4">=&quot;E0AB-332A&quot; </span><span style="color: #569CD6">BLOCK_SIZE</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #B5CEA8">512</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;vfat&quot; </span><span style="color: #569CD6">PARTUUID</span><span style="color: #D4D4D4">=&quot;bd61ce9d-671d-43d7-809c-2976ab205ce9&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/vda1: </span><span style="color: #569CD6">LABEL</span><span style="color: #D4D4D4">=&quot;cloudimg-rootfs&quot; </span><span style="color: #569CD6">UUID</span><span style="color: #D4D4D4">=&quot;2a6b8daa-1d70-43b6-84e1-8d987d9f1411&quot; </span><span style="color: #569CD6">BLOCK_SIZE</span><span style="color: #D4D4D4">=&quot;</span><span style="color: #B5CEA8">4096</span><span style="color: #D4D4D4">&quot; </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;ext4&quot; </span><span style="color: #569CD6">PARTUUID</span><span style="color: #D4D4D4">=&quot;e58420d6-3a2a-4d04-9f8a-8931390c10fc&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/loop1: </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;squashfs&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/loop2: </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;squashfs&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/loop0: </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4">=&quot;squashfs&quot;</span></span>
<span class="line"><span style="color: #D4D4D4">/dev/vda14: </span><span style="color: #569CD6">PARTUUID</span><span style="color: #D4D4D4">=&quot;a980d4b4-bd79-46f1-8fa2-ffa6545d4356&quot;</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h2 class="wp-block-heading">以下是按照想要的挂载点名称（假设为<code>/mnt/second_disk_90g</code>）进行操作示例</h2>



<h3 class="wp-block-heading">创建新的挂载点</h3>



<ol class="wp-block-list">
<li><strong>创建挂载点目录</strong>：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo mkdir -p /mnt/second_disk_90g" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">sudo mkdir -p /mnt/second_disk_90g</span></span></code></pre></div>



<p>这一步创建了一个新的目录，用作<code>/dev/vdb1</code>分区的挂载点。</p>



<h3 class="wp-block-heading">修改<code>/etc/fstab</code>以实现自动挂载</h3>



<ol class="wp-block-list" start="2">
<li><strong>编辑<code>/etc/fstab</code>文件</strong>：</li>
</ol>



<p>首先，为了安全起见，备份<code>/etc/fstab</code>文件：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo cp /etc/fstab /etc/fstab.backup" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">sudo cp /etc/fstab /etc/fstab.backup</span></span></code></pre></div>



<p>接着，编辑<code>/etc/fstab</code>文件。这里以<code>vi</code>为例：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo vi /etc/fstab" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">sudo vi /etc/fstab</span></span></code></pre></div>



<ol class="wp-block-list" start="3">
<li><strong>添加挂载配置</strong>：</li>
</ol>



<p>在<code>/etc/fstab</code>文件的末尾，添加以下行：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="UUID=1511cf57-a511-47a2-a2ec-de6eb128eebe /mnt/second_disk_90g ext4 defaults 0 2" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #569CD6">UUID</span><span style="color: #D4D4D4">=1511cf57-a511-47a2-a2ec-de6eb128eebe /mnt/second_disk_90g ext4 defaults </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">2</span></span></code></pre></div>



<p>这里，<code>UUID=1511cf57-a511-47a2-a2ec-de6eb128eebe</code>是之前通过<code>blkid</code>命令获得的<code>/dev/vdb1</code>分区的UUID，<code>/mnt/second_disk_90g</code>是您创建的挂载点目录，<code>ext4</code>是文件系统类型，<code>defaults</code>表示默认的挂载选项，<code>0 2</code>是用于<code>dump</code>和<code>fsck</code>的优先级设置。</p>



<p>保存并关闭<code>/etc/fstab</code>文件。</p>



<h3 class="wp-block-heading">挂载分区</h3>



<ol class="wp-block-list" start="4">
<li><strong>挂载所有未挂载的分区</strong>：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="sudo mount -a" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">sudo mount -a</span></span></code></pre></div>



<p>这个命令会根据<code>/etc/fstab</code>文件的配置，尝试挂载所有未挂载的文件系统，包括刚刚添加的<code>/dev/vdb1</code>分区。</p>



<h3 class="wp-block-heading">验证挂载</h3>



<ol class="wp-block-list" start="5">
<li><strong>检查挂载是否成功</strong>：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="lsblk" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">lsblk</span></span></code></pre></div>



<p>或者：</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="mount | grep second_disk_90g" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">mount | grep second_disk_90g</span></span></code></pre></div>



<p>如果一切正常，能看到<code>/dev/vdb1</code>现在挂载在<code>/mnt/second_disk_90g</code>上。这样就成功地以一种直观的方式命名了挂载点，同时通过<code>/etc/fstab</code>确保了它在系统启动时自动挂载。</p>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="root@kvm-muta:~# lsblk
NAME    MAJ:MIN RM  SIZE RO TYPE MOUNTPOINTS
loop0     7:0    0 61.9M  1 loop /snap/core20/1434
loop1     7:1    0 79.9M  1 loop /snap/lxd/22923
loop2     7:2    0 44.7M  1 loop /snap/snapd/15534
sr0      11:0    1  388K  0 rom
vda     252:0    0   50G  0 disk
├─vda1  252:1    0 49.9G  0 part /
├─vda14 252:14   0    4M  0 part
└─vda15 252:15   0  106M  0 part /boot/efi
vdb     252:16   0   90G  0 disk
└─vdb1  252:17   0   90G  0 part /mnt/second_disk_90g
" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">root@kvm-muta:~</span><span style="color: #6A9955"># lsblk</span></span>
<span class="line"><span style="color: #569CD6">NAME</span><span style="color: #D4D4D4">    </span><span style="color: #569CD6">MAJ</span><span style="color: #D4D4D4">:</span><span style="color: #569CD6">MIN</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">RM</span><span style="color: #D4D4D4">  </span><span style="color: #569CD6">SIZE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">RO</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">TYPE</span><span style="color: #D4D4D4"> </span><span style="color: #569CD6">MOUNTPOINTS</span></span>
<span class="line"><span style="color: #D4D4D4">loop0     </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">61</span><span style="color: #D4D4D4">.9M  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loop /snap/core20/</span><span style="color: #B5CEA8">1434</span></span>
<span class="line"><span style="color: #D4D4D4">loop1     </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">79</span><span style="color: #D4D4D4">.9M  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loop /snap/lxd/</span><span style="color: #B5CEA8">22923</span></span>
<span class="line"><span style="color: #D4D4D4">loop2     </span><span style="color: #B5CEA8">7</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">2</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">44</span><span style="color: #D4D4D4">.7M  </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4"> loop /snap/snapd/</span><span style="color: #B5CEA8">15534</span></span>
<span class="line"><span style="color: #D4D4D4">sr0      </span><span style="color: #B5CEA8">11</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">  388K  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> rom</span></span>
<span class="line"><span style="color: #D4D4D4">vda     </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">   50G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> disk</span></span>
<span class="line"><span style="color: #D4D4D4">├─vda1  </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">1</span><span style="color: #D4D4D4">    </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> </span><span style="color: #B5CEA8">49</span><span style="color: #D4D4D4">.9G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part /</span></span>
<span class="line"><span style="color: #D4D4D4">├─vda14 </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">14</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">    4M  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part</span></span>
<span class="line"><span style="color: #D4D4D4">└─vda15 </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">15</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">  106M  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part /boot/efi</span></span>
<span class="line"><span style="color: #D4D4D4">vdb     </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">16</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">   90G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> disk</span></span>
<span class="line"><span style="color: #D4D4D4">└─vdb1  </span><span style="color: #B5CEA8">252</span><span style="color: #D4D4D4">:</span><span style="color: #B5CEA8">17</span><span style="color: #D4D4D4">   </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4">   90G  </span><span style="color: #B5CEA8">0</span><span style="color: #D4D4D4"> part /mnt/second_disk_90g</span></span>
<span class="line"></span></code></pre></div>



<p></p>



<h2 class="wp-block-heading">Docker中特定的容器数据存储</h2>



<p>       若要将docker中特定的容器或数据卷存储在新挂载的磁盘上可以通过配置容器的卷（Volumes）或绑定挂载（Bind Mounts）来实现。这样可以为特定的容器选择数据存储位置，而不需要更改Docker的全局数据存储配置。</p>



<h3 class="wp-block-heading">使用数据卷</h3>



<p>Docker卷（Volumes）是由Docker管理的存储空间，最适合完全由Docker管理的数据或需要在容器之间共享的数据。要将数据存储在新挂载的磁盘上，可以在该磁盘上创建一个或多个目录，然后在启动容器时指定使用这些目录作为卷。</p>



<p>例如，如果想要为一个新的MySQL容器在<code>/mnt/second_disk_90g</code>上创建一个数据卷，可以这样做：</p>



<ol class="wp-block-list">
<li>在新挂载的磁盘上创建一个目录用于MySQL数据：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="   sudo mkdir -p /mnt/second_disk_90g/mysql_data" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">   sudo mkdir -p /mnt/second_disk_90g/mysql_data</span></span></code></pre></div>



<ol class="wp-block-list" start="2">
<li>使用<code>docker run</code>命令启动MySQL容器，并将刚刚创建的目录挂载为卷：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="   docker run -d \
     --name my_mysql \
     -v /mnt/second_disk_90g/mysql_data:/var/lib/mysql \
     mysql" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">   docker run -d \</span></span>
<span class="line"><span style="color: #D4D4D4">     --name my_mysql \</span></span>
<span class="line"><span style="color: #D4D4D4">     -v /mnt/second_disk_90g/mysql_data:/var/lib/mysql \</span></span>
<span class="line"><span style="color: #D4D4D4">     mysql</span></span></code></pre></div>



<p>这个命令会启动一个新的MySQL容器，<code>-v /mnt/second_disk_90g/mysql_data:/var/lib/mysql</code>部分告诉Docker将主机上的<code>/mnt/second_disk_90g/mysql_data</code>目录挂载到容器内的<code>/var/lib/mysql</code>目录。</p>



<h3 class="wp-block-heading">使用绑定挂载</h3>



<p>绑定挂载（Bind Mounts）允许将主机上的任意目录或文件系统挂载到容器中。这对于需要容器访问特定文件或目录的情况非常有用。</p>



<p>使用绑定挂载的步骤与使用数据卷类似，不同之处在于指定路径时，直接使用主机上的路径。</p>



<p>例如，如果想要让容器使用<code>/mnt/second_disk_90g/app_data</code>作为数据目录：</p>



<ol class="wp-block-list">
<li>创建目标目录：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="   sudo mkdir -p /mnt/second_disk_90g/app_data" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">   sudo mkdir -p /mnt/second_disk_90g/app_data</span></span></code></pre></div>



<ol class="wp-block-list" start="2">
<li>启动容器时，使用该目录作为绑定挂载点：</li>
</ol>



<div class="wp-block-kevinbatdorf-code-block-pro" data-code-block-pro-font-family="Code-Pro-JetBrains-Mono" style="font-size:.875rem;font-family:Code-Pro-JetBrains-Mono,ui-monospace,SFMono-Regular,Menlo,Monaco,Consolas,monospace;line-height:1.25rem;--cbp-tab-width:2;tab-size:var(--cbp-tab-width, 2)"><span style="display:block;padding:16px 0 0 16px;margin-bottom:-1px;width:100%;text-align:left;background-color:#1E1E1E"><svg xmlns="http://www.w3.org/2000/svg" width="54" height="14" viewBox="0 0 54 14"><g fill="none" fill-rule="evenodd" transform="translate(1 1)"><circle cx="6" cy="6" r="6" fill="#FF5F56" stroke="#E0443E" stroke-width=".5"></circle><circle cx="26" cy="6" r="6" fill="#FFBD2E" stroke="#DEA123" stroke-width=".5"></circle><circle cx="46" cy="6" r="6" fill="#27C93F" stroke="#1AAB29" stroke-width=".5"></circle></g></svg></span><span role="button" tabindex="0" data-code="   docker run -d \
     --name my_app \
     -v /mnt/second_disk_90g/app_data:/usr/src/app/data \
     my_app_image" style="color:#D4D4D4;display:none" aria-label="Copy" class="code-block-pro-copy-button"><svg xmlns="http://www.w3.org/2000/svg" style="width:24px;height:24px" fill="none" viewBox="0 0 24 24" stroke="currentColor" stroke-width="2"><path class="with-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2m-6 9l2 2 4-4"></path><path class="without-check" stroke-linecap="round" stroke-linejoin="round" d="M9 5H7a2 2 0 00-2 2v12a2 2 0 002 2h10a2 2 0 002-2V7a2 2 0 00-2-2h-2M9 5a2 2 0 002 2h2a2 2 0 002-2M9 5a2 2 0 012-2h2a2 2 0 012 2"></path></svg></span><pre class="shiki dark-plus" style="background-color: #1E1E1E" tabindex="0"><code><span class="line"><span style="color: #D4D4D4">   docker run -d \</span></span>
<span class="line"><span style="color: #D4D4D4">     --name my_app \</span></span>
<span class="line"><span style="color: #D4D4D4">     -v /mnt/second_disk_90g/app_data:/usr/src/app/data \</span></span>
<span class="line"><span style="color: #D4D4D4">     my_app_image</span></span></code></pre></div>



<p>这样，<code>/mnt/second_disk_90g/app_data</code>目录就会挂载到容器的<code>/usr/src/app/data</code>路径。</p>



<h3 class="wp-block-heading">小结</h3>



<p>通过以上方法，可以灵活地为特定容器指定数据存储位置，而无需迁移整个Docker的数据目录。这种方式为管理容器数据提供了更大的灵活性和控制。</p>
]]></content:encoded>
					
		
		
			</item>
		<item>
		<title>关于我</title>
		<link>https://blog.mutadecheng.com/2024/05/20/hello-world-2/</link>
					<comments>https://blog.mutadecheng.com/2024/05/20/hello-world-2/#comments</comments>
		
		<dc:creator><![CDATA[木它]]></dc:creator>
		<pubDate>Mon, 20 May 2024 01:20:19 +0000</pubDate>
				<category><![CDATA[未分类]]></category>
		<guid isPermaLink="false">http://127.0.0.1:40030/?p=1</guid>

					<description><![CDATA[也许是一蜘蛛]]></description>
										<content:encoded><![CDATA[
<p>也许是一蜘蛛</p>
]]></content:encoded>
					
					<wfw:commentRss>https://blog.mutadecheng.com/2024/05/20/hello-world-2/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
