Systemd ile kullanıcı grupları nasıl oluşturulur


14

İçinde imtiyazsız lxckonteyner kullanıyorum Arch Linux. Temel sistem bilgileri aşağıdadır:

[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

Özel / derlenmiş bir çekirdek 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 

Ne yazık ki, şu anda systemdiyi oynamıyor lxc. Özellikle cgroupsroot olmayan bir kullanıcı için kurulum iyi çalışmıyor gibi görünüyor veya bunu nasıl yapacağımı çok bilmiyorum. lxcbir kapsayıcıyı yalnızca gerekli grupları oluşturabildiği zaman ayrıcalıksız modda başlatır /sys/fs/cgroup/XXX/*. Ancak bu mümkün değildir lxc, çünkü systemdbağlar rootiçinde CGroup hiyerarşisi /sys/fs/cgroup/*. Bir çözüm aşağıdakileri yapmak gibi görünüyor:

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

Bu kod karşılık gelen cgroupcgroup ayrıcalıksız bir kullanıcı için hiyerarşide dizinleri . Ancak anlamadığım bir şey oluyor. Yukarıda belirtilenleri uygulamadan önce şunu göreceğim:

[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

Yukarıda adı geçen kodu yürüttükten sonra kabuğunda gördüm:

[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

Ama başka bir kabukta hala görüyorum:

[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

Böylece ayrıcalığımı başlatabilirim lxc yukarıda belirtilen kodu ama başka herhangi bir değil kabuk kapsayıcı .

  1. Birisi bu davranışı açıklayabilir mi?

  2. Birisi ( ) cgroupsgeçerli bir sürümü ile gerekli kurmak için daha iyi bir yol buldu mu?systemd>= 217

Yanıtlar:


13

Daha iyi ve daha güvenli bir çözüm, ( tabanlı bir dağıtımda) kurmak cgmanagerve çalıştırmaktır . Kullanıcınızdan daha fazlasına sahip olabilirsiniz veya ana bilgisayar üzerinde haklarınız varsa, aşağıdakilere sahip tüm denetleyicilerde ayrıcalıksız kullanıcınız için oluşturursunuz :systemctl start cgmanagersystemdrootsudocgroups

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

Ayrıcalıksız kullanıcınız için oluşturulduktan sonra, eriştiği işlemleri cgroupher denetleyici için aşağıdakileri kullanarak taşıyabilir :

cgm movepid all $USER $PPID

Gönderdiğim kabuk betiğinden daha güvenli, daha hızlı, daha güvenilir.

Manuel çözüm:

Cevaplamak için 1.

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

Ben bu senaryoyu yazdım tam olarak ne zaman bittiğini ancak ne okuduğunu hakkında cahil bu ve biraz bana ne olup bittiğini anlamak için yardımcı deney. Temelde bu komut dosyasında yaptığım, şimdiye kadar yukarıda belirttiğim cgroupakım için yeni bir oturum oluşturmaktır user. Ben şimdiki şu komutları çalıştırdığınızda shellmevcut değerlendirilmiştir alır, böylece onu ya bir komut onları çalıştırmak ve yapmak shelldeğil, bir de subshell(aracılığıyla işe bunun için önemlidir!) Ben sadece için yeni bir oturum açma değil ki ancak geçerli kabuğu bu yeni grupta çalışan bir işlem olarak ekleyin. Komut dosyasını bir alt kabukta çalıştırarak ve sonra hiyerarşiye inerek ve. script.usercgroupchb subcgroupecho $$ > tasksGeçerli kabuğu, öğesinin her üyesine eklemek için chb cgroup hierarchy.

Bu nedenle, lxcşu anki kabukta koştuğumda kabım, akımın üyesi olduğu tüm chb subcgroups'lerin shellbir üyesi olacak. Yani benim durumumu containerdevralır . Bu aynı zamanda neden mevcut s'nin bir parçası olmayan başka bir kabukta çalışmadığını da açıklar .cgroupshellchb subcgroup

Hala geçiyorum 2.. Muhtemelen tutarlı bir davranışı benimsemek için bir systemdgüncelleme veya daha fazla Kernelgelişme beklememiz gerekecek, systemdancak ne yapacağınızı anlamaya zorladığından yine de manuel kurulumu tercih ediyorum.


sadece cgroups dir başka bir yere monte değil (dürüst soru) ? geçen yıl linux grupları ve systemd üzerinde, cgroups sürdürücüsünün açıkça kullanıcı adı ile ilgilenen grup grupları üzerinde isme ve diğer benzer adlandırılmamış uygulama otoritesine göre systemd vermeye karar verdiği iyi bir tartışma vardı . nasıl tüm çıktı emin değilim, ama bir kullanıcı bunu bir yıl önce bunu yapabilir olmadığını havada oldukça olduğunu biliyorum.
mikeserv

Muhtemelen bunu yapabilirdim ama ilk etapta systemd'nin cgroup root dizinini monte etmesini önlemem gerekecekti. Makine sistemime her giriş yaptığımda kök grup kök hiyerarşisini / sys / fs / cgroup altına bağlar ve yalnızca kök grubun systemd bölümünün altına bir kullanıcı grubu ekler (Bunu yukarıda görebilirsiniz.). Systemd tabanlı dağıtımlar ile sistemd tabanlı dağıtımlar arasındaki fark, geçişten önce, örneğin Ubuntu grup yönetiminde init artalan sürecinin elinde olmamasıdır.
lord.garbage

Bunun yerine, örneğin cgmanager gibi bir program tarafından ele alınır. Ya da yukarıda gönderdiğim kernel.org bağlantısında önerildiği gibi elle yapabilirsiniz. Şu anda sistemd cgroup yönetimi ile şu ana kadar benden daha derin bir kavga için yeterince derin bir anlayışa sahip değilim. Ama umarım bu yakında değişecektir.
lord.garbage

1
Doğru, uzun zaman önce verdiğim bir cevaba yaptığı yorumda bunu söylediğini hatırlıyorum.
Sorgulayacağım

1
Hüner temelde: sudo systemctl start cgmanager && sudo cgm create all $USER && sudo cgm chown all $USER $(id -u) $(id -g) && sudo cgm movepid all $USER $PPID. Yeni komut grubuna eklemek için, son komutun geçerli kabukta çalıştırılması gerekir $USER.
lord.garbage

0

Aslında archlinux'ta bu, örneğin ayrıcalıksız bir kullanıcıyla çalışmaz (unpriv. Lxc kapları kullanıldığında önerilir). yani kullanıcının sudo'u yok :)

Bunun yerine, /etc/cgconfig.conf içinde grup tanımlayın, cgconfig, cgrules (AUR'da libcgroup) öğesini etkinleştirin, cgrules ekleyin, bitti .. unpriv. kullanıcı aynı haklara sahip olacaktır.

Systemd 218'de (ne zaman bilmiyorum, ancak cgconfig yolundan oluşturulduğunda ayarlanmadığı için iki koşul daha eklemek zorunda görünüyor):

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/

Ad alanının çekirdekte derlendiği varsayılmaktadır.

Bu bir şablon, cpus kaç tane çekirdeğinize göre olabilir, mem bazı gerçek değere ayarlanabilir, vb.

DÜZENLEME 2: Son olarak, systemd'de, böyle bir ayrıcalıksız kullanıcıyla otomatik başlatmayı kullanmak isterseniz, şunları yapabilirsiniz:

cp /usr/lib/systemd/system/lxc{,admin </\@.service, ardından Kullanıcı = lxcadmin ekleyin

ve lxcadmin'in lolz systemctl adlı konteyneri için etkinleştirin lxcadmin @ lolz'yi etkinleştirin.


@Anthon, kod biçimlendirmesini bu web sitelerinde asla alamadım, x
Malina Salina

Teşekkür ederim. Geç cevap verdiğim için özür dilerim. İlk nokta, "Aslında Arch Linux içinde, (unpriv kullanırken önerilir. LXC konteynerler) örneğin bir ayrıcalığı olmayan kullanıcı ile bu olmaz çalışır. Yani o kullanıcı yok değil sudo :)" yalnızca ihtiyaç olarak durmazsa rootyöneticinin oluşturmak ve chowntüm cgroupdenetleyicileri içine . Bu gayet iyi ve güvenlidir. haklar movepidolmadan rootve dolayısıyla unpriv yapılabilir. kullanıcının herhangi bir sudohakka ihtiyacı yoktur . (Btw, libcgroupartık kullanılmayacak. RHEL ve diğerleri bunu reddetti.)
lord.garbage

@Brauner. Önceden ayrıcalıklı olmayan kullanıcı kaplarınız önyüklemede nasıl otomatik olarak başlatılır? Aslında listelenen çözümleriniz sadece bir sudo kullanıcısı çalıştı (ve ima etti). Benimki olmadı. Nasıl düzeltebileceğini sordun. Her neyse, yeni bir güncelleme oldu ve cgconfig ayarlarının başlangıcından önce user.slices otomatik olarak eklendiğinden cgconfig başlatılamıyor. Bunlar kullanıcı izinlerinden yoksundur (muhtemelen bir regresyon hatası, şimdi bakıyorum). Bunun en iyi çözüm olduğunu söylemedim . Sorunuz için / bir çözümdü. :) Ama benim konteyner şimdi önyükleme başlamıyor grrr.
Malina Salina

Systemctl enable lxcadmin @ container'ı listelememin nedeni, root'un önyüklemede unpriv kapsayıcı çalıştırmaya karar verebilmesiydi. Kullanıcının kendisi --user (land) içinde kullanıyorsa, yalnızca oturum açtığında önyüklenir, bir sunucu için çok yararlı olmaz. Ve yorumunuzla ilgili bir not. bir kullanıcının tüm denetleyicilere seçilmesi, kullanıcının pid'leri ana bilgisayar alanına taşımaya başlamasına izin verir, inanıyorum ki bu bir güvenlik riski.
Malina Salina

Görünüşte bunu ubuntu paket systemd olsa bile, bu adresinden başlangıçta sanırım listelenen yöntemle, ancak bakışla yaptıklarını olduğunu Erm, bugs.launchpad.net/ubuntu/+source/systemd/+bug/1413927 Ama bir şey güncellendi Geçtiğimiz günlerde mantığı değiştiriyorum .. İzini bulmaya çalışıyorum.
Malina Salina

0

Bu yüzden CentOS 7 üzerinde çalışan LXC ayrıcalıklı kapsayıcıları almaya çalışırken de aynı sorunla karşılaştım cgmanager. Bunun yerine ne kadar sona erdi ubuntu paketinden bazı yamalar ve cgroup denetleyicileri listesini genişletmek için bir özel yama kullanarak systemd yama. Https://github.com/CtrlC-Root/rpmdist adresinden GitHub hesabımda bir RPM oluşturmak için gereken kaynaklara sahibim . Ayrıca gölge-utils (subuids ve subgids için) ve pam (loginuid için) yamalı sürümleri var. Bu RPM'leri yükledikten ve bir kullanıcıyı ayrıcalıksız kapsayıcılar çalıştıracak şekilde yapılandırdıktan sonra (subuids & subgids atayın, lxc-usernet içinde veth çiftleri ayırın, .config / lxc / default.conf, vb.) LXC ayrıcalıklı kapsayıcıları çalıştırabilirim.

EDIT: cgmanager kullanmak istemiyordu başka bir nedeni, normal kullanıcılarım sudo kullanmak zorunda istemiyordu çünkü. Düzenli kullanıcılar giriş yapabilmeli ve her şey kutudan çıkar çıkmaz çalışmalıdır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.