সিস্টেমড দিয়ে কীভাবে ব্যবহারকারী সিগ্রুপ তৈরি করা যায়


14

আমি এতে অনিবদ্ধ lxcপাত্রে ব্যবহার করি Arch Linux। এখানে বেসিক সিস্টেম ইনফোগুলি রয়েছে:

[chb@conventiont ~]$ uname -a
Linux conventiont 3.17.4-Chb #1 SMP PREEMPT Fri Nov 28 12:39:54 UTC 2014 x86_64 GNU/Linux

এটি একটি কাস্টম / সংকলিত কার্নেল এর সাথে user namespace enabled:

[chb@conventiont ~]$ lxc-checkconfig 
--- Namespaces ---
Namespaces: enabled
Utsname namespace: enabled
Ipc namespace: enabled
Pid namespace: enabled
User namespace: enabled
Network namespace: enabled
Multiple /dev/pts instances: enabled

--- Control groups ---
Cgroup: enabled
Cgroup clone_children flag: enabled
Cgroup device: enabled
Cgroup sched: enabled
Cgroup cpu account: enabled
Cgroup memory controller: enabled
Cgroup cpuset: enabled

--- Misc ---
Veth pair device: enabled
Macvlan: enabled
Vlan: enabled
File capabilities: enabled

Note : Before booting a new kernel, you can check its configuration
usage : CONFIG=/path/to/config /usr/bin/lxc-checkconfig

[chb@conventiont ~]$ systemctl --version
systemd 217
+PAM -AUDIT -SELINUX -IMA -APPARMOR +SMACK -SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID -ELFUTILS +KMOD +IDN 

দুর্ভাগ্যক্রমে, বর্তমানে systemdভাল খেলছে না lxc। বিশেষত cgroupsএকটি মূলবিহীন ব্যবহারকারীর জন্য সেটআপ করা ভালভাবে কাজ করছে বলে মনে হচ্ছে বা আমি কীভাবে এটি করব তা সম্পর্কে খুব অপরিচিত। lxcএটি কেবল তখনই অনিবদ্ধ মোডে একটি ধারক শুরু করবে যখন এটি প্রয়োজনীয় সিগ্রুপ তৈরি করতে পারে /sys/fs/cgroup/XXX/*। এটি তবে এর জন্য সম্ভব নয় lxcকারণ সিগ্রুপের ক্রমবিন্যাসকে systemdমাউন্ট করে । একটি কার্যবিধির মধ্যে নিম্নলিখিতটি করা মনে হচ্ছে:root/sys/fs/cgroup/*

for d in /sys/fs/cgroup/*; do
        f=$(basename $d)
        echo "looking at $f"
        if [ "$f" = "cpuset" ]; then
                echo 1 | sudo tee -a $d/cgroup.clone_children;
        elif [ "$f" = "memory" ]; then
                echo 1 | sudo tee -a $d/memory.use_hierarchy;
        fi
        sudo mkdir -p $d/$USER
        sudo chown -R $USER $d/$USER
        echo $$ > $d/$USER/tasks
done

এই কোডটি একটি অনিবদ্ধ ব্যবহারকারীর জন্য শ্রেণিবিন্যাসে সম্পর্কিত cgroupডিরেক্টরিগুলি তৈরি করে cgroup। যাইহোক, আমি বুঝতে পারি না এমন কিছু ঘটেছিল। পূর্বোক্তটি কার্যকর করার আগে আমি এটি দেখতে পাব:

[chb@conventiont ~]$ cat /proc/self/cgroup 
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope

পূর্বোক্ত কোডটি কার্যকর করার পরে আমি শেলটিতে দেখতে পেলাম এটিতে আমি এটি চালিয়েছি:

[chb@conventiont ~]$ cat /proc/self/cgroup 
8:blkio:/chb
7:net_cls:/chb
6:freezer:/chb
5:devices:/chb
4:memory:/chb
3:cpu,cpuacct:/chb
2:cpuset:/chb
1:name=systemd:/chb

তবে অন্য যে কোনও শেলের মধ্যে আমি এখনও দেখতে পাচ্ছি:

[chb@conventiont ~]$ cat /proc/self/cgroup 
8:blkio:/
7:net_cls:/
6:freezer:/
5:devices:/
4:memory:/
3:cpu,cpuacct:/
2:cpuset:/
1:name=systemd:/user.slice/user-1000.slice/session-c1.scope

অতএব, আমি lxcউপরে উল্লিখিত কোডটি কার্যকর করেছি তবে অন্য কোনওটিতে নয় তবে আমার অনিবদ্ধ কনটেইনারটি শুরু করতে পারি ।

  1. কেউ কি এই আচরণ ব্যাখ্যা করতে পারেন?

  2. ( ) cgroupsএর বর্তমান সংস্করণ সহ প্রয়োজনীয় সেট আপ করার জন্য কি আরও ভাল কোনও উপায় খুঁজে পেয়েছে ?systemd>= 217

উত্তর:


13

cgmanagerএটির systemctl start cgmanager( systemdবেসড ডিসট্রোতে) ইনস্টল করে চালানো একটি আরও ভাল এবং নিরাপদ সমাধান । আপনার rootব্যবহারকারীর চেয়ে আপনার থাকতে পারে, বা আপনার সমস্ত অনিয়ন্ত্রিত ব্যবহারকারীর জন্য সমস্ত নিয়ামকগুলিতে অনিচ্ছুক ব্যবহারকারীর জন্য sudoহোস্টে অধিকার থাকলে cgroups:

sudo cgm create all $USER
sudo cgm chown all $USER $(id -u $USER) $(id -g $USER)

এগুলি একবার আপনার অপ্রয়োজনীয় ব্যবহারকারীর জন্য তৈরি হয়ে গেলে সে / তিনি প্রসেসগুলি সরাতে পারেন তিনি cgroupব্যবহার করে প্রতিটি নিয়ামকের জন্য তার মধ্যে প্রবেশ করতে পারে :

cgm movepid all $USER $PPID

আমি পোস্ট করা শেল স্ক্রিপ্টের চেয়ে নিরাপদ, দ্রুত, আরও নির্ভরযোগ্য।

ম্যানুয়াল সমাধান:

উত্তর দিতে ঘ।

for d in /sys/fs/cgroup/*; do
        f=$(basename $d)
        echo "looking at $f"
        if [ "$f" = "cpuset" ]; then
                echo 1 | sudo tee -a $d/cgroup.clone_children;
        elif [ "$f" = "memory" ]; then
                echo 1 | sudo tee -a $d/memory.use_hierarchy;
        fi
        sudo mkdir -p $d/$USER
        sudo chown -R $USER $d/$USER
        echo $$ > $d/$USER/tasks
done

আমি যখন স্ক্রিপ্টটি লিখেছিলাম ঠিক তখন কী চলছে সে সম্পর্কে আমি অজ্ঞ ছিলাম তবে এটি পড়ে এবং কিছুটা পরীক্ষা-নিরীক্ষা আমাকে বুঝতে সাহায্য করেছিল যে কী চলছে। আমি এই স্ক্রিপ্টে মূলত যা করছি তা হ'ল cgroupবর্তমানটির জন্য একটি নতুন অধিবেশন তৈরি করা userযা আমি ইতিমধ্যে উপরে বলেছি। আমি যখন বর্তমান এই কমান্ড সঞ্চালন করুন shellযাতে অথবা তাদের একটি স্ক্রিপ্ট চালানোর সংগ্রাম করে এটি বর্তমান মূল্যায়ন পরার shellএবং একটি নেই subshell(মাধ্যমে এটির জন্য কাজ করতে গুরুত্বপূর্ণ!) যে আমি শুধু জন্য একটি নতুন অধিবেশন খুলতে হয় তবে এই নতুন সিগ্রুপে চলমান প্রক্রিয়া হিসাবে বর্তমান শেলটি যুক্ত করুন। আমি একটি সাবসিলে স্ক্রিপ্টটি চালিয়ে একই প্রভাব অর্জন করতে পারি এবং তারপরে ব্যবহার এবং ব্যবহারের ক্রমবিন্যাসে নামতে পারি. script.usercgroupchb subcgroupecho $$ > tasksএর প্রতিটি সদস্যের সাথে বর্তমান শেল যুক্ত করুন chb cgroup hierarchy

অতএব, যখন আমি lxcসেই বর্তমান শেলটি চালাব তখন আমার ধারকও সেই সমস্ত সদস্যের হয়ে উঠবে chb subcgroupযে বর্তমানের shellসদস্য। এটি আমার মর্যাদা containerউত্তরাধিকারসূত্রে বলতে হয় । এটি এটি ব্যাখ্যা করে যে এটি কেন এমন কোনও শেলে কাজ করে না যা বর্তমানের অংশ নয় ।cgroupshellchb subcgroup

আমি এখনও পাস 2.। সামঞ্জস্যপূর্ণ আচরণ অবলম্বন করার জন্য আমাদের সম্ভবত কোনও systemdআপডেট বা আরও Kernelউন্নয়নের জন্য অপেক্ষা করতে হবে systemdতবে আমি ম্যানুয়াল সেটআপটিকে পছন্দ করি কারণ এটি আপনাকে কী করছে তা বুঝতে বাধ্য করে।


আপনি কি আর কোথাও সিগ্রুপ দির মাউন্ট করতে পারবেন না (সৎ প্রশ্ন) ? লিনাক্স সিগ্রুপগুলি নিয়ে গত বছর বেশ বিতর্ক হয়েছিল এবং সিস্টেমেড যখন সিগ্রুপ রক্ষণকারীরা স্পষ্টতই ইউজারস্পেসে সিগ্রুপগুলি পরিচালনা করার ক্ষেত্রে নাম এবং অন্যান্য অনুরূপ নামবিহীন অ্যাপ্লিকেশন কর্তৃপক্ষের দ্বারা সিস্টেমড দেওয়ার সিদ্ধান্ত নিয়েছিল । কীভাবে এটি সমস্ত পরিণত হয়েছিল তা নিশ্চিত নয় তবে আমি জানি যে কোনও বছর এক বছর আগে কোনও ব্যবহারকারী এটি করতে পারে কিনা তা বাতাসে বেশ সুন্দর ছিল।
মাইকজার্ভেস

আমি সম্ভবত এটি করতে পারি তবে আমি প্রথমে সিগ্রুপের রুট ডিরেক্টরিটি মাউন্ট করা থেকে সিস্টেমডকে আটকাতে হবে। আমি যখনই আমার মেশিনে লগইন করেছি সিস্টেমেড / সিএস / এফএস / সিগ্রুপের অধীনে রুট সিগ্রুপের মূল স্তরক্রমকে মাউন্ট করবে এবং কেবল ব্যবহারকারী সিগ্রুপকে মূল সিগ্রুপের সিস্টেম্ট অংশের অধীনে যুক্ত করবে (আপনি এটি উপরে দেখতে পারেন)। সিস্টেম সুইড করার আগে সিস্টেম ভিত্তিক ডিস্ট্রোস এবং সিস্টেম ভিত্তিক ডিস্ট্রোসের মধ্যে পার্থক্য হ'ল উদাবু সিগ্রুপ ম্যানেজমেন্ট থ্রি ডিমন এর হাতে নেই।
Lord.garbage

এটি পরিবর্তে সিজিম্যানেজারের মতো একটি প্রোগ্রাম দ্বারা পরিচালিত হয়। অথবা আপনি উপরে পোস্ট করা কার্নেল.আর লিঙ্কে পরামর্শ হিসাবে আপনি এটি হাতে করে করতে পারেন। এখনকার চেয়ে আরও গভীর করে তুলতে সিস্টেমেড সিগ্রুপ ম্যানেজমেন্ট সম্পর্কে আমার কাছে এত গভীর উপলব্ধি নেই। তবে আশা করি খুব শীঘ্রই এটি পরিবর্তিত হবে।
প্রভু.গারবাজে 16

1
সত্য, আমি আপনাকে স্মরণ করছি যে আমি দীর্ঘ সময় আগে দিয়েছি এমন উত্তরের মন্তব্যে বলেছি। আমি জিজ্ঞাসা করব ...
লর্ড.গারবাজ

1
কৌতুক মূলত হল: sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID। নতুন কগ্রুপের জন্য এটি যুক্ত করতে বর্তমান শেলটিতে শেষ কমান্ডটি চালানো দরকার $USER
প্রভু.গারবাজে

0

আসলে আর্চলিনাক্সে, এটি উদাহরণস্বরূপ একটি অনিবদ্ধ ব্যবহারকারী (আনপ্রাইভ। এলএক্সসি পাত্রে ব্যবহার করার সময় প্রস্তাবিত) সাথে কাজ করবে না। যেমন ব্যবহারকারীর সুডো নেই :)

পরিবর্তে, /etc/cgconfig.conf গোষ্ঠীটি সংজ্ঞায়িত করুন, cgconfig সক্রিয় করুন, cgrules (এআর-তে libcgroup) করুন, পাশাপাশি cgrules যোগ করুন, সম্পন্ন করুন .. অপ্রিয়। ব্যবহারকারীরও একই অধিকার থাকবে।

সিস্টেমেড 218 এ (আমি কখন জানি না, তবে মনে হয় সিগকনফিগ উপায় থেকে তৈরি করার সময় সেগুলি সেট না করা অবস্থায় একটি আরও দুটি শর্ত যুক্ত করতে হবে):

cat /etc/cgconfig.conf

group lxcadmin {
perm {
    task {
        uid = lxcadmin;
        gid = lxcadmin;
    }
    admin {
        uid = lxcadmin;
        gid = lxcadmin;
    }
}
cpu { }
memory { memory.use_hierarchy = 1; }  
blkio { }
cpuacct { }
cpuset { 
    cgroup.clone_children = 1;
    cpuset.mems = 0;
    cpuset.cpus = 0-3; 
}
devices { }
freezer { }
hugetlb { }
net_cls { }
}

cat /etc/cgrules.conf
lxcadmin        *       lxcadmin/

ধরুন নেমস্পেস কার্নেলের মধ্যে সংকলিত হয়েছে।

এটি একটি টেম্পলেট, cpus আপনার কতগুলি কোর অনুসারে হতে পারে, মেমকে কিছু আসল মান ইত্যাদিতে সেট করা যায় ইত্যাদি etc.

সম্পাদনা 2: অবশেষে, সিস্টেমেডে, আপনি কি এইরকম অনিবদ্ধ ব্যবহারকারীর সাথে অটো-স্টার্ট ব্যবহার করতে চান, আপনি এটি করতে পারেন:

সিপি / ওএসআর / এলিব / সিস্টেমেড / সিস্টেমে / এলএক্সসি{, অ্যাডমিনি}\.এই সার্ভিস, তারপরে ইউজার = এলএক্সক্যাডমিন যুক্ত করুন

এবং এটি lxcadmin এর ধারক জন্য lolz systemctl সক্ষম করুন lxcadmin @ lolz সক্ষম করুন।


আপনাকে ধন্যবাদ অ্যান্টন, আমি কখনই এই ওয়েবসাইটগুলিতে কোড ফর্ম্যাটিংটি সঠিকভাবে পেতে পারি না, x
ম্যালিনা সালিনা

ধন্যবাদ. দেরী উত্তর দেওয়ার জন্য দুঃখিত। আপনার প্রথম পয়েন্ট, "আসলে আর্চলিনাক্সে, এটি উদাহরণস্বরূপ একটি অবাঞ্ছিত ব্যবহারকারীর সাথে কাজ করবে না (আনপ্রাইভ। এলএক্সসি পাত্রে ব্যবহার করার সময় প্রস্তাবিত) ie অর্থাত্ ব্যবহারকারীটির সাথে সুডো নেই :)" দাঁড়ায় না কারণ আপনার কেবলমাত্র আপনার rootপ্রশাসকের প্রয়োজন তৈরি এবং chownআপনি সমস্ত cgroupনিয়ামক মধ্যে। এটি পুরোপুরি সূক্ষ্ম এবং সুরক্ষিত। অধিকার movepidছাড়াই rootএবং তাই অপ্রয়োজনীয় কাজ করা যেতে পারে । ব্যবহারকারীর কোনও sudoঅধিকারের প্রয়োজন নেই । (BTW, libcgroupআর ব্যবহার করা যেতে অনুমিত হয় না RHEL এবং অন্যদের এটি অবচিত হয়েছে।।)
lord.garbage

@Brauner। আপনি কীভাবে বুট এ অটোস্টার্ট করবেন, তখন আপনার অনিবদ্ধ ব্যবহারকারীর পাত্রে? প্রকৃতপক্ষে আপনার তালিকাভুক্ত সমাধানগুলি কেবলমাত্র একটি সুডো ব্যবহারকারীর সাথে কাজ করেছে (এবং বোঝায়)। আমার হয়নি। আপনি কীভাবে এটি ঠিক করবেন জিজ্ঞাসা করেছিলেন। যাইহোক, সবেমাত্র একটি আপডেট হয়েছে, এবং cgconfig এখন আরম্ভ করতে ব্যর্থ হয়েছে, যেমন ইউজারআর স্লাইসগুলি স্বয়ংক্রিয়ভাবে যুক্ত হয়, সিগকনফিগ সেটিংসের সামনে মনে হয়। এগুলির মধ্যে কোনও ব্যবহারকারীর অনুমতি নেই (সম্ভবত একটি রিগ্রেশন বাগ, এখন এটি সন্ধান করছে)। আমি বলিনি এটি সেরা সমাধান ছিল। এটি ছিল আপনার অনুসন্ধানের সমাধান / সমাধান। :) তবে আমার পাত্রে এখন বুট শুরু হচ্ছে না, গ্রার।
ম্যালিনা সালিনা

যে কারণে আমি systemctl lxcadmin @ কনটেইনার সক্ষম করেছিলাম তার কারণে রুটটি বুটটিতে একটি অপ্রয়োজনীয় ধারক চালানোর সিদ্ধান্ত নিতে পারে। ব্যবহারকারী নিজে যদি এটি ব্যবহারকারীর (ল্যান্ড) ব্যবহার করে তবে এটি কেবল তখনই বুট হবে যখন সে লগ ইন করবে, কোনও সার্ভারের জন্য খুব কার্যকর নয়। এবং আপনার মন্তব্যে একটি নোট। সমস্ত কন্ট্রোলারের মধ্যে একজন ব্যবহারকারীকে ডুবিয়ে দেওয়া, সেই ব্যবহারকারীকে পিডকে হোস্ট স্পেসে স্থানান্তরিত করার অনুমতি দেয়, আমি বিশ্বাস করি এটি বেশ সুরক্ষা ঝুঁকিপূর্ণ।
ম্যালিনা সালিনা

এরম, আপাতদৃষ্টিতে আপনি মনে করেন যে আপনার পদ্ধতিটি প্রাথমিকভাবে তালিকাবদ্ধ তালিকাভুক্তটি দিয়ে যা করছিল তা হ'ল তবে এটি দেখুন, এটি উবুন্টু সিস্টেমড প্যাকেজ বগস.লাঞ্চপ্যাড.net / বুন্টু /+সোর্স / সিস্টেমেড /+ বাগ / ১৪১9৯২ তবে কিছু আপডেট হয়েছিল গত দিনগুলি লজিক পরিবর্তন করছে .. আমি এটি ট্র্যাক করার চেষ্টা করছি।
ম্যালিনা সালিনা

0

সুতরাং আমি যখন সেন্ট্রোস L তে এলএক্সসি অপরিকল্পিত পাত্রে কাজ করার চেষ্টা করছিলাম তখন আমি একই সমস্যায় পড়েছিলাম use cgmanagerআমি ব্যবহার করতে চাইনি কারণ আমি একেবারে প্রয়োজনীয় না হলে কোনও অতিরিক্ত পরিষেবাদি প্রবর্তন করতে পছন্দ করি না। পরিবর্তে আমি যা শেষ করেছি তা হ'ল উগুন্টু প্যাকেজ থেকে কিছু প্যাচ এবং সিগ্রুপ কন্ট্রোলারের তালিকা প্রসারিত করার জন্য একটি কাস্টম প্যাচ ব্যবহার করে সিস্টেমড প্যাচিং। Https://github.com/CtrlC- রুট / আরপিএমডিস্টে আমার গিটহাব অ্যাকাউন্টে আরপিএম তৈরি করার জন্য আমার কাছে প্রয়োজনীয় উত্স রয়েছে । আমার কাছে ছায়া-ইউটিজের (সাবউইডস এবং সাবজিডগুলির জন্য) এবং পাম (লগইনউইডের জন্য) সংস্করণও রয়েছে। আমি এই আরপিএমগুলি ইনস্টল করার পরে এবং কোনও ব্যবহারকারীকে অননুমোদিত পাত্রে চালানোর জন্য কনফিগার করেছি (সাবউইডস এবং সাবজিডগুলি নির্ধারণ করুন, lxc- ইউজারনেটে Veth জোড়া বরাদ্দ করুন, .config / lxc / default.conf ইত্যাদি তৈরি করুন) আমি LXC অপ্রতিযুক্ত কন্টেইনারগুলি ঠিকঠাক চালাতে পারি।

সম্পাদনা: আমি সিজিম্যানেজারটি ব্যবহার করতে চাইনি বলে আরেকটি কারণ হ'ল আমি চাইনি আমার নিয়মিত ব্যবহারকারীরা মোটেই সুডো ব্যবহার করতে পারেন। নিয়মিত ব্যবহারকারীদের লগ ইন করতে সক্ষম হওয়া উচিত এবং সমস্ত কিছু বাক্সের বাইরে "কেবলমাত্র কাজ করা" উচিত।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.