วิธีสร้างฮาร์ดลิงก์ไปยัง inode (ext4)


17

ถ้าฉันรู้ว่าโหนดดัชนี (inode) ของไฟล์ แต่ฉันไม่รู้เส้นทางของมัน (หรือเส้นทางใด ๆ ) มันเป็นไปได้ไหมที่จะสร้างฮาร์ดลิงก์ไปยัง inode นั้นโดยตรง

ฉันพบไฟล์ที่ใช้sudo find / -inum 123546แล้วสร้างฮาร์ดลิงก์ แต่มันจะช้าเกินไปสำหรับแอปพลิเคชันของฉัน

NB ฉันใช้ระบบไฟล์ ext4


1
ที่เกี่ยวข้องอย่างใกล้ชิด: การลบหรือเปลี่ยนชื่อไฟล์ผ่าน inode (ทั้งสองอย่างนั้นไม่สามารถทำได้โดยตรงเท่ากัน)
Gilles 'หยุดความชั่วร้าย'

คำตอบ:


23

AFAIK ไม่ใช่กับเคอร์เนล API หากมีอินเทอร์เฟซดังกล่าวก็จะต้องถูก จำกัด ให้ผู้ใช้ขั้นสูงเป็นอย่างอื่นที่จะช่วยให้ทุกคนเข้าถึงไฟล์ในไดเรกทอรีที่พวกเขาไม่มีการเข้าถึงการค้นหา

แต่คุณสามารถใช้debugfsในระบบไฟล์ (เมื่อยกเลิกการต่อเชื่อม) เพื่อทำมัน (สมมติว่าคุณมีสิทธิ์เข้าถึงการเขียนในอุปกรณ์บล็อก)

debugfs -w / dev / block / อุปกรณ์

(แทนที่/dev/block/deviceด้วยอุปกรณ์บล็อกจริงที่ระบบไฟล์อยู่)

จากนั้นเมื่อพร้อมต์ให้debugfsป้อน

สถิติ < 123 >
(ด้วยวงเล็บเหลี่ยมแทนที่ 123 ด้วยหมายเลขไอโหนดจริง) เพื่อตรวจสอบว่าไฟล์นั้นมีอยู่ (inode มีจำนวนลิงก์มากกว่า 0) และไม่ใช่ไดเรกทอรี

ถ้าดีให้ป้อน:

ln < 123 > path / to / newfile
เพื่อสร้างฮาร์ดลิงก์ (โปรดทราบว่าพา ธ นั้นสัมพันธ์กับรูทของระบบไฟล์) ติดตามโดย:

ไมล์ < 123 >
เพื่อเพิ่มจำนวนลิงค์ (กดEnterสำหรับฟิลด์ทั้งหมดยกเว้นจำนวนลิงก์ที่คุณต้องการเพิ่ม 1 ในค่าปัจจุบัน)


6
อินเทอร์เฟซดังกล่าวจะต้องตรวจสอบว่าไฟล์มีจำนวนลิงค์ที่ไม่ใช่ศูนย์มิฉะนั้นจะเป็นไปได้ที่จะเรียกคืนไฟล์ที่ถูกลบ แต่ยังคงเปิดอยู่ซึ่ง IIRC นั้นถูกปฏิเสธเพราะละเมิดค่าเคอร์เนล
Gilles 'หยุดความชั่วร้าย'

2
@Gilles ที่เกี่ยวข้อง: unix.stackexchange.com/a/499760/308316
mosvy

1
@PhilipCouling บิตสิทธิการใช้งานบนไดเรกทอรีแปลเป็นสิทธิ์ในการค้นหา ฉันพูดไปแล้วในไดเรกทอรีแล้วไม่สามารถเข้าถึงการค้นหาได้
Stéphane Chazelas

3
@OrangeDog สิทธิ์การค้นหาเป็นคำศัพท์ที่ใช้โดยมาตรฐาน POSIX
Stéphane Chazelas

1
@mosvy: การตรวจสอบนั้นสามารถลบได้จากเคอร์เนล คุณต้องแก้ไขสถานที่สองแห่งใน VFS เพื่อไม่ให้เกิดปัญหากับตัวเอง ฉันทำมันในขณะที่ทำงานกับวิทยานิพนธ์ของฉันปีที่ผ่านมา
Joshua

3

ขึ้นอยู่กับกรณีการใช้งานของคุณวิธีอื่นอาจเป็นการรวบรวมผู้สมัครไฟล์ทั้งหมดในไดเรกทอรีเดียวก่อนโดยการเชื่อมโยงอย่างหนักจากนั้นทำการเชื่อมโยงไฟล์ที่คุณสนใจเป็นพิเศษ

เช่น

mkdir -pm 0700 by-inode/{0..999}
find <path> ! -type d -printf "%i/%p\0" |
  while IFS=/ read -rd '' i n; do
    ln "$n" "by-inode/$((i/1000))/$i"
  done

(สมมติว่าหมายเลขไอโหนดของคุณน้อยกว่า 1,000,000 สร้างไดเรกทอรีเพิ่มเติมถ้าจำเป็น)

หลังจากนั้น inodes ของคุณจะถูกจัดกลุ่ม 1,000 คนและรวบรวมไว้ในby-inode/ต้นไม้ จากตรงนั้นคุณสามารถลิงก์ได้ตามต้องการ

โปรดทราบว่าหมายความว่าการลบไฟล์ภายใต้<path>จะไม่เรียกคืนพื้นที่เนื่องจากการเชื่อมโยงที่ยากเป็นพิเศษ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.