Jak skonfigurować ulimit dla użytkownika

Serwery i sieci oparte na Slackware, wszelkiego rodzaju usługi, troubleshooting.

Moderatorzy: Moderatorzy, Administratorzy

vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów

Jak skonfigurować ulimit dla użytkownika

Post autor: vitos »

Mam pytanie do Szanownych Grupowiczów

Temat już się przez grupę przewijał, ale chciałbym sobie tę kwestię uściślić.

W jaki sposób można ustalić parametry ulimit dla użytkownika, który się loguje na konsolę poprzez np. ssh ? Potrafię ustalić te parametry dla użytkownika root, podając w /etc/profile odpowiednie ulimity. Myślałem, że podane tam parametry działają globalnie dla wszystkich użytkowników w systemie. Niestety chyba tak nie jest.

W Slackwarze konwencja z /etc/security/limits.conf chyba nie funkcjonuje i jest to jakoś inaczej rozwiązane.

Czy moglibyście mi pomóc w określeniu miejsca, gdzie można zdefiniować ulimity dla użytkownia shellowego w Slackware 12.

Bardzo dziękuję za pomoc

Pozdrawiam
Witek
Ostatnio zmieniony 2007-11-22, 10:46 przez vitos, łącznie zmieniany 2 razy.
Awatar użytkownika
oSA
Użytkownik
Posty: 365
Rejestracja: 2005-04-16, 00:58
Lokalizacja: Zielona Góra
Kontakt:

Re: Jak skonfigurować ulimit dla użytkownika

Post autor: oSA »

Tutaj masz dobry art o tym. Ja z niego korzystałem i wszystko śmigało jak należy
Ostatnio zmieniony 2007-11-22, 10:46 przez oSA, łącznie zmieniany 1 raz.
Wszystko na temat dostępu do internetu przez sieci komórkowe (HSDPA, EDGE, GPRS) oraz WiFi, WiMax, CDMA [url=http://www.bez-kabli.pl/]Bez-kabli.pl[/url]
Awatar użytkownika
difrost
Moderator
Posty: 2802
Rejestracja: 2006-03-11, 12:31
Lokalizacja: Wrocław
Kontakt:

Re: Jak skonfigurować ulimit dla użytkownika

Post autor: difrost »

Na końcu /etc/profile

Kod: Zaznacz cały

if [ -n "$SSH_CONNECTION" ] ; then
   case "$(id -u)" in
     1000) ...
     [...]
fi
[url=http://bdtk.sourceforge.net][img]http://pin.if.uz.zgora.pl/~beton/bdt-ready.png[/img][/url] #337142
--------------------------------------------
"I had a letter in the post today. It said 'Gas Bill'. It sounds a tempting offer." -- Alan Cox
"Users have been trained that when a computer bluescreens and losing all of their data, it's either (a) just the way things are, or (b) it's microsoft's fault." -- Theodore Tso
vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów

Re: Jak skonfigurować ulimit dla użytkownika

Post autor: vitos »

difrost pisze:Na końcu /etc/profile

Kod: Zaznacz cały

if [ -n "$SSH_CONNECTION" ] ; then
   case "$(id -u)" in
     1000) ...
     [...]
fi
Trochę nie rozumiem tego przykładu??? Mógłbyś objaśnić, bardzo proszę. Ponadto kiedy w /etc/profile wpisałem ulimit -n 8192, to dla root'a taki ulimit się ustawia, natomiast po zalogowaniu się innego użytkownika na konsoli chociażby, czy poprzez ssh, system podaje komunikat

Kod: Zaznacz cały

-bash: ulimit: open files: cannot modify limit: Operation not permitted".
Bardzo proszę o pomoc i przystępne wyjaśnienie problemu, bo jakoś tego nie rozumiem dlaczego się tak dzieje, że u mnie nie działa. Proszę również o wyrozumiałość dla mojej niewiedzy :-) Czytam różne artykuły i w przytłaczającej większości podawane są przykłady z /etc/security/limits.conf, które dotyczą choćby m.in. Debiana.

Witek
Awatar użytkownika
oSA
Użytkownik
Posty: 365
Rejestracja: 2005-04-16, 00:58
Lokalizacja: Zielona Góra
Kontakt:

Re: Jak skonfigurować ulimit dla użytkownika

Post autor: oSA »

Przeczytaj ten art co Ci podałem. Tam masz wszystko opisane...
Wszystko na temat dostępu do internetu przez sieci komórkowe (HSDPA, EDGE, GPRS) oraz WiFi, WiMax, CDMA [url=http://www.bez-kabli.pl/]Bez-kabli.pl[/url]
Awatar użytkownika
hanys
Użytkownik
Posty: 349
Rejestracja: 2004-07-21, 11:49
Lokalizacja: Poznań

Re: Jak skonfigurować ulimit dla użytkownika

Post autor: hanys »

Ja skorzystałem z informacji zawartych tutaj na forum i stworzyłem sobie plik
/etc/profile.d/zlimits.h
z zawartością

Kod: Zaznacz cały

#!/bin/sh
zmien=`echo $GROUPS`
if [ "$zmien" == "206" ]
then
echo -n "Liczba procesów 10"
ulimit -u 10
else
echo -n "Bez ograniczen"
fi
echo ""
i do grupy o id 206 wrzucam wszystkich użytkowników, dla których chcę ustawić max 10 procesów.
Registered Linux User #375982
vitos
Użytkownik
Posty: 104
Rejestracja: 2005-10-30, 09:13
Lokalizacja: Pszów

Re: Jak skonfigurować ulimit dla użytkownika

Post autor: vitos »

oSA pisze:Przeczytaj ten art co Ci podałem. Tam masz wszystko opisane...
Naprawdę artykuł jest bardzo dobry.

W artykule jest opisany między innymi przypadek jak zmniejszać startowe limity dla użytkowników systemowych będących na przykład zwykłymi użytkownikami z grupy users. Działa to wyśmienicie, gdyż shell uruchamiany przez użytkownika najpierw przelatuje przez /etc/profile a potem wykonuje ~/.bash_profile, jeśli podany oczywiście może być czytany przez użytkownika i stosuje podane obostrzenia jeśli są. Natomiast każdy użytkownik oprócz użytkownika root nie może sobie podnosić limitów, może tylko zaakceptować takie jakie otrzymał od administratora.

Moje pytanie jest następujące, którego rozwiązanie nie jest podane w artykule.

Jak zwiększyć bazowe początkowe limity użytkowników należących do users, żeby od początku limit np. ulimit -n nie wynosił dla nich 1024 tylko dajmy na to 8192 ?

Ja mam z tym jeden bardzo upierdliwy przypadek. Mianowicie na sambie 3.0.27a jest między innymi jeden zasób, który trzyma pliki dbf z windowsowego programu, który po uruchomieniu otwiera sobie na początek około 400 plików (jest to program GIS). Czterech użytkowników otworzy sobie po jednej sesji tego programu i już nam się robi 1600 plików. Niestety nie wiem czemu czasem jeden z potomnych procesów smbd uruchamia się jako user samba (takiego sobie założyłem żeby robił jako guest) i wtedy zaczynają się problemy. Logi procesu smbd dla usera, który akurat otworzył jeden z programów puchną i zapełniają dysk z logami. Jest w nich napisane tak:

Kod: Zaznacz cały

0) smdb/notify_inotify.c:inotify_handler(234) No data on inotidy df?!
Taki log puchnie błyskawicznie i rośnie obciążenie cpu do 100%. Muszę ubijać "uszkodzony" proces smbd i kasować gigantyczny log.

Nasuwa mi się przypuszczenie, że albo ustawić większe ulimit -n dla użytkownika samba, albo nakazać sambie, żeby uruchamiała procesy potomne tylko jako root.

Niestety nie wiem jak to zrobić ;-(

Bardzo proszę o pomoc.

Witek

PS. smb.conf

Kod: Zaznacz cały

[global]
        server string = Intranet Linux Server
        workgroup = WORK
        interfaces = 192.168.0.3/24, 127.0.0.1
        bind interfaces only = yes
        smb ports = 445 139

        map to guest = Bad Password
        guest account = samba
        auth methods = guest, sam

        passdb backend = tdbsam:/etc/samba/private/passdb.tdb

        dos charset = 852
        unix charset = ISO8859-2
        display charset = ISO-8859-2

        log file = /var/log/samba/samba.%m
        log level = 0 passdb:1 auth:1 winbind:0
        syslog = 0
        max log size = 200

        lock directory = /var/run/samba/lock
        pid directory = /var/run/samba

        name resolve order = lmhosts hosts wins bcast
        socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_SNDBUF=8192                                                                               SO_RCVBUF=8192
        os level = 65
        lm announce = no
        preferred master = yes
        domain master = yes
        wins support = yes
        ldap ssl = no

        create mask = 0770
        directory mask = 0770
        force create mode = 0770
        force directory mode = 0770

        hosts allow = 127., 192.168.0.0/255.255.255.0

# zasób z plikami baz dbf programu otwierającego je w ogromnej ilości
[program]
    volume = Program
    comment = Oprogramowanie gis
    path = /mnt/hd1/gis
    force user = samba
    force group = users
    browseable = yes
    case sensitive = no
    valid users = user1, user2
    write list = user1, user2


[ Dodano: 2007-11-25, 17:08 ]
Udało mi się znaleźć odpowiedź i rozwiązanie problemu związanego ze zwiększeniem ilości bazowej filedescriptorów w systemie.

Cała kwestia wiąże się z modyfikacją pliku ./include/linux/fs.h w źródłach kernela i jego rekompilacja (u mnie 2.6.20)

Edytujemy następującą definicję:
W pliku ./include/linux/fs.h definicję INR_OPEN, czyli wyjściowa ilość fd dla użytkownika - standardowo jest 1024, ja ustawiłem ją na 8192 oraz NR_FILE, którą ustawiłem z kolei na 32768.

Początek pliku ./include/linux/fs.h :

Kod: Zaznacz cały

/*
 * This file has definitions for some important file table
 * structures etc.
 */

#include <linux/limits.h>
#include <linux/ioctl.h>

/*
 * It's silly to have NR_OPEN bigger than NR_FILE, but you can change
 * the file limit at runtime and only root can increase the per-process
 * nr_file rlimit, so it's safe to set up a ridiculously high absolute
 * upper limit on files-per-process.
 *
 * Some programs (notably those using select()) may have to be 
 * recompiled to take full advantage of the new limits..  
 */

/* Fixed constants first: */
#undef NR_OPEN
#define NR_OPEN (1024*1024)	/* Absolute upper limit on fd num */
#define INR_OPEN 8192	            /* Initial setting for nfile rlimits */
.
.
.
#ifdef CONFIG_DNOTIFY
extern int dir_notify_enable;
#endif

#define NR_FILE 32768	/* this can well be larger on a larger system */
Po uruchomieniu systemu z nowym kernelem mamy już grzecznie ustaloną ilość fd na wejściu, które możemy obniżać dla użytkowników jak nam się podoba w pliku /etc/profile.

Warto zwrócić uwagę jeszcze na jedną rzecz. Mianowice w pliku ./include/linux/limits.h także istnieje definicja NR_OPEN, której zmiana powoduje dodanie ilości fd ustalonej tutaj oraz w ./include/linux/fs.h. Osobiście nie zmieniam zawartości pliku limits.h, jedynie poza ustaleniem ilości otwartych plików dla procesu z 256 na 1024.

Co do problemów z sambą opisanymi w poprzednim poście, to kwestie dotyczyły następujących spraw. W zdefiniowanym zasobie, na którym klienci otwierali mnóstwo plików ustawiłem opcję "force user = jakis_uzytkownik_z_grupy_users", która powodowała, że proces potomny demona smbd forkował się nie jako root, tylko jako "jakis_uzytkownik_z_grupy_users", który posiadał już ulimit -n tylko 1024. No i wtedy zaczynały się problemy. Trzeba było zabijać felerny proces smbd, który wysypywał gigantycznych rozmiarów log oraz "żarł" 100% cpu.

Reasumując problem z sambą. Albo nie należy używać parametru "force user" w smb.conf, albo wystarczająco podnieść startowy ulimit -n.

Mam nadzieję, że komuś moje spostrzeżenia się przydają.
Dodatkowo artykuł , na którym się wsparłem.

Pozdrawiam
Witek
Ostatnio zmieniony 2007-11-25, 17:11 przez vitos, łącznie zmieniany 5 razy.
ODPOWIEDZ