移除Windows和NTFS全紀錄
自從我在我的遊戲碟設定好BTRFS Subvolume後,我就再也沒開過Windows了,我在Ubuntu用了1年又1月的心得那篇有說我當時2個月沒開Windows,當時大概是2月上旬,到現在都5月初了,所以也差不多4、5個月沒開Windows,現在SSD價格居高不下的時刻我白白讓1T因為有Windows的存在所以不用,有點過意不去,雖然是QLC SSD,但有1T是1T對吧?
那在移除Windows時,因為我已經把Boot Manager已經獨立到這顆SSD上了,並且NVRAM也指向了這個Bootloader,所以在移除Windows時必須先把NVRAM的指向移除,那這樣整個Windows刪除流程是這樣:
搬資料 -> 移除EFI條目 -> 抹除SSD -> 格式化
具體搬的資料是甚麼?看個人,我只搬了Downloads和螢幕擷圖,有的人會想直接搬整個系統,那這個時候我建議用其他軟體把整個Windows重新讀取轉成.vmdk或者.qcow2,這裡就不說明了。
刪除NVRAM指向
如果不刪除NVRAM上面的Boot Order有可能主機板在POST的時候因為讀取空白位置導致開機異常(可以參考我之前的Code 99事件),所以最好在抹除整個系統之前先把Boot Order從UEFI上面刪掉。
對於UEFI NVRAM的操作在Linux上統一是由efibootmgr指令作為前端去操作,它會影響到/sys/firmware/efi/efivars/的檔案,我們等等會交叉比對。
那你要確認你目前電腦有哪些Bootloader你直接輸入efibootmgr就可以了:
$ efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002,0001
Boot0001* Windows Boot Manager HD(3,GPT,68d7479f-1a17-42de-bfee-51fc9080068c,0x74487000,0x100000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)57494e444f5753000100000088000000780000004200430044004f0042004a004500430054003d007b00390064006500610038003600320063002d0035006300640064002d0034006500370030002d0061006300630031002d006600330032006200330034003400640034003700390035007d00000024400100000010000000040000007fff0400
Boot0002* Ubuntu HD(1,GPT,8aa23fd2-b0ba-48f4-8411-fab5fd7837bb,0x800,0x219800)/File(\EFI\ubuntu\shimx64.efi)
# 額外驗證
$ ls -l /sys/firmware/efi/efivars/ | grep Boot000
-rw-r--r-- 1 root root 304 5月 2 13:41 Boot0001-8be4df61-93ca-11d2-aa0d-00e098032b8c
-rw-r--r-- 1 root root 122 5月 2 13:41 Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
efibootmgr會把當前有的Bootloader和啟動順序給列出來,那我們可以看到Boot0001就是Windows Boot Manager,記住這個編號,我們要來拿起屠刀了,刪除Boot Order的指令如下:
efibootmgr -b $ORDER -B
-b是宣告要修改後面指定的$ORDER的Binary,然後-B是直接移除,所以套用到我的情境就是efibootmgr -b 0001 -B,查看的時候可以不用sudo,刪除的時候要加sudo。
刪除的時候會列出來當前Boot Order,你也可以再輸入一次efibootmgr確認
$ sudo efibootmgr -b 0001 -B
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002
Boot0002* Ubuntu HD(1,GPT,8aa23fd2-b0ba-48f4-8411-fab5fd7837bb,0x800,0x219800)/File(\EFI\ubuntu\shimx64.efi)
$ efibootmgr
BootCurrent: 0002
Timeout: 1 seconds
BootOrder: 0002
Boot0002* Ubuntu HD(1,GPT,8aa23fd2-b0ba-48f4-8411-fab5fd7837bb,0x800,0x219800)/File(\EFI\ubuntu\shimx64.efi)
接下來檢查/sys/firmware/efi/efivars/是不是有真的被影響:
$ ls -l /sys/firmware/efi/efivars/ | grep Boot000
-rw-r--r-- 1 root root 122 5月 2 13:41 Boot0002-8be4df61-93ca-11d2-aa0d-00e098032b8c
這時如果你有重新開機但是沒有刪除Windows或者Windows Boot Manager,主機板POST時讀到Windows Boot Manager會重新加入到NVRAM,可以的話盡量移除後至少把Windows Boot Manager也從硬碟上面刪除。
然後因為這個操作涉及到UEFI跟OS的交互,無聊還跟Claude暢談了一下UEFI、Bootloader和OS彼此怎麼交互與通訊,如果我有時間(然後還記得的話),我會發一篇Blog的。
Secure Erase SSD
接下來就是抹除SSD,來釋放空間了,你可能會跟我說「哼!這還不簡單,我直接dd if=/dev/zero of=/dev/nvme1就好?」
Emm…理論上是,但這是HDD時代的思維,對於SSD來說讀寫操作是先寫到邏輯位址,所以你抹完後可能實體顆粒資料完好,而且還會浪費顆粒的P/E cycle,浪費時間又沒效果。
那…直接刪除分區不就好了?可以,速度很快,跟快速格式化差不多,但之後會觸發Trim,排程一到會開始垃圾回收,佔用硬體性能,而且寫分區表也是一次寫入(從OS角度說抹除分區就是修改分區表)。
所以上述兩種狀況都會讓顆粒經歷兩次刷寫操作(write和GC時的erase),那要怎麼樣以最不傷SSD的方式抹除上面的資料?
答案是直接對SSD下達sanitize (NVMe)或Security-Erase (SATA)指令,在Windows你估計只能看到快速格式化能不能勾選(不勾選就是寫0操作),但在Linux你有Command可以操作。
!!重要!!因為Secure Erase是個破壞性操作,所以在開始操作之前請先用
sudo smartctl -x /dev/$DISK和其他硬碟工具仔細確認是你要抹除的硬碟!
!!重要!!在抹除之前請先把你要儲存的資料搬到其他硬碟!
NVMe Sanitize
Linux操控NVMe的指令是nvme,Kubuntu預設不安裝,需要使用以下指令來安裝NVMe CLI操作工具:
sudo apt install nvme-cli
安裝好後先檢查支不支持sanitize
sudo nvme id-ctrl /dev/nvmeX -H | grep -i sanitize
只要看到Block Erase Sanitize Operation Supported就代表支持Secure Erase:
$ sudo nvme id-ctrl /dev/nvme2 -H | grep -i sanitize
[31:30] : 0 Additional media modification after sanitize operation completes successfully is not defined
[29:29] : 0 No-Deallocate After Sanitize bit in Sanitize command Supported
[2:2] : 0x1 Overwrite Sanitize Operation Supported
[1:1] : 0x1 Block Erase Sanitize Operation Supported
[0:0] : 0 Crypto Erase Sanitize Operation Not Supported
接下來我們就可以用nvme sanitize來清除硬碟,來看看man nvme-sanitize怎麼Erase Sanitize SSD:
-a <action>, --sanact=<action>
Sanitize Action:
┌───────────────────────────┬───────────────────────────────┐
│ Value │ Definition │
├───────────────────────────┼───────────────────────────────┤
│ 0x00 │ Reserved │
├───────────────────────────┼───────────────────────────────┤
│ 0x01 | exit-failure │ Exit Failure Mode │
├───────────────────────────┼───────────────────────────────┤
│ 0x02 | start-block-erase │ Start a Block Erase sanitize │
│ │ operation │
├───────────────────────────┼───────────────────────────────┤
│ 0x03 | start-overwrite │ Start an Overwrite sanitize │
│ │ operation │
├───────────────────────────┼───────────────────────────────┤
│ 0x04 | start-crypto-erase │ Start a Crypto Erase sanitize │
│ │ operation │
└───────────────────────────┴───────────────────────────────┘
可以看到模式2才是我們要的模式,所以我們使用以下指令來抹除:
sudo nvme sanitize -a 2 /dev/nvmeN
那我這次案例是nvme2是我的Windows SSD,那就是sudo nvme sanitize -a 2 /dev/nvme2。
這個操作非常迅速,沒有警告,沒有確認提示,一按下去後馬上結束,然後你會得到一個連分區表都沒有的NVMe SSD

原理是一旦發送Block Sanitize後以Block為單位全SSD加電壓把電子趕走全寫成1,過程非常快,是並列同時發送的,趕走電子後直接重製FTL mapping table。
如果你用dd做寫入操作那是以Pages為單位寫入,而且是先寫到FTL再來寫到顆粒裡面,發送1T個0和直接送Sanitize指令的速度差距顯而易見。
接下來就可以開始設定分區了!
SATA SSD (從Sanitize到) Block Device Discard
我剛好電腦裡面也有個MX500而且也是NTFS,所以可以順便寫。
SATA這邊比較複雜,因為SATA的操作界面跟SCSI甚至IDE共用,不同廠牌的韌體行為也不一致,所以指令界面很混亂。
先是hdparm,我前面洋洋灑灑的寫了sudo hdparm --yes-i-know-what-i-am-doing --sanitize-block-erase /dev/sda可以安全清除,然後結果是這樣:
$ sudo hdparm --yes-i-know-what-i-am-doing --sanitize-block-erase /dev/sda && sudo hdparm --sanitize-status /dev/sda
/dev/sda:
Issuing SANITIZE_BLOCK_ERASE command
SG_IO: bad/missing sense data, sb[]: f0 00 0b 04 51 40 00 0a a0 72 45 6b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Operation started in background
You may use `--sanitize-status` to check progress
/dev/sda:
Issuing SANITIZE_STATUS command
SG_IO: bad/missing sense data, sb[]: f0 00 0b 04 51 40 00 0a 80 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00
Sanitize status:
State: SD0 Sanitize Idle
沒有跑就算了,無論指令還是Dophin都在告訴我沒有Erase,接著又找到了sg3-utils,跟我說這是非法請求:
$ sudo sg_sanitize -B -Q /dev/sda
ATA CT1000MX500SSD1 046 peripheral_type: disk [0x0]
Unit serial number: 2423E8B71FCB
LU name: 500a0751e8b71fcb
Sanitize failed: Illegal request, Invalid opcode
sg_sanitize failed: Illegal request, Invalid opcode
找到這,我說真的,我的心情是這樣的:

最後找到blkdiscard,這個是最接近的Secure Erase的,他的方式是直接向SSD Controller發送全碟都是空閒空間的資訊,然後做全碟TRIM,如果你有賣SSD的需求,我的建議是如果你真的要Secure Erase還是乖乖用Windows然後安裝各家的硬碟管理工具吧,這裡不像是NVMe一樣美好。
blkdiscard的用法很簡單,直接接你要Discard資料的硬碟就好,那我因為要處理的是MX500,我也沒其他SATA硬碟,所以就是/dev/sda。
但是要如果你是要全面Discard整個硬碟,指令會提示要加-f,因為這是破壞性操作。
$ sudo blkdiscard -s /dev/sda
blkdiscard: /dev/sda contains existing partition (gpt).
blkdiscard: This is destructive operation, data will be lost! Use the -f option to override.
所以如果你要用blkdiscard最理想的參數是-sf,-s是Secure的意思,基本等同是強制回收,一定會TRIM,最接近Erase。
如果你像我一樣,有跳出不支援的提示,可能跟前面hdparm和sg-utils原因一樣,或者這就是如假包換的Secure erase或Sanitize,那就不要用-s了:
$ sudo blkdiscard -sf /dev/sda
blkdiscard: Operation forced, data will be lost!
blkdiscard: BLKSECDISCARD: /dev/sda ioctl failed: Operation not supported
這時候就把s刪除變成只有-f即可,然後一樣會跳出第一行提示,但是你硬碟的資料以及分區表會消失
sudo blkdiscard -f /dev/sda
完成之後就可以格式化成Ext4或BTRFS了(終於!)
系統移除完後的操作
如果你移除完Windows,你是GRUB的話記得要grub-mkconfig或update-grub來重設os-prober,不然你會看到GRUB選單還可以開啟Windows,這後去選大概率GRUB會是因為找不到檔案導致chain-load失敗後看到grub-rescue >,嚇哭了都🫲😩🫱
真的這樣那關機,重開機就好,然後回到Linux記得補更新GRUB。
如果是Limine或Systemd-boot,那就不用管了。
額外:smartctl健康檢測
Windows系統碟(QLC NVMe 1.3 SSD)
可以看到沒甚麼變化(除了那個Percentage Used💀),如果用dd的話那Data Units Written會暴漲1T Write,用Sanitize則是因為繞過邏輯讀寫,所以只有繼續掛著硬碟才會些微增加Data Units Read
# Sanitize之前
$ sudo smartctl -x /dev/nvme2
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.17.0-23-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Number: GIGABYTE G325E1TB
Serial Number: SN240508901346
Firmware Version: EDFM00.7
PCI Vendor/Subsystem ID: 0x1987
IEEE OUI Identifier: 0x6479a7
Total NVM Capacity: 1,000,204,886,016 [1.00 TB]
...
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02)
Critical Warning: 0x00
Temperature: 37 Celsius
Available Spare: 100%
Available Spare Threshold: 5%
Percentage Used: 1%
Data Units Read: 7,362,837 [3.76 TB]
Data Units Written: 7,036,689 [3.60 TB]
Host Read Commands: 85,770,108
Host Write Commands: 98,399,013
Controller Busy Time: 308
Power Cycles: 743
Power On Hours: 5,560
...
# Sanitize之後
$ sudo smartctl -x /dev/nvme2
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.17.0-23-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Number: GIGABYTE G325E1TB
Serial Number: SN240508901346
Firmware Version: EDFM00.7
PCI Vendor/Subsystem ID: 0x1987
IEEE OUI Identifier: 0x6479a7
Total NVM Capacity: 1,000,204,886,016 [1.00 TB]
...
=== START OF SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
SMART/Health Information (NVMe Log 0x02)
Critical Warning: 0x00
Temperature: 37 Celsius
Available Spare: 100%
Available Spare Threshold: 5%
Percentage Used: 2%
Data Units Read: 7,362,911 [3.76 TB]
Data Units Written: 7,036,689 [3.60 TB]
Host Read Commands: 85,770,616
Host Write Commands: 98,399,013
Controller Busy Time: 308
Power Cycles: 743
Power On Hours: 5,560
...
MX500
可以看到Total_LBAs_Written幾乎沒有增加,更關鍵的是看Host和FTL_Program_Page_Count的數值。
Host_Program_Page_Count差值同樣沒有大變化以外,FTL_Program_Page_Count確有2萬個pages變化,這證明了我們並沒有往裡面寫入多少東西,但是SSD Controller收到資料後開始進行回收了。
# Sanitize之前
$ sudo smartctl -a /dev/sda
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.17.0-23-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Crucial/Micron Client SSDs
Device Model: CT1000MX500SSD1
Serial Number: 2423E8B71FCB
LU WWN Device Id: 5 00a075 1e8b71fcb
Firmware Version: M3CR046
User Capacity: 1,000,204,886,016 bytes [1.00 TB]
Sector Size: 512 bytes logical/physical
...
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
General SMART Values:
...
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x002f 100 100 000 Pre-fail Always - 0
5 Reallocate_NAND_Blk_Cnt 0x0032 100 100 010 Old_age Always - 0
9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 5647
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 745
...
206 Write_Error_Rate 0x000e 100 100 000 Old_age Always - 0
210 Success_RAIN_Recov_Cnt 0x0032 100 100 000 Old_age Always - 0
246 Total_LBAs_Written 0x0032 100 100 000 Old_age Always - 8122758270
247 Host_Program_Page_Count 0x0032 100 100 000 Old_age Always - 66129114
248 FTL_Program_Page_Count 0x0032 100 100 000 Old_age Always - 107894743
SMART Error Log Version: 1
No Errors Logged
...
# Sanitize之後
$ sudo smartctl -a /dev/sda
smartctl 7.4 2023-08-01 r5530 [x86_64-linux-6.17.0-23-generic] (local build)
Copyright (C) 2002-23, Bruce Allen, Christian Franke, www.smartmontools.org
=== START OF INFORMATION SECTION ===
Model Family: Crucial/Micron Client SSDs
Device Model: CT1000MX500SSD1
Serial Number: 2423E8B71FCB
LU WWN Device Id: 5 00a075 1e8b71fcb
Firmware Version: M3CR046
User Capacity: 1,000,204,886,016 bytes [1.00 TB]
Sector Size: 512 bytes logical/physical
...
=== START OF READ SMART DATA SECTION ===
SMART overall-health self-assessment test result: PASSED
General SMART Values:
...
SMART Attributes Data Structure revision number: 16
Vendor Specific SMART Attributes with Thresholds:
ID# ATTRIBUTE_NAME FLAG VALUE WORST THRESH TYPE UPDATED WHEN_FAILED RAW_VALUE
1 Raw_Read_Error_Rate 0x002f 100 100 000 Pre-fail Always - 0
5 Reallocate_NAND_Blk_Cnt 0x0032 100 100 010 Old_age Always - 0
9 Power_On_Hours 0x0032 100 100 000 Old_age Always - 5648
12 Power_Cycle_Count 0x0032 100 100 000 Old_age Always - 745
...
206 Write_Error_Rate 0x000e 100 100 000 Old_age Always - 0
210 Success_RAIN_Recov_Cnt 0x0032 100 100 000 Old_age Always - 0
246 Total_LBAs_Written 0x0032 100 100 000 Old_age Always - 8122759110
247 Host_Program_Page_Count 0x0032 100 100 000 Old_age Always - 66129354
248 FTL_Program_Page_Count 0x0032 100 100 000 Old_age Always - 107916650
SMART Error Log Version: 1
No Errors Logged
...
Reference
man nvmeman nvme-sanitize