নিয়মিত ব্যবহারকারী কেন বিটিআরএফএস সাবভলিউম মুছতে পারবেন না


12

একটি লুপ মাউন্টযুক্ত ব্যবহারকারী তৈরি বিটিআরএফএস ফাইল সিস্টেম ব্যবহার করে অনুমতিগুলি সঠিকভাবে সেট করার সাথে ব্যবহারকারীর অবাধে বিআরটিএফএস সাবভলিউম তৈরি করতে সক্ষম হয়:

user@machine:~/btrfs/fs/snapshots$ /sbin/btrfs sub create newsubvol
Create subvolume './newsubvol'

তবে, ত্রুটিতে নতুন তৈরি সাবভলিউম ফলাফল মুছে ফেলার চেষ্টা করা হচ্ছে:

user@machine:~/btrfs/fs/snapshots$ /sbin/btrfs sub del newsubvol
Delete subvolume '/home/user/btrfs/fs/snapshots/newsubvol'
ERROR: cannot delete '/home/user/btrfs/fs/snapshots/newsubvol'

মূল ব্যবহারকারী অবশ্যই এটি মুছতে সক্ষম:

root@machine:/home/user/btrfs/fs/snapshots# /sbin/btrfs sub del newsubvol
Delete subvolume '/home/user/btrfs/fs/snapshots/newsubvol'

ক্রিয়াকলাপ এবং মুছুন অপারেশনগুলির মধ্যে আচরণের এই পার্থক্যটি কিছুটা অদ্ভুত বলে মনে হয়। কেউ কি এটার উপর একটু আলো ফেলতে পারো?

এখানে আদেশের সঠিক ক্রমটি রয়েছে:

user@machine:~$ dd if=/dev/zero of=btrfs_disk bs=1M count=100
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 1.2345 s, 84.9 MB/s
user@machine:~$ mkdir mountpoint
user@machine:~$ /sbin/mkfs.btrfs btrfs_disk

WARNING! - Btrfs Btrfs v0.19 IS EXPERIMENTAL
WARNING! - see http://btrfs.wiki.kernel.org before using

SMALL VOLUME: forcing mixed metadata/data groups
Created a data/metadata chunk of size 8388608
fs created label (null) on btrfs_disk
    nodesize 4096 leafsize 4096 sectorsize 4096 size 100.00MB
Btrfs Btrfs v0.19
user@machine:~$ sudo mount btrfs_disk mountpoint/
user@machine:~$ cd mountpoint/
user@machine:~/mountpoint$ /sbin/btrfs sub create test
Create subvolume './test'
user@machine:~/mountpoint$ /sbin/btrfs sub delete test
Delete subvolume '/home/user/mountpoint/test'
ERROR: cannot delete '/home/user/mountpoint/test' - Operation not permitted

এখানে অনুমতিগুলি রয়েছে:

user@machine:~/mountpoint$ ls -la
total 4
drwxr-xr-x 1 user user    8 Set  4 09:30 .
drwx------ 1 user user 4486 Set  4 09:29 ..
drwx------ 1 user user    0 Set  4 09:38 test

এবং সম্পর্কিত লাইন df -T:

Filesystem              Type     1K-blocks      Used Available Use% Mounted on
/dev/loop0              btrfs       102400        32     98284   1% /home/user/mountpoint

ডিস্ট্রো হ'ল ডেবিয়ান হুইজি, 3.2.0-4-686-paeকার্নেল, v0.19বিটিআরএফএস-সরঞ্জামগুলি। উবুন্টু সসিতে, 3.11.0-4-genericকার্নেল, v0.20-rc1বিটিআরএফএস-সরঞ্জামগুলিতে এখনও পরিস্থিতি দেখা দেয় ।


আমার বোঝার থেকে এই ফাইল সিস্টেমের ধরণটি এখনও পরীক্ষামূলক এবং উত্পাদন প্রস্তুত নয়।
এমডিপিসি

আপনি আউটপুট যোগ করতে পারেন df -Tএবং btrfs version? যখন আমি একই চেষ্টা করেছি তখন আমি নীচের ত্রুটি পেয়েছি "ERROR: সাবভলিউম তৈরি করতে পারে না - অনুমতি অস্বীকার করা হয়েছে"
বিএসডি

@ এমডিপিসি যদিও এটি সত্য, বিটিআরএফস কয়েক বছর ধরে রয়েছে এবং এটি এই পর্যায়ে কিছুটা স্থিতিশীল হবে বলে আশা করা হচ্ছে। এটি এই মুহুর্তে এটি কোনও বাগ বা একটি 'বৈশিষ্ট্য' কিনা তা এখনও বোঝার জন্য কার্যকর হতে পারে।
goncalopp

@ নীচে আমি কমান্ড, ডিএফ এবং আমার ব্যবহৃত সংস্করণগুলির যথাযথ ক্রম যুক্ত করেছি।
goncalopp

3.2 কার্নেলটি এখন দেড় বছরেরও বেশি পুরানো। আপনি যদি পরীক্ষামূলক ফাইল সিস্টেমের সাথে খেলতে চান তবে আপনি আরও ডেট আপ টু ডেট কার্নেল চালাতে চাইতে পারেন।
psusi

উত্তর:


14

আচ্ছা এটি আমার জন্য একটি শিক্ষণীয় অভিজ্ঞতা ছিল কিন্তু আমি অবশেষে এটি বের করে ফেললাম। আমি এখানে আমার প্রক্রিয়াটি ব্যাখ্যা করব যাতে আপনার নিজেরাই কীভাবে এই জিনিসগুলি বের করা যায় তা জানার পক্ষে সহজ (বিটিআরএফএস ডকুমেন্টেশন, যেমনটি আমি নিশ্চিত যে আপনি খুঁজে পেয়েছেন, আপাতত তুলনামূলকভাবে অসম্পূর্ণ)।

প্রথমে আমি ভেবেছিলাম যে সাবভলিউম তৈরি ioctlকরা হ্যান্ডলারের সাহায্যে কোনও সামর্থ্য যাচাই করে না (এটির কোনও যুক্তি ছিল কিনা তার উপর নির্ভর করে কোনও সুরক্ষা সমস্যা থাকতে পারে বা নাও হতে পারে) যখন এটি মুছলে সরাসরি মেটাডেটা পরিবর্তন করা হয় (এবং এভাবে ব্যবহারকারীর CAP_SYS_RAWIOসঠিকভাবে কাজ করার প্রয়োজন হতে পারে )।

যাচাই করতে, আমি btrfs-utilsউত্স কোডটি খুলতে ফাটাল দিয়েছি এবং এটি আমি পেয়েছি:

Create subvolume, cmds-receive.c Line 180:
         ret = ioctl(r->dest_dir_fd, BTRFS_IOC_SUBVOL_CREATE, &args_v1);

Delete subvolume, cmds-subvolume.c Line 259:
         res = ioctl(fd, BTRFS_IOC_SNAP_DESTROY, &args);

ঠিক আছে, এটি সহায়ক নয়, তারা উভয়ই আইওএসটিএল (আকর্ষণীয় দিক নোট: "স্নাপশট" কোনও কারণে "সাবভলিউম" সহ সোর্স কোডে আন্তঃব্যক্তভাবে ব্যবহৃত হয়)। তাই আমি কার্নেল উত্স কোডে গিয়ে উভয় হ্যান্ডলারের সন্ধান পেয়েছি fs/btrfs/ioctl.c

অবশেষে, আমি এটি btrfs_ioctl_snap_destroy()2116 লাইনে ফিরে পেয়েছি :

     if (!capable(CAP_SYS_ADMIN)){

বিশেষত, এটি যদি তাদের সামর্থ্য না থাকে তবে এটি যদি তাদের কাছে থাকে তবে এটি একটি চেক , লজিকটি অপারেশন সম্পাদন করতে সরাসরি চলে যায়। আইএফ স্টেটমেন্টের বডিটি এটি পরীক্ষা করে যে এটি নিয়মিত ব্যবহারকারী যিনি সাবভলিউমের ইনোডের মালিক এবং USER_SUBVOL_RM_ALLOWEDবিটিআরএফএস অপশনটি হ্যান্ডলারের সম্পাদন চালিয়ে যেতে সক্ষম করে কিনা তা পরীক্ষা করে। তাদের যদি হয় না তবে আইওসিটিএল হ্যান্ডলার একটি ত্রুটি সহ প্রস্থান করে।

সুতরাং দেখে মনে হচ্ছে একটি "স্ন্যাপশট" (ওরফে "সাবভলিউম") ধ্বংস করার জন্য সাধারণত এমন একটি ব্যবহারকারী প্রয়োজন যা CAP_SYS_ADMIN(অথবা USER_SUBVOL_RM_ALLOWEDসক্ষম করতে হবে এবং ব্যবহারকারী প্রদত্ত সাবভলিউমের "মালিকানাধীন) রয়েছে) দুর্দান্ত, একটি স্ন্যাপশট / ভলিউম তৈরি সম্পর্কে কী?

আইওসিটিএল-এর btrfs_ioctl_snap_create()হ্যান্ডলারটি প্রদর্শিত হয় বলে মনে হয় এই হ্যান্ডলারটিতে capable()প্রত্যক্ষ বা অপ্রত্যক্ষভাবে কোনও কল নেই । যেহেতু মূল উপায় অ্যাক্সেসকে দালাল করা হচ্ছে আমি এটি বোঝাতে চাইছি যে সাবভলিউম সৃষ্টি সর্বদা সফল হয়। আপনি যা দেখছেন তা আপনি কেন দেখছেন তা কার্যকরী স্তরে এটি ব্যাখ্যা করে।

বিটিআরএফএসের প্রধান ব্যবহারের ক্ষেত্রে সীমাবদ্ধ ব্যবহারকারীর অ্যাক্সেস সহ কোনও সার্ভারের সাথে কেন এটিকে কেন আকাঙ্ক্ষিত বলে বিবেচনা করা যায় তা আমি বলতে পারি না । এটি পর্যাপ্ত নয় তবে কার্যত বন্ধ করার জন্য আমি কোনও কোড দেখছি না। এটি কেন (এবং আপনি এটির যত্ন নিতে চান) এর কোনও উত্তর খুঁজে না পেলে আপনাকে কার্নেল মেলিং তালিকায় জিজ্ঞাসা করতে হতে পারে।

উপসংহার

আমার গবেষণায় বোঝা যাচ্ছে যে যে কেউ সাবভলিউম তৈরি করতে পারে তবে একটি সাবভলিউম মুছতে আপনার প্রয়োজন হয় CAP_SYS_ADMINবা এটি উভয়ই সত্য প্রয়োজন যে কলিং ব্যবহারকারী সাবভলিউম ইনোডের মালিক এবং USER_SUBVOL_RM_ALLOWEDসক্ষম both

সাবভলিউম তৈরির কোনও অর্থ নেই তাই আমি সম্ভবত কিছু অপ্রত্যক্ষভাবে অনুপস্থিত যা অপারেশনটিকে অস্বীকার করা হয়েছে যেহেতু এটি কোনও সিস্টেমের সহজ পদ্ধতির মতো বলে মনে হচ্ছে।

দ্রষ্টব্য: আমি এমন কোনও স্থানে নেই যেখানে আমি এই কার্যকারিতাটি যাচাই করতে পারি তবে একবার বাড়ি ফিরে এলে আমি সেট করতে পারি যদি setcapযাদুটি কীভাবে এই পূর্বাভাস দেয় তা কাজ করে।


যেভাবে এটি বোঝায় (আপনার ডস উদ্বেগ সম্পর্কিত) তা যদি rmdirখালি সাব-ভলিউমগুলিতে অনুমোদিত হয়। তারপরে rm -rস্বচ্ছভাবে কাজ করবে। দুর্ভাগ্যক্রমে কোডটি কেবল বিকশিত হয়নি (এখনও)। দেখে মনে হচ্ছে যে কেউ 2010 এ তিনটি চেষ্টা করেছে এবং তারপরে ছেড়ে দিয়েছে :( স্পিনিকস.এন.লিস্ট
লিনিক্স-

5

একটি সাবভলিউম মোছার মাধ্যমে কারও কাছে নিজের মালিকানাধীন ফাইলগুলি লিঙ্কমুক্ত করার অনুমতি দেয়। আমার মতে, কোনও সুবিধাপ্রাপ্ত ব্যবহারকারী দ্বারা নির্বাচিত কোনও স্থানে যে সুবিধাপ্রাপ্ত ব্যবহারকারী লিখেছেন সেগুলি হ'ল ফ্রি গেম, তবে যে ব্যক্তি মূল-বিহীন মুছে ফেলার কার্যকারিতাটি অবদান রেখেছিল তারা সম্ভবত এই শব্দার্থবিজ্ঞানগুলি কতটা নিরাপদ এবং বিষয়বস্তু সম্পর্কে যথেষ্ট আত্মবিশ্বাসী বোধ করছিল না? তাদের নতুন মাউন্ট বিকল্প হিসাবে জমা দিতে ( mount -o user_subvol_rm_allowed)।


1
ভাল, আশ্চর্যজনকভাবে ইউনিক্স-এ আপনি নিজের মালিকানাধীন কোনও ফাইল সহজেই লিঙ্কমুক্ত করতে পারেন - আপনাকে কেবল এটির ডিরেক্টরিতে লেখার অনুমতি থাকতে হবে।
পোজ

ফেডোরা ২০-তে আমার একই সমস্যা রয়েছে, আমার একটি সাবভলিউমে / হোম আছে, আমি ব্যবহারকারীর রুট ব্যবহার করছি তবে যাই হোক, আমি / হোম মুছতে পারি না
c4f4t0r

উদাহরণস্বরূপ, যদি প্রশ্নযুক্ত ফাইলটি আপনার নিজের মালিকানাধীন কোনও ফোল্ডারে থাকে তবে আপনি এটিকে লিঙ্কমুক্ত করতে পারবেন না এবং ফোল্ডারটি নিজেই লিঙ্কমুক্ত করতে পারবেন না কারণ এটিতে এখনও স্টাফ রয়েছে। আপনি কেবল এই ফোল্ডারে অ-ধ্বংসাত্মক ক্রিয়াকলাপগুলি যেমন এটি সরানো বা পুনরায় নামকরণ করতে পারেন।
18:38

-1

"হোম / মুছতে পারে না" (যা @ হোম)।

আপনি / হোম / স্ন্যাপশট_ইয়ামএমডিডি স্ন্যাপশটটি তৈরি না করে / বাড়ির সাথে সংযুক্ত না করে আপনি যে সাবভলিউমটি আপনার / হোম / অ্যাকাউন্টে থাকেন সেগুলি কেন মুছতে চান?

আমি বিটিআরএফস ব্যবহারে নতুন তবে আমি এটি খুঁজে পেয়েছি: @ / এবং @ হোম (/ এবং / হোম) বিটিআরএফএস দ্বারা তৈরি করা হয় যখন এটি আপনার HD তে ফাইল সিস্টেম হিসাবে ইনস্টল করা হয়। যদি না আপনি আগের স্ন্যাপশট থেকে / বাড়ির পুনরুদ্ধার না করে থাকেন, যেমনটা আমি বুঝতে পেরেছি, আপনি নিজের হাঁটুতে নিজেকে কেটে ফেলছেন।

যাইহোক, আপনি মাউন্ট / ডেভ / সা / এমএনটি / (বা আপনার চালিত বিটিআরএসএস সিস্টেমটি যে কোনও ডিভাইসটি চালু রয়েছে) ব্যবহার করে / রুট হিসাবে ডিভাইসটি মাউন্ট করতে পারেন তারপরে সিডি থেকে / এমএনটি / এবং সেখান থেকে মুছুন আদেশটি জারি করুন @বাড়ি. তারপরে আপনি @ home_snaphot_yymmdd (বা আপনি যা নাম দিয়েছিলেন) @ হোমে সরানোর জন্য mv কমান্ডটি ব্যবহার করতে পারেন। @ বাড়ির আকারের উপর নির্ভর করে এই পদক্ষেপটি কয়েক ঘন্টা সময় নিতে পারে। তারপরে সিডি আপনার নিজের অ্যাকাউন্টে ফিরে আসুন এবং sudo umount / mnt / ইস্যু করুন আপনি কখনও সত্যই লগআউট বা আপনার সিস্টেম বন্ধ করতে পারেন নি। এটি বিটিআরএফসের একটি সৌন্দর্য।


দেখে মনে হচ্ছে তারা ইতিমধ্যে এটি করেছে। বিটিআরএফগুলি @ এবং @ হোম তৈরি করে না যতক্ষণ না আপনি তাদের (বা আপনার উবুন্টুর মতো ডিসট্রো আপনার পক্ষে তা করে)।
অ্যান্থন
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.