मैं एक ही फाइल सिस्टम पर "माउंट-बिंद" निर्देशिका से एक फ़ाइल के लिए एक `हार्डलिंक 'क्यों नहीं बना सकता हूं?


9

मूल समस्या

मेरे पास एक फाइल सिस्टम पर एक फाइल है: /data/src/file

और मैं इसे कड़ी से कड़ी करना चाहता हूँ: /home/user/proj/src/file

लेकिन /homeएक डिस्क पर है, और /dataदूसरे पर है तो मुझे एक त्रुटि मिलती है:

$ cd /home/user/proj/src
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

ठीक है, इसलिए मैंने सीखा कि मैं उपकरणों के बीच कड़ी नहीं बना सकता। समझ में आता है।

हाथ में समस्या

इसलिए मैंने सोचा कि मैं कल्पना करूंगा और एक srcफ़ोल्डर को बांधूंगा जो कि /dataफाइल सिस्टम पर है:

$ mkdir -p /data/other/src
$ cd /home/user/proj
$ sudo mount --bind /data/other/src src/
$ cd src
$ # (now we're technically on `/data`'s file system, right?)
$ ln /data/src/file .
ln: failed to create hard link './file' => '/data/src/file': Invalid cross-device link

यह अभी भी काम क्यों नहीं करता है?

वैकल्पिक हल

मुझे पता है कि मेरे पास यह सेटअप सही है क्योंकि मैं /dataबाध्य लिंक के बजाय "वास्तविक" निर्देशिका में हार्ड लिंक बना सकता हूं ।

$ cd /data/other/src
$ ln /data/src/file .
$ # OK
$ cd /home/user/proj/src
$ ls -lh
total 35M
-rw------- 2 user user 35M Jul 17 22:22 file

$

कुछ सिस्टम जानकारी

$ uname -a
Linux <host> 4.10.0-24-generic #28-Ubuntu SMP Wed Jun 14 08:14:34 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux

$ findmnt
.
.
.
├─/home                               /dev/sdb8   ext4       rw,relatime,data=ordered
│ └─/home/usr/proj/src             /dev/sda2[/other/src]
│                                                 ext4       rw,relatime,data=ordered
└─/data                               /dev/sda2   ext4       rw,relatime,data=ordered

$ mountpoint -d /data
8:2

$ mountpoint -d /home/usr/proj/src/
8:2

नोट : मैंने स्थिति को और अधिक स्पष्ट करने के लिए फ़ाइल और निर्देशिका नामों को मैन्युअल रूप से बदल दिया है, इसलिए कमांड रीडआउट में एक टाइपो या दो हो सकते हैं।


2
इससे कोई फर्क नहीं पड़ता कि आप फ़ोल्डर को कहां माउंट करते हैं। वे अलग-अलग विभाजन पर भौतिक हैं। प्रत्येक विभाजन की अपनी फाइल टेबल होती है और हार्डलिंक इस तालिका में सिर्फ रिकॉर्ड होता है।
user996142

2
यहाँ मुद्दा यह है कि फाइलें भौतिक रूप से भिन्न विभाजन पर नहीं हैं। यह एक ही विभाजन से एक ही फाइल सिस्टम है। अंतर बाइंड माउंट है।
रोआमा

बाइंड माउंट केवल एक कल्पना है। यह डिस्क पर डेटा संरचनाओं को नहीं बदलता है। फ़ाइल सिस्टम अभी भी भौतिक रूप से अलग हैं।
बॉब एगर

लेकिन जब मैं हार्ड लिंक बनाता हूं, तो मैं /dataबाइंड माउंट डायरेक्टरी से इनकोड एक्सेस कर सकता हूं, इसलिए या तो बाइंड माउंट उसी विभाजन पर होना चाहिए /data, या हार्ड लिंक डिवाइसों पर काम कर रहा है, जो कि अवैध होना चाहिए, लेकिन वैसे भी काम करता है। मैं क्या खो रहा हूँ?
jdk1.0

जवाबों:


6

कोड में टिप्पणियों की निराशाजनक कमी है । यह ऐसा है जैसे कोई भी कभी भी इसे उपयोगी नहीं समझता है, क्योंकि v2.4 में बाइंड माउंट को लागू किया गया था। निश्चित रूप से आप सभी को यह करने की आवश्यकता होगी .mnt->mnt_sbकि वह कहाँ है .mnt...

क्योंकि यह आपको एक सबट्री के चारों ओर एक सुरक्षा सीमा प्रदान करता है।

पुनश्च: जिसकी चर्चा बहुत बार की गई थी, लेकिन खोजों से बचने के लिए: उदाहरण के लिए विचार करें - माउंट-बिंद / tmp / tmp; अब आपके पास एक ऐसी स्थिति आ गई है जब उपयोगकर्ता कहीं और रूट एफएस के लिंक नहीं बना सकते हैं, भले ही उनके पास / tmp उनके लिए उपयुक्त हो। इसी तरह की टेकनीक अन्य अलगाव आवश्यकताओं के लिए काम करती है - मूल रूप से, आप दिए गए सबट्री के लिए नाम / लिंक को परिभाषित कर सकते हैं। IOW, यह एक जानबूझकर सुविधा है। ध्यान दें कि आप पेड़ों के एक झुंड को चुरोट में बांध सकते हैं और इस बात की परवाह किए बिना कि कैसे एक साल बाद मुख्य वृक्ष में सामान मिल सकता है, के बारे में अनुमान लगाने योग्य प्रतिबंध प्राप्त कर सकते हैं।

- अल विरो

थ्रेड के नीचे एक ठोस उदाहरण है

जब भी हमें माउंट -r - बिंड ठीक से काम करने को मिलता है (जो मैं पेज कैश साझा करने की अनुमति देते समय चेरोट जेल के अंदर आवश्यक साझा पुस्तकालयों की प्रतियां लगाने के लिए उपयोग करता हूं), तो यह सुविधा सुरक्षा को तोड़ देगी।

mkdir /usr/lib/libs.jail
for i in $LIST_OF_LIBRARIES; do
ln /usr/lib/$i /usr/lib/libs.jail/$i
done
mount -r /usr/lib/libs.jail /jail/lib
chown prisoner /usr/log/jail
mount /usr/log/jail /jail/usr/log
chrootuid /jail prisoner /bin/untrusted &

हालाँकि सुरक्षा पर्याप्त होनी चाहिए, लेकिन मैं कैदी लिंक /jail/lib/libfoo.so (रिटर्न EROFS लिखना) / जेल / usr / लॉग में जाने से बचूँगा जहाँ यह संभावित रूप से लेखन योग्य है।


-1

कारण यह है कि आप क्रॉस-डिवाइस लिंकिंग नहीं कर सकते क्योंकि आप अस्पष्टता का परिचय देते हैं। फ़ाइल के लिए निर्देशिका प्रविष्टि में (सरल सिस्टम में) संबंधित फ़ाइल के लिए आई-नोड नंबर होता है। कड़ी कड़ी (बस एक और निर्देशिका प्रविष्टि) में भी एक ही आई-नोड संख्या सम्‍मिलित है। यह ठीक है, लेकिन आई-नोड नंबर केवल एकल फ़ाइल सिस्टम के भीतर अद्वितीय हैं (वे आमतौर पर 1 पर शुरू होने वाला एक घना सेट हैं)।

आपका बाइंड माउंट उस समस्या को ठीक नहीं करता है। हां, यह संरचना के एक प्रकार के 'फिक्शन' का निर्माण करता है, लेकिन यह क्या नहीं करता है, यह सुनिश्चित करने के लिए कि एक फाइल सिस्टम पर सभी आई-नोड्स को फिर से नंबर दिया जाए, यह सुनिश्चित करने के लिए कि वे दोनों फाइल सिस्टम से संबंधित हैं; वह मूर्खतापूर्ण होगा।

यह प्रतिबंध हमेशा यूनिक्स प्रणालियों पर रहा है। इसे हल करने के लिए प्रतीकात्मक लिंक का आंशिक रूप से आविष्कार किया गया था। मुझे पता है कि वे कार्यात्मक रूप से समान नहीं हैं, लेकिन वे आमतौर पर ठीक हैं।

एक प्रतीकात्मक लिंक की कोशिश करो? ( ln -s)


यहाँ किसी भी इनोड का नाम बदलने का कोई नाम नहीं होगा। केवल एक अंतर्निहित फाइल सिस्टम है, जिसमें दो दृश्य हैं।
गाइल्स 'एसओ- बुराई को रोकना'

एक कारण मैं प्रतीकात्मक लिंक नहीं चाहता था क्योंकि मेरे रास्ते लंबे थे और यह गड़बड़ कर रहा था ls -l। Kinda मूर्खतापूर्ण तर्क पर पहले, लेकिन फिर यह एक खरगोश छेद करने के लिए नेतृत्व और मैं कड़ी मेहनत के साथ क्या हो रहा था के रूप में उत्सुक था ...
jdk1.0

@ गिल्स, वही मैं कह रहा था। मैं जो बिंदु बना रहा था, वह यह था कि इनोड रिन्यूमरिंग हास्यास्पद होगा। पता नहीं क्यों एक सही जवाब नीचा दिखाया गया था।
बॉब एगर

आपको निष्कर्ष सही मिलता है, लेकिन आपका स्पष्टीकरण इतने सारे स्थानों पर गलत है कि आपका जवाब एक पूरी तरह से भ्रामक है। एक अच्छी व्याख्या के लिए sourcejedi का उत्तर देखें।
गिलेस एसओ- बुराई को रोकना '

मुझे कोई त्रुटि नहीं दिख रही है, हालांकि मैं मानता हूं कि मैं स्पष्ट हो सकता था।
बॉब एगर
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.