<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Snapshots on Commentary of Takao</title><link>https://takao.blog/zh-tw/tags/snapshots/</link><description>Recent content in Snapshots on Commentary of Takao</description><generator>Hugo -- gohugo.io</generator><language>zh-TW</language><copyright>Commentary of Takao</copyright><lastBuildDate>Wed, 14 Aug 2024 00:00:00 +0000</lastBuildDate><atom:link href="https://takao.blog/zh-tw/tags/snapshots/index.xml" rel="self" type="application/rss+xml"/><item><title>Proxmox VE ZFS Storage: Pool 設定, Snapshots, and 優化</title><link>https://takao.blog/zh-tw/web/proxmox-zfs-storage/</link><pubDate>Wed, 14 Aug 2024 00:00:00 +0000</pubDate><guid>https://takao.blog/zh-tw/web/proxmox-zfs-storage/</guid><description>&lt;img src="https://takao.blog/img/thumbnail/proxmox-zfs-storage-zh-tw.png" alt="Featured image of post Proxmox VE ZFS Storage: Pool 設定, Snapshots, and 優化" /&gt;&lt;h2 id="why-zfs-on-proxmox"&gt;Why ZFS on Proxmox
&lt;/h2&gt;&lt;p&gt;ZFS brings enterprise-grade features to Proxmox VE: data integrity via checksumming (detects and repairs silent corruption), transparent compression, instant snapshots and clones, and flexible RAID-like pooling. It replaces traditional volume management and filesystem layers with a single, unified stack.&lt;/p&gt;
&lt;h2 id="creating-a-pool"&gt;Creating a Pool
&lt;/h2&gt;&lt;p&gt;A pool is built from virtual devices (vdevs). Common vdev types:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Vdev type&lt;/th&gt;
					&lt;th&gt;Minimum disks&lt;/th&gt;
					&lt;th&gt;Usable capacity&lt;/th&gt;
					&lt;th&gt;Description&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;Mirror&lt;/td&gt;
					&lt;td&gt;2&lt;/td&gt;
					&lt;td&gt;50%&lt;/td&gt;
					&lt;td&gt;Data mirrored across two disks&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ1&lt;/td&gt;
					&lt;td&gt;3&lt;/td&gt;
					&lt;td&gt;67%&lt;/td&gt;
					&lt;td&gt;Single parity (max 1 disk failure)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ2&lt;/td&gt;
					&lt;td&gt;4&lt;/td&gt;
					&lt;td&gt;50%&lt;/td&gt;
					&lt;td&gt;Double parity (max 2 failures)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;RAIDZ3&lt;/td&gt;
					&lt;td&gt;5&lt;/td&gt;
					&lt;td&gt;40%&lt;/td&gt;
					&lt;td&gt;Triple parity (max 3 failures)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;Stripe&lt;/td&gt;
					&lt;td&gt;1&lt;/td&gt;
					&lt;td&gt;100%&lt;/td&gt;
					&lt;td&gt;No redundancy (not recommended)&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Create a mirrored pool:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool create -o ashift&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;12&lt;/span&gt; tank mirror /dev/sda /dev/sdb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;ashift=12&lt;/code&gt; option ensures 4K sector alignment, critical for modern SSDs and HDDs. Short-stroking and partition alignment further improve performance.&lt;/p&gt;
&lt;h2 id="adding-cache-and-log-devices"&gt;Adding Cache and Log Devices
&lt;/h2&gt;&lt;p&gt;ZFS supports separate devices for performance acceleration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;SLOG&lt;/strong&gt; (Separate Intent Log) — Absorbs synchronous writes (NFS, database transactions). A small, power-protected SSD (NVMe or Optane) dramatically improves sync write performance. Does not affect reads.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool add tank log /dev/nvme0n1p1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;L2ARC&lt;/strong&gt; (Level 2 ARC) — Caches frequently read data on an SSD. Adds read cache beyond RAM size. Useful when ARC eviction is high, but consumes CPU for indexing.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool add tank cache /dev/nvme0n1p2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="compression"&gt;Compression
&lt;/h2&gt;&lt;p&gt;ZFS offers transparent, block-level compression with negligible CPU overhead on modern hardware:&lt;/p&gt;
&lt;table&gt;
	&lt;thead&gt;
			&lt;tr&gt;
					&lt;th&gt;Algorithm&lt;/th&gt;
					&lt;th&gt;Ratio&lt;/th&gt;
					&lt;th&gt;CPU cost&lt;/th&gt;
					&lt;th&gt;Best for&lt;/th&gt;
			&lt;/tr&gt;
	&lt;/thead&gt;
	&lt;tbody&gt;
			&lt;tr&gt;
					&lt;td&gt;lz4&lt;/td&gt;
					&lt;td&gt;~2x&lt;/td&gt;
					&lt;td&gt;Very low&lt;/td&gt;
					&lt;td&gt;General purpose (default)&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zstd&lt;/td&gt;
					&lt;td&gt;~2–5x&lt;/td&gt;
					&lt;td&gt;Low–Medium&lt;/td&gt;
					&lt;td&gt;Archival, mixed data&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;gzip&lt;/td&gt;
					&lt;td&gt;~3–6x&lt;/td&gt;
					&lt;td&gt;High&lt;/td&gt;
					&lt;td&gt;Maximum compression&lt;/td&gt;
			&lt;/tr&gt;
			&lt;tr&gt;
					&lt;td&gt;zle&lt;/td&gt;
					&lt;td&gt;~1x&lt;/td&gt;
					&lt;td&gt;Negligible&lt;/td&gt;
					&lt;td&gt;Already compressed data&lt;/td&gt;
			&lt;/tr&gt;
	&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Enable compression on a dataset:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs set compression&lt;span style="color:#f92672"&gt;=&lt;/span&gt;lz4 tank/vmdata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="arc-tuning-and-atime"&gt;ARC Tuning and atime
&lt;/h2&gt;&lt;p&gt;The ARC (Adaptive Replacement Cache) uses system RAM for data caching. By default ZFS consumes up to 50% of total RAM. Tune via kernel module parameters:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# /etc/modprobe.d/zfs.conf&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;options zfs zfs_arc_max&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;8589934592&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;options zfs zfs_arc_min&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#ae81ff"&gt;4294967296&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Disable atime to reduce write amplification on SSDs:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs set atime&lt;span style="color:#f92672"&gt;=&lt;/span&gt;off tank/vmdata
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="trimming-ssds"&gt;Trimming SSDs
&lt;/h2&gt;&lt;p&gt;Enable automated TRIM for SSD pools to maintain performance over time:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool set autotrim&lt;span style="color:#f92672"&gt;=&lt;/span&gt;on tank
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Manual trim is available as a one-shot operation:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool trim tank
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="snapshots-and-clones"&gt;Snapshots and Clones
&lt;/h2&gt;&lt;p&gt;ZFS snapshots are instantaneous and consume only blocks that change (Copy-on-Write):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs snapshot tank/vmdata@pre-update
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs list -t snapshot
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Rollback to a snapshot:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs rollback tank/vmdata@pre-update
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Clones are writable snapshots, useful for testing without duplicating data:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs clone tank/vmdata@pre-update tank/clone-test
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sendrecv-replication"&gt;Send/Recv Replication
&lt;/h2&gt;&lt;p&gt;ZFS send/recv streams snapshots to another pool, enabling off-site backups and replication:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs send tank/vmdata@pre-update | ssh backup-server &lt;span style="color:#e6db74"&gt;&amp;#34;zfs recv backup-pool/vmdata&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Incremental sends only transfer changed blocks between snapshots:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zfs send -i tank/vmdata@pre-update tank/vmdata@post-update | &lt;span style="color:#ae81ff"&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ssh backup-server &lt;span style="color:#e6db74"&gt;&amp;#34;zfs recv backup-pool/vmdata&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="scrubbing-and-monitoring"&gt;Scrubbing and Monitoring
&lt;/h2&gt;&lt;p&gt;Regular scrubs verify checksums and repair silent corruption:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool scrub tank
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool status -v
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Schedule scrubs via Proxmox GUI or cron. 螢幕 pool health and SMART data:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;smartctl -a /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="replacing-failed-disks"&gt;Replacing Failed Disks
&lt;/h2&gt;&lt;p&gt;Replace a failed disk in a redundant vdev:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool offline tank /dev/sda
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool replace tank /dev/sda /dev/sdc
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;zpool online tank /dev/sdc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="common-troubleshooting"&gt;Common Troubleshooting
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Pool import failure&lt;/strong&gt; — &lt;code&gt;zpool import -D&lt;/code&gt; to recover devices; &lt;code&gt;zpool import -a&lt;/code&gt; to import all.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Device offline&lt;/strong&gt; — Check cables, then &lt;code&gt;zpool online tank /dev/sda&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pool performance degrades&lt;/strong&gt; — Check for fragmentation: &lt;code&gt;zpool list -v tank&lt;/code&gt;. Trim if SSD.&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>