- Установка Arch Linux
- Arch Linux
- Создание образа
- Изменяем приоритет загрузки в BIOS/UEFI
- Начало установки
- Настройка сети
- Выбор файловой системы
- Размечаем диск
- Вариант 1: LVM
- Вариант 2: Btrfs
- Устанавливаем ядро
- Генерируем fstab
- arch-chroot
- Настраиваем дату и локаль
- Прописываем хосты
- Initramfs
- Ставим пакеты
- Пользователи
- Установка grub
- Ставим Gnome
- Завершение установки
- man & help
- Типы файлов в выводе ls и других стандартных команд
- Пакетные менеджеры
- Нужные пакеты
- Заменяем ядро на стабильное
- Масштабировавние 150% как в Windows
- Расширения для Gnome
- Пользовательские сочетания клавиш
- Запуск исполняемых файлов по двойному клику в Nautilus
- Шаблоны файлов
- Гибернация
- RAID
- Права
- Монтирование
- Добавляем путь в PATH
- bin в домашнем каталоге
- Монтируем Windows разделы
- Шрифты
- Emoji
- Спецсимволы
- Блокируем сайты с рекламой через hosts
- Редактирование DConf
- ZSH
- Разноцветный cat
- Цветовые схемы для терминала
- Бекап системы
- asdf-vm
- NVM
- Настройка Docker
- Настройка Visual Code
- LVM
- Btrfs
- Snapper
- Timeshift
- Установка и настройка Postgres
- Мониторинг процессов
- systemd
- Git
- Работаем с github через ssh
- Tor Service
- Менеджер паролей pass
- Частые проблемы
- Справка по командам и т.д.
- Шпаргалка по командам Shell
- i3: Введение
- i3: Установка и настройка
- XTerm
- Termite: горячие клавиши
- Termite: цветовые схемы
- i3: заставка lockscreen
- i3: сохранение/восстановление рабочего пространства
Arch Linux ‒ это один из немногих дистрибутивов Linux, использующих модель роллинг-релизов. Это означает, что в нем доступны самые последние версии пакетов. Это одновременно является его как преимуществом так и недостатком. Пересесть на него меня заставила необходимость: мое компьютерное железо (процессор ryzen 5 2600 и видеоадаптер rx 590) оказались не совместимы с версией Linux Kernel младше 4.20.
На самом деле все не так плохо, но неприятные инциденты имеют место хотя и очень редко.
Качаем образ и записываем его с помощью команды:
$ sudo dd if=/path/to/iso of=/dev/sdX bs=8M status=progress; sync
Где sdX
– имя нашего USB устройства. Перегружаемся после удачного завершения операции.
В Windows для создания загрузочной флешки можно использовать Rufus.
При загрузке системы нажимаем F2 или Del (зависит от производителя материнской платы). Во вкладке BIOS в приоритете загрузки делаем первым наше USB-устройство. Нажимаем F10 и сохраняем настройки.
Инструкцию по установке Arch Linux можно посмотреть так:
less ~/install.txt
Небольшой лайфхак: во время установки можно переключаться между терминалами с помощью Ctrl+Alt+F1..6
. Если мы нажмем Ctrl+Alt+F2
откроется второй терминал (по-умолчанию мы работаем в первом) и потребуется ввести пароль root
, во втором терминале мы можем открыть инструкцию и периодически подсматривать ее, переключаясь между терминалами.
При подключении от кабеля ничего настраивать не надо. Настройка wifi требует ввода пары команд:
rfkill unblock wifi
wifi-menu
Следует отметить, что не все usb wifi адаптеры гараниторованно поддерживаются. Например, у меня не захотел работать dexp wfa 301, а вот с tp-link все ок.
Проверить соединение можно с помощью команды ping:
$ ping -c 3 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=53 time=12.1 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=2 ttl=53 time=12.1 ms
64 bytes from ya.ru (87.250.250.242): icmp_seq=3 ttl=53 time=12.1 ms
--- ya.ru ping statistics ---
3 packets transmitted, 3 received, 0% packet loss, time 5ms
rtt min/avg/max/mdev = 12.137/12.139/12.141/0.127 ms
Самыми удобными являются три варианта: LVM+ext4 либо Btrfs, либо Btrfs под LVM.
Теперь нужно разметить раздел по LVM. Касательно LVM: единственное удобство в нем для меня – это возможность динамически менять размер разделов. Самая частая проблема, которая у меня была раньше – это то, что я не угадывал размер для корня. Мы можем добавлять в группу другие разделы (не обязательно на одном устройстве) и устройства. Нет ограничений как для обычных разделов, когда не возможно расширить раздел за счет предыдущего, нам вообще об этом не нужно заботиться. В LVM у нас есть группы разделов и логическите разделы. У логических разделов свои файловые системы. Увеличение размера логического раздела в отличии от уменьшения размонтирования не требует. resize2fs в LVM работает заметно быстрее.
Файловая система Btrfs может размещаться на одном и более устройствах/разделах. Устройства и разделы можно как добавлять так и удалять после создания. У нас тут нет групп и логических разделов со своими файловыми системами. У нас есть только подразделы с динамическим размером, что удобно. Так же мы можем ограничить размер подраздела.
LVM и Btrfs имеют механизм снапшотов, которые позволяют сохранять состояние системы.
Для начала посмотрим все доступные устройства:
fdisk -l
Создадим новый раздел:
# fdisk /dev/nvme0n1
# Более удобная утилита чем fdisk, в ней можно выбирать все стрелочками
cfdisk /dev/nvme0n1
# При разметке swap размещайте перед home, т.е. самым последним на случай, если потребуется увеличить его размер
Если есть раздел с Windows сделайте от него отступ 1-2 MB, т.к. Windows выходит за установленные лимиты и портит соседние разделы.
Если не установлен Windows:
Создаем раздел в FAT-32 размером 300-1000 Мб, а затем форматируем его:
mkfs.fat -F32 /dev/nvme0n1p1
В дальнейших примерах предполагается, что у нас установлена Windows, которая занимает 4 раздела: recovery, efi, reserved, Windows. Поэтому в примерах новый раздел nvme0n1p5.
# Создадим группу на разделе без файловой системы
vgcreate linux /dev/nvme0n1p5
# Теперь создадим в ней логические разделы:
lvcreate -L 30G linux -n root
lvcreate -L 20G linux -n home
# Можно для раздела отдать все оставшееся место
lvcreate -L +100%FREE linux -n home
mkfs.ext4 /dev/linux/root
mkfs.ext4 /dev/linux/home
mount /dev/linux/root /mnt
mkdir /mnt/home
mount /dev/linux/home /mnt/home
# Создаем файл подкачки. Не нужно верить дурачкам: он нужен всегда. Без него система будет лагать
fallocate -l 2G /mnt/swapfile
# Если хотим использовать гибернацию, то файл подкачки должен быть равен размеру оперативной памяти
# fallocate -l `awk '/Mem:/ {print $2}' <(free -m)`M /mnt/swapfile
chmod 600 /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile
mkdir -p /mnt/boot/efi
mount /dev/nvme0n1p2 /mnt/boot/efi
# Сначала монтируем раздел
mount /dev/nvme0n1p5 /mnt
# Потом создаем на нем подразделы
btrfs subvolume create /mnt/@
btrfs subvolume create /mnt/@home
# Теперь мы демонтируем устройство
umount /mnt
# и монтируем созданные подразделы
mount -o noatime,compress=lzo,space_cache,subvol=@ /dev/nvme0n1p5 /mnt
mkdir /mnt/home
mount -o noatime,compress=lzo,space_cache,subvol=@home /dev/nvme0n1p5 /mnt/home
# Файл подкачки нужно создавать так
# И что очень важно: поддержка файлов подкачки в Btrfs доступна в версией ядра linux, начниная с 5.0.0
truncate -s 0 /mnt/swapfile
chattr +C /mnt/swapfile
btrfs property set /mnt/swapfile compression none
# fallocate -l 2G /mnt/swapfile
# С fallocate могут возникнуть проблемы
dd if=/dev/zero of=/mnt/swapfile count=2000 bs=1M
chmod 600 /mnt/swapfile
mkswap /mnt/swapfile
swapon /mnt/swapfile
mkdir -p /mnt/boot/efi
mount /dev/nvme0n1p2 /mnt/boot/efi
pacstrap /mnt base base-devel
genfstab -U /mnt >> /mnt/etc/fstab
arch-chroot /mnt
При использовании LVM нужно выполнить чуть больше действий:
# Предотвращаем ошибки lvm:
# WARNING: Failed to connect lvmetad...
# WARNING: Device /dev/nvme0n1 not initialized in udev database...
mkdir /mnt/hostlvm
mount --bind /run/lvm /mnt/hostlvm
arch-chroot /mnt
ln -s /run/lvm /hostlvm
ln -sf /usr/share/zoneinfo/Europe/Moscow /etc/localtime
hwclock --systohc
Далее:
nano /etc/locale.gen
Раскоментируем:
en_US.UTF-8
Генерируем локаль:
locale-gen
echo "LANG=en_US.UTF-8" > /etc/locale.conf
Если пропустить этот шаг, то не будет запускаться терминал.
echo "sergey-pc" > /etc/hostname
nano /etc/hosts
Добавляем в файл такие строки:
127.0.0.1 localhost
::1 localhost
127.0.1.1 sergey-pc.localdomain sergey-pc
mkinitcpio это Bash скрипт используемый для создания начального загрузочного диска системы. Из mkinitcpio man page:
⚠ Это обязательный шаг даже, если не используется LVM, а так же при изменение пути до корня
При использовании LVM нужно отредактировать /etc/mkinitcpio.conf
и модифицировать список HOOKS, добавив lvm2
ДО ЗНАЧЕНИЯ filesystems
:
HOOKS=(base udev autodetect modconf block lvm2 filesystems keyboard fsck)
Генерация:
mkinitcpio -p linux
Эти пакеты понадобятся далее:
pacman -S sudo grub efibootmgr ntfs-3g os-prober alsa-utils xf86-video-ati xorg xorg-server
xf86-video-ati – свободный драйвер для видеокарт AMD. xorg и xorg-server можно не ставить, они являются зависимостями пакета gnome.
Задаем пароль для супер-пользователя:
passwd
Создаем пользователя:
useradd -m -g users -G wheel -s /bin/bash sergey
Устанавливаем пароль для нового пользователя:
passwd sergey
chage -d 0 sergey
Пароль для пользователя можно ставить 1, так как при логине придется его сменит.
Теперь в файле /etc/sudoers
нужно раскоментировать строку:
%wheel ALL=(ALL:ALL) ALL
grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id="Arch Linux"
Чтобы отключить автоматическую загрузку Linux, редактируем дефолтный конфиг груба:
nano /etc/default/grub
Меняем GRUB_TIMEOUT:
GRUB_TIMEOUT=-1
Затем генерируем grub:
grub-mkconfig -o /boot/grub/grub.cfg
pacman -S gnome
# Включаем Gnome Display Manager
systemctl enable gdm
Вместо Gnome можно попробовать тайловый менеджер i3.
Включаем NetworkManager для автоматического подключения к сети:
systemctl enable NetworkManager
Надо еще настроить звук:
# Сохраним на всякий случай состояние
alsactl store
# Для автоматического сохранения/восстановления значения громкости звука:
systemctl enable alsa-restore
Теперь можно выходить и перегружаться:
exit
reboot
$ man [ <section> ] <page>
# Section Description
# 1 General Commands
# 2 System Calls
# 3 Library functions, covering in particular the C standard library
# 4 Special files (usually devices, those found in /dev) and drivers
# 5 File formats and conventions
# 6 Games and screensavers
# 7 Miscellanea
# 8 System administration commands and daemons
# Узнать где хранятся страницы манулов можно так
$ manpath
/usr/local/man:/usr/local/share/man:/usr/share/man
$ man -w printf
/usr/share/man/man1/printf.1.gz
# Поиск страниц по ключевому слову
$ man -k printf
# Смотрим все страницы
$ man -f printf
printf (1) - format and print data
printf (1p) - write formatted output
printf (3) - formatted output conversion
printf (3p) - print formatted output
# Выбираем конкретную
$ man 1p printf
# Краткая справка по функции
$ command -h
$ command --help
There is only 1 command you need to know, which will help you to identify and categorize all the seven different file types found on the Linux system.
$ ls -ld <file name>
Here is an example output of the above command.
$ ls -ld /etc/services
-rw-r--r-- 1 root root 19281 Feb 14 2012 /etc/services
ls command will show the file type as an encoded symbol found as the first character of the file permission part. In this case it is "-", which means "regular file". It is important to point out that Linux file types are not to be mistaken with file extensions. Let us have a look at a short summary of all the seven different types of Linux file types and ls command identifiers:
- : regular file
d : directory
c : character device file
b : block device file
s : local socket file
p : named pipe
l : symbolic link
Пакетным менеджером по-умолчанию для Arch Linux является pacman. Для подсветки вывода pacman в /etc/pacman.conf
нужно раскомментировать Color
. Пользовательским репозиторием является AUR. Пакеты из него можно использовать только на свой страх и риск. Чтобы не собирать пакеты из него ручками можно поставить yay:
sudo pacman -S git
cd /tmp
git clone https://aur.archlinux.org/yay.git
cd yay
makepkg -si
Пакеты всегда нужно ставить из репозиториев. Смысла собирать их из исходников нет, так как в AUR и так самые последние версии. Так будет меньше хлама оставаться в системе после их удаления.
В AUR много пакетов, оканчивающихся на -git
. При их установке исходники копируются с github, а затем собираются, что занимает много времени и требуется дополнительное дисковое пространство для создания временных файлов и т.п., а еще для сборки могут потребоваться дополнительные пакеты. Поэтому лучше избегать установки таких пакетов, если есть альтернативы.
Синтаксис команды Yay аналогичен pacman. Так что будет полезным почитать справку по pacman.
Ссылки:
Это список необходимых для меня пакетов:
yay -Sy linux-headers \ # нужны для компиляции некоторых программ
wget \ # позволяет выполнять HTTP-запросы, скачивать файлы
curl \ # делает то же самое, что и предыдущий
adobe-source-code-pro-fonts \ # шрифт для терминала, нужен для темы Oh My Zsh! agnoster
ttf-droid \ # шрифт по-умолчанию для VScode
\ # шрифты по-умолчанию для Chrome
\ # consolas-font \
\ # ttf-ms-fonts \
arc-gtk-theme-git \ # тема для интерфейса
apache \ # самый популярный веб-сервер
apache-tools \ # содержит ab, нагрузочный клиент
\ # blender \ # самый простой 3D-редактор
dconf-editor \ # все настройки gnome в одном месте
dmraid \ # утилита для работы с raid-массивами дисков
docker-compose \ # содержит docker и docker compose
exfat-utils \ # добавляет поддержку файловой системы exfat
firefox \ # один из лучших браузеров, единственный конкурент Chrome и единственный популярный non-chromium браузер
flat-remix-git \ # тема с иконками
\ # gimp \ # скромненький аналог Photoshop
gnome-panel \ # я ставил только чтобы ярлыки из GUI создавать
google-chrome \ # лучший браузер, противники проприетарщины предпочитают chromium
chrome-gnome-shell \ # позволяет устанавливать расширения для Gnome
gparted \ # графическая оболочка для разметки дисков
htop \ # показывает запущенные процессы, загрузку cpu и потребление памяти
\ # inkscape \ # векторный графический редактор
\ # mariadb \ # свободная реализация самой популярной СУБД MySQL
mc \ # аналог виндового Far + mcedit, замена nano
\ # mongodb-bin \ # лучшая NoSQL база данных
net-tools \ # содержит netstat
neofetch \ # выводит в консоль информацию о системе
nginx \ # самый быстрый веб-сервер
ntfs-3g \ # добавляет поддержку файловой системы ntfs
\ # nvm \ # менеджер версий для Node.js
\ # postgresql \ # лучшая SQL база данных
\ # pgadmin4 \ # админка для Postgres
\ # pgmodeler \ # визуальный редактор для моделирования в Postgres
\ # phpenv \ # менеджер версий для PHP
\ # pyenv \ # менеджер версий для Python
asdf-vm \ # Заменяет собой все выше перечисленные менеджеры версий + умеет управлять базами
\ # redis \ # СУБД в оперативной памяти, используемая для межпроцессового взаимодействия
smartmontools \ # утилита для проверки состояния SSD
telegram-desktop-bin \ # лучший мессенджер
texmaker \ # редактор LaTex, генерирует PDF
tor \ # сервис, который можно использовать для подключения к сети Tor
torsocks \ # утилита torify, которая заставляет другие программы работать через Tor
transmission-qt \ # торрент-клиент
thunderbird \ # email-клиент
virtualbox \ # виртуальная машина, позволяет запускать Windows и Linux
visual-studio-code-bin \ # лучший бесплатный текстовый редактор
vlc \ # видеоплеер
websocat-bin \ # утилита для тестированя вебсокетов
woeusb \ # создание загрузочных флешек с Windows
xclip \ # копирование файла в буффер обмена из консоли
seahorse \ # Приложение для управления паролями, а так же PGP и SSH ключами
baobab \ # Приложения для мониторинга дисков
jq \ # Утилита для работы с JSON
pv \ # получает на вход поток и перенаправляет его, показывая статистику
Если надоело, что что-то ломается почти после каждого обновления ядра, запускаем терминал и выполняем:
yay -S linux-lts linux-headers-lts
yay -R linux linux-headers
mkinitcpio -p linux
По-умолчанию в Gnome масштабирование кратно 100. Чтобы добавить варианты масштабирования 125% и 150% нужно выполнить в терминале:
gsettings set org.gnome.mutter experimental-features "['scale-monitor-framebuffer']"
Отключение:
gsettings reset org.gnome.mutter experimental-features
Устанавливаем расширение для Chrome.
Управление расширениями осуществляется через Tweaks.
Расширения для установки:
Название | Описание |
---|---|
Dash to Dock. | Выезжающий Dash - панель с избранными приложениями |
Desktop Icons | Иконки на рабочем столе |
ShellTile | Тайловый менеджер |
Log Out Button | Добавляет кнопку, которая выполняет выход из системы |
В Settings → Devices → Keyboard добавляем сочетания клавиш:
Ctrl + Alt + T
для запуска терминала (gnome-terminal
);Ctrl + Alt + V
для запуска Visual Code (code
).
Заставляем Nautilus выполнять исполняемые файлы вместо открытия их в текстовом редакторе. Нужно нажать на три точки, а потом выбрать Preferences:
Чтобы в Nautilus в контекстном меню отображался пункт New Document
, нужно в ~/Templaytes
создать шаблоны файлов:
touch ~/Templates/{Empty\ Document,Text\ Document.txt,README.md,pyfile.py}
Режим гибернациии от режима сна отличается тем, что в первом случае содержимое оперативной памяти сохраняется на жесткий диск и питание полностью отключается, во втором - питание подается только на оперативку. Чем хороша гибернация? - Например, мы работаем в Linux, вошли в режим гибернации, а затем загрузились в Windows и играем. Когда мы в следующий раз загрузимся в Linux, то увидим все то, что было перед выключением. Прекрасно?! Но часто ли такое нужно?
При переходе в режим гибернации делается дамп памяти на диск, причем всей, а не только используемой, так что размер файла подкачки должен быть не меньше количества оперативки. Про гибернацию лучше почитать здесь.
Режим гибернации по-умолчанию отключен. Чтобы его включить для начала нужно узнать UUID раздела, где расположен своп, а так же смещение своп-файла относительно начала раздела:
$ lsblk `df /swapfile | awk '/^\/dev/ {print $1}'` -no UUID
217df373-d154-4f2e-9497-fcac21709729
$ sudo filefrag -v /swapfile | awk 'NR == 4 {print $5}' | cut -d ':' -f 1
1423360
В /etc/default/grub
прописать:
GRUB_CMDLINE_LINUX_DEFAULT="quiet resume=UUID=217df373-d154-4f2e-9497-fcac21709729 resume_offset=1423360"
Теперь нужно обновить grub и сгенерировать initramfs:
sudo grub-mkconfig -o /boot/grub/grub.cfg
sudo mkinitcpio -p linux
Сам переход в режим гибернации выглядит так:
systemctl hibernate
Чтобы появилась кнопка для перехода в режим гибернации ставим расширение.
В Linux RAID на аппаратном уровне называют FakeRAID. Для работы с FakeRAID используется пакет dmraid.
Редактируем конфиг mkinitcpio:
sudo nano /etc/mkinitcpio.conf
В хуки добавляем dmraid:
HOOKS=(base udev autodetect modconf block lvm2 dmraid filesystems keyboard fsck)
И генерируем mkinitcpio:
sudo mkinitcpio -p linux
4 - Чтение (r) 2 - Запись (w) 1 - Выполнение (x)
Сумма этих чисел дает разные сочетания типа: 1 + 2 + 4 = 7 или 1 + 4 = 5
Права задаются тремя числами, например, 755, где первое число – права владельца, далее: группа и остальные пользователи. Владелец может делать все (1 + 2 + 4 = 7), другие пользователи – только читать и исполнять файлы (1 + 4 = 5).
Для работы с правами на файлы используется команда chroot:
chroot --help
В Python права можно записывать так:
0o755
$ ll
total 20K
drwxr-xr-x 3 sergey sergey 4,0K июн 20 17:22 backend
...
d | rwx | r-x | r-x
тип файла | владелец | группа | остальные
Ссылки:
$ sudo mount [ -t <fs> ] <device> <path> [ -o <options> ]
Опции:
ro Mount the filesystem read-only.
rw Mount the filesystem read-write.
sync All I/O to the filesystem should be done synchronously. In the
case of media with a limited number of write cycles (e.g. some
flash drives), sync may cause life-cycle shortening.
user Allow an ordinary user to mount the filesystem. The name of the
mounting user is written to the mtab file (or to the private
libmount file in /run/mount on systems without a regular mtab)
so that this same user can unmount the filesystem again. This
option implies the options noexec, nosuid, and nodev (unless
overridden by subsequent options, as in the option line
user,exec,dev,suid).
noexec ‒ запретить выполнение файлов
noatime ‒ не обновлять время домступа к файлу
defaults = rw,suid,dev,exec,auto,nouser,async
uid ‒ 1000 для первого пользователя
gid ‒ см. далее
$ id
uid=1000(sergey) gid=985(users) groups=985(users),969(docker),998(wheel)
users Allow any user to mount and to unmount the filesystem, even when
some other ordinary user mounted it. This option implies the
options noexec, nosuid, and nodev (unless overridden by subse‐
quent options, as in the option line users,exec,dev,suid).
umask=value
Set the umask (the bitmask of the permissions that are not
present). The default is the umask of the current process. The
value is given in octal.
dmask=value
Set the umask applied to directories only. The default is the
umask of the current process. The value is given in octal.
fmask=value
Set the umask applied to regular files only. The default is the
umask of the current process. The value is given in octal.
Указываются права не в виде восьмиричного числа!
0 1 2 3 4 5 6 7
r + + + + - - - -
w + + - - + + - -
x + - + - + - + -
Например, 0755 будет 0022
- Bash Shell:
~.bash_profile
,~/.bashrc
or~/.profile
- Korn Shell:
~/.kshrc
or~/.profile
- Z Shell:
~/.zshrc
or~/.zprofile
export PATH=/path/to/bin:$PATH
mkdir ~/bin
echo 'export PATH=$HOME/bin:$PATH' >> ~/.zprofile
# or
echo 'export PATH=$HOME/bin:$PATH' >> ~/.zshrc
Теперь самописные скрипты можно кидать в ~/bin
, так они будут доступны только для текущего пользователя.
~/bin/hello
:
#!/usr/bin/env bash
function hello() {
local name=${1:-World}
printf "Hello, %s!\n" $name
}
hello $@
Сделаем скрпит исполняемым:
$ chmod +x ~/bin/hello
Проверка:
# Если не перелогинивались после добавления пути в ~/.zprofile, то сначала выполняем
$ source ~/.zprofile
$ hello $USER
Hello, sergey!
$ sudo mkdir /mnt/c
Редактируем /etc/fstab
:
/dev/nvme0n1p4 /mnt/c ntfs-3g rw,user,fmask=0111,dmask=0000 0 0
Шрифты надо кидать в /usr/share/fonts
либо в ~/.fonts
или в ~/.local/share/fonts
.
# Обновить шрифты
$ fc-cache -f -v
# Чтобы проверить установлен ли шрифт
$ fc-list | grep "<name-of-font>"
Шарим Windows шрифты:
$ sudo ln -sf /mnt/c/Windows/Fonts /usr/share/fonts/WindowsFonts
Наборы шрифтов:
yay -S ttf-emojione
Я не совсем понимаю как отображаются emoji. В гномовских приложения они выглядят одинаково, а в сторонних, в том же VScode рендерятся по-другому.
Для вставки специальных символов в Gnome применяется сочетание клавиш Ctrl+Shift+U
, далее вводим 4-х значный код символа.
Символ | Unicode |
---|---|
« | 00ab |
» | 00bb |
© | 00a9 |
™ | 2122 |
§ | 00a7 |
– | 2013 |
€ | 20ac |
₽ | 20bd |
→ | 2192 |
λ | 03bb |
$ ifconfig -a
...
enp5s0: flags=4163<UP,BROADCAST,RUNNING,MULTICAST> mtu 1500
inet 192.168.0.106 netmask 255.255.255.0 broadcast 192.168.0.255
...
# inet 192.168.0.106 ‒ это наш адрес в локальной сети, если запустить на локальной машине nginx, то перейдя по ссылке http://192.168.0.106 мы увидим приветствие Nginx
Расшифрорвка имен:
Two character prefixes based on the type of interface:
* en -- ethernet
* sl -- serial line IP (slip)
* wl -- wlan
* ww -- wwan
Так же можно менять свой локальный ip.
Ссылки:
(Linux ifconfig command)[https://www.computerhope.com/unix/uifconfi.htm].
# Сохраняем копию оригинального файла
$ cp /etc/hosts ~/Documents/hosts.bak
$ wget -qO- https://raw.githubusercontent.com/StevenBlack/hosts/master/hosts | sudo tee --append /etc/hosts
$ lspci
00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
00:01.0 PCI bridge: Intel Corporation Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port (rev 09)
00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09)
00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04)
00:16.0 Communication controller: Intel Corporation 7 Series/C216 Chipset Family MEI Controller #1 (rev 04)
00:1a.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #2 (rev 04)
00:1b.0 Audio device: Intel Corporation 7 Series/C216 Chipset Family High Definition Audio Controller (rev 04)
00:1c.0 PCI bridge: Intel Corporation 7 Series/C216 Chipset Family PCI Express Root Port 1 (rev c4)
00:1c.4 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 5 (rev c4)
00:1c.5 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 6 (rev c4)
00:1c.6 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 7 (rev c4)
00:1d.0 USB controller: Intel Corporation 7 Series/C216 Chipset Family USB Enhanced Host Controller #1 (rev 04)
00:1f.0 ISA bridge: Intel Corporation H77 Express Chipset LPC Controller (rev 04)
00:1f.2 IDE interface: Intel Corporation 7 Series/C210 Series Chipset Family 4-port SATA Controller [IDE mode] (rev 04)
00:1f.3 SMBus: Intel Corporation 7 Series/C216 Chipset Family SMBus Controller (rev 04)
00:1f.5 IDE interface: Intel Corporation 7 Series/C210 Series Chipset Family 2-port SATA Controller [IDE mode] (rev 04)
03:00.0 Ethernet controller: Realtek Semiconductor Co., Ltd. RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller (rev 09)
04:00.0 Network controller: Qualcomm Atheros AR9485 Wireless Network Adapter (rev 01)
05:00.0 IDE interface: Marvell Technology Group Ltd. 88SE9172 SATA III 6Gb/s RAID Controller (rev 11)
# Видеоадаптер(ы)
$ lspci -v | grep "VGA" -A 12
# SATA-устройства
$ lsscsi
# Список USB-устройств
$ lsusb
# Очень подробная информация о всех устройствах
$ inxi -Fx
$ hwinfo --short
cpu:
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3500 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3480 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3500 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3491 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3550 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3484 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3492 MHz
Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz, 3496 MHz
keyboard:
/dev/input/event2 Logitech Keyboard K120
mouse:
/dev/input/mice Logitech M-U0004 810-001317 [B110 Optical USB Mouse]
monitor:
SAMSUNG SMS24A650
SAMSUNG SMB2340
graphics card:
Intel 2nd Generation Core Processor Family Integrated Graphics Controller
sound:
Intel 7 Series/C216 Chipset Family High Definition Audio Controller
storage:
Intel 7 Series/C210 Series Chipset Family 4-port SATA Controller [IDE mode]
Intel 7 Series/C210 Series Chipset Family 2-port SATA Controller [IDE mode]
Marvell 88SE9172 SATA III 6Gb/s RAID Controller
network:
enp3s0 Realtek RTL8111/8168/8411 PCI Express Gigabit Ethernet Controller
wlp4s0 Qualcomm Atheros AR9485 Wireless Network Adapter
network interface:
docker0 Ethernet network interface
enp3s0 Ethernet network interface
lo Loopback network interface
wlp4s0 Ethernet network interface
br-1d7c88a3dc61 Ethernet network interface
disk:
/dev/sdb WDC WD5000AZLX-0
/dev/sda INTEL SSDSC2CW24
partition:
/dev/sdb1 Partition
/dev/sda1 Partition
/dev/sda2 Partition
/dev/sda3 Partition
usb controller:
Intel 7 Series/C216 Chipset Family USB Enhanced Host Controller #2
Intel 7 Series/C216 Chipset Family USB Enhanced Host Controller #1
Intel 7 Series/C210 Series Chipset Family USB xHCI Host Controller
bios:
BIOS
bridge:
Intel 7 Series/C216 Chipset Family PCI Express Root Port 1
Intel H77 Express Chipset LPC Controller
Intel Xeon E3-1200/2nd Generation Core Processor Family PCI Express Root Port
Intel 7 Series/C210 Series Chipset Family PCI Express Root Port 6
Intel 2nd Generation Core Processor Family DRAM Controller
Intel 7 Series/C210 Series Chipset Family PCI Express Root Port 7
Intel 7 Series/C210 Series Chipset Family PCI Express Root Port 5
hub:
Intel Integrated Rate Matching Hub
Linux Foundation 2.0 root hub
Linux Foundation 3.0 root hub
Linux Foundation 2.0 root hub
Intel Integrated Rate Matching Hub
Linux Foundation 2.0 root hub
memory:
Main Memory
unknown:
FPU
DMA controller
PIC
Keyboard controller
/dev/lp0 Parallel controller
Intel 7 Series/C216 Chipset Family MEI Controller #1
Intel 7 Series/C216 Chipset Family SMBus Controller
Serial controller
/dev/input/event3 Logitech Keyboard K120
# Список блочных устройств
$ lsblk
# Покажет разделы и занимаемое ими место
$ df -h
# Fdisk is a utility to modify partitions on hard drives, and can be used to list out the partition information as well.
$ sudo fdisk -l
Disk /dev/sda: 500.1 GB, 500107862016 bytes
255 heads, 63 sectors/track, 60801 cylinders, total 976773168 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x30093008
Device Boot Start End Blocks Id System
/dev/sda1 * 63 146801969 73400953+ 7 HPFS/NTFS/exFAT
/dev/sda2 146802031 976771071 414984520+ f W95 Ext'd (LBA)
/dev/sda5 146802033 351614654 102406311 7 HPFS/NTFS/exFAT
/dev/sda6 351614718 556427339 102406311 83 Linux
/dev/sda7 556429312 560427007 1998848 82 Linux swap / Solaris
/dev/sda8 560429056 976771071 208171008 83 Linux
# The mount is used to mount/unmount and view mounted file systems.
$ mount | column -t
/dev/sda6 on / type ext4 (rw,errors=remount-ro)
proc on /proc type proc (rw,noexec,nosuid,nodev)
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)
none on /sys/fs/cgroup type tmpfs (rw)
none on /sys/fs/fuse/connections type fusectl (rw)
none on /sys/kernel/debug type debugfs (rw)
none on /sys/kernel/security type securityfs (rw)
udev on /dev type devtmpfs (rw,mode=0755)
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=0620)
tmpfs on /run type tmpfs (rw,noexec,nosuid,size=10%,mode=0755)
none on /run/lock type tmpfs (rw,noexec,nosuid,nodev,size=5242880)
none on /run/shm type tmpfs (rw,nosuid,nodev)
none on /run/user type tmpfs (rw,noexec,nosuid,nodev,size=104857600,mode=0755)
none on /sys/fs/pstore type pstore (rw)
/dev/sda8 on /media/13f35f59-f023-4d98-b06f-9dfaebefd6c1 type ext4 (rw,nosuid,nodev,errors=remount-ro)
/dev/sda5 on /media/4668484A68483B47 type fuseblk (rw,nosuid,nodev,allow_other,blksize=4096)
binfmt_misc on /proc/sys/fs/binfmt_misc type binfmt_misc (rw,noexec,nosuid,nodev)
systemd on /sys/fs/cgroup/systemd type cgroup (rw,noexec,nosuid,nodev,none,name=systemd)
gvfsd-fuse on /run/user/1000/gvfs type fuse.gvfsd-fuse (rw,nosuid,nodev,user=enlightened)
# Again, use grep to filter out only those file systems that you want to see
$ mount | column -t | grep ext
# The dmidecode command is different from all other commands. It extracts hardware information by reading data from the SMBOIS data structures (also called DMI tables).
# display information about the processor/cpu
$ sudo dmidecode -t processor
# memory/ram information
$ sudo dmidecode -t memory
# bios details
$ sudo dmidecode -t bios
# cpu information
$ cat /proc/cpuinfo
# memory information
$ cat /proc/meminfo
$ cat /proc/version
Linux version 3.11.0-12-generic (buildd@allspice) (gcc version 4.8.1 (Ubuntu/Linaro 4.8.1-10ubuntu7) ) #19-Ubuntu SMP Wed Oct 9 16:20:46 UTC 2013
# SCSI/Sata devices
$ cat /proc/scsi/scsi
Attached devices:
Host: scsi3 Channel: 00 Id: 00 Lun: 00
Vendor: ATA Model: ST3500418AS Rev: CC38
Type: Direct-Access ANSI SCSI revision: 05
Host: scsi4 Channel: 00 Id: 00 Lun: 00
Vendor: SONY Model: DVD RW DRU-190A Rev: 1.63
Type: CD-ROM ANSI SCSI revision: 05
Partitions
$ cat /proc/partitions
major minor #blocks name
8 0 488386584 sda
8 1 73400953 sda1
8 2 1 sda2
8 5 102406311 sda5
8 6 102406311 sda6
8 7 1998848 sda7
8 8 208171008 sda8
11 0 1048575 sr0
# The hdparm command gets information about sata devices like hard disks.
$ sudo hdparm -i /dev/sda
/dev/sda:
Model=ST3500418AS, FwRev=CC38, SerialNo=9VMJXV1N
Config={ HardSect NotMFM HdSw>15uSec Fixed DTR>10Mbs RotSpdTol>.5% }
RawCHS=16383/16/63, TrkSize=0, SectSize=0, ECCbytes=4
BuffType=unknown, BuffSize=16384kB, MaxMultSect=16, MultSect=16
CurCHS=16383/16/63, CurSects=16514064, LBA=yes, LBAsects=976773168
IORDY=on/off, tPIO={min:120,w/IORDY:120}, tDMA={min:120,rec:120}
PIO modes: pio0 pio1 pio2 pio3 pio4
DMA modes: mdma0 mdma1 mdma2
UDMA modes: udma0 udma1 udma2 udma3 udma4 udma5 *udma6
AdvancedPM=no WriteCache=enabled
Drive conforms to: unknown: ATA/ATAPI-4,5,6,7
* signifies the current active mode
DConf хранит профили терминала в ~/.config/dconf/user
, в формате GVDB пруф.
# Делаем дамп
$ dconf dump / > /tmp/dconf
# Редактируем и загружаем
$ dconf load / < /tmp/dconf
$ yay -S zsh
Меняем shell на /bin/zsh
:
$ chsh -s $(which zsh)
Чтобы изменения вступили в силу нужно залогиниться по-новой.
Установка:
sh -c "$(curl -fsSL https://raw.githubusercontent.com/robbyrussell/oh-my-zsh/master/tools/install.sh)"
Пакет из репозитория ставится вне домашнего каталога, а потому требует root права при установке плагинов, что не удобно.
Так же для некоторых тем Oh My Zsh нужны шрифты наподобие Powerline:
yay -S powerline-fonts
Ставим must-have плагины:
git clone https://github.com/zsh-users/zsh-autosuggestions ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-autosuggestions
git clone https://github.com/zsh-users/zsh-completions ${ZSH_CUSTOM:=~/.oh-my-zsh/custom}/plugins/zsh-completions
git clone https://github.com/zsh-users/zsh-syntax-highlighting.git ${ZSH_CUSTOM:-~/.oh-my-zsh/custom}/plugins/zsh-syntax-highlighting
Изменяем .zshrc
:
ZSH_THEME="agnoster"
...
plugins=(
command-not-found
extract
git
zsh-autosuggestions
zsh-completions
zsh-syntax-highlighting
)
autoload -Uz compinit && compinit
source $ZSH/oh-my-zsh.sh
Для темы Agnoster настройках терминала выбираем шрифт Source Code Pro Regular
, чтобы отображались стрелочки.
$ wget -P $ZSH_CUSTOM/themes https://raw.githubusercontent.com/caiogondim/bullet-train-oh-my-zsh-theme/master/bullet-train.zsh-theme
# Сначала сохраняем копию zhsrc, потому как jovial изменить оригинальеный файл
$ cp ~/.zshrc ~/.zshrc.bak
$ curl -sSL git.io/jovial | sudo bash -s $USER
У меня эта тема упорно устанавливается в /root/.oh-my-zsh
.
Это красивая тема для ZSH.
git clone https://github.com/romkatv/powerlevel10k.git $ZSH_CUSTOM/themes/powerlevel10k
~/.zshrc
:
ZSH_THEME=powerlevel10k/powerlevel10k
Изменим prompt:
cd && curl -fsSLO https://raw.githubusercontent.com/romkatv/dotfiles-public/master/.purepower
echo 'source ~/.purepower' >>! ~/.zshrc
# Интерактивная установка
# Падает с ошибкой, если нет профиля по-умолчаниюю для терминала
# Для всех созданных профилей будет использовавться шрифт профиля по-умолчанию
bash -c "$(wget -qO- https://git.io/vQgMr)"
# Удаление всех профилей
dconf reset -f /org/gnome/terminal/legacy/profiles:/
Ссылки:
Предполагается, что бекап мы будем делать с установочной флешки.
mkdir /mnt/{backup,root}
mount /path/to/backup /mnt/backup
mount /path/to/root /mnt/root
# Делаем бекап
cd /mnt/root
tar -cvpzf /mnt/backup/root.tar.gz .
# Извлекаем бекапа
tar -xzpvf /mnt/backup/root.tar.gz -C /mnt/root
Ссылки:
Установка asdf через Git:
git clone https://github.com/asdf-vm/asdf.git ~/.asdf
cd ~/.asdf
git checkout "$(git describe --abbrev=0 --tags)"
echo -e '\n. $HOME/.asdf/asdf.sh' >> ~/.zshrc
echo -e '\n. $HOME/.asdf/completions/asdf.bash' >> ~/.zshrc
Установка asdf через AUR:
yay -S asdf-vm
В ~/.zshrc
(после compinit) добавляем строки:
. /opt/asdf-vm/asdf.sh
. /opt/asdf-vm/completions/asdf.bash
В ~/.zprofile
:
export PATH=/opt/asdf-vm/bin:$PATH
Эту строку можно и в ~/.zshrc
.
Удаление:
rm -rf ~/.asdf/ ~/.tool-versions
Примеры:
$ asdf plugin-add python
$ asdf install python 3.7.3
$ asdf install python 2.7.15
$ asdf list python
2.7.15
3.7.3
$ asdf uninstall python 2.7.15
$ asdf global python 3.7.3
# Сделать системную версию Python глобальной
$ asdf global python system
$ which python
/home/sergey/.asdf/shims/python
$ asdf plugin-add nodejs
# see: <https://github.com/asdf-vm/asdf-nodejs#install>
$ bash ~/.asdf/plugins/nodejs/bin/import-release-team-keyring
$ asdf install nodejs 10.16.0
$ asdf global nodejs 10.16.0
$ which node
/home/sergey/.asdf/shims/node
$ which npm
/home/sergey/.asdf/shims/npm
$ asdf list
golang
1.12
nodejs
10.16.0
postgres
11.4
python
2.7.15
3.7.3
sqlite
3.29.0
Все доступные плагины. При установке, использовании плагинов могут возникать проблемы. Например, плагин для Python работает поверх pyenv и при возникновении проблем, следует изучить страницу «Common build problems».
If you use pip to install a module like ipython that has a binaries. You will need to run asdf reshim python for the binary to be in your path.
После установки через pip пакетов, которые добавляют команды, чтобы те были доступны, нужно всегда выполнять asdf reshim python
.
Ссылки:
⚠️ Использование asdf-vm предпочительнее.
Устанавливаем последнюю версию Node.js:
nvm install node
$ yay -S docker
$ sudo systemctl start docker
$ sudo systemctl enable docker
# sudo groupadd docker
# groupadd: group 'docker' already exists
sudo usermod -aG docker $USER
Нужно выйти и войти в систему, а потом проверить:
$ docker run hello-world
{
"editor.fontSize": 16,
"editor.rulers": [
72,
80,
100,
120
],
"editor.tabSize": 2,
"editor.wordWrap": "bounded",
"editor.wordWrapColumn": 120,
"files.insertFinalNewline": true,
"files.trimFinalNewlines": true,
"files.trimTrailingWhitespace": true,
"terminal.integrated.fontFamily": "Source Code Pro"
}
Список логических разделов LVM:
$ sudo lvscan
ACTIVE '/dev/linux/root' [40.00 GiB] inherit
ACTIVE '/dev/linux/home' [20.00 GiB] inherit
Изменение размера логического раздела:
# Ключ -r выполняет resizefs
$ lvresize -r -L +10G /dev/linux/home
# Аналогично двум командам:
# Увеличиваем размер логического раздела
$ sudo lvresize -L +10GB /dev/mapper/linux-home
# После lvresize нужно обязательно изменить размер файловой системы
$ sudo resize2fs /dev/mapper/linux-home
# Делает то же самое, что и две команды выше
$ sudo lvresize -r -L +10GB /dev/mapper/linux-root
Переименование логического раздела:
$ sudo lvrename <oldname> <newname>
После нужно отредактировать /etc/fstab
, изменив пути до разделов, а затем выполнить:
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
Про снапшоты. В Btrfs есть механизм, аналогичный git, который позволяет фиксировать изменения снимками. Снапшоты хранят в себе только изменения между снимками, поэтому занимают мало места и по этой же причине не могут быть созданы вне текущей файловой системы. Они содержат только диффы. Как только мы создали снапшот, состояние системы зафиксировалось. Например у нас есть три файла: foo, bar, baz. Мы сделали снапшот, а потом удалили foo и baz, но пока существует снапшот эти файлы продолжат занимать место + если мы изменим bar, то и его первоначальная копия продолжит свое существование. Так что чтобы освободить место придется периодически удалять ненужные снапшоты.
Обнаружил баг: из-за своп-файла не делались снапшоты корня.
# Создать subvolume
$ sudo btrfs sub create /path/to/@name
# Создание снапшота
# Снапшоты являются разновидностью полдазделов, потому с ними можно выполнять те же операции
$ sudo mkdir /.snapshots
$ sudo chmod 750 /.snapshots
# Этой командой не получится создать снапшот на другой Btrfs (на флешке)
$ sudo btrfs sub snap -r /home /.snapshots/@home_`date +%F-%s`
Create a readonly snapshot of '/home' in '/.snapshots/@home_2019-07-15-1563181292'
$ sudo btrfs sub li -a /
ID 257 gen 1457 top level 5 path <FS_TREE>/@
ID 258 gen 1458 top level 5 path <FS_TREE>/@home
ID 281 gen 1458 top level 5 path <FS_TREE>/@var
ID 283 gen 1458 top level 257 path <FS_TREE>/@/.snapshots/@home_2019-07-15-1563181292
# Удаление снапшота аналогично удалению подраздела
$ sudo btrfs sub del /.snapshots/@home_2019-07-15-1563181292
Delete subvolume (no-commit): '/.snapshots/@home_2019-07-15-1563181292'
# Смонтировать subvolume/снапшот по указанному пути
$ sudo btrfs sub set-default <ID> /
# Восстановление данных
# С сохранением снапшота
$ cp -aR --reflink /.snapshots/@home_YYYY-MM-DD-ssssssssss /@home
# С удалением снапшота
# Таким же способом можно переименовывать подразделы/снапшоты
$ mv /.snapshots/@home_YYYY-MM-DD-ssssssssss /@home
$ btrfs filesystem df /
Data, single: total=15.01GiB, used=12.42GiB
System, single: total=4.00MiB, used=16.00KiB
Metadata, single: total=1.01GiB, used=772.20MiB
GlobalReserve, single: total=44.47MiB, used=0.00B
# Как сделать бекап и восстановить его в другой ФС
$ btrfs send /source/subvolume >/another/filesystem/subvolume-image # just a file
# (or you can gzip it and/or send with nc on the fly, whatever)
# then later
$ </another/filesystem/subvolume-image btrfs receive /some/btrfs/directory
# Можно так же добавлять новые разделы и устройства в уже существующую ФС
# Можно так же сделатиь ограничения на размер подраздела, добавив его в группу и включив для него квоту
$ man btrfs
бтрфс ничего не жмет.
наилучший вариант сделать ридонли снапшот системы, потом из снапшота сделать образ через send и уж его можно жать и в хвост и в гриву
к примеру
sudo btrfs filesystem sync /
sudo btrfs subvolume snapshot -r / /mnt/backup/root_base
sudo btrfs send /mnt/b11/root_base | gzip > root_`date '+%F'`.gz
но почему бы не воспользоваться обыденным tar ??
так-то формат упаковки btrfs-stream (формат выхода btrfs send) не фундаментально отличается от формата tar. выполнить на сервере
sudo tar -czpf %backup%/srv4full-`date "+%F"`.tgz -X /etc/backupfull_exclude /
в файл /etc/backupfull_exclude пишешь список того что не нужно упаковывать в архив с системой (кроме классических /dev /proc /run /sys и прочих еще докинуть саму директорию куда архивишься и плюс рабочие директории сервисов, к примеру база данных такую архивацию не всегда переживет)
а далее восстановление из tar архива
если свободного места на сервере будет меньше трети всего объема то такой бекап может не прокатить, либо жать сильнее к примеру через lzma (жрет памяти и проц очень хорошо) либо писать напрямую по интернету к себе (если будет разрыв то передача обломится)
Типы файловых систем:
Flat:
toplevel (volume root directory, not to be mounted by default)
+-- root (subvolume root directory, to be mounted at /)
+-- home (subvolume root directory, to be mounted at /home)
+-- var (directory)
| \-- www (subvolume root directory, to be mounted at /var/www)
\-- postgres (subvolume root directory, to be mounted at /var/lib/postgresql)
Nested:
toplevel (volume root directory, to be mounted at /)
+-- home (subvolume root directory)
+-- var (subvolume root directory)
+-- www (subvolume root directory)
+-- lib (directory)
\-- postgresql (subvolume root directory)
Snapper ‒ это утилита для управления снапшотами для LVM и Btrfs.
# Установка
$ yay -S snapper
# Глобальные настройки
$ sudo nano /etc/conf.d/snapper
# Из этого шаблона генерируются другие конфиги
# Тут мы увеличим время после которого снапшоты будут удаляться до 24 часов
$ sudo sed -ri 's/MIN_AGE="[0-9]+"/MIN_AGE="86400"/g' /etc/snapper/config-templates/default
# Создаем конфиги для каждого подраздела отдельно
$ sudo snapper -c root create-config /
$ sudo snapper -c home create-config /home
$ sudo snapper -c var create-config /var
# Сгенерированные шаблоны находятся в /etc/snapper/configs
# Список конфигов
$ sudo snapper list-configs
Config | Subvolume
-------+----------
home | /home
root | /
var | /var
# Созданные конфиги меют такой адрес: /etc/snapper/configs/<config>
# Список снапшотов для конфига
$ snapper -c CONFIG list
# Удаление конфига
$ sudo snapper -c CONFIG delete-config
# Создать новый снапшот
$ snapper -c CONFIG snapshot
# Удалить снапшот
$ snapper -c CONFIG delete snapshot_number
# Удалить диапазон снапшотов
$ snapper -c CONFIG delete snapshot_X-snapshot_Y
<<<<<<< HEAD
# Включаем автоматическое создания снапшотов
# Запускаем бекап через 5 минут после загрузки и далее каждые 24 часа
=======
# Добавляем .snapshots в исключения для mlocate
$ sudo nano /etc/updatedb.conf
...
PRUNENAMES = ".git .hg .svn .snapshots"
...
# Делаем снимки через 5 минут после загрузки и далее каждые 24 часов
>>>>>>> c67ee04f7511ffe5c7ed83f2c751da05ac42de29
$ sudo nano $(locate snapper-timeline.timer)
...
[Timer]
OnBootSec=5min
OnUnitActiveSec=24h
...
# Включаем автоматическое создания снапшотов
$ sudo systemctl enable snapper-timeline.timer && sudo systemctl start snapper-timeline.timer
# Можно так же периодичность очистки снапшотов изменить
$ sudo nano $(locate snapper-cleanup.timer)
# Автоматически удаляет снапшоты при превышении квот
$ sudo systemctl enable snapper-cleanup.timer && sudo systemctl start snapper-cleanup.timer
# Просмотр логов
$ tail -f /var/log/snapper.log
Описание настроек:
### SNAPPER-CONFIGS(5)# Filesystem Snapshot Management
### Boolean values must be "yes" or "no".
SUBVOLUME="/"
# Path of the subvolume or mount point.
# There is no default value. The value must always be specified.
FSTYPE=btrfs
# Filesystem type for the subvolume.
# Default value is "btrfs" but it's recommended to always specify the
# filesystem type.
ALLOW_USERS=""
# List of users allowed to operate with the config. The user-names
# must be separated by spaces. Spaces in usernames can be escaped with
# a "\".
# Also see the PERMISSONS section in snapper(8).
# Default value is "" but "root" is always implicitly included.
ALLOW_GROUPS="snapper"
# List of groups allowed to operate with the config. The group-names
# must be separated by spaces. Spaces in group-names can be escaped
# with a "\".
# Also see the PERMISSONS section in snapper(8).
# Default value is "".
SYNC_ACL=yes
# Defines whether snapper will sync the users and groups from
# ALLOW_USERS and ALLOW_GROUPS to the ACL of the .snapshots directory.
# Also see the PERMISSONS section in snapper(8).
# Default value is "no".
# New in version 0.2.0.
BACKGROUND_COMPARISON=yes
# Defines whether pre and post snapshots should be compared in the
# background after creation.
# Default value is "yes".
### CLEANUP ALGORITHMS
######################
### NUMBER
NUMBER_CLEANUP=no
# Defines whether the number cleanup algorithm should be run for the
# config.
# Default value is "no".
NUMBER_MIN_AGE=1800
# Minimal age for snapshots to be deleted by the number cleanup
# algorithm.
# Default value is "1800".
NUMBER_LIMIT=50
# Defines how many snapshots the number cleanup algorithm should
# keep. The youngest snapshots will be kept.
# Default value is "50".
NUMBER_LIMIT_IMPORTANT=10
# Defines how many important snapshots the number cleanup algorithm
# should keep. Important snapshots have important=yes in the userdata.
# The youngest important snapshots will be kept.
# The number of normal and important snapshots are counted
# independently.
# Default value is "10".
# New in version 0.1.8.
### TIMELINE
TIMELINE_CREATE=yes
# Defines whether hourly snapshots should be created.
# Together with the timeline cleanup algorithm this will create a
# collection of snapshots with more snapshots is the near past and less
# snapshots in the far past.
# Default value is "no".
TIMELINE_CLEANUP=yes
# Defines whether the timeline cleanup algorithm should be run for
# the config.
# Default value is "no".
TIMELINE_MIN_AGE=14400
# Minimal age for snapshots to be deleted by the timeline cleanup
# algorithm.
# Default value is "1800".
TIMELINE_LIMIT_HOURLY=23
# Defines how many hourly snapshots the timeline cleanup algorithm
# should keep. An hourly snapshot is the first snapshot in an hour. The
# youngest hourly snapshots will be kept.
# Default value is "10".
TIMELINE_LIMIT_DAILY=14
# Defines how many daily snapshots the timeline cleanup algorithm
# should keep. A daily snapshot is the first snapshot in a day. The
# youngest daily snapshots will be kept.
# Default value is "10".
TIMELINE_LIMIT_MONTHLY=6
# Defines how many monthly snapshots the timeline cleanup algorithm
# should keep. A monthly snapshot is the first snapshot in a month. The
# youngest monthly snapshots will be kept.
# Default value is "10".
TIMELINE_LIMIT_YEARLY=1
# Defines how many yearly snapshots the timeline cleanup algorithm
# should keep. A yearly snapshot is the first snapshot in a year. The
# youngest yearly snapshots will be kept.
# Default value is "10".
### EMTPY PRE POST
EMPTY_PRE_POST_CLEANUP=yes
# Defines whether the empty-pre-post cleanup algorithm should be run
# for the config.
# Default value is "no".
EMPTY_PRE_POST_MIN_AGE=1800
# Minimal age for snapshots to be deleted by the empty-pre-post
# cleanup algorithm.
# Default value is "1800".
GUI:
# Не запускается
$ yay -S snapper-gui-git
Ссылки:
Программа для управления бекапами. Работает с Btrfs и в rsync-режиме (полный дамп).
$ yay -S timeshift
[sergey@sergey-pc ~]$ sudo pacman -S postgresql
[sergey@sergey-pc ~]$ sudo chown postgres /var/lib/postgres/data
[sergey@sergey-pc ~]$ sudo -i -u postgres
[postgres@sergey-pc ~]$ initdb -D '/var/lib/postgres/data'
[postgres@sergey-pc ~]$ logout
[sergey@sergey-pc ~]$ sudo systemctl start postgresql
[sergey@sergey-pc ~]$ sudo systemctl enable postgresql
[sergey@sergey-pc ~]$ sudo -u postgres -i initdb --locale $LANG -E UTF8 -D /var/lib/postgres/data
[sergey@sergey-pc ~]$
[postgres@sergey-pc ~]$ createuser --interactive -P
Enter name of role to add: sergey
Enter password for new role:
Enter it again:
Shall the new role be a superuser? (y/n)
Please answer "y" or "n".
Shall the new role be a superuser? (y/n) n
Shall the new role be allowed to create databases? (y/n) y
Shall the new role be allowed to create more new roles? (y/n) y
[postgres@sergey-pc ~]$ createdb -O sergey sergey # создаем пользователя и БД с именами совпадающими с пользователем системы, чтобы psql запускать без параметров
[postgres@sergey-pc ~]$ logout
[sergey@sergey-pc ~]$ psql
psql (11.1)
Type "help" for help.
sergey=>
# Дамп базы схемы БД
$ pg_dump -d db -f /tmp/dump.sql
# Загрузка дампа
$ psql db < /tmp/dump.sql
# Замена стандартному top
$ yay -S htop
$ htop
# Все сервисы
# Покажут только включенные
$ systemctl
$ systemctl list-units --type service
# + выключенные
$ systemctl list-unit-files --type service
$ sudo systemctl enable docker
$ sudo systemctl disable docker
$ sudo systemctl restart nginx.service
$ sudo systemctl start application.service
$ sudo systemctl start application.service
$ systemctl status nginx.service
$ sudo systemctl is-enabled service
Создание своего сервиса:
/etc/systemd/system/rot13.service
:
[Unit]
Description=ROT13 demo service
After=network.target
StartLimitIntervalSec=0
[Service]
Type=simple
Restart=always
RestartSec=1
User=centos
ExecStart=/usr/bin/env php /path/to/server.php
[Install]
WantedBy=multi-user.target
Ссылки:
# Установка
$ yay -S git
# Глобальные настройки
$ git config --global user.name <yourname>
$ git config --global user.email <email>
# Сменить ветку
$ git checkout <branchname>
# Создать ветку и переключится на нее
$ git checkout -b <branchname>
# Объединить текущую ветку с branchname
$ git merge <branchname>
# Добавить изменения (все файлы в каталоге и вложеннхы)
$ git add .
# Закоммитить изменения (сделать описание)
$ git commit -m "Тест"
# Если не были добавлены новые файлы, а лишь производились изменения в уже добавленных, то можно использовать только одну команду
$ git commit -am "Тест"
# Обновить репозиторий на сервере
$ git push
# Выгрузить изменения с сервера (тоже самое, что git fetch + git merge)
$ git pull
# Копировать репозиторий
$ git clone https://github.com/someuser/repo.git [<assigneddirectory>]
# Посмотреть историю
$ git log --graph --oneline --decorate --all
# Посмотреть отличия по сравнения с предыдущей версией
$ git diff 871d36b [<filename>]
# Сохранить изменения
$ git stash [save "my stash message here"]
# Удалить stach и применить его
$ git stash pop [stash@{1}]
# Список stash
$ git stash list
# Посмотреть что там лежит
$ git stash show stash@{0}
$ git stash apply
$ git stash drop stash@{2}
$ git stash clear
# List all the tags:
$ git tag
# Search tags for a particular pattern:
$ git tag -l <tag-pattern>
# Show a tag data:
$ git show <tag-name>
# Create a Lightweight Tag:
$ git tag <tag-name>
# Create an Annotated Tag:
$ git tag -a <tag-name> -m <tag-message>
# Create a tag for a specific commit:
$ git tag -a <tag-name> <commit-checksome>
# Push a specific tag to remote:
$ git push origin <tag-name>
# Push all the tags to remote:
$ git push origin --tags
# Checkout a specific to local:
$ git checkout -b <branch-name> <tag-name>
Генерация нового ключа:
$ ssh-keygen -t rsa -b 4096 -C "<email>"
Generating public/private rsa key pair.
Enter file in which to save the key (/home/sergey/.ssh/id_rsa): /home/sergey/.ssh/github_rsa
Created directory '/home/sergey/.ssh'.
...
В настройках нужно добавить сгенерированный ключ, скопировав содержимое pub-файла (для примера - github_rsa.pub), который лежит в ~/.ssh
.
Если уже есть проекты, которые были ранее склонированы по https, то нужно изменить .git/config
проекта. :
...
[remote "origin"]
url = [email protected]:<username>/<project>.git
...
Правильный адрес проекта можно посмотреть на странице репозитория:
Для проекта можно указать локальные email и имя:
git config user.email <email>
git config user.name <name>
Включаем Tor:
sudo systemctl start tor
sudo systemctl enable tor
Проверка:
$ torify curl http://httpbin.org/ip
{
"origin": "173.244.209.5, 173.244.209.5"
}
$ yay -S pass
# Далее нужно сгенерировать PGP ключ. Сгенерированный ключ можно удалить через seahorse
$ gpg2 --gen-key
gpg (GnuPG) 2.2.16; Copyright (C) 2019 Free Software Foundation, Inc.
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Note: Use "gpg --full-generate-key" for a full featured key generation dialog.
GnuPG needs to construct a user ID to identify your key.
Real name: Sergey M
Email address: [email protected]
You selected this USER-ID:
"Sergey M <[email protected]>"
Change (N)ame, (E)mail, or (O)kay/(Q)uit? O
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
gpg: key 82AD537DDC8DD344 marked as ultimately trusted
gpg: revocation certificate stored as '/home/sergey/.gnupg/openpgp-revocs.d/<gpg_id>.rev'
public and secret key created and signed.
pub rsa2048 2019-07-13 [SC] [expires: 2021-07-12]
<gpg_id>
uid Sergey M <[email protected]>
sub rsa2048 2019-07-13 [E] [expires: 2021-07-12]
# Теперь инициализируем хранилище
$ pass init gpg_id
# Можем сгенерировать пароль (будет автоматически сохранен)
$ pass generate example.com 15
The generated password for example.com is:
'.kXKEs<lx4dcKM
# Посмотреть пароль (потребует passphrase)
$ pass example.com
'.kXKEs<lx4dcKM
# Копировать пароль в буфер обмена
$ pass -c example.com
Copied example.com to clipboard. Will clear in 45 seconds.
# Удалить пароль
$ pass rm example.com
Are you sure you would like to delete example.com? [y/N] y
removed '/home/sergey/.password-store/example.com.gpg'
Базу паролей можно разместить на Google Диск.
Ссылки:
- Pass — утилита для хранения паролей в Linux;
- Приложение для Android;
- Устаревшее расширение для Chrome.
Нужно пофиксить разделы:
fsck -y <device>
Пример: у нас на диске есть два ntfs раздела раздела, а за ними идет паздел linux, мы в Windows ntfs-2, а размер ntfs-1 увеличиваем на все освободившееся пространство, в итоге Windows выходит за свои границы и портит раздел linux.
Чаще всего эта ошибка происходит после переименования логических разделов LVM, подразделов Btrfs, переноса системы на новый раздел (когда не совпадают GUID'ы).
error: ... not found.
Entering rescue mode...
# Для начала нужно посмотреть все устройства и разделы
grub rescue> ls
(hd0) (hd1) (hd1,gpt1) (hd2) (hd2,gpt5) (hd2,gpt4) (hd2,gpt3) (hd2,gpt2) (hd2,gpt1) (hd3,gpt2) (hd3,gpt1) (hd4) (hd5)
# Мы помним, что наша система находится на 5 разделе, так что тут гадать не нужно
grub rescue> set prefix=(hd2,gpt5)/@/boot/grub
# «@» ‒ это имя подраздела Btrfs. Для обычного Ext4 раздела, команда будет выглядеть так:
#
# set prefix=(hd2,gpt5)/boot/grub
#
# А для LVM:
#
# set prefix=(lvm/arch-root)/boot/grub
grub rescue> set root=(hd2,gpt5)
# Проверим
grub rescue> ls /
@/ @home
# Да, это наш корневой раздел Linux
# Теперь можно загрузиться в систему
grub rescue> insmod normal
grub rescue> normal
После загрузки системы нужно переустановить grub:
$ sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id="Arch Linux"
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
Это переключение между виртуальными терминалами. с 1-6 текстовые, остальные ‒ графические. В gdm Ctrl+Alt+F1
‒ логин в систему, Ctrl+Alt+F2
‒ рабочий стол. В lightdm переключиться на рабочий стол можно нажатием Ctrl+Alt+F7
.
Существует файл /usr/share/applications/mimeinfo.cache. В нем хранятся ассоциации между mime-типами и приложениями. Его редактирование исправляет проблему, НО такое решение является временным, так как этот файл генерируется при каждом обновлении системы из *.desktop файлов.
Нужно отредактировать MimeType (я его просто закомментировал) в /usr/share/applications/visual-studio-code.desktop и обновить mimeinfo.cache:
$ sudo nano /usr/share/applications/visual-studio-code.desktop
...
# MimeType=text/plain;inode/directory;
...
$ sudo update-desktop-database /usr/share/applications
В один прекрасный день Chrome выдаст такое предупреждение, после чего перестанут сохраняться пароли и не будет работать автозаполнение форм для логина.
Решение:
# можно нажать `Super+A` и поискать приложение `passwords and keys`
$ seahorse &
# Если пакет не установлен
$ yay -S seahorse
Удаляем вкладку Login:
Другой вариант удалить все кейринги вручную:
$ rm -rf ~/.local/share/keyrings
Далее удаляем настройки Chrome:
$ rm -rf ~/.config/google-chrome
Теперь остается только перезапустить Chrome.
Ищет на stackoverflow и других ресурсах справку по командам и языкам программирования.
Установка:
curl https://cht.sh/:cht.sh | sudo tee /usr/local/bin/cht.sh
sudo chmod +x /usr/local/bin/cht.sh
# Так же требуются пакеты xsel и rlwrap
yay -S xsel rlwrap
Использование:
# Интерактивный режим
$ cht.sh --shell <language>
$ cht.sh --shell bash
type 'help' for the cht.sh shell help
cht.sh/bash> for
# shell - Bash 'for' loop syntax?
#
# Replace
for (($i=0...
# with
for ((i=0;i<10;i++))
# [jman] [so/q/6854118] [cc by-sa 3.0]
cht.sh/bash>
$ cht.sh go create file
/*
* go - Create an empty text file
*
* Don't try to check the existence first, since you then have a race if
* the file is created at the same time. You can open the file with the
* O_CREATE flag to create it if it doesn't exist:
*/
os.OpenFile(name, os.O_RDONLY|os.O_CREATE, 0666)
// [JimB] [so/q/35558787] [cc by-sa 3.0]
# Небольшой туториал по языку
$ cht.sh python :learn
Установка:
$ git clone --depth=1 https://github.com/pindexis/marker ~/.marker && ~/.marker/install.py
- Ctrl-space: search for commands that match the current written string in the command-line.
- Ctrl-k (or marker mark): Bookmark a command.
- Ctrl-t: place the cursor at the next placeholder, identified by '{{anything}}'
- marker remove: remove a bookmark
Пользовательские команды хранятся в ~/.local/share/marker/user_commands.txt
.
Пример:
yay -S {{package}}##install package
yay -S --noconfirm {{package}}##install package without confirmations
yay -Ss {{search}}##search packages
yay -Si {{package}}##package information
yay -Sc##clean
yay -Syu##update all packages
yay -Ps##print system stats
yay -Pu##print list of packages that needs to be updated
yay -Rns {{package}}##remove package
exec "$SHELL"##reload shell
"Встроенные" в /home/sergey/.marker/tldr/
.
Этим я пользовался до cht.sh.
$ npm i tldr -g
Получаем краткую справку по команде:
$ tldr nvm
✔ Page not found. Updating cache...
✔ Creating index...
nvm
Install, uninstall or switch between Node.js versions.
Supports version numbers like "0.12" or "v4.2", and labels like "stable", "system", etc.
Homepage: https://github.com/creationix/nvm.
- Install a specific version of Node.js:
nvm install node_version
- Use a specific version of Node.js in the current shell:
nvm use node_version
- Set the default Node.js version:
nvm alias default node_version
- List all available Node.js versions and highlight the default one:
nvm list
- Uninstall a given Node.js version:
nvm uninstall node_version
- Launch the REPL of a specific version of Node.js:
nvm run node_version --version
- Execute a script in a specific version of Node.js:
nvm exec node_version node app.js
# ==============================================================================
#
# Основы синтаксиса
#
# ==============================================================================
# $1, $2, $3, ... are the positional parameters.
# "$@" is an array-like construct of all positional parameters, {$1, $2, $3 ...}.
# "$*" is the IFS expansion of all positional parameters, $1 $2 $3 ....
# $# is the number of positional parameters.
# $- current options set for the shell.
# $$ pid of the current shell (not subshell).
# $_ most recent parameter (or the abs path of the command to start the current shell immediately after startup).
# $IFS is the (input) field separator.
# $? is the most recent foreground pipeline exit status.
# $! is the PID of the most recent background command.
# $0 is the name of the shell or shell script.
# присвоить значение переменной
x=42
# Для вывода используем echo и printf
echo "x=$x"
echo "x=${x}"
printf "x=%s\n" x
# Если переменная не задана, то присваиваем ей дефолтное значение
x=${x:-default}
# $ { varname :- word }
# If varname exists and isn’t null, return its value; otherwise return word.
# Purpose:
# Returning a default value if the variable is undefined.
# Example:
# ${count:-0} evaluates to 0 if count is undefined.
# $ { varname := word}
# If varname exists and isn’t null, return its value; otherwise set it to word and then return its value. Positional and special parameters cannot be assigned this way.
# Purpose:
# Setting a variable to a default value if it is undefined.
# Example:
# $ {count := 0} sets count to 0 if it is undefined.
# $ { varname :? message }
# If varname exists and isn’t null, return its value; otherwise print varname : followed by message, and abort the current command or script (non-interactive shells only). Omitting message produces the default message parameter null or not set.
# Purpose:
# Catching errors that result from variables being undefined.
# Example:
# {count :?” undefined! " } prints “count: undefined!” and exits if count is undefined.
# $ { varname :+word }
# If varname exists and isn’t null, return word; otherwise return null.
# Purpose:
# Testing for the existence of a variable.
# Example:
# $ {count :+ 1} returns 1 (which could mean “true”) if count is defined.
# $ { varname : offset }
# $ { varname : offset:length }
# Purpose:
# Returning parts of a string (substrings or slices).
# Example:
# If count is set to frogfootman, $ {count :4} returns footman. $ {count :4:4} returns foot.
# Экспорт глобальной переменной
export VAR=42
# Генерация строк с помощью Brace expansion
$ echo a{d,c,b}e
ade ace abe
# Массивы
arr=(Hello World)
echo ${arr[0]} ${arr[1]}
${arr[*]} # Все записи в массиве
${!arr[*]} # Все индексы в массиве
${#arr[*]} # Количество записей в массиве
${#arr[0]} # Длина первой записи (нумерация с нуля)
array=(one two three four [5]=five)
echo "Array size: ${#array[*]}" # Выводим размер массива
echo "Array items:" # Выводим записи массива
for item in ${array[*]}
do
printf " %s\n" $item
done
echo "Array indexes:" # Выводим индексы массива
for index in ${!array[*]}
do
printf " %d\n" $index
done
echo "Array items and indexes:" # Выводим записи массива с их индексами
for index in ${!array[*]}
do
printf "%4d: %s\n" $index ${array[$index]}
done
# Следующий пример покажет, как кавычки и конструкции без кавычек возвращают строки (особенно важно, когда в этих строках есть пробелы):
array=("first item" "second item" "third" "item")
echo "Number of items in original array: ${#array[*]}"
for ix in ${!array[*]}
do
printf " %s\n" "${array[$ix]}"
done
echo
arr=(${array[*]})
echo "After unquoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo
arr=("${array[*]}")
echo "After * quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
echo
arr=("${array[@]}")
echo "After @ quoted expansion: ${#arr[*]}"
for ix in ${!arr[*]}
do
printf " %s\n" "${arr[$ix]}"
done
# Циклы
for i in $(seq 1 10);
do
echo $i
done
for ((i = 0 ; i < max ; i++ ))
do
echo $i
done
for i in {0..10}
do
echo $i
done
for w in word1 word2 word3
do
doSomething($w)
done
# А вот это zsh не умеет!
for filename in *.sh
echo "$filename"
end
i=0
while (( ++i <= num )); do
printf 'counter is at %d\n' "$i"
done
i=1
while [ "$i" -le "$num" ]; do
printf 'counter is at %d\n' "$i"
i=$(( i + 1 ))
done
# Условия
if [ "$seconds" -eq 0 ]; then
timezone_string="Z"
elif [ "$seconds" -gt 0 ]; then
timezone_string=$(printf "%02d:%02d" $((seconds/3600)) $(((seconds / 60) % 60)))
else
echo "Unknown parameter"
fi
# В условиях нужно использовать двойные скобки
# [ is just a regular command with a weird name.
# ] is just an argument of [ that prevents further arguments from being used.
# [[ a = a && b = b ]]: true, logical and
# [ a = a && b = b ]: syntax error, && parsed as an AND command separator cmd1 && cmd2just an argument of [ that prevents further arguments from being used.
# x='a b'; [[ $x = 'a b' ]]: true, quotes not needed
# x='a b'; [ $x = 'a b' ]: syntax error, expands to [ a b = 'a b' ]
# Подробнее тут:
# <https://stackoverflow.com/a/47576482>
# -eq
# is equal to
[ "$a" -eq "$b" ]
# -ne
# is not equal to
[ "$a" -ne "$b" ]
# -gt
# is greater than
[ "$a" -gt "$b" ]
# -ge
# is greater than or equal to
[ "$a" -ge "$b" ]
# -lt
# is less than
[ "$a" -lt "$b" ]
# -le
# is less than or equal to
[ "$a" -le "$b" ]
# <
# is less than (within double parentheses)
(("$a" < "$b"))
# <=
# is less than or equal to (within double parentheses)
(("$a" <= "$b"))
# >
# is greater than (within double parentheses)
(("$a" > "$b"))
# >=
# is greater than or equal to (within double parentheses)
(("$a" >= "$b"))
# <http://tldp.org/LDP/abs/html/comparison-ops.html>
# [ ‒ это всего лишь команда, последним аргументом которой всегда должна быть "]"! Все операторы описаны в man'е:
man [
# Это вполне себе валидное выражение
"[" 1 -eq 0 "]" || echo fail
# Строка слева всегда имя переменной
x=42; [[ "x" -eq "42" ]] || echo fail
# выражение слева всегда переменная
case $VAR in
foo) ... ;;
bar) ... ;;
# Все остальные значения
*) ... ;;
esac
# Объявление функции
foo() {
# Аргументы функции
$1..$N
# Локальная переменная
local x=42
...
# Теперь в $1 будет $2, в $2 ‒ $3 и т.д.
shift
}
# Экспорт функции
export -f foo
die() { echo "$*" 1>&2 ; exit 1; }
...
die "Kaboom"
[ "$#" -eq 2] || die "Needs 2 arguments, input and output"
# The syntax is token-level, so the meaning of the dollar sign depends on the token it's in. The expression $(command) is a modern synonym for `command` which stands for command substitution; it means, run command and put its output here. So
echo "Today is $(date). A fine day."
# Управление выводом
# Направить stdout одной программы в stdin другой
command1 | command2
# Перенаправление stdout и stderr
command1 |& command2
# Создать либо перезаписать файл, добавив строку
command > out
# Создать файл, если его не существует и дописать строку в конец
command >> out
# Направить stderr команды в файл
command 2>&1 out
# stdout 2-ой команды, является stdin для первой
command1 <<< command2
# Вывод многострочного текста
cat <<EOF
хуй
пизда
джигурда
EOF
cat >> /path/to/file <<EOL
хуй
пизда
джигурда
EOL
# ==============================================================================
#
# Написание скриптов
#
# ==============================================================================
# Первой строкой скрипта идет Shebang, торый указывает какой интерпретатор использовать
#!/usr/bin/env bash
# При наличии ошибок прекратит выполнение сценария
set -e
# Так же часто делают каталог скрипта рабочим (по-умолчанию рабочим является тот откуда запустили скрипт)
cd "$(dirname "$0")"
# ==============================================================================
#
# Выполнение скриптов
#
# ==============================================================================
# Сделать файл исполняемым
$ chmod +x /path/to/file
# Выполнит скрипт в текущем процессе (переменные и функции, объявленные внутри скрипта станут доступны в терминале)
$ source /path/to/file
# ==============================================================================
#
# Запуск команд
#
# ==============================================================================
# Запустить процесс и вернуть его дескриптор (при закрытии терминала будет остановлена)
$ command &
# То же самое за исключением того, что процесс не будет остановлен при закрытии терминала
$ nohup command &
# ==============================================================================
#
# Пакеты
#
# ==============================================================================
# Установить пакет
$ yay -S <package>
# Удалить пакет
$ yay -Rns <package>
# Обновить все установленные пакеты
$ yay -Syu
# Обновить в т.ч. с пакетами для разработчика
$ yay -Syu --devel --timeupdate
# Очистить кеш
$ yay -Sc
# Удалить все ненужные зависимости
$ yay -Yc
# Статистика по пакетами
$ yay -Ps
# Generates development package DB used for devel updates
$ yay -Y --gendb
# Ошибки с удалением зависимостей
$ yay -Rns gnome-extra
checking dependencies...
error: failed to prepare transaction (could not satisfy dependencies)
:: nautilus: removing nautilus-sendto breaks dependency 'nautilus-sendto'
$ yay -Rdd nautilus-sendto
# Теперь можно снести gnome-extra
# ==============================================================================
#
# Текст
#
# ==============================================================================
# Замена в тексте
$ echo "This is a test" | sed 's/test/another test/'
# Ключ -e позволяет выполнить несколько команд:
# sed -e 's/This/That/; s/test/another test/'
# Перевод регистра
$ echo lowercase | tr '[:lower:]' '[:upper:]'
LOWERCASE
# ==============================================================================
#
# Файловая система
#
# ==============================================================================
# Список разделов
$ sudo fdisk -l
$ sudo mkdir /mnt/usb1
# Монтировать устройство
$ sudo mount /dev/sdb1 /mnt/usb1
# Размонтируем устройство
$ sudo umount /dev/sdb1
# или
$ sudo umount /mnt/usb1
# Сменить владельца и группу для файла
$ sudo chown $USER:$USER /path/to/file
# В Linux все файлы. Регулярные файлы ‒ обычные файлы, каталоги ‒ это файлы содержащие список файлов и т.д.
# Перемещение/переименование файла
$ mv <src> <dst>
# Копирование файлов
$ cp <src> <dst>
# Копировать каталог и все вложенные файлы
$ cp -r <src> <dst>
# Полный путь до файла
$ realpath example.txt
/home/username/example.txt
# Листинг каталога
$ ls
$ tldr ls
# Вывести информацию о владельце и группе файла
$ ls -ld /path/to/file
$ stat /path/to/file
# Вывести все вложенные файлы
$ ls -R <path>
$ find <path> -print
# Покажет имя и размер
$ du -a <path>
# Размер всех файлов с расширеним .txt
$ du -chs *.txt
# Создание каталога
$ mkdir <target>
# Создание каталога вместе с родительскими каталогами, если тех не существует
$ mkdir -p <target>
# Создать каталог с определенными правами
$ mkdir -m 0750 <directory>
# Создание множества каталогов
$ mkdir foo bar baz
# или
$ mkdir prefix-{foo,bar,baz}
# Такой же трюк работает при создании файлов
$ touch {foo,bar,baz}.txt
# Создать мягкую ссылку на файл либо заменить ее новой
$ ln -sf path/to/new_file path/to/symlink
# Мягкая ссылка содержит путь до файла. Жесткая ссылается на inode, искомый
# файл при перемещении остается доступен по ссылке и невозможно ссылаться на
# файл на другом устройстве
# Слияние файлов в один
$ paste file1.txt file2.txt > fileresults.txt
# Удалить файлы старше 5 дней
$ find /path/to/files* -mtime +5 -exec rm {} \;
# Удалить все шрифты соответствущие шаблону *powerline* без учета регистра
# «{} \;» rm будет вызван множество раз
# «{} +» добавляет агрументы к rm
$ sudo find /usr/share/fonts -iname "*powerline*" -exec rm {} +
# Поиск фала по имени в специальной базе
$ locate -e login.keyring
/home/sergey/.local/share/keyrings/login.keyring
# Установка
$ yay -S mlocate
# Перед первым запуском следует выполнить
$ sudo updatedb
# После установки будет доступен сервис updatedb.timer, который будет ежедневно обновлять базу
# Стастика
$ locate -S
Database /var/lib/mlocate/mlocate.db:
157 512 directories
1 384 522 files
119 423 666 bytes in file names
38 722 751 bytes used to store database
# Поиск исполняемых файлов, исходников и страниц манула
$ whereis <q>
# Покажет что куда смонтировано (можно свободное место узнать)
$ df -h --total
# Узнать на каком разделе смонтирован каталог
$ df -h /tmp
# Просмотр числа inode
$ df -i
# Просмотр содержимого фйала с навигацией
$ less /path/to/file
# или более короткая версия в ZSH
$ < /path/to/file
# Просмотр логов в реальном времени
$ tail -f /var/log/syslog | less
# Вывести строки не соответствующие шаблону
$ grep -Pv <exclude_pattern> <filename>
# Создать файл, забитый null-байтами
$ dd if=/dev/zero of=/tmp/nullbytes bs=1M count=1
# Конфертировать .md в .rst
$ pip install m2r
$ m2r --help
# Конвертировать .webp в .png
$ yay -S libwebp
$ dwebp file.webp -o file.png
# Вывод содержимого файла с подсветкой синтаксиса
$ yay -S ccat
$ ccat ./file
# Вывести файлы в каталоге, отсортировав их по времени до доступа
$ ls -ltu <path>
# Изменить размер каталога /tmp
$ mount -o remount,size=4G /tmp/
# Подробная информация о диске
$ sudo smartctl -a /dev/nvme0
# ==============================================================================
#
# Работа с архивами
#
# ==============================================================================
# Заархивировать каталог
$ tar -czvf filename.tar.gz directory
# Для извлечения файлов проще всего пользоваться плагином Oh My ZSH extract
# Извлечь архив и удалить его (ключ -r)
$ extract -r <filename>
# Извлечь .tar.gz
$ tar zxvf <yourfile>.tar.gz -C /usr/src/
# Скачать и Распаковать Архив с помощью WGET
$ wget http://example.com/archive.tar -O - | tar -x
$ wget http://example.com/archive.tar.gz -O - | tar -xz
$ wget http://example.com/archive.tar.bz2 -O - | tar -xj
# Скачать и Распаковать Архив с помощью CURL
$ curl http://example.com/archive.tar | tar -x
$ curl http://example.com/archive.tar.gz | tar -xz
$ curl http://example.com/archive.tar.bz2 | tar -xj
# ==============================================================================
#
# Сеть
#
# ==============================================================================
# Показать все прослушиваемые и установленные порты TCP и UDP вместе с PID
# связанного процесса
$ netstat -plantu
# Все запущенные сервера на хосте
$ netstat -lnt
# Скачать файл в каталог
$ wget -P $ZSH_CUSTOM/themes https://raw.githubusercontent.com/caiogondim/bullet-train-oh-my-zsh-theme/master/bullet-train.zsh-theme
# ==============================================================================
#
# Шрифты
#
# ==============================================================================
# Список установленных шрифтов
$ fc-list
# Обновить базу шрифтов после добавления/удаления их в/из `/usr/share/fonts`
# либо `~/.local/share/fonts`
$ fc-cache -f -v
# ==============================================================================
#
# Буфер обмена
#
# ==============================================================================
$ yay -S xclip
# Скопировать текст в буфер обмена
$ echo 123 | xclip -sel clip
# Копировать содержимое файла в буфер обмена
$ xclip -sel clip < ~/.ssh/github_rsa.pub
# Вывести содержимое буфера обмена
$ xclip -o -sel clip
# Конвертировать файл в base64 и скопировать в буфер обмена
$ file="test.docx"
$ base64 -w 0 $file | xclip -selection clipboard
# ==============================================================================
#
# Языковые настройки
#
# ==============================================================================
# Список влюченных локалей
$ locale -a
# Добавление локалей
# В этом файле находится список всех поддерживаемых локалей
# Раскомментируем нужную
$ sudo nano /etc/locale.gen
# Генерируем локали
$ sudo locale-gen
# Можно так же локали так добавлять
$ sudo locale-gen de_DE.UTF-8
# Меняем язык системы (нужно перегрузиться)
echo "LANG=de_DE.UTF-8" > /etc/locale.conf
# ==============================================================================
#
# Генерация паролей
#
# ==============================================================================
$ yay -S pwgen
$ pwgen -cnsy 10 1
1u_dr<ZLH;
$ pip install xkcdpass
$ xkcdpass -n 3 -d -
backdrop-unruly-yodel
$ xkcdpass -n 3 -d - --min 2 --max 6
shrank-trio-thong
# ==============================================================================
#
# Прочее
#
# ==============================================================================
# Перегрузить Shell
$ exec "$SHELL"
# Список всех доступных команд
$ compgen -c
# Ищем Chrome
$ compgen -c | grep chrome
google-chrome-stable
chrome-gnome-shell
google-chrome
# Просмотр логов в реальном времени
$ journalctl -f
# Изменить размер терминала
$ gnome-terminal --geometry 135x45
# Документация по командам
$ tldr cat
$ tldr --search create file
Ссылки:
- Цвет и форматирование текста в консоли;
- Поиск файлов на Сервере;
- Файловая система Linux;
- Inode;
- Управление разделами LVM;
- Часто используемые команды Git;
- Использование регулярных выражений
i3 – это тайловый оконный менеджер для Linux. Тут настройки под меня.
$ yay -S awesome-terminal-fonts bumblebee-status compton fonts-powerline dmenu i3-gaps i3lock-fancy-git lxappearance nitrogen rofi scrot termite xclip
$ sudo nano /usr/share/xsessions/i3-custom.desktop
[Desktop Entry]
Name=i3 custom
Exec=/usr/local/bin/i3-custom
Type=Application
$ sudo nano /usr/local/bin/i3-custom
#!/bin/bash
mkdir -p ~/.config/i3/logs
export TERMINAL=termite
exec i3 -V >> ~/.config/i3/logs/$(date +'%F-%T').log 2>&1
$ sudo chmod +x /usr/local/bin/i3-custom
$ i3-config-wizard
$ cp /etc/xdg/termite/config ~/.config/termite/config
$ nano ~/.config/termite/config
[options]
# ...
font pango:Inconsolata, Font Awesome 10
# ...
[colors]
# ...
# 20% background transparency (requires a compositor)
background = rgba(63, 63, 63, 0.8)
$ cp /etc/xdg/compton.conf ~/.config
$ nano ~/.config/i3/config
# ...
font pango:Droid Sans 10
# ...
# Заменяем все Mod1 на $m и создаем переменную выше вызовов bindsym
set $m Mod1
# lockscreen
bindsym Ctrl+$m+l exec i3lock
# Pulse Audio controls
bindsym XF86AudioRaiseVolume exec --no-startup-id pactl set-sink-volume 0 +5% #increase sound volume
bindsym XF86AudioLowerVolume exec --no-startup-id pactl set-sink-volume 0 -5% #decrease sound volume
bindsym XF86AudioMute exec --no-startup-id pactl set-sink-mute 0 toggle # mute sound
# Sreen brightness controls
bindsym XF86MonBrightnessUp exec xbacklight -inc 20 # increase screen brightness
bindsym XF86MonBrightnessDown exec xbacklight -dec 20 # decrease screen brightness
# Touchpad controls
bindsym XF86TouchpadToggle exec /some/path/toggletouchpad.sh # toggle touchpad
# Media player controls
bindsym XF86AudioPlay exec playerctl play
bindsym XF86AudioPause exec playerctl pause
bindsym XF86AudioNext exec playerctl next
bindsym XF86AudioPrev exec playerctl previous
# rofi
bindsym $m+t exec "rofi -combi-modi window,drun -show combi"
# захватывает весь экран и копирует в буфер обмена
bindsym --release Print exec "scrot /tmp/%F_%T_$wx$h.png -e 'xclip -selection c -t image/png < $f && rm $f'"
# захватывает область экрана и копирует в буфер обмена
bindsym --release Shift+Print exec "scrot -s /tmp/%F_%T_$wx$h.png -e 'xclip -selection c -t image/png < $f && rm $f'"
# ...
bar {
set $disk_format "{path}: {used}/{size}"
status_command bumblebee-status -m nic disk:root disk:home cpu memory sensors pulseaudio datetime layout pacman -p root.left-click="nautilus /" root.format=$disk_format home.path=/home home.left-click="nautilus /home" home.format=$disk_format -t solarized-powerline
position top
}
# ...
# отступы между окнами
gaps outer -10
gaps inner 20
floating_minimum_size 75 x 50
floating_maximum_size -1 x -1
# Убрать рамки у окон:
# 1)
# new_window pixel 0
# 2)
# for_window [class="^.*"] border none
# force floating for all new windows
# for_window [class=".*"] floating enable
for_window [class="Nautilus" instance="file_progress"] floating enable
for_window [class="^Telegram"] floating enable, resize set 800 600
# Всплывающие окна браузера
for_window [window_role="pop-up"] floating enable
# no_focus [window_role="pop-up"]
# прозрачность терминала
exec --no-startup-id compton --config ~/.config/compton.conf
# смена расскладки
exec --no-startup-id setxkbmap -model pc105 -layout us,ru -option grp:ctrl_shift_toggle
# восстановление заставки рабочего стола
exec --no-startup-id nitrogen --restore
Нужно выйти из сессии и выбрать в Display Manager сессию i3 custom
.
LXAppearance используется для изменения значков, шрифта по-умолчанию в приложениях.
Nitrogen позволяет менять обои.
Для изменения оформления i3 – служит i3-style:
$ yay -S i3-style
$ i3-style archlinux -o ~/.config/i3/config --reload
Вместо Ctrl+Shift+V
нужно использовать Shift+Ins
, а вместо Ctrl+Shift+C
– Ctrl+C
. Права кнопка мыши копировать, клик по колесику – вставить.
$ curl https://raw.githubusercontent.com/khamer/base16-termite/master/themes/base16-nord.config >> ~/.config/termite/config
$ nano ~/.config/termite/config
# 4-ое значение отвечает за прозрачность (1 - непрозрачно, 0 - абсолютная прозрачность)
background = rgba(40, 44, 52, 0.8)
$ yay -S i3lock-fancy-git
$ nano ~/.config/i3/config
# параметр -B делает фоном lockscreen скриншот экрана с размытием
bindsym Ctrl+$m+l exec i3lock-fancy -gpf Ubuntu -- scrot -z
# Сохранение
i3-save-tree --workspace 1 > ~/.i3/workspace-1.json
# Восстановление
i3-msg "workspace 1; append_layout ~/.i3/workspace-1.json"
Требует установки зависимостей.