Эта статья — часть Большого Мануала по настройке lamp-сервера на debian.
Предыдущая статья цикла — Про vds/dedicated хостеров. Выбираем сервер.
Следующая статья цикла — /etc/apt/sources.list.
Нередко хостеры не позволяют налить машину из своего iso-образа. Самые продвинутые позволяют налить систему из захардкоженного списка iso-шников — с ними проще. Но вот у всех остальных система ставится из образа, приготовленного хостером. Есть в таких образах полезные вещи — драйвера к железу из коробки, какие-то там системы мониторинга, которые позволяют в панели рисовать клевые графички или присылать смс, если на сервере кончилась память (это во flops, кстати). Но в большинстве случаев хостер в шаблон кладет какое-нибудь дерьмо — ненастроенный apache, ntpd, самые фантазеры дадут вам машину «с настроенным LAMP» — всё это вам не нужно. Во-первых, можно потратить много времени на то, чтобы донастроить за хостером всё то, что он добавил в шаблон (это иногда нетривиально, к тому же), во-вторых — зачем нам какая-то ненужная хрень на сервере?
Поэтому сейчас мы будем учиться сносить всё лишнее. Для примера я взял виртуалку в digitalocean с «базовым» Debian 7 — даже там хватает ненужного.
Для начала посмотрим на то, что на самом деле debian-у нужно. Вот вам пример выхлопа ps aux на одном из моих серверов (единственная его задача — быть dns-сервером)
root@ns2:~# ps aux
USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
root 1 0.0 0.3 10444 812 ? Ss May12 0:02 init [2]
root 2 0.0 0.0 0 0 ? S May12 0:00 [kthreadd/3325]
root 3 0.0 0.0 0 0 ? S May12 0:00 [khelper/3325]
root 430 0.0 0.3 56664 1024 ? Ss May12 0:00 /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
root 432 0.0 0.2 56664 556 ? S May12 0:00 /usr/sbin/saslauthd -a pam -c -m /var/run/saslauthd -n 2
root 440 0.0 0.2 10136 756 ? Ss May12 0:10 /sbin/syslogd
bind 462 0.0 6.7 132140 17576 ? Ssl May12 0:14 /usr/sbin/named -u bind
root 490 0.0 0.3 23000 1012 ? Ss May12 0:00 /usr/sbin/cron
root 521 0.0 0.8 58136 2112 ? Ss May12 0:08 sendmail: MTA: accepting connections
root 543 0.0 0.4 51276 1192 ? Ss May12 0:07 /usr/sbin/sshd
root 8050 0.0 1.4 81104 3796 ? Ss 19:47 0:00 sshd: root@ttyp0
root 8052 0.0 0.7 19808 1916 ttyp0 Ss 19:47 0:00 -bash
root 8058 0.0 1.2 79736 3332 ? Ss 19:48 0:00 sshd: root [priv]
sshd 8059 0.0 0.5 52620 1456 ? S 19:48 0:00 sshd: root [net]
root 8061 0.0 0.4 18976 1100 ttyp0 R+ 19:48 0:00 ps aux
Каждый процесс мне здесь понятен, запущенная система занимает 21 мегабайт памяти.
А теперь посмотрим на «чистую» систему в digitalocean:
PID TTY STAT TIME COMMAND
1 ? Ss 0:00 init [2]
...
281 ? Ss 0:00 udevd --daemon
1844 ? Sl 0:00 /usr/sbin/rsyslogd -c5
1897 ? Ss 0:00 /usr/sbin/atd
1906 ? Ss 0:00 /usr/sbin/acpid
1908 ? Ss 0:00 /usr/sbin/anacron -s
2007 ? Ss 0:00 /usr/sbin/cron
2027 ? Ss 0:00 /usr/bin/dbus-daemon --system
2110 ? Ss 0:00 /usr/sbin/sshd
2316 ? Ss 0:00 /usr/sbin/exim4 -bd -q30m
2345 tty1 Ss+ 0:00 /sbin/getty 38400 tty1
2346 tty2 Ss+ 0:00 /sbin/getty 38400 tty2
2347 tty3 Ss+ 0:00 /sbin/getty 38400 tty3
2348 tty4 Ss+ 0:00 /sbin/getty 38400 tty4
2349 tty5 Ss+ 0:00 /sbin/getty 38400 tty5
2350 tty6 Ss+ 0:00 /sbin/getty 38400 tty6
2352 ? Ss 0:00 sshd: root@pts/1
2355 ? Sl 0:00 /usr/sbin/console-kit-daemon --no-daemon
2424 pts/1 Ss 0:00 -bash
2473 pts/1 R+ 0:00 ps ax
Там, где … — ядерные процессы, мы с ничего делать не будем (обозначаются как [something] в выводе ps ax).
Давайте рассуждать. init — процесс нужный, тут не поспоришь.
udevd отвечает за управлением железом (в том числе, и виртуальным). Пригодится.
А вот мы встретили rsyslog, он нам непонятен. Идем в гугл с запросом «linux what is rsyslog». Ага, в эту штуку система пишет логи, тоже оставим. Но вот если бы был syslog-ng — мы бы его заменили на rsyslog, он полегче (не такой фичастый, зато памяти меньше ест).
Гуглим про atd. Какой-то там планировщик одноразовых задач на определенное время (ей б-гу, я им пользовался за 7 лет 2 раза). Вот когда понадобится — тогда и поставим. А пока снесем.
Для начала попробуем найти, где он. Процесс называется atd, спросим у dpkg, что он знает про файлы с таким названием:
at: /etc/pam.d/atd
at: /etc/init.d/atd
at: /usr/sbin/atd
linux-image-3.2.0-4-amd64: /lib/modules/3.2.0-4-amd64/kernel/drivers/dma/ioat/ioatdma.ko
at: /usr/share/man/man8/atd.8.gz
Вряд ли утилита at daemon живет в пакете linux-image. А вот пакет at — похож на правду. Сносим его:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
at*
0 upgraded, 0 newly installed, 1 to remove and 0 not upgraded.
After this operation, 103 kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 26343 files and directories currently installed.)
Removing at ...
[ ok ] Stopping deferred execution scheduler: atd.
Purging configuration files for at ...
Processing triggers for man-db ...
Так, что там у нас следующее? acpid. Вроде, какая-то штука про управление питанием в Linux. Пожалуй, оставим.
anacron и cron. Запуск задач по расписанию. Вообще штуки полезные и нам пригодятся. Я бы снес anacron, но некоторые пакеты зависят от него — они запускают что-то через anacron, а не cron, так что пусть живет.
dbus — гуглим, тоже что-то важное. Оставляем.
sshd — ssh-daemon. Пожалуй, имея доступ только через ssh на сервер, сносить его будет плохой идеей.
А следующий у нас — exim. Почтовый сервер, конфигурация которого нам неизвестна. Отличненько! Но нам-то хочется, чтобы конфигурация exim-a была известной, чтобы через нас спам пройти не мог.
Попробуем найти все пакеты про exim:
ii exim4 4.80-7+deb7u1 all metapackage to ease Exim MTA (v4) installation
ii exim4-base 4.80-7+deb7u1 amd64 support files for all Exim MTA (v4) packages
ii exim4-config 4.80-7+deb7u1 all configuration for the Exim MTA (v4)
ii exim4-daemon-light 4.80-7+deb7u1 amd64 lightweight Exim MTA (v4) daemon
Угу, пробуем снести:
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages will be REMOVED:
bsd-mailx* exim4* exim4-base* exim4-config* exim4-daemon-light*
0 upgraded, 0 newly installed, 5 to remove and 0 not upgraded.
After this operation, 4,061 kB disk space will be freed.
Do you want to continue [Y/n]? Y
(Reading database ... 26319 files and directories currently installed.)
Removing bsd-mailx ...
Purging configuration files for bsd-mailx ...
Removing exim4 ...
Purging configuration files for exim4 ...
Removing exim4-daemon-light ...
[ ok ] Stopping MTA: exim4_listener.
Purging configuration files for exim4-daemon-light ...
Removing exim4-base ...
Purging configuration files for exim4-base ...
Removing exim4-config ...
Purging configuration files for exim4-config ...
dpkg-statoverride: warning: no override present
Processing triggers for man-db ...
Вроде бы получилось.
А что если не получилось бы? Мы можем переустановить конфиги пакета, не снося сам пакет. Правда, apt этого делать не умеет (apt-get install —reinstall не в счет).
Поэтому нам понадобятся deb-файлы:
Проверим, что они появились в текущем каталоге:
exim4_4.80-7+deb7u1_all.deb exim4-base_4.80-7+deb7u1_amd64.deb exim4-config_4.80-7+deb7u1_all.deb exim4-daemon-light_4.80-7+deb7u1_amd64.deb
Сойдет.
Теперь мы можем привести конфигурацию этих пакетов к дефолтной:
По крайней мере, так мы восстановим те конфиги, которые хостер удалил (бывает у них) после установки пакета.
Ребутаемся, смотрим — система занимает 26 мегабайт. Окей, 5 мегабайт — это разница между sendmail и exim.
А в списке запущенных процессов (за вычетом ядерных) у нас около 20 процессов. Прекрасно, здесь уже можно работать.
Стоит проверить ещё и список установленных пакетов, его можно посмотреть такой командой:
Конечно, весь его прочитать не получится, но поискать там все упоминания известного вам софта (apache, php, *sql, smb, ftp и так далее) стоит, чтобы не оказаться в ситуации, когда вы стараетесь настроить заведомо неправильно настроенный демон.
Например, я снёс вот эти пакеты:
tcpdump — вещь ситуативная, её можно поставить, когда понадобится
sudo — потом поставлю и настрою, мало ли что там хостер в sudo вписал.
w3m — вообще консольный браузер. Полезная штука, но вряд ли я им воспользуюсь именно на этом сервере.
whois — ну э… я с ноутбука whois домена посмотреть могу (у меня там такой же пакет есть, ага).
traceroute — тоже ситуативная вещь, на практике на 80% серверов его никогда не запускают.
rsync — когда понадобится — поставлю.
parted — вот уж работать с партициями дисков на виртуалке мне точно не придется.
ntpdate — сносим на всякий, потом поставим и настроим.
netcat — понадобится — поставим. Вообще-то штука полезная, но я предпочитаю ту, что в пакете netcat-openbsd
nano — редактор, которым я не пользуюсь. В топку.
manpages, man-db — у меня есть, где почитать мануалы.
acl — вряд ли вы будете его использовать (а если будем, то и не сносим).
aptitude — apt (наконец-то) уже всё то же самое умеет.
arping — аналогично трейсроуту
avahi-daemon — кто вообще эту дрянь сюда положил?
eject — на виртуалке? Кхм.
ftp — стандартный консольный ftp клиент. Во-первых, есть lftp, во-вторых, можно поставить, когда понадобится
fuse — вот тоже как-то не собираюсь его использовать.
git, git-man — пока не нужны. А если нужны — вы знаете, что делать.
Вот такими примерно рассуждениями можно минимизировать размер системы и количество опасных мест. А после этого уже приступать к настройке.
«dpkg -i —force-confmiss …»
Если где то в конфигах сказано «include /etc/foo.d/*.conf», и хостер туда положил какой-нить свой /etc/foo.d/hostername.conf то может получиться не совсем то, что мы изначально планировали. Правда как это красиво обойти я не знаю.
Мда. Тоже верно =)
Ну в таких случаях пурджить и смотреть, что нет сообщений вида «/etc/daemon: not removed, not empty». Не помню уже, как там именно, но смысл в том.
Хорошо что сейчас у многих VPS есть возможность подключить свою ISO для минимальной установки и морочиться с вычищением уже не нужно.