Чистим docker от старых container, image, volume и network

Остановка и удаление контейнеров

docker container ls -aq

или

docker ps -aq

Остановка всех контейнеров:

docker container stop $(docker container ls -aq)

или

docker container stop $(docker ps -aq)

Удаление всех контейнеров:

docker container rm $(docker container ls -aq)

или

docker container rm $(docker ps -aq)

Удаление всех незадействованных image (не использует ни один контейнер):

docker image prune -a

Удаление неиспользуемых volume:

docker volume prune

Удаление неиспользуемых сетей network:

docker network prune

А вообще можно всё упаковать в подобный скрипт docker-cleaner.sh:

docker system prune
docker container stop $(docker container ls -aq)
docker container rm $(docker container ls -aq)
docker rmi $(docker images -aq)
docker volume prune
docker network prune

Более подробно почитать: https://www.digitalocean.com/community/tutorials/how-to-remove-docker-images-containers-and-volumes-ru

Как разрешить пользователю Linux запускать только определенный набор команд

Проблема: при организации сетевой связности между системами и сетевым элементами сетевики постоянно требуют пинги/трейсы по портам для анализа проблем.

Решение: создать для них учетную запись Linux, которая будет ограничена в правах и функционале — пусть сами всё проверяют.

Исходные данные: Ubuntu 20.04, нужен доступ к ping и traceroute.

В Ubuntu 20.04 утилита rbash уже есть. Но, если в системе её нет, то можно создать её копированием:

cp /bin/bash /bin/rbash

Создание пользователя:

useradd -s /bin/rbash username

Создадим для него домашнюю директорию c поддиректорией utils:

mkdir -p /home/username/utils

Пользователь может запускать только то, что будет найдено в директориях, указанных в переменной окружения PATH, которая прописана в /home/username/.bash_profile

Создадим и отредактируем этот файл:

# cat /home/username/.bash_profile  
# .bash_profile  

# Get the aliases and functions  
if [ -f ~/.bashrc ]; then  
. ~/.bashrc  
fi  
# User specific environment and startup programs  
PATH=$HOME/utils  
export PATH

Теперь, когда пользователь будет пытаться запускать команды — они будут запускаться не из /bin//usr/local/bin/ или /home/usename/bin/, а из /home/username/utils/

Создадим ссылки на утилиты:

ln -s /bin/ping /home/username/utils/
ln -s /usr/sbin/traceroute /home/username/utils/

В директории /home/username/utils/ появились ссылки на утилиты:

> ls -l /home/username/utils/
lrwxrwxrwx 1 root root  9 янв 16 17:19 ping -> /bin/ping
lrwxrwxrwx 1 root root 20 янв 16 17:22 traceroute -> /usr/sbin/traceroute

Проверяем работоспособность:

username@notebook:~$ top
-rbash: /usr/lib/command-not-found: ограниченный режим: в названиях команд нельзя использовать косую черту «/»
username@notebook:~$ ping ya.ru
PING ya.ru (87.250.250.242) 56(84) bytes of data.
64 bytes from ya.ru (87.250.250.242): icmp_seq=1 ttl=55 time=24.0 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=55 time=24.9 ms
...
username@notebook:~$ traceroute ya.ru
traceroute to ya.ru (87.250.250.242), 30 hops max, 60 byte packets
 1  _gateway (192.168.0.1)  1.360 ms  1.418 ms  1.506 ms
 2  95.55.64.1 (95.55.64.1)  8.333 ms  8.362 ms  8.407 ms
...

Готово!

Для защиты файла от перезаписи (сделать его immutable) и изменения переменной PATH — рекомендуется использовать chattr:

chattr +i /home/username/.bash_profile

Таким образом ни root, ни username не смогут его изменить, пока сам root не сделает этот файл снова изменяемым.

Убирается этот атрибут командой:

chattr -i /home/username/.bash_profile

Посмотреть атрибуты файла можно командой:

> lsattr /home/username/.bash_profile
----i---------e----- /home/localuser/.bash_profile

Подробнее про chattr и его атрибуты читаем тут: https://losst.ru/neizmenyaemye-fajly-v-linux

Список инстансов в AWS

Очень долго не мог найти instance в AWS, на котором крутится веб-сервер, т.к. не заходил в аккаунт давным давно и всё забыл.

Чтобы не перебирать каждый регион, нашёл такой хитрый способ поиска работающих инстансов EC2: в разделе Management & Governance заходим в Resource Groups & Tag Editor, слева в меню переходим в Tag Editor, в Regions выбираем All regions, в Resource types выбираем AWS::EC2::Instance и жмём Search resources.

Лог истории загрузок Ubuntu 20.04

Файл настроек: /etc/systemd/journald.conf

Список последних загрузок:

>journalctl —list-boots

-10 a843385338a345ba8624afdb540958ac Wed 2020-10-14 22:26:33 MSK—Wed 2020-10-21 00:45:37 MSK
 -9 d00f8ed0dade4d79a3ae532a31d9e48d Wed 2020-10-21 00:46:06 MSK—Thu 2020-10-22 16:21:57 MSK
 -8 9cb91d48cf044b7692185886a56cf626 Thu 2020-10-22 16:23:51 MSK—Thu 2020-10-22 21:18:06 MSK
 -7 73639158c7f24ad4b9d0441ba0056544 Thu 2020-10-22 21:18:40 MSK—Thu 2020-10-22 21:25:59 MSK
 -6 22bec3b93a134219be1130b1a8b61bb3 Thu 2020-10-22 21:26:22 MSK—Sun 2020-10-25 14:12:29 MSK
 -5 5cd092de09da43ada66385fe8f7fccae Sun 2020-10-25 14:56:54 MSK—Sun 2020-10-25 17:55:28 MSK
 -4 02b7067e714a429bb259b634b5118d15 Sun 2020-10-25 18:02:56 MSK—Sun 2020-10-25 18:06:14 MSK
 -3 f7dc97bab377439f9b997347b2deba2d Sun 2020-10-25 18:06:42 MSK—Sun 2020-10-25 18:08:11 MSK
 -2 1269d557225f4a16ad7e1621142c5a49 Sun 2020-10-25 18:12:11 MSK—Sun 2020-10-25 18:37:23 MSK
 -1 ea48cfbac029432cbea0f94b81744949 Sun 2020-10-25 18:37:44 MSK—Sun 2020-10-25 18:54:51 MSK
  0 115cbebd2b8542bcb9e126760c9fd3a2 Sun 2020-10-25 18:55:13 MSK—Mon 2020-10-26 23:59:02 MSK

Посмотреть журнал загрузки номер -1:

> journalctl -b -1

-- Logs begin at Thu 2020-06-18 10:44:21 MSK, end at Tue 2020-10-27 00:45:29 MSK. --
окт 25 18:37:44 notebook kernel: microcode: microcode updated early to revision 0x2f, date = 2019-02-17
окт 25 18:37:44 notebook kernel: Linux version 5.4.0-52-generic (buildd@lgw01-amd64-060) (gcc version 9.3.0 (Ubuntu 9.3.0-17ubuntu1~20.04>
окт 25 18:37:44 notebook kernel: Command line: BOOT_IMAGE=/vmlinuz-5.4.0-52-generic root=UUID=d9e99dd5-b26b-4bbc-8f9a-733fe5276e05 ro qui>
окт 25 18:37:44 notebook kernel: KERNEL supported cpus:
окт 25 18:37:44 notebook kernel:   Intel GenuineIntel
...

А если добавить в cron, то можно:

journalctl --vacuum-time=2d  # хранить данные только за 2 дня

journalctl --vacuum-size=300M  # хранить только 300MB

Delete journalctl logs:

journalctl --disk-usage  # (To see the size of the log)

sudo journalctl --vacuum-time=1d  # (To delete, the 1d represents that it will delete logs more than a day older)

Password has been used already. Choose another.

Changing password for ftpuser.
New Password:
Reenter New Password:
BAD PASSWORD: has been already used
BAD PASSWORD: has been already used
BAD PASSWORD: has been already used
BAD PASSWORD: has been already used
BAD PASSWORD: has been already used
Password has been used already. Choose another.
passwd: Authentication token manipulation error

Старые пароли в Linux хранятся в /etc/security/opasswd
Решение: удалить из файла /etc/security/opasswd строку с пользователем, для которого собираетесь менять пароль.

Также посмотрите файл /etc/pam.d/common-password — там есть что-то вроде:
password required pam_pwcheck.so enforce_for_root remember=12 use_authtok use_first_pass
Параметр remember=12 говорит, что последние 12 паролей нельзя повторно использовать.

Файлы journalctl

Проверить, сколько места занимают файлы журналов:
journalctl —disk-usage

Когда в конфигурационном файле /etc/systemd/journald.conf параметр Storage= имеет значение auto, журнал записывается в /var/log/journal/ . Если вы или какая-то программа удалит этот каталог, systemd не пересоздаст его автоматически и вместо этого будет писать свои журналы по непостоянному пути /run/systemd/journal. Однако, папка будет пересоздана, когда вы установите Storage=persistent и выполните systemctl restart systemd-journald (или перезагрузитесь).

Показать все сообщения с момента текущей загрузки системы:
# journalctl -b
Показать все сообщения с момента предыдущей загрузки системы:
# journalctl -b -1
Показать все сообщения с момента следующей за предыдущей загрузки системы:
# journalctl -b -2

Показать все сообщения, начиная с какой-либо даты (и, если хотите, времени):
# journalctl —since=»2012-10-30 18:17:16″

Показать все сообщения за последние 20 минут:
# journalctl —since «20 min ago»

Показывать новые сообщения:
# journalctl -f

Показать все сообщения для конкретного исполняемого файла:
# journalctl /usr/lib/systemd/systemd

Показать все сообщения для конкретного процесса:
# journalctl _PID=1

Показать все сообщения для конкретного юнита:
# journalctl -u netcfg

Очистка файлов журнала journalctl вручную:
Remove archived journal files until the disk space they use falls below 100M:
# journalctl —vacuum-size=100M

Make all journal files contain no data older than 2 weeks.
# journalctl —vacuum-time=2weeks

Почитать дополнительно

Дружим VirtualBox и iptables

Лаба 1

Дано:

Хост машина Ubuntu (Server) и на ней две гостевые Centos (Server0 и Server1).
Хост имеет два сетевых интерфейса: vboxnet0 и vboxnet1

Server0 и Server1 имеют настройки сети в VirtualBox: тип подключения «Виртуальный адаптер хоста». Имена, указанные для подключений «vnetbox0» и «vnetbox1» соответственно для каждой гостевой машины.

Задача: Server0 и Server1 должны общаться друг с другом по сети.

Server

vboxnet0: 10.0.0.1/24

vboxnet1: 192.168.56.1/24

 

Server0 ip: 10.0.0.2

ip addr add 10.0.0.2/24 dev enp0s3

ip route add default via 10.0.0.1

 

Server1 ip: 192.168.56.2

ip addr add 192.168.56.2 dev enp0s3

ip route add default via 192.168.56.1

На хосте включаем ip_forward:

Поскольку после перезагрузки такое не сохраняется:

sysctl -w net.ipv4.ip_forward=1

то сделаем так:

echo «net.ipv4.ip_forward=1» >> /etc/sysctl.conf

Применяем записанный параметр:

sysctl -p /etc/sysctl.conf

На хосте прописываем правила:

sudo iptables -t nat -A POSTROUTING -o vboxnet0 -j MASQUERADE
sudo iptables -A FORWARD -i vboxnet0 -o vboxnet1 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i vboxnet1 -o vboxnet0 -j ACCEPT

sudo iptables -t nat -A POSTROUTING -o vboxnet1 -j MASQUERADE
sudo iptables -A FORWARD -i vboxnet1 -o vboxnet0 -m state --state RELATED,ESTABLISHED -j ACCEPT
sudo iptables -A FORWARD -i vboxnet0 -o vboxnet1 -j ACCEPT

Лаба 2:

Дано: три гостевые, между ними построена «Внутренняя Сеть».

Задача та же: чтобы машинки общались друг с другом по сети.

Без имени

Всё то же самое

Server0:

ip addr add 10.0.0.2/24 dev enp0s3

ip route add default via 10.0.0.1

 

Server1:

ip addr add 192.168.0.2/24 dev enp0s3

ip route add default via 192.168.0.1

 

Включаем ip_forward на Server:

sysctl -w net.ipv4.ip_forward=1

и добавляем правила в iptables:

iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT

iptables -A FORWARD -i eth1 -o eth0 -j ACCEPT

Осталось понять, в чем принципиальная разница между решениями в iptables первой и второй лабы))

 

Ubuntu 12.04 и iwl4965

На старом ноуте постоянно отваливается wifi. Само подключение работает, но пропадает связь.

Смотрим dmesg:

[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: Microcode SW error detected. Restarting 0x82000000.
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: Loaded firmware version: 228.61.2.24
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: Start IWL Error Log Dump:
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: Status: 0x000213E4, count: 5
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: Desc Time data1 data2 line
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_ERROR (0x000C) 0116363223 0x00000008 0x03530000 208
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: pc blink1 blink2 ilink1 ilink2 hcmd
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: 0x0046C 0x0A332 0x004C2 0x006DE 0x0A388 0x203001C
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH register values:
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_RSCSR_CHNL0_STTS_WPTR_REG: 0X02b84200
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_RSCSR_CHNL0_RBDCB_BASE_REG: 0X002e3270
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_RSCSR_CHNL0_WPTR: 0X00000060
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_MEM_RCSR_CHNL0_CONFIG_REG: 0X00819000
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_MEM_RSSR_SHARED_CTRL_REG: 0X0000003c
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_MEM_RSSR_RX_STATUS_REG: 0X03530000
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_MEM_RSSR_RX_ENABLE_ERR_IRQ2DRV: 0X00000000
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_TSSR_TX_STATUS_REG: 0X07ff0002
[Сб. сент. 22 20:44:12 2018] iwl4965 0000:05:00.0: FH_TSSR_TX_ERROR_REG: 0X00000000
[Сб. сент. 22 20:44:12 2018] ieee80211 phy7: Hardware restart was requested

Понятно, что есть драйвер (модуль) iwl4965 и firmware для него версии: 228.61.2.24

modinfo iwl4965

Видим, что производитель Intel.

(Дополнительно можно глянуть lshw -C network)

Нашлось два выхода из ситуации:

  1. В интернетах предлагают понизить ядро с 3.2.0-63-generic, до, например, 2.6
  2. Найти версию firmware постарее и подсунуть её.

Второй пункт выглядит проще, его и попробую.

Скачал со страницы https://wireless.wiki.kernel.org/en/users/drivers/iwlegacy другую версию firmware — 228.57.2.21 (напоминаю, было 228.61.2.24) для Intel® Wireless WiFi Link 4965AGN

Сначала отключу модуль:

rmmod iwl4965

Подменяю файл firmware:

mv /lib/firmware/iwlwifi-4965-2.ucode /lib/firmware/iwlwifi-4965-2.ucode.bak

cp /home/ivan/Downloads/iwlwifi-4965-2.ucode /lib/firmware/iwlwifi-4965-2.ucode

Включаю модуль:

modprobe iwl4965

Вроде, помогло. Уже час стабильно работает подключение по wi-fi.

Что почитать про модули: https://habr.com/post/117654/

Вывести содержимое последних логов в один файл (ленивая версия с извращениями, Solaris)

Я всё усложнил, можно было сделать гораздо проще, но такими сложностями заставляешь себя вспоминать многие вещи, которыми нечасто пользуешься.

Сначала получим список последних файлов, исключив директории, и запишем его в файл:

ls -lAtr /tmp | grep "^-" | awk '{print $9}' | tr "\n" " " > /tmp/filenames.txt
tr "\n" " " - позволяет заменить перенос строки на пробел

Редактируем файл filelist.txt в vi, удаляем оттуда имя файла ‘filelist.txt’. Почему руками? А чтобы вспомнить, как пользоваться vi. Напоминалка: 25dd — удалить 25 строк, 500x — удалить 500 символов.

Читаем файл со списком и выводим содержимое файлов с их названием:

 for filename in $(cat /tmp/filelist.txt); do 

echo "==== $filename ===="; 

cat "$filename"; 

done > /tmp/output.txt

В результате получаем сообщение:

«cat: input/output files ‘/tmp/output.txt’ identical»

WTF???

Ага, косяк с том, что в списке файлов присутствует и сам ‘output.txt’, я забыл его удалить с прошлых тестов. Исправляюсь:

В Solaris не работает sed -i, вместо этого использую perl:

perl -pi -e ‘s/output.txt//’ /tmp/filelist.txt

Теперь после повторного выполнения скрипта с циклом for, что был выше, не появятся сообщения.

PROFIT!

 

Реестр приложений с FTP сервера

Задача:

Поиск всех exe-файлов на ftp-сервере, имя не должно содержать знак тильды.
Выводить имя владельца и группы файла, дату модификации, путь и имя файла.

find /usr/ftp/pub/sklad/bin/ -type f -name "*.exe" -exec ls -laE {} \; | grep -v "~" | sed 's@/usr/ftp/pub/sklad/bin/@@' | awk '{print $3","$4","$6","$9}' > /tmp/sklad.txt

В файл /tmp/reestr.txt запишется информация в таком виде: Продолжить чтение «Реестр приложений с FTP сервера»