เชิงลึกของ Windows I/O (ตอนที่ 5) — โครงสร้างภายในของ NTFS: เข้าใจระบบไฟล์จาก MFT

· · Windows, NTFS, I/O, ระบบไฟล์, MFT, เคอร์เนล, .NET, การสอบสวนบั๊ก

สี่ตอนที่ผ่านมา เราดูว่าคำขอ I/O ไหลอย่างไร (ตอนที่ 1〜3) และแคชรับอย่างไร (ตอนที่ 4) คำขอไปถึง ระบบไฟล์ เป็นที่สุด คราวนี้ถึงตาตัวแทนนั้น คือ NTFS

มุมเปลี่ยน ถึงตอนนี้เป็นเรื่อง พลวัต คือ «กระแสของคำขอ» คราวนี้เป็นเรื่องโครงสร้าง สถิต คือ ข้อมูลถูกวางบนดิสก์อย่างไร ตัวจริงของ «Zone.Identifier» ที่มองไม่เห็นซึ่งติดไฟล์ที่ดาวน์โหลด เหตุที่คัดลอกไฟล์เล็ก 10,000 ไฟล์ช้ากว่าไฟล์เดียวขนาดรวมเท่ากันมากแค่ไหน «NTFS เป็นแบบวารสารจึงสบายใจ» จริงแค่ไหน ── อธิบายได้ทั้งหมดจากโครงสร้างนี้

เป็นตอนที่ 5 ของซีรีส์ «เชิงลึกของ Windows I/O»

ข้อสมมติของการอ่านตอนนี้: ถ้าจับพื้นฐาน IRP กับสแตกอุปกรณ์ของตอนที่ 1 แล้วจะอ่านง่าย อย่างไรก็ตาม เพื่อให้อ่านเดี่ยวได้ จะนิยามคำจากตอนก่อนที่โผล่ในบทความก่อน

คำ พูดหนึ่งบรรทัด รายละเอียด
IRP (I/O Request Packet) «ใบคำขอ I/O» ที่การเรียก API อย่าง ReadFile ถูกแปลงในเคอร์เนล ไดรเวอร์รับใบนี้แล้วประมวลผล ตอนที่ 1
I/O Manager กับสแตกอุปกรณ์ ส่วนของเคอร์เนลที่สร้าง IRP แล้วส่งตามลำดับไปไดรเวอร์ที่กองจนถึงอุปกรณ์เป้าหมาย และกองนั้นเอง ตอนที่ 1
Cache Manager ส่วนที่ถือเนื้อหาไฟล์ในหน่วยความจำ แล้วเขียนเนื้อหาของ WriteFile ไปดิสก์ทีหลังรวม ๆ ต้นเหตุของ «เพิ่งเขียนไม่ได้แปลว่าไปถึงดิสก์แล้ว» ตอนที่ 4

ตาราง 1: คำจากตอนก่อนที่ใช้เป็นข้อสมมติในตอนนี้

อีกอย่าง สองขั้นที่จัดการในตอนที่ 1 คือ cleanup (เมื่อแฮนเดิลสุดท้ายปิด) และ close (เมื่อการอ้างอิงในเคอร์เนลหายหมด) ถูกใช้ในคำอธิบายการลบไฟล์ของหมวด 4 ด้วย

1. สรุปก่อนเลย

  • ศูนย์กลางของ NTFS คือ MFT (Master File Table) ไฟล์ทั้งหมดถูกจัดการเป็นเรกคอร์ดในสมุดทะเบียนใน MFT และข้อมูลทั้งหมดเกี่ยวกับไฟล์อยู่ใน «ในรายการ MFT» หรือ «พื้นที่นอก MFT ที่รายการชี้» (หมวด 2)1
  • ตัวจริงของไฟล์คือ «ชุดแอตทริบิวต์» ไฟล์เล็กเก็บตัวข้อมูลทั้งก้อนในเรกคอร์ด MFT (เรซิเดนต์) ไฟล์ใหญ่มีแค่การอ้างอิงไปแถวคลัสเตอร์ (นอนเรซิเดนต์) ความช้าของการประมวลผลไฟล์เล็กจำนวนมากอธิบายได้จากตรงนี้ (หมวด 2)1
  • ข้อมูลมีได้หลายอัน (สตรีมข้อมูลหลายอัน) ข้อมูลปกติคือ «สตรีมที่ไม่มีชื่อ» และมีสตรีมเพิ่มด้วย file.txt:ชื่อ นี่คือตัวจริงของ Zone.Identifier (Mark of the Web) (หมวด 3)2
  • ชื่อก็เป็นแอตทริบิวต์ สิ่งที่ใส่ชื่อหลายอันในเรกคอร์ดเดียวกันคือฮาร์ดลิงก์ ชื่อสั้น 8.3 ก็อยู่ร่วมเป็น «อีกชื่อ» (หมวด 4)34
  • จุดรีพาร์สคือกลไกทางการของ «เปิดแล้วไปที่อื่น» ลิงก์สัญลักษณ์ จังก์ชัน ไฟล์ตามความต้องการของ OneDrive ล้วนเป็นการประยุกต์ข้อมูลติดแท็กนี้ (หมวด 5)56
  • วารสารมีสองอัน $LogFile สำหรับ กู้ความสอดคล้องของเมทาดาตา (ล็อกล่วงหน้าเพื่อไม่ให้พัง) วารสาร USN สำหรับ บันทึกประวัติการเปลี่ยน (สมุดทะเบียนว่าอะไรเปลี่ยน) บทบาทต่างกันโดยสิ้นเชิง (หมวด 6)78
  • «ขนาด» กับ «ขนาดบนดิสก์» คนละอย่าง ไฟล์สปาร์สและการบีบอัดสร้างความห่าง พื้นหลังของ «ไฟล์บีบอัดไม่อะซิงค์» ที่เห็นในตอนที่ 2 ก็อยู่ตรงนี้ (หมวด 7)910

แผนที่ความรู้ของบทความนี้

ศูนย์กลางของ NTFS คือ MFT (Master File Table) และไฟล์ทั้งหมดถูกจัดการเป็นเรกคอร์ดในสมุดทะเบียนใน MFT ข้อมูลเล็กเป็นเรซิเดนต์ในเรกคอร์ด ข้อมูลใหญ่เป็นนอนเรซิเดนต์ที่ถือแค่การอ้างอิงไปแถวคลัสเตอร์ (ดาต้ารัน) และนี่คือตัวจริงของความช้าในการประมวลผลไฟล์เล็กจำนวนมากและการแตกกระจาย สตรีมข้อมูลหลายอัน ฮาร์ดลิงก์ และชื่อสั้น 8.3 ล้วนเป็นการประยุกต์กลไกเดียวกันคือ «ชุดแอตทริบิวต์» และจุดรีพาร์สคือตะขอทางการของ «เปิด» ที่รองรับตั้งแต่ลิงก์สัญลักษณ์จนถึงไฟล์ตามความต้องการของ OneDrive สิ่งที่ $LogFile ป้องกันคือความสอดคล้องของโครงสร้าง ความทนทานของเนื้อหาข้อมูลต้องสร้างแยกด้วยเครื่องมือควบคุมแคชของตอนที่ 4

แผนที่ความรู้โครงสร้างภายในของ NTFS กับ MFTแผนภาพที่แสดงความสัมพันธ์ระหว่าง NTFS, MFT, เรกคอร์ดไฟล์, แอตทริบิวต์เรซิเดนต์กับนอนเรซิเดนต์, ดาต้ารัน, การแตกกระจาย, สตรีมข้อมูลหลายอัน, Zone.Identifier, ฮาร์ดลิงก์, ชื่อสั้น 8.3, จุดรีพาร์ส (ลิงก์สัญลักษณ์・จังก์ชัน・ไฟล์ตามความต้องการของ OneDrive), $LogFile กับวารสาร USN, ไฟล์สปาร์สและการบีบอัด NTFSใช้ใช้ต้องมีบรรเทาใช้ใช้ใช้ร่วมไม่ได้ใช้อาจก่อให้เกิดตรวจยืนยันด้วยใช้ถูกเก็บในตรวจยืนยันด้วยตรวจยืนยันด้วยอาจก่อให้เกิดใช้ต้องมีใช้กำหนดค่าด้วยใช้ตรวจยืนยันด้วยอิมพลีเมนต์อิมพลีเมนต์อิมพลีเมนต์ใช้บรรเทาใช้ใช้ตรวจยืนยันด้วยใช้อาจก่อให้เกิดใช้อาจก่อให้เกิดใช้ร่วมไม่ได้ตรวจยืนยันด้วยNTFSMFT (Master File Table)เรกคอร์ดไฟล์ MFTโซน MFTการแตกกระจาย (NTFS)แอตทริบิวต์เรซิเดนต์ (resident)แอตทริบิวต์นอนเรซิเดนต์ (non-resident)ดาต้ารันfsutilสตรีมข้อมูลสำรอง (ADS)Zone.Identifier (Mark of the Web)streams (Sysinternals)ความห่างระหว่างขนาดเชิงตรรกะกับพื้นที่ดิสก์ที่ใช้ฮาร์ดลิงก์ชื่อสั้น 8.3จุดรีพาร์สลิงก์สัญลักษณ์จังก์ชัน (จุดเมานต์)ไฟล์ตามความต้องการของ OneDrive$LogFile (ล็อกธุรกรรม NTFS)วอลุ่มพังCache Managerวารสาร USN (วารสารการเปลี่ยน)ไฟล์สปาร์สการบีบอัด NTFSI/O แบบอะซิงโครนัสProcess Monitor (procmon.exe)

ในแผนภาพ เส้นทึบหมายถึงความสัมพันธ์ที่ถือเสมอ และเส้นประหมายถึงความสัมพันธ์ที่มีเงื่อนไข (เงื่อนไขอยู่ในการอธิบายของแต่ละความสัมพันธ์ในหน้าละเอียด) รายการความสัมพันธ์ทั้งหมด (รวม 35 รายการ พร้อมหลักฐานและระดับความเชื่อมั่น) และนิยามของแนวคิดหลักรวบรวมไว้ที่ หน้าละเอียดของแผนที่ความรู้ (เป็นภาษาญี่ปุ่น) ข้อมูล: JSON-LD / Turtle

2. ทุกอย่างคือเรกคอร์ดของ MFT

2.1. สมุดทะเบียนของวอลุ่ม

เมื่อฟอร์แมตวอลุ่ม NTFS จะสร้าง MFT (master file table) และชุดไฟล์เมทาดาตาที่ขึ้นต้นด้วย $ ใน MFT มี อย่างน้อยหนึ่งรายการสำหรับทุกไฟล์บนวอลุ่ม และ รวมรายการของ MFT เองด้วย1

วอลุ่ม NTFSเรกคอร์ดชี้ตำแหน่ง$MFT ── ตารางไฟล์หลักสมุดทะเบียนเรกคอร์ดของทุกไฟล์ (ตนก็อยู่ในนั้น)พื้นที่ข้อมูลผู้ใช้(ที่วางข้อมูลนอนเรซิเดนต์)$LogFile ── ล็อกธุรกรรมของการดำเนินการเมทาดาตา (หมวด 6)$Bitmap ── สถานะการใช้คลัสเตอร์$Boot / $Secure / $UpCase ฯลฯไฟล์เมทาดาตาอื่น

ภาพ 1: โครงสร้างวอลุ่ม NTFS การออกแบบของ NTFS คือ «ข้อมูลจัดการของระบบไฟล์เองก็ถือเป็นไฟล์»

ข้อมูลเกี่ยวกับไฟล์ ── ขนาด การประทับเวลา สิทธิ์เข้าถึง ไปจน เนื้อหาข้อมูล ── ถูกเก็บในรายการ MFT หรือถูกเก็บในพื้นที่นอก MFT ที่รายการ MFT บรรยายตำแหน่ง1 เมื่อลบไฟล์ รายการถูกทำเครื่องหมาย «ว่าง» เพื่อใช้ใหม่ แต่ MFT เองไม่หด นอกจากนี้ เพื่อรักษา MFT ให้ต่อเนื่อง มีพื้นที่ โซน MFT ถูกจองไว้ และเมื่อวอลุ่มเริ่มเต็ม การแตกกระจายของ MFT เริ่ม ── เรื่องอายุนี้ก็ถูกเขียนในเอกสารทางการ1

2.2. ไฟล์ = ชุดแอตทริบิวต์ เรซิเดนต์กับนอนเรซิเดนต์

เนื้อในเรกคอร์ดไฟล์คือ รายการแอตทริบิวต์ ข้อมูลมาตรฐาน (การประทับเวลา ฯลฯ) ชื่อไฟล์ ความปลอดภัย และข้อมูล ที่นี่มีการแยกสำคัญ

เรกคอร์ดไฟล์ MFT (สมุดทะเบียนหนึ่งไฟล์)ประมาณหลายร้อยไบต์มากกว่านั้นแอตทริบิวต์ข้อมูลมาตรฐานการประทับเวลา・แฟลกแอตทริบิวต์แอตทริบิวต์ชื่อไฟล์(มีได้หลายอัน ── หมวด 4)แอตทริบิวต์ข้อมูลข้อมูลเล็กหรือเรซิเดนต์ (resident)ตัวข้อมูลเก็บในเรกคอร์ดการอ่านจบด้วยการเข้าถึง MFT อย่างเดียวนอนเรซิเดนต์ (non-resident)ในเรกคอร์ดมีแค่ «การอ้างอิงไปแถวคลัสเตอร์»ข้อมูลจริงอยู่ในพื้นที่ข้อมูลผู้ใช้

ภาพ 2: เรกคอร์ดไฟล์คือชุดแอตทริบิวต์ ถ้าข้อมูลเล็กจะ «เรซิเดนต์» ในเรกคอร์ด

เนื้อในเรกคอร์ดเดียวกัน เรซิเดนต์กับนอนเรซิเดนต์เปลี่ยนอย่างไร เมื่อเรียงดูจะเข้าใจง่าย

นอนเรซิเดนต์ (non-resident) ── ไฟล์ใหญ่ชี้ตำแหน่งชี้ตำแหน่งเรกคอร์ดไฟล์ MFT (ความยาวคงที่)ข้อมูลมาตรฐาน / ชื่อไฟล์ / ความปลอดภัย─────────────แอตทริบิวต์ข้อมูล = ตารางดาต้ารันแถว 「จากไหนกี่คลัสเตอร์」พื้นที่ข้อมูลผู้ใช้รัน 1: คลัสเตอร์ต่อเนื่องพื้นที่ข้อมูลผู้ใช้รัน 2: คลัสเตอร์ต่อเนื่องที่อื่นเรซิเดนต์ (resident) ── ไฟล์เล็กเรกคอร์ดไฟล์ MFT (ความยาวคงที่)ข้อมูลมาตรฐาน / ชื่อไฟล์ / ความปลอดภัย─────────────แอตทริบิวต์ข้อมูล = เนื้อในเอง「ค่าที่ตั้ง=1」อยู่ในที่นี่ตรง ๆบนดิสก์ไม่มีที่วางแยกการอ่านจบด้วยการเข้าถึง MFT อย่างเดียว

ภาพ 3: เทียบเรซิเดนต์กับนอนเรซิเดนต์ ในนอนเรซิเดนต์ สิ่งที่เรกคอร์ดมีคือแค่ตาราง (ดาต้ารัน) ว่า «ข้อมูลจริงอยู่ที่ไหนกี่อัน»

ยิ่งจำนวนดาต้ารันเพิ่ม การอ่านไฟล์หนึ่งไฟล์ยิ่งต้องเดินข้ามพื้นที่ที่กระจาย นี่คือตัวจริงของการแตกกระจายที่กล่าวต่อไป

จากโครงสร้างนี้ อธิบายปรากฏการณ์ที่เจอในงานได้หลายอย่าง

  • เหตุที่คัดลอกไฟล์เล็ก 10,000 ไฟล์ช้า แต่ละไฟล์เกิดการดำเนินการเมทาดาตา คือสร้างเรกคอร์ด MFT ลงทะเบียนชื่อ ตั้งความปลอดภัย งานสมุดทะเบียนกลายเป็นตัวหลักมากกว่าการส่งข้อมูลเอง (และแต่ละอันกลายเป็นเป้าตรวจของฟิลเตอร์ที่เห็นในตอนที่ 6 ด้วย)
  • ตัวจริงของการแตกกระจาย ข้อมูลนอนเรซิเดนต์ถูกบันทึกเป็น «แถวของช่วงคลัสเตอร์ต่อเนื่อง (รัน)» ถ้าเอาพื้นที่ต่อเนื่องไม่ได้ จำนวนรันเพิ่ม การซีคที่ต้องใช้ตอนอ่านเพิ่ม ── นี่คือการแตกกระจาย แถวจริงของรันแอบดูด้วย fsutil file layout ได้
  • «โฟลเดอร์» ก็ไม่พิเศษ ไดเรกทอรีคือ «ไฟล์ที่มีดัชนีจากชื่อไฟล์ไปหมายเลขเรกคอร์ด MFT» บนสมุดทะเบียน ทุกอย่างอยู่บนกลไกเดียวกัน

3. ข้อมูลเป็นแค่หนึ่งใน «สตรีม»

3.1. หนึ่งไฟล์ หลายลำดับไบต์

ใน NTFS ไฟล์หนึ่งไฟล์มี สตรีมข้อมูลได้หลายอัน สิ่งที่อ่านเขียนด้วย ReadFile/WriteFile ปกติคือ สตรีมเริ่มต้นที่ไม่มีชื่อ และสร้าง สตรีมข้อมูลสำรอง (ADS) ได้ด้วยไวยากรณ์ ชื่อไฟล์:ชื่อสตรีม2

ไฟล์ชื่อ report.docx (เรกคอร์ด MFT อันเดียว)สตรีมเริ่มต้น (ไม่มีชื่อ)= เนื้อในที่เห็นปกติ:Zone.Identifierข้อมูลแหล่งที่มา (Mark of the Web):ชื่อใดก็ได้ข้อมูลเพิ่มเฉพาะแอป

ภาพ 4: สตรีมข้อมูลหลายอัน สิ่งที่โผล่ในการแสดงขนาดของ Explorer คือแค่สตรีมเริ่มต้น

ADS ที่ใกล้ที่สุดคือ Zone.Identifier ไฟล์ที่ดาวน์โหลดด้วยเบราว์เซอร์ มีแหล่งที่มา (มาจากอินเทอร์เน็ต ฯลฯ) ถูกบันทึกในสตรีมนี้ และเป็นวัตถุดิบการตัดสินของ «พีซีถูกปกป้องโดย Windows» ของ SmartScreen และมุมมองที่ป้องกันของ Office หน้าของกลไกนี้อยู่ใน «เหตุผลที่ Windows แสดง «พีซีถูกปกป้องโดย Windows»» ── ตัวจริงด้านหลังคือแค่สตรีม NTFS

3.2. กับดักที่นักพัฒนาเหยียบ

  • มองไม่เห็น ไม่โผล่ทั้งขนาดของ Explorer และรายการ dir ตรวจด้วย dir /r หรือ streams ของ Sysinternals11
  • ขนย้ายไม่ได้ ADS เป็นฟังก์ชันของ NTFS ดังนั้นการคัดลอกผ่าน USB แบบ FAT หรือที่เก็บคลาวด์ มักหาย «คำเตือนดาวน์โหลดหายเมื่อคัดลอก» คืออันนี้
  • แอปของตนก็เปิดได้ แค่ใส่ทวิภาคในพาธอย่าง CreateFile("data.txt:meta", ...) ก็อ่านเขียนได้2 สะดวก แต่ต้องรับคุณ «ขนย้ายไม่ได้» ของข้อก่อนไปด้วย จึงไม่ใช่ที่ใส่ตัวจริงของข้อมูลธุรกิจ

4. ชื่อก็เป็นแอตทริบิวต์ — ฮาร์ดลิงก์กับชื่อ 8.3

4.1. ฮาร์ดลิงก์ — หลายชื่อสู่เรกคอร์ดเดียวกัน

ในภาพ 2 เขียนว่า «แอตทริบิวต์ชื่อไฟล์มีได้หลายอัน» ในวอลุ่มเดียวกัน หลายพาธอ้างอิงไฟล์เดียว ── นี่คือ ฮาร์ดลิงก์ (CreateHardLink / mklink /H)3

ดัชนีของ C:\backup\ดัชนีของ C:\app\config-link.json → เรกคอร์ด#1234config.json → เรกคอร์ด#1234เรกคอร์ด MFT #1234ตัวข้อมูล (หรือการอ้างอิงไปรัน)จำนวนลิงก์: 2

ภาพ 5: ฮาร์ดลิงก์ ดัชนีของไดเรกทอรีชี้เรกคอร์ด MFT เดียวกัน ทั้งคู่เป็น «ของจริง»

เปลี่ยนจากชื่อใดก็เป็น ไฟล์เดียวกัน ดังนั้นเนื้อหาตรงทันที3 และความหมายของ «ลบ» เปลี่ยน ── DeleteFile คือ «ถอดชื่อหนึ่งอัน» และ ตัวจริงหายครั้งแรกเมื่อชื่อสุดท้ายถูกถอด แฮนเดิลที่เปิดอยู่ปิด และการอ้างอิงในเคอร์เนลอย่างเซกชันของแมปหน่วยความจำก็หายหมด สองขั้น cleanup (แฮนเดิลสุดท้าย) กับ close (การอ้างอิงสุดท้าย) ที่เห็นในตอนที่ 1 มีผลต่ออายุของการลบตรง ๆ อนึ่ง การแสดงแอตทริบิวต์มีนิสัย แม้เปลี่ยนแอตทริบิวต์ผ่านลิงก์หนึ่ง การแสดงที่เห็นผ่านลิงก์อื่นอาจยังเก่า ตามที่เอกสารทางการระบุ3

4.2. ชื่อ 8.3 — อีกชื่อที่ซ่อน

เพื่อความเข้ากันทางประวัติ NTFS สร้าง ชื่อสั้นรูปแบบ 8.3 อย่าง REPORT~1.DOC ให้ชื่อไฟล์ยาวได้อัตโนมัติ อันนี้ก็อยู่ร่วมในเรกคอร์ดเป็น «อีกชื่อ» ในโฟลเดอร์ที่มีไฟล์จำนวนมาก การสร้างชื่อสั้นและการกันชนเป็นต้นทุน จึงปิดการสร้างหรือถอดชื่อสั้นที่มีอยู่ด้วย fsutil 8dot3name ได้ (แอปเก่าที่บันทึกพาธรีจิสทรีด้วยชื่อสั้นจะพัง จึงมีฟังก์ชันตรวจก่อน strip ซึ่งเป็นจุดที่ใช้ในงานจริง)4

จุดที่ต้องระวังคือ ว่ามีชื่อสั้นหรือไม่ขึ้นกับสภาพแวดล้อม พฤติกรรมค่าเริ่มต้นถูกกำหนดด้วยค่ารีจิสทรี NtfsDisable8dot3NameCreation มีสี่ทางคือ 0 (สร้างทุกวอลุ่ม) 1 (ไม่สร้างทุกวอลุ่ม) 2 (ตั้งทีละวอลุ่ม) 3 (ไม่สร้างนอกวอลุ่มระบบ)4 ถ้าเลือก 2 สลับทีละวอลุ่มได้ ดังนั้น «บน Windows ต้องมีชื่อสั้นอย่าง PROGRA~1 เสมอ» ไม่จริง ก่อนเขียนโค้ดหรือขั้นตอนที่พึ่งชื่อสั้น ให้ตรวจสถานะปัจจุบันด้วย fsutil 8dot3name query C: (ละวอลุ่มจะได้การตั้งค่าเริ่มต้นร่วมทุกวอลุ่ม)

กับดักรอบพาธและชื่อ (MAX_PATH ชื่อสงวน จุดท้าย) อยู่ใน «กับดัก MAX_PATH กับพาธและชื่อไฟล์ของ Windows» รวมการแก้ชื่อของตอนที่ 1 (Object Manager) กับหมวดนี้ (ชื่อในระบบไฟล์) จะได้ภาพรวมของ «ชื่อ» ของ Windows

5. จุดรีพาร์ส — กลไก «เปิดแล้วไปที่อื่น»

ไฟล์หรือไดเรกทอรีติด จุดรีพาร์ส ได้ ตัวจริงคือแอตทริบิวต์ «แท็ก + ข้อมูลที่ผู้ใช้กำหนด» เมื่อระบบไฟล์เปิดไฟล์ที่มีจุดรีพาร์ส การประมวลผลถูกแย่ง ตามแท็ก ── ไดรเวอร์ฟิลเตอร์ที่เข้าใจแท็กรับการประมวลผล หรือถ้าเป็นแท็กชนิดเปลี่ยนชื่อ การแก้จะถูกทำใหม่ด้วยพาธปลายทาง5

NTFSI/O ManagerแอปNTFSI/O Managerแอปพบจุดรีพาร์สที่เป้าคืนแท็กกับข้อมูลฟิลเตอร์ที่เข้าใจแท็กรับการประมวลผล (ตอนที่ 6)alt[ลิงก์สัญลักษณ์/จังก์ชัน(การเปลี่ยนชื่อ)][แท็กที่ฟิลเตอร์จัดการ (ไฟล์คลาวด์ฯลฯ)]CreateFile("C:\data\link.txt")IRP_MJ_CREATE (โลกของตอนที่ 1)「ที่จริงอยู่ที่นี่」แก้ใหม่ด้วยพาธปลายทาง

ภาพ 6: การแก้จุดรีพาร์ส กลายเป็นตะขอทางการที่แทรกการดำเนินการ «เปิด»

บนกลไกอันเดียวนี้ ฟังก์ชันที่คุ้นเรียงกัน

  • ลิงก์สัญลักษณ์ (mklink) ── ป้ายที่ถือพาธปลายทาง ชี้วอลุ่มอื่นหรือพาธ UNC ได้6
  • จังก์ชัน/จุดเมานต์ ── กลไกอาวุโสที่เชื่อมไดเรกทอรีไปตำแหน่งของวอลุ่มท้องถิ่นอื่น3
  • ไฟล์ตามความต้องการของ OneDrive ── แสดงไฟล์ที่ยังไม่มีข้อมูลจริงในมือเป็นจุดรีพาร์ส และวินาทีที่ถูกเปิด ฟิลเตอร์ดาวน์โหลดแล้วส่งเนื้อใน นี่คือตัวจริงของ «เห็นใน Explorer แต่เปิดแล้วมีการสื่อสาร» (กลไกของฟิลเตอร์เองอยู่ในตอนที่ 6)

ข้อควรระวังในงานจริงมีหนึ่ง «ปลายทางของพาธไม่จำเป็นต้องเป็นที่นั้นในเครื่องท้องถิ่นจริง» เครื่องมือที่เดินต้นไม้แบบเรียกซ้ำวนด้วยจังก์ชัน การรวมขนาดซ้ำ การสำรองทำให้การทำให้เป็นตัวจริงของคลาวด์เกิดจำนวนมาก ── โค้ดที่ไม่รู้จุดรีพาร์สเหยียบเหล่านี้ การตรวจแอตทริบิวต์ FILE_ATTRIBUTE_REPARSE_POINT ของตระกูล FindFirstFile คือทางเข้าของมาตรการ5

6. สองวารสาร — $LogFile กับ USN

มักถูกพูดว่า «NTFS เป็นระบบไฟล์แบบวารสาร» แต่ NTFS มี สองวารสาร ที่บทบาทต่างกัน ถ้าสับสนจะอ่านการรับประกันผิด

วารสาร USN ── ประวัติการเปลี่ยน (เพื่อรู้ว่าอะไรเปลี่ยน)ทุกครั้งที่ไฟล์/ไดเรกทอรีเปลี่ยนบันทึกเนื้อหาการเปลี่ยนกับชื่อเครื่องมือสำรอง・ดัชนีค้นหา・ซิงค์จับ 「อะไรเปลี่ยนจากครั้งก่อน」 โดยไม่สแกนทั้งก้อน$LogFile ── ล็อกล่วงหน้า (เพื่อไม่ให้พัง)บันทึกการดำเนินการเมทาดาตา (อัปเดตเรกคอร์ด・เปลี่ยนชื่อ ฯลฯ)ลงล็อกก่อนทำตอนบูตครั้งถัดไปหลังระบบล้มเล่นล็อกซ้ำเพื่อกู้ความสอดคล้องของโครงสร้าง

ภาพ 7: สองวารสาร $LogFile เพื่อ «ไม่ให้พัง» USN เพื่อ «รู้การเปลี่ยน»

ความต่างเมื่อทำตาราง เป็นดังนี้

มุม $LogFile (ล็อกธุรกรรม) วารสาร USN (วารสารการเปลี่ยน)
จุดประสงค์ คืน โครงสร้าง ของระบบไฟล์สู่สถานะสอดคล้องหลังล้ม7 รู้ทีหลังว่า «อะไรเปลี่ยนจากครั้งก่อน»8
สิ่งที่บันทึก ล็อกล่วงหน้าของการดำเนินการเมทาดาตา (อัปเดตเรกคอร์ด・เปลี่ยนชื่อ ฯลฯ) เนื้อในไฟล์อยู่นอกเป้า ทุกครั้งที่เปลี่ยน เนื้อหาการเปลี่ยนกับชื่อไฟล์/ไดเรกทอรีเป้า8
ใครใช้ NTFS เอง ใช้กู้อัตโนมัติตอนเมานต์ครั้งถัดไป แอปอย่างสำรอง ดัชนีค้นหา เครื่องมือซิงค์
ย้อนได้ไกลแค่ไหน แค่ช่วงที่ต้องใช้กู้ ใช้ขนาดคงที่วน จึงใช้ไล่ประวัติไม่ได้ เมื่อเกินขนาดเป้าหมาย (MaximumSize) เรกคอร์ดเก่าถูกตัดตอนจุดตรวจ ช่วงที่ย้อนได้ขึ้นกับการตั้งขนาดและปริมาณอัปเดตของวอลุ่ม12
วิธีอ้างอิง ไม่มีวิธีทางการอ่านเนื้อใน (ขนาดตรวจด้วย chkdsk /L ได้) สถานะด้วย fsutil usn queryjournal เนื้อในด้วย fsutil usn readjournal จากโปรแกรมใช้ FSCTL_QUERY_USN_JOURNAL / FSCTL_READ_USN_JOURNAL12
หยุดได้ไหม หยุดไม่ได้ (เป็นส่วนของ NTFS) ผู้ดูแลลบหรือปิดได้ แต่บังคับบริการที่ใช้อยู่ให้สแกนทั้งก้อน ผลจึงใหญ่12

ตาราง 2: เทียบสองวารสาร

  • $LogFile (ล็อกธุรกรรม) คือ ล็อกล่วงหน้า ของการดำเนินการเมทาดาตา แม้ระบบล้ม NTFS กู้ความสอดคล้องของระบบไฟล์อัตโนมัติ จากล็อกนี้กับข้อมูลจุดตรวจตอนบูตครั้งถัดไป7 สิ่งที่ถูกป้องกันตรงนี้คือ โครงสร้าง ตามที่เห็นในตอนที่ 4 เนื้อหาข้อมูล สกปรกบนแคชอาจหายเมื่อตัดไฟ ── «วอลุ่มไม่พัง แต่การเขียนครั้งสุดท้ายอาจหาย» คือการอ่านที่ถูก
  • วารสาร USN (วารสารการเปลี่ยน) คือสมุดทะเบียนที่บันทึก เนื้อหาการเปลี่ยนกับชื่อเป้า ทุกครั้งที่ไฟล์หรือไดเรกทอรีในวอลุ่มเปลี่ยน8 เป็นกลไกให้สำรองหรืออินเด็กเซอร์เก็บ «เฉพาะที่เปลี่ยนจากครั้งก่อน» โดยไม่สแกนทั้งก้อน และถูกใช้เลี่ยงการสร้างดัชนีใหม่หลังล้มด้วย8 ในงานจริง จำไว้ว่าใช้ fsutil usn readjournal เป็นสมุดทะเบียนจับคู่เสริมการตกหล่นของ FileSystemWatcherคู่มือปฏิบัติ FileSystemWatcher») ตอนสอบสวน จะมีประโยชน์

7. สปาร์สกับการบีบอัด — เรื่องที่ «ขนาด» มีสองอัน

ใน NTFS ความยาวเชิงตรรกะ ของไฟล์กับ พื้นที่ที่ถูกจัดสรรจริง ถูกจัดการแยก คือ «ขนาด» กับ «ขนาดบนดิสก์» ในหน้าคุณสมบัติ ตัวแทนที่สร้างความห่างมีสองอย่าง

ไฟล์สปาร์ส ไม่จัดสรรพื้นที่จริงให้ช่วงที่เป็นศูนย์ต่อเนื่อง จัดการเป็น «หลุม»9 ไฟล์ดิสก์เสมือนขนาดตรรกะ 42GB ใช้บนดิสก์แค่ 500MB ── เกิดเป็นเรื่องปกติ อ่านหลุมได้ศูนย์ เขียนแล้วถูกจัดสรรเฉพาะส่วนนั้น

การจัดสรรบนดิสก์ (15MB+ข้อมูลจัดการ)ไฟล์เชิงตรรกะ (ขนาด: 1GB)รัน: ตัวจริงของ R1รัน: ตัวจริงของ R2ข้อมูล 10MBหลุม (ศูนย์) 500MBข้อมูล 5MBหลุม (ศูนย์) ที่เหลือ

ภาพ 8: ไฟล์สปาร์ส «หลุม» ไม่มีการจัดสรร ขนาดตรรกะกับขนาดบนดิสก์ห่างกัน

การบีบอัด NTFS บีบอัดข้อมูลทีละหน่วยบีบอัดแล้วเก็บ10 โปร่งใสและสะดวก แต่ต้นทุนก็ไม่โปร่งใส ── ทุกครั้งที่อ่านเขียนมีการขยายและบีบอัดใหม่ และการแตกกระจายก็เกิดง่ายขึ้น และตามที่เห็นใน ตอนที่ 2 หมวด 5 การเข้าถึงไฟล์บีบอัดไม่อะซิงค์ (ระบบไฟล์แปลงเป็นซิงค์) เมื่อ «ทำให้เป็น I/O อะซิงค์แล้วแต่มีไฟล์ที่ไม่เร็วขึ้น» นี่คือที่หนึ่งที่ควรสงสัย

ขนาดจริงฐานการจัดสรรดึงด้วย GetCompressedFileSize ได้ ในการสอบสวนที่ «ผลรวมขนาดไฟล์» กับ «การใช้ดิสก์» ไม่ตรง หลักคือสงสัยสปาร์ส การบีบอัด ADS (หมวด 3) และการปัดคลัสเตอร์ ทั้งสี่ตามลำดับ

8. ยืนยันด้วยตาตนเอง

คราวนี้ก็สังเกตได้ทั้งหมดบน Windows ในมือ (บางส่วนต้องมีสิทธิ์ผู้ดูแล) เพื่อให้ตัดสินเองได้ว่าผลรันถูกหรือไม่ แต่ละคำสั่งจะติดว่า ดูตรงไหนแล้วรู้อะไร

:: ดูสตรีมข้อมูลสำรอง
dir /r C:\Users\%USERNAME%\Downloads

ดูตรงนี้: ใต้แถวไฟล์ปกติ มีแถวย่อหน้าที่เป็นรูป ชื่อไฟล์:Zone.Identifier:$DATA พร้อมความยาว ถ้ามีแถวนี้ ไฟล์นั้นมี Mark of the Web (หมวด 3) ไฟล์ที่ดาวน์โหลดด้วยเบราว์เซอร์มี ไฟล์ที่สร้างเองไม่มี รันทั้งสองที่แล้วเทียบ จะเห็นการมีหรือไม่มี ADS ชัด

:: ดูการจัดวางของไฟล์บน MFT (รัน) และแอตทริบิวต์
fsutil file layout C:\path\to\file.dat

:: ดูเฉพาะเอ็กซ์เทนต์ (คำสั่งย่อยที่มีระบุในเอกสารทางการ)
fsutil file queryextents C:\path\to\file.dat

ดูตรงนี้: layout เรียงต่อสตรีม ทั้งขนาด ขนาดที่จัดสรร และถ้าเป็นนอนเรซิเดนต์ รายการเอ็กซ์เทนต์ (คู่ VCN・LCN・จำนวนคลัสเตอร์) ไฟล์เล็กมากที่ไม่มีแถวเอ็กซ์เทนต์คือเรซิเดนต์ (หมวด 2.2) ถ้าแยกหลายแถวแสดงว่าแตกกระจาย วิธีสัมผัสเรซิเดนต์/นอนเรซิเดนต์ที่สั้นที่สุดคือรันเทียบไฟล์ข้อความไม่กี่ไบต์กับไฟล์หลายร้อย MB

:: การตั้งค่าการสร้างชื่อสั้น 8.3 และชื่อสั้นที่มีอยู่
fsutil 8dot3name query C:
dir /x

ดูตรงนี้: query คืนว่าการสร้างชื่อสั้นบนวอลุ่มนั้นเปิดหรือปิด (ละวอลุ่มจะได้การตั้งค่าเริ่มต้นร่วมทุกวอลุ่ม)4 dir /x แสดงคอลัมน์ชื่อสั้นข้างชื่อยาว ดังนั้น ถ้าคอลัมน์ว่าง แสดงว่าไม่ได้สร้างชื่อสั้น ยืนยัน «ไม่จำเป็นต้องมีชื่อสั้น» ของหมวด 4.2 ได้ในสภาพแวดล้อมของตน

:: สถานะของวารสาร USN
fsutil usn queryjournal C:

ดูตรงนี้: แสดงรหัสวารสาร ช่วง USN ที่ใช้ได้ (First USN / Next USN) ขนาดเป้าหมาย (MaximumSize) และหน่วยจัดสรร (AllocationDelta)12 สร้างไฟล์อะไรสักอย่างแล้วรันอีกครั้ง Next USN น่าจะเดิน นี่คือการยืนยันว่า «การเปลี่ยนถูกบันทึก» MaximumSize คือตัวประมาณ «ย้อนได้ไกลแค่ไหน» ที่แตะในหมวด 6 วอลุ่มที่วารสารปิดจะเกิดข้อผิดพลาด

:: ตรวจจุดรีพาร์ส (ปลายทางกับแท็ก)
dir /aL C:\Users\%USERNAME%
fsutil reparsepoint query "C:\Users\%USERNAME%\OneDrive"

ดูตรงนี้: สิ่งที่โผล่ใน dir /aL คือจุดรีพาร์ส (สิ่งที่ FILE_ATTRIBUTE_REPARSE_POINT ตั้ง) ลิงก์สัญลักษณ์หรือจังก์ชันแสดงพร้อมชนิดอย่าง <SYMLINKD> <JUNCTION> fsutil reparsepoint query แสดงค่าแท็กรีพาร์ส และถ้าเป็นชนิดเปลี่ยนชื่อ จะแสดงพาธปลายทาง ถ้าระบุเป้าที่ไม่ใช่จุดรีพาร์สจะเกิดข้อผิดพลาด ดังนั้น การเกิดข้อผิดพลาดเองคือการยืนยันว่า «ตรงนี้เป็นโฟลเดอร์ปกติ»

เมื่อตามการดำเนินการไฟล์ด้วย Procmon ตัวละครของตอนนี้ไหลด้วยชื่อจริง (การเขียนไป $LogFile พาธที่มีชื่อสตรีม การประมวลผลรีพาร์ส) วิธีใช้ดู «คู่มือปฏิบัติ Process Monitor (ProcMon)»

9. สรุป

  • ศูนย์กลางของ NTFS คือ MFT ไฟล์ทั้งหมดเป็นเรกคอร์ดในสมุดทะเบียน และข้อมูลอยู่ใน «ในเรกคอร์ด» หรือ «พื้นที่ภายนอกที่เรกคอร์ดชี้» ข้อมูลเล็กเป็น เรซิเดนต์ ข้อมูลใหญ่เป็น การอ้างอิงรัน ความช้าของการประมวลผลไฟล์เล็กจำนวนมากและการแตกกระจายเป็นผลของโครงสร้างนี้1
  • สตรีมข้อมูลมีได้หลายอัน Zone.Identifier (Mark of the Web) เป็นแค่ ADS เห็นด้วย dir /r และไม่ถูกขนออกนอก NTFS211
  • ชื่อเป็นแอตทริบิวต์ และมีได้หลายอัน ฮาร์ดลิงก์คือชื่อระดับเดียวกันสู่เรกคอร์ดเดียวกัน ชื่อ 8.3 คืออีกชื่อเพื่อความเข้ากัน «ลบ = ถอดชื่อ» และการหายของตัวจริงเกิดเมื่อชื่อสุดท้าย แฮนเดิล และการอ้างอิงในเคอร์เนล (เซกชันที่แมปแล้ว ฯลฯ) หายหมด34
  • จุดรีพาร์สคือตะขอทางการสู่ «เปิด» ลิงก์สัญลักษณ์ จังก์ชัน ไฟล์ตามความต้องการ ล้วนเป็นการประยุกต์นี้ โค้ดที่เดินต้นไม้ต้องรู้ FILE_ATTRIBUTE_REPARSE_POINT56
  • วารสารมีสองอัน $LogFile กู้ความสอดคล้องของโครงสร้าง (ไม่ให้พัง) USN คือประวัติการเปลี่ยน (อะไรเปลี่ยน) ไม่ใช่ «เป็นแบบวารสารจึงข้อมูลก็ปลอดภัย» ── ความทนทานของข้อมูลสร้างด้วยเครื่องมือของตอนที่ 478
  • ขนาดตรรกะกับการจัดสรรคนละอย่าง สปาร์ส การบีบอัด ADS การปัดคลัสเตอร์ คือสี่ปัจจัยใหญ่ของ «ขนาดไม่ตรง» รวมเรื่องไฟล์บีบอัดที่ไม่อะซิงค์ I/O เป็นลิ้นชักของการสอบสวนสมรรถนะ910

ต่อคือตอนสุดท้าย ตอนที่ 6 «ไดรเวอร์ฟิลเตอร์กับมินิฟิลเตอร์ ── เหตุที่ Procmon และการสแกนไวรัสแทรก I/O ได้» «ผู้ที่แทรกกลาง» ที่โผล่เป็นระยะตั้งแต่ตอนที่ 1 ── ป้องกันไวรัส Procmon OneDrive การเข้ารหัส ── แทรก I/O อย่างไร ในฐานะการเก็บงานซีรีส์ จะเปิดตัวจริงของผู้อยู่ที่ยืนในช่องว่างของสแตกอุปกรณ์

บทความที่เกี่ยวข้อง

ด้านให้คำปรึกษาที่เกี่ยวข้อง

KomuraSoft LLC รับงานออกแบบและสอบสวนแอปธุรกิจ Windows ที่รากอยู่ในกลไกของ NTFS เช่น พฤติกรรมขนาดไฟล์หรือสมรรถนะการคัดลอกที่อธิบายยาก บั๊กรอบลิงก์และสตรีม

ลิงก์อ้างอิง

  1. Microsoft Learn, Master File Table. ว่าด้วยทุกไฟล์บนวอลุ่ม NTFS ที่มีอย่างน้อยหนึ่งรายการใน MFT รวมรายการของ MFT เอง ข้อมูลทั้งหมดรวมขนาด การประทับเวลา สิทธิ์เข้าถึง เนื้อหาข้อมูล ที่ถูกเก็บในรายการ MFT หรือในพื้นที่นอก MFT ที่รายการบรรยายตำแหน่ง เมื่อลบไฟล์รายการถูกทำเครื่องหมายว่างเพื่อใช้ใหม่แต่ขนาด MFT ไม่หด โซน MFT ที่ถูกจองเพื่อรักษา MFT ให้ต่อเนื่อง และการแตกกระจายของ MFT ที่เกิดเมื่อการจัดสรรเดินหน้า  2 3 4 5 6

  2. Microsoft Learn, File Streams. ว่าด้วยข้อมูลไฟล์ของ NTFS ที่ถูกเก็บเป็นสตรีมหนึ่งอันขึ้นไป สตรีมข้อมูลเริ่มต้น (ไม่มีชื่อ) กับสตรีมข้อมูลสำรองที่มีชื่อ และการเปิดสตรีมด้วย CreateFile โดยระบุรูป «ชื่อไฟล์:ชื่อสตรีม»  2 3 4

  3. Microsoft Learn, fsutil 8dot3name. ว่าด้วย NTFS ที่สร้างชื่อสั้นรูปแบบ 8.3 ให้ชื่อไฟล์ยาวได้ fsutil 8dot3name ที่สอบถามและตั้งการเปิด/ปิดการสร้างชื่อสั้น ถอด (strip) ชื่อสั้นที่มีอยู่ และสแกนการอ้างอิงรีจิสทรีที่จะได้รับผลเมื่อถอด  2 3 4 5

  4. Microsoft Learn, Reparse points. ว่าด้วยจุดรีพาร์สที่เป็นชุดของข้อมูลที่ผู้ใช้กำหนดกับแท็กรีพาร์สที่ระบุรูปแบบข้อมูลนั้นไม่ซ้ำ เมื่อเปิดไฟล์ที่มีจุดรีพาร์ส ระบบไฟล์พยายามประมวลผลที่ตรงแท็ก (การประมวลผลโดยฟิลเตอร์ระบบไฟล์ที่ตีความแท็ก) ถูกใช้ในอิมพลีเมนต์ลิงก์ระบบไฟล์ของ NTFS และที่เก็บระยะไกล (หน่วยความจำแบบชั้น) และตรวจการมีด้วยแอตทริบิวต์ FILE_ATTRIBUTE_REPARSE_POINT  2 3 4

  5. Microsoft Learn, NTFS overview. ว่าด้วย NTFS ที่ใช้ไฟล์ล็อกกับข้อมูลจุดตรวจ และเมื่อระบบล้ม จะเล่นล็อกธุรกรรมซ้ำตอนบูตครั้งถัดไปเพื่อกู้ความสอดคล้องของระบบไฟล์อัตโนมัติ การรีแมปเซกเตอร์เสียแบบพลวัต และ self-healing NTFS ที่ซ่อมความเสียหายเล็กน้อยในพื้นหลัง  2 3 4

  6. Microsoft Learn, Change Journals. ว่าด้วยทุกครั้งที่ไฟล์หรือไดเรกทอรีในวอลุ่มถูกเปลี่ยน เนื้อหาการเปลี่ยนกับชื่อไฟล์/ไดเรกทอรีเป้าถูกบันทึกในวารสารการเปลี่ยน USN ของวอลุ่มนั้น วารสารถูกรักษาทีละวอลุ่ม และใช้กู้ดัชนีระบบไฟล์หลังล้มได้ โดยเลี่ยงการทำดัชนีวอลุ่มทั้งก้อนใหม่  2 3 4 5 6

  7. Microsoft Learn, Sparse Files. ว่าด้วยไฟล์สปาร์สที่ไม่จัดสรรพื้นที่ดิสก์กายภาพให้ช่วงใหญ่ที่ประกอบด้วยศูนย์ และจัดสรรพื้นที่เฉพาะส่วนที่มีข้อมูล การอ่านช่วงที่ไม่มีจัดสรรคืนศูนย์  2 3

  8. Microsoft Learn, File Compression and Decompression. ว่าด้วยการบีบอัดไฟล์ของ NTFS ที่ทำโปร่งใส ข้อมูลถูกบีบอัดและเก็บทีละหน่วยบีบอัด GetCompressedFileSize ที่ดึงขนาดหลังบีบอัด (จัดสรรจริง) ได้ และการอ่านเขียนไฟล์บีบอัดที่มาพร้อมต้นทุนขยายและบีบอัดใหม่  2 3

  9. Microsoft Learn, Streams - Sysinternals. ว่าด้วยยูทิลิตี streams ของ Sysinternals ที่แจกและลบสตรีมข้อมูลสำรองของไฟล์ NTFS ได้  2

  10. Microsoft Learn, Creating, Modifying, and Deleting a Change Journal และ fsutil usn. ว่าด้วย MaximumSize ของวารสารการเปลี่ยนที่เป็นค่าเป้าหมาย และเมื่อขนาดเกินผลรวม MaximumSize กับ AllocationDelta จะถูกตัดตอนจุดตรวจของ NTFS AllocationDelta ที่เป็นหน่วยการเพิ่มท้ายวารสารและการลบจากต้น fsutil usn queryjournal ที่อ้างอิงสถานะและความจุของวารสาร และ readjournal ที่อ้างอิงเนื้อหาที่บันทึก จากโปรแกรมใช้ FSCTL_CREATE_USN_JOURNAL / FSCTL_QUERY_USN_JOURNAL / FSCTL_READ_USN_JOURNAL / FSCTL_DELETE_USN_JOURNAL และการลบหรือปิดวารสารที่ทำงานอยู่ที่มาพร้อมการสแกน MFT ทั้งก้อน และบังคับบริการที่ใช้วารสารให้สแกนวอลุ่มใหม่  2 3 4

บทความล่าสุดที่มีแท็กเดียวกัน เพื่อเจาะลึกหัวข้อใกล้เคียง

เชิงลึกของ Windows I/O (ตอนที่ 4) — Cache Manager: WriteFile ของคุณไปถึงดิสก์เมื่อใด

ตอนที่ 4 ของซีรีส์ที่อธิบาย Cache Manager ของ Windows ด้วยแผนภาพ จัดแคชที่อิมพลีเมนต์เป็นการแมปไฟล์ การอ่านล่วงหน้ากับการเขียนแบบหน่วง กา...

เชิงลึกของ Windows I/O (ตอนที่ 6・ตอนสุดท้าย) — ไดรเวอร์ฟิลเตอร์กับมินิฟิลเตอร์: เหตุที่ Procmon และการสแกนไวรัสแทรก I/O ได้

ตอนสุดท้ายของซีรีส์ที่อธิบายไดรเวอร์ฟิลเตอร์และมินิฟิลเตอร์ของ Windows ด้วยแผนภาพ ครอบ Filter Manager กับอัลติจูด คอลแบ็ก pre/post กลไกที...

OneDrive "ไฟล์ตามความต้องการ" กับแอปธุรกิจ — ข้อสมมติที่เพลสโฮลเดอร์ทำลาย และวิธีรับมือ

CSV บนเดสก์ท็อปเปิดไม่ได้ หรือการนำเข้าล้มเหลวด้วย "ไม่พบไฟล์" — สาเหตุอาจเป็น Known Folder Move และไฟล์ตามความต้องการของ OneDrive บทความ...

พร็อกซีองค์กรและแอป Windows — จัดระเบียบการหาพร็อกซีใน WinINET, WinHTTP และ .NET

เบราว์เซอร์ผ่านได้ แต่มีแค่แอปธุรกิจที่ข้ามพร็อกซีองค์กรไม่ได้ สาเหตุมักเป็นการไม่ตรงกันของค่าพร็อกซีที่ WinINET, WinHTTP, ตัวแปรสภาพแวดล...

แนวปฏิบัติมัลติเธรดเชิงปฏิบัติ: ฉบับ .NET — สิ่งที่ต้องตัดสินก่อนเพิ่มเธรด

เรียบเรียงหลักออกแบบที่กันไม่ให้โค้ดมัลติเธรด .NET/C# «แครชหรือค้างเป็นครั้งคราว»: อย่าสร้างเธรดเอง ให้ขี่ Task ลดสถานะที่เปลี่ยนแปลงร่วม...

หน้าเหล่านี้วางหัวข้อไว้ในบริบทที่กว้างขึ้นของบริการและการตัดสินใจ

บทความนี้เกี่ยวข้องโดยตรงกับบริการต่อไปนี้

คำถามที่พบบ่อย

คำถามที่มักพบในการปรึกษาเกี่ยวกับหัวข้อของบทความนี้

MFT (Master File Table) คืออะไร?
โครงสร้างข้อมูลที่เป็นหัวใจของวอลุ่ม NTFS คือสมุดทะเบียนที่มีอย่างน้อยหนึ่งรายการ (เรกคอร์ดไฟล์) สำหรับทุกไฟล์บนวอลุ่ม รวมรายการของ MFT เองด้วย ข้อมูลทั้งหมดเกี่ยวกับไฟล์ ตั้งแต่ขนาด การประทับเวลา สิทธิ์เข้าถึง ไปจนเนื้อหาข้อมูลเอง ถูกเก็บในรายการ MFT หรือในพื้นที่นอก MFT ที่รายการชี้ไป ไฟล์เล็กพอจะเก็บตัวข้อมูลทั้งก้อนในรายการ MFT (เรซิเดนต์) ไฟล์ใหญ่มีแค่การอ้างอิงไปที่วางข้อมูล (แถวคลัสเตอร์) ถูกบันทึกในรายการ (นอนเรซิเดนต์) เมื่อลบไฟล์ รายการถูกทำเครื่องหมายว่างเพื่อใช้ใหม่ แต่ขนาดของ MFT เองไม่หด
ข้อมูลที่มองไม่เห็นชื่อ «Zone.Identifier» ที่ติดไฟล์คืออะไร?
เป็นหนึ่งในสตรีมข้อมูลหลายอันของ NTFS (สตรีมข้อมูลสำรอง) ใน NTFS ไฟล์หนึ่งไฟล์มีลำดับไบต์ (สตรีม) ได้หลายอัน สิ่งที่อ่านเขียนปกติคือสตรีมเริ่มต้นที่ไม่มีชื่อ Windows บันทึกแหล่งที่มาของไฟล์ (ดาวน์โหลดจากอินเทอร์เน็ต ฯลฯ) ในสตรีมเพิ่มที่ระบุด้วยเครื่องหมายทวิภาคอย่าง «file.txt:Zone.Identifier» นี่คือที่เรียก «Mark of the Web» และเป็นวัตถุดิบการตัดสินของคำเตือน SmartScreen และมุมมองที่ป้องกันของ Office สตรีมสำรองไม่โผล่ในการแสดงขนาดของ Explorer ตรวจได้ด้วยคำสั่ง dir /r หรือเครื่องมือ streams ของ Sysinternals จุดที่ต้องระวังคือ เมื่อคัดลอกไประบบไฟล์ที่ไม่ใช่ NTFS (FAT ฯลฯ) จะไม่ถูกเก็บ
ฮาร์ดลิงก์กับลิงก์สัญลักษณ์ต่างกันอย่างไร?
ฮาร์ดลิงก์คือ «ชื่อระดับเดียวกันอีกอันที่ชี้ตัวจริงไฟล์เดียวกัน (เรกคอร์ด MFT เดียวกัน) ถูกเพิ่ม» สร้างได้แค่ในวอลุ่มเดียวกัน เข้าถึงจากชื่อใดก็เป็นไฟล์เดียวกัน และลบชื่อหนึ่ง ถ้ายังมีชื่ออื่นอยู่ ไฟล์ไม่หาย ลิงก์สัญลักษณ์คือ «ป้ายที่ชี้ไปพาธอื่น» ถูกอิมพลีเมนต์เป็นจุดรีพาร์ส เพราะถือแค่สตริงพาธปลายทาง จึงชี้วอลุ่มอื่นหรือระยะไกลได้ แต่ถ้าปลายทางหายจะตัน ในงานจริง หลักคือฮาร์ดลิงก์ใช้แชร์ตัวจริง (ความหมายของการลบเปลี่ยน) ลิงก์สัญลักษณ์ใช้เปลี่ยนพาธ (ย้ายหรือเปลี่ยนทิศ)
NTFS เป็นระบบไฟล์แบบวารสาร งั้นตัดไฟข้อมูลก็ไม่หายหรือ?
ต้องเข้าใจขอบที่ถูกป้องกันให้ถูก สิ่งที่ล็อกธุรกรรมของ NTFS ($LogFile) ป้องกันคือความสอดคล้องของโครงสร้างระบบไฟล์ (เมทาดาตา) แม้ระบบล้ม ตอนบูตครั้งถัดไปใช้ล็อกกู้ความสอดคล้องอัตโนมัติ กันสถานการณ์ «วอลุ่มพังอ่านไม่ได้» แต่ไม่ได้หมายความว่าเนื้อหาข้อมูลของไฟล์ที่กำลังเขียนอยู่ถูกกู้ ตามที่เห็นในตอนที่ 4 ของซีรีส์ ข้อมูลสกปรกบนแคชหายเมื่อตัดไฟ ดังนั้นความเข้าใจที่ถูกคือ «วอลุ่มไม่พัง แต่เนื้อหาการเขียนครั้งสุดท้ายอาจหาย» ถ้าต้องการความทนทานของข้อมูลเอง ต้องสร้างด้วย FlushFileBuffers, WRITE_THROUGH หรือการออกแบบการเขียนฝั่งแอป (ไฟล์ชั่วคราว+เปลี่ยนชื่อ ฯลฯ)
ทำไม «ขนาด» ของไฟล์กับ «ขนาดบนดิสก์» จึงต่าง?
เพราะใน NTFS ความยาวเชิงตรรกะของไฟล์กับพื้นที่ดิสก์ที่ถูกจัดสรรจริงถูกจัดการแยก แม้ไฟล์ปกติก็ต่างเพราะจัดสรรปัดขึ้นเป็นหน่วยคลัสเตอร์ (ค่าเริ่มต้น 4KB) แต่ที่ห่างมากคือไฟล์สปาร์สกับไฟล์บีบอัด ไฟล์สปาร์สไม่จัดสรรพื้นที่จริงให้ช่วงที่เป็นศูนย์ต่อเนื่อง จัดการเป็น «หลุม» จึงเกิดได้ที่ขนาดตรรกะหลาย GB แต่บนดิสก์แค่ไม่กี่ MB ไฟล์บีบอัดถูกจัดสรรแค่ขนาดหลังบีบอัด ในทางกลับกัน ถ้า «ขนาดบนดิสก์» ดูใหญ่กว่า สาเหตุอาจเป็นการปัดคลัสเตอร์หรือสตรีมข้อมูลสำรอง

โปรไฟล์ผู้เขียน

หน้าแนะนำผู้เขียนบทความ

Go Komura

ผู้แทนของ KomuraSoft LLC

เชี่ยวชาญด้านการพัฒนาซอฟต์แวร์ Windows ที่ปรึกษาเทคนิค และการตรวจสอบบั๊ก โดยเฉพาะโปรเจกต์ที่มีระบบเดิมและบั๊กที่ทำซ้ำได้ยาก

ลิงก์สาธารณะ

กลับไปยังบล็อก