Add TRIM corruption sequel post + publish SATA cable post (en/zh, og+banner)
Deploy / build (push) Successful in 19s
Deploy / build (push) Successful in 19s
- New post: 'The Corruption Came Back on Different Drives — the Cause Was TRIM, Not the SSDs' — same 0x8941f998 zeros fingerprint on a second drive stack (IronWolf 110 SATA pair), root cause queued TRIM (FreeBSD gag 264139), fix diskAutotrim=off + nodiscard, scrub evidence, enterprise SATA buying guidance. en + zh, custom OG + banner. - Publish formerly-draft SATA cable post (draft:false) with OG + banner. - Correct drive identity in both: ZA960NM10001 is Seagate IronWolf 110, not 'Samsung PM9A3' (PM9A3 is NVMe; FPDMA errors are SATA-only). - Old RAID post (en+zh): cross-link to sequel, fix 'a Samsung' -> IronWolf 110.
This commit is contained in:
@@ -416,23 +416,59 @@ const BANNERS = {
|
||||
},
|
||||
|
||||
'unraid-stop-array-hangs-on-swapfile': {
|
||||
titlebar: 'root@unraid — array stop incident',
|
||||
lines: [
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'WebUI → Stop array · swapfile lives on /mnt/cache (btrfs RAID1)' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: 'Retry unmounting user shares… · umount: target is busy (every 5s, forever)' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: '/proc/swaps lists /dev/loop0 — grep swapfile never matches' },
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'fix = User Scripts: swapoff -a + losetup -j/-d at stopping_svcs · swapon at disks_mounted' },
|
||||
{ t: 'prompt', text: '' }, { t: 'ok', text: '→ clean unmount on first try · swap survives stop/start ✓' },
|
||||
],
|
||||
flow: [
|
||||
{ n: '1', label: 'stop array' },
|
||||
{ n: '2', label: 'EBUSY loop', err: true },
|
||||
{ n: '3', label: 'losetup -j' },
|
||||
{ n: '4', label: 'swapoff hook' },
|
||||
{ n: '5', label: 'clean stop ✓' },
|
||||
],
|
||||
},
|
||||
};
|
||||
titlebar: 'root@unraid — array stop incident',
|
||||
lines: [
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'WebUI → Stop array · swapfile lives on /mnt/cache (btrfs RAID1)' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: 'Retry unmounting user shares… · umount: target is busy (every 5s, forever)' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: '/proc/swaps lists /dev/loop0 — grep swapfile never matches' },
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'fix = User Scripts: swapoff -a + losetup -j/-d at stopping_svcs · swapon at disks_mounted' },
|
||||
{ t: 'prompt', text: '' }, { t: 'ok', text: '→ clean unmount on first try · swap survives stop/start ✓' },
|
||||
],
|
||||
flow: [
|
||||
{ n: '1', label: 'stop array' },
|
||||
{ n: '2', label: 'EBUSY loop', err: true },
|
||||
{ n: '3', label: 'losetup -j' },
|
||||
{ n: '4', label: 'swapoff hook' },
|
||||
{ n: '5', label: 'clean stop ✓' },
|
||||
],
|
||||
},
|
||||
|
||||
'the-cause-was-trim-not-the-ssds': {
|
||||
titlebar: 'root@unraid — ssd pool trim watch',
|
||||
lines: [
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: 'raw read error rate (failing now) is 19665 — sdd SMART trip' },
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'btrfs device stats /mnt/ssd' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: 'corruption_errs sdd1=27 sdb1=31 · csum 0x8941f998 = CRC32C(zeros) · both mirrors' },
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'fix = diskAutotrim="off" · remount,nodiscard · scrub' },
|
||||
{ t: 'prompt', text: '' }, { t: 'ok', text: '→ scrub #2: corrected 0 · counters flat · cause = queued TRIM firmware bug ✓' },
|
||||
],
|
||||
flow: [
|
||||
{ n: '1', label: 'SMART trip' },
|
||||
{ n: '2', label: 'zeros on both mirrors', err: true },
|
||||
{ n: '3', label: 'queued TRIM' },
|
||||
{ n: '4', label: 'autotrim off' },
|
||||
{ n: '5', label: 'scrub clean ✓' },
|
||||
],
|
||||
},
|
||||
|
||||
'that-dying-ssd-was-just-a-bad-sata-cable': {
|
||||
titlebar: 'root@unraid — sdd mkfs attempt',
|
||||
lines: [
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'mkfs.btrfs -K -f /dev/sdd1' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: 'ata7.00: WRITE FPDMA QUEUED timeout · NCQ disabled · lost async page write' },
|
||||
{ t: 'prompt', text: 'WARN' }, { t: 'err', text: 'ERROR: superblock magic doesn\'t match · smartctl -H timeout' },
|
||||
{ t: 'prompt', text: '$' }, { t: 'cmd', text: 'fix = new SATA cable + different port · rerun the same mkfs' },
|
||||
{ t: 'prompt', text: '' }, { t: 'ok', text: '→ clean format · 8 GiB fio verify=crc32c err=0 · device stats all zero ✓' },
|
||||
],
|
||||
flow: [
|
||||
{ n: '1', label: '"dying" SSD' },
|
||||
{ n: '2', label: 'FPDMA timeouts', err: true },
|
||||
{ n: '3', label: 'cable/port swap' },
|
||||
{ n: '4', label: 'rerun mkfs' },
|
||||
{ n: '5', label: 'clean ✓' },
|
||||
],
|
||||
},
|
||||
};
|
||||
|
||||
const DEFAULT_BANNER = {
|
||||
titlebar: 'root@host — shell',
|
||||
|
||||
@@ -136,7 +136,7 @@ const TERMINALS = {
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">self-heal rewrite does NOT stick</span><span class="fix">→ replace both drives ✓</span></div>`,
|
||||
|
||||
'self-hosting-mem0-memory-stack': `
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">curl -X POST :20015/memories · X-Api-Key</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">curl -X POST :20015/memories · X-Api-Key</span></div>
|
||||
<div class="line"><span class="prompt"> </span><span class="err">infer=true → LLM hop · slow write</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">infer=false · pgvector · LiteLLM gateway</span><span class="fix">→ remembers across chats ✓</span></div>`,
|
||||
|
||||
@@ -159,6 +159,16 @@ const TERMINALS = {
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">reading app → GET /webhook/mtts?pass=…&text=…</span></div>
|
||||
<div class="line"><span class="prompt"> </span><span class="err">azure token expires in ~10min · google in ~1h</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">2 cron sidecars write accesstoken.txt · 570s / 3500s</span><span class="fix">→ 1 year uptime ✓</span></div>`,
|
||||
|
||||
'the-cause-was-trim-not-the-ssds': `
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">btrfs device stats /mnt/ssd</span></div>
|
||||
<div class="line"><span class="prompt"> </span><span class="err">corruption_errs sdd1=27 sdb1=31 · csum 0x8941f998 = CRC32C(zeros) · both mirrors</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">diskAutotrim="off" · remount,nodiscard · scrub</span><span class="fix">→ 0 new errors ✓</span></div>`,
|
||||
|
||||
'that-dying-ssd-was-just-a-bad-sata-cable': `
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">mkfs.btrfs -K -f /dev/sdd1</span></div>
|
||||
<div class="line"><span class="prompt"> </span><span class="err">WRITE FPDMA QUEUED timeouts · superblock magic doesn't match</span></div>
|
||||
<div class="line"><span class="prompt">$</span><span class="cmd">swap SATA cable/port · rerun mkfs</span><span class="fix">→ clean · 0 errors ✓</span></div>`,
|
||||
};
|
||||
|
||||
const DEFAULT_TERMINAL = `
|
||||
|
||||
Reference in New Issue
Block a user