Radiofisik

my knowledge base

Linux

Инициализация системы

SysV

Старт основан на runlevel. Показать текущий уровень - команда runlevel Переключиться на другой уровень можно с помощью команды inti level_number В папке /etc/rc{level_number}.d лежат скрипты запуска этого уровня. Те что начинаются с К - kill, те что начинаются с S - start. В папке /etc/init.d лежат севрисы. Изначальная конфигурация запуска в /etc/inittab

# полезные команды
runlevel
wall "pc will be shundown"
init 0
telinit 0
service docker start

systemd

В более современных системах для запуска используется systemd. systemd оперирует юнитами. Юниты хранятся в директориях:

виды юнитов

systemctl list-units
systemctl --failed
systemctl list-units --type service
systemctl status docker
systemctl stop docker
systemctl start docker

цели - аналог уровнев в sysv

Runlevel Target  
0 poweroff.target выключение
1 rescue.target однопользовательский режим
2,4 multi-user.target настраиваемые режимы
3 multi-user.target многопользовательский режим
5 graphical.target графический режим
6 reboot.target перезагрузка
# запущенные таргеты (аналог runlevel)
systemctl list-units --type=target
# переключиться на другой (аналог init)
systemctl isolate name.target
#посмотреть что установлено по умолчанию
systemctl get-default
# установить по умолчанию
systemctl set-default -f name.target

journal - служба журналирования

# показать события в реальном времени
jounalctl -f
# показать события рута
journalctl _UID=0
# в интервале с grep
journalctl --since="2021-04-21 23:59" --until="2021-04-22 02:00" | grep -v multipathd
# по script name
journalctl _COMM=cron --since="00:00"

upstart

Оперирует Services и Tasks. хранит jobs в /etc/init Для управления используется утилита initctl

Библиотеки

Конфигурации библиотек хранятся в файле /etcc/ld.so.conf он подключает все файлы в директории /etc/ld.so.conf.d/*.conf

# обновить кеш библиотек
ldconfig

# используемые бинарником библиотеки
ldd /bin/ls

export LD_LIBRARY_PATH=/opt/soft/lib
ldconfig

Менеджер пакетов

В дебиане для управления пакетов служит утилита apt-get. Список репозиториев для нее хранится в файле /etc/apt/sources.list

dpkg 
-l перечень пакетов в системе
-L перечень файлов в системе
-s статус пакета
-S поиск пакета содержащего файл
dpkg -S /bin/ifconfig
-i install
-r remove
-P remove with configs
dpkg-reconfigure - переконфигурация

apt-cache search something
apt-cahce show something
apt-cache depends something
apt-cache rdepends something

apt-get install something
apt-get remove something
apt-get --purge remove webmin
apt-get autoremove

apt-get install aptitude
aptitude

В RedHat дистпридутивах перечень репозиториев хранится в /etc/yum.repos.d

rpm -iv somePackage.rpm
# проверка пакета
rpm -Vv somePackage
# получение ниформации query
rpm -q somePackage
# extract
rpm2cpio somePakcage > somePakcage.cpio
less something.cpio

yum install somePakcage
yum remove somePackage
yum upgrade
yum search something

#download rpms
yum downloader somePackage 

Bash и Переменные среды

основные настройки облочки bash сохраняются в /etc/profile настройки для пользователя ~/.profile далее настройки внешенего вида настраиваются в ~/.bashrc

# выполнение несскольких команд
echo hello; ls; echo Buy
# запись информации в файл
cat >file.txt
echo some content
^C

env
abc=123
export abc
echo $abc
unset abc

PATH=$PATH:.

touch {6,7,8}.txt
uname -a
# опредилить тип файла
file someFile.txt
whatis history
history
man -k http
# игнорируем настройи профиля
exec ls -a

Работа с текстовыми потоками

Поиск

# поиск файлов
find . -type f

# по имени
find . -name somename

# найти больше чем 5MB
find . -size +5M

# найти по времени доступа в днях
find . -atime +5

# найти по времени изменения в днях
find . -сtime +5

#locate в некоторых дистрибутивах есть быстрый поиск
locate something

Архивы

#cpio 
ls | cpio -o > ../test.cpio
find . -name *.txt | cpio -o > test2.cpio

cpio -id < ../test2.cpio

# dd
dd if=/dev/sdb of=drive.img
dd if=/dev/sda bs=64k | ssh root@centos5.5 «dd of=/dev/mapper/vg00-lv_rh73 bs=64k»

#gzip
gzip drive.img
gunzip drive.img.gz

#bzip2
bzip2 drive.img
bunzip2 drive.img.bz2

#xz
xz drive.img
unxz drive.img.xz

#tar
tar cvf archive.tar folder
tar xvf archive.tar

# исользует gz для сжатия в tar.gz
tar cvfz archive.tar folder

Потоки

wc file.txt
wc < file.txt

ls > list.txt 2>error.log
ls >> addToList.txt 2>error.log

# вывод на экран и в файл
ls | tee output.txt

# построчная передача как параметр
find . -name *.txt | xargs rm -f

Процессы

# запуск в фоновом режиме с помощью & 
sleep 10000 &
# проверить
jobs
# вернуть 
fg 1
#остановим ^Z и запустим
bg 1

# отобразить процессы
ps -aux

# убить все в именем
killall sleep
kill -9 pid

# предотвращает прекращение процесса при логауте
nohup sleep 1000
#
pgrep sleep -l
pkill sleep

# uptime говорит кроме времени работы общую загрузку системы и количество пользователей
uptime

# память
free

# Приоритет процесса NI (nice) -20 - максимум, 19 - минимум
ps alx
ps -eo user,pid,pcpu,nice,comm
nice sleep 6000 & # устанавливает низкий приоритет 10
nice -n -20 sleep 6000 & # устанавливает высший приоритет -20
renice 5 -p PID  # переустановить приоритет
renice 15 -u username

Обычно более просто операции с процессами можно выполнить с помощью top

#top
top
процесс можно убить нажав k введя pid и сигнал 15 - мягко sigterm, 9 - жестко sigkill
<> сортировка
посмотреть по ядрам 1
скрыть idle процессы i
load average среднее количество процессов в очереди планировщика за соответственно 1	5	15 минут

0.0%us - процент использования процессора процессами пользователя 
0.3%sy - процент использования процессора системными вызовами
0.0%wa - процент времени процессор ждал завершения дисковых операций
0.0%ni - процент использования процессора процессами с повышенным приоритетом nice
99.7%id - процент бездействия процессора
 	hi = servicing IRQs
        si = servicing soft IRQs
        st = steal (time given to other DomU instances)

top - 20:56:15 up 6 days, 33 min,  3 users,  load average: 0.05, 0.01, 0.00
Tasks: 146 total,   1 running, 145 sleeping,   0 stopped,   0 zombie
Cpu(s):  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Mem:   1923456k total,  1690960k used,   232496k free,   172140k buffers 	<- использование памяти
Swap:  1675256k total,        8k used,  1675248k free,  1078592k cached		<- использование swap больше ноля плохо

  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND

Мониторинг диска

apt-get install sysstat

iostat -xmt 1 10
iotop -P

#показать SMART
smartctl -a /dev/sda

#показать UID и метки
blkid 

#данные из планировщика диска
blockdev --report

sar -d

#данные по загрузке диска для процесса
pidstat -d

Grep

# -n - нумеровать строки
grep -n something somefile.txt
# -i - не обращать внимания на регистр
grep -i something somefile.txt

Vi

:wq  или ZZ - выйти с сохранением
:q! или ZQ - выйти без сохранения
:e! - отменить все
/ - начать поиск ниже
? - начать поиск выше
N и n - продолжить поиск

Права

Права Linux кодируются цифрами (bitmask 1,2,4) либо буквами (rwx), a - all, g - group, o - other, u - user

Специальные биты прав Linux

например 4751 - установлен suid bit, полные права у пользователя (4+2+1), на чтение и исполнение у группы, только на исполнение у остальных

Права по умолчанию. По умолчания файл создается с правами 666 - маска, а папка 777 - маска. Маска задается для пользователя через команду например umask 022 означает что для этого пользователя файлы будут создаваться с правами 666 - 022 = 644, а папки 777 - 022 = 755. Персистентно можно изменить в файле `grep UMASK /etc/login.defs

Создание и монтирование файловой системы

mkfs.ext4 /dev/sda1
mount /dev/sda1 /mnt

mkswap /dev/sda2
swapon /dev/sda2

# (use -U or -L to define by UUID or labels, respectively)
genfstab -U /mnt >> /mnt/etc/fstab

Проверка.. файловой системы

# disk free
df -h
# показать inode
df -i
# взвесить summarize - не показывать размер вложенных но суммировть его в результат
du -h --summarize .
# показать inode файлов
ls -i
# проверить
umount /dev/sdb1
fsck /dev/sdb1
fsck -t ext4 /dev/sdb1

# низкоуровневая работа с файловой системой
debugfs -v /dev/sdb1

mount -v -t nfs  192.168.1.109:/c/Users/RF/Downloads /home/nfs/
mount /dev/xvdb1 /mnt/share -o acl,user_xattr

X11

файл конфигурации хрантся в ` /usr/share/X11/xorg.conf.d/ или /etc/X11`

echo $DISPLAY

cat /etc/X11/default-display-manager
/usr/bin/sddm

Поиск изменений в файловой системе после установки программы

# первый вариант не учитывающий изменения в файлах
find / | grep -v '^/proc' > snapshot1
#Install software on to your system. After you install the software continue.
find / | grep -v '^/proc' > snapshot2
diff -crB snapshot1 snapshot2 > changes

# вариант с расчетом контрольных сумм
find / ! -wholename '/proc*' -type f -prune -print0 | xargs -0 md5sum| tee md5sum.txt

md5sum -c md5sum.txt 2> /dev/null | grep -i 'FAILED$' > failed.txt
cat failed.txt | grep -v "var\|sys" >diff.txt

sed 's/: FAILED//g' diff.txt> result.txt
cat result.txt | xargs md5sum > changedmd5.txt

for i in $(tr '\r' '\n' < result.txt); do grep $i md5sum.txt; done >md5before.txt

md5sum -c md5before.txt 2> /dev/null | grep -i 'FAILED$'

Настройка sudo без пароля

# to edit /etc/sudoers use visudo

User_Alias ADMINS = radiofisik, dockeruser
ADMINS      ALL=(ALL) NOPASSWD:ALL

Настройка сети

#посмотрим название интерфейса в ip link
ip link

#испольлзуем это название для нахождения или сооздания файла конфигурации
vi /etc/systemd/network/enp0s4.network

[Match]
name=en*
[Network]
DHCP=yes

#Address=192.168.1.10/24
#Gateway=192.168.1.1

#перезапустим сеть и включим автозагрузку
systemctl restart systemd-networkd
systemctl enable systemd-networkd

#настроим использование dns в /etc/resolv.conf
nameserver 8.8.8.8

#hostname
echo MySuperHost > /etc/hostname

#Определить какое приложение слушает порт
netstat -tpln 

#tcpdump
tcpdump -i eth0 -n -nn -ttt 'host 192.168.2.13 and ip proto \icmp'

#замер трафика на интерфейсе
m1=`cat /sys/class/net/eth1/statistics/tx_bytes` ; sleep 10s ; m2=`cat /sys/class/net/eth1/statistics/tx_bytes` ; echo $((($m2-$m1)/1024))

Настройка разрешения экрана

#вычислим строчку конфигурации
gtf 1920 1080 60

  # 1920x1080 @ 60.00 Hz (GTF) hsync: 67.08 kHz; pclk: 172.80 MHz
  Modeline "1920x1080_60.00"  172.80  1920 2040 2248 2576  1080 1081 1084 1118  -HSync +Vsync
  
#используя ее установим разрешение 
# Create 1920x1080 resolution mode
xrandr --newmode '1920x1080'  173.00  1920 2048 2248 2576  1080 1083 1088 1120 -hsync +vsync

# Add new resolution mode to the display
xrandr --addmode Virtual1 1920x1080

# Resize the display to use the new resolution mode
xrandr --output Virtual1 --mode '1920x1080' --rate 60

Железо

# список дисков
ubuntu@stageb:~$ lsblk
NAME                      MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
loop0                       7:0    0 55.4M  1 loop /snap/core18/1944
loop1                       7:1    0 69.9M  1 loop /snap/lxd/19188
loop2                       7:2    0 32.3M  1 loop /snap/snapd/11402
loop3                       7:3    0 32.3M  1 loop /snap/snapd/11588
loop4                       7:4    0 55.5M  1 loop /snap/core18/1997
loop5                       7:5    0 70.4M  1 loop /snap/lxd/19647
sda                         8:0    0  400G  0 disk
├─sda1                      8:1    0    1M  0 part
├─sda2                      8:2    0    1G  0 part /boot
└─sda3                      8:3    0  399G  0 part
  └─ubuntu--vg-ubuntu--lv 253:0    0  399G  0 lvm  /
sr0                        11:0    1 1024M  0 rom

# список железа
lshw
lsusb
lspci

# список модулей ядра
lsmod

Открытые порты

sudo netstat -tulnp | grep :80
tcp        0      0 0.0.0.0:80              0.0.0.0:*               LISTEN      1027/nginx: master
tcp        0      0 0.0.0.0:8001            0.0.0.0:*               LISTEN      9740/docker-proxy
tcp        0      0 0.0.0.0:8090            0.0.0.0:*               LISTEN      11130/node


sudo ss -tulnp | grep :80
tcp   LISTEN 0      511                              0.0.0.0:80         0.0.0.0:*    users:(("nginx",pid=1032,fd=8),("nginx",pid=1027,fd=8))
tcp   LISTEN 0      4096                             0.0.0.0:8001       0.0.0.0:*    users:(("docker-proxy",pid=9740,fd=4))


sudo systemctl status nginx
sudo systemctl stop nginx
sudo systemctl disable nginx