Работа с загрузчиком
Цель: Зайти в систему без пароля рута - базовая задача сисадмина ( ну и одно из заданий на любой линуксовой сертификации). Так же нужно уметь управлять поведением загрузчика. Это и будем учиться делать в ДЗ
1. Попасть в систему без пароля несколькими способами
2. Установить систему с LVM, после чего переименовать VG
3. Добавить модуль в initrd
4(*). Сконфигурировать систему без отдельного раздела с /boot, а только с LVM
Репозиторий с пропатченым grub: https://yum.rumyantsev.com/centos/7/x86_64/
PV необходимо инициализировать с параметром --bootloaderareasize 1m
Критерии оценки: Описать действия, описать разницу между методами получения шелла в процессе загрузки.
Где получится - используем script, где не получается - словами или копипастой описываем действия.
- Попасть в систему без пароля:
- Заходим в загрузчик до старта системы (перед тем, как начнется загрузка нужно успеть нажать на клашиву
e
) - Затем находим строку
linux16
и убираем из нее все значениеconsole
, а частности:console=tty0 console=ttyS0,115200n8
и добавляемrd.break
, далее нажимаемCtrl+X
- Произойдет загрузка системы в аварийном режиме, далее выполняем команду перемонтирования корня для чтения и записи -
mount -o remount,rw /sysroot
, далееchroot /sysroot
- Далее мы можем поменять пароль, выполнив команду
passwd
илиpasswd root
- После смены пароля необходимо создать скрытый файл
.autorelabel
в /, выполнивtouch /.autorelabel
, этот файл нужен, для того чтобы выполнить relabel файлов в системе, если selinux включен и находиться в режимеEnforcing
. Без этого вы не сможете залогиниться в систему после ее загрузки. Однако в моем случае автоматически autorelabel не произошел. - Далее мне пришлось снова зайти в grub до загрузки системы, после чего в строке linux16 передать ядру параметр загрузки
enforcing=0
, этот параметр говорит ядру, загрузить систему в режиме selinux=Permissive, в этом режиме система безопасности только лишь пишет в лог файл о найденных нарушениях в файлах, но не блокирует их работу. - Загрузка произошла, теперь мы можем зайти под root, введя измененный пароль
- Далее выполняем команду
fixfiles -f relabel
, происходит relabeling файлов, selinux перечитывает файлы системы и начинаем им доверять - После чего заходим в
/etc/selinux/config
и приводим строку кSELINUX=Enforcing
или можем выполнить командуsetenforce 1
, что также включит полностью selinux. - Далее можем перезагружаться и попробовать войти в систему, это получится сделать.
Как проверить что SELINUX выключен? - Проверить это можно через команду getenforce или увидев, что в файле
/etc/selinux/config
SELINUX равенDisabled
.
Другой способ:
- Попасть в систему для смены пароля можно также, успев до загрузки зайти в grub, нажам клавишу
e
, после чего добавить к строкеlinux16
init=/bin/sh
и убрать из этой же строкиconsole=tty0 console=ttyS0,115200n8
после чего нажатьCtrl+X
для начала загрузки системы - Далее перемонтируем корень -
mount -o remount,rw /
, далее меняем пароль командойpasswd
, далее проверяем включен для SELUXcat /etc/selinux/config
, еслиSELINUX=Enforcing
, то меняем или наPermissive
илиDisabled
, перезагружаемся - Заходим в систему по новому паролю, если SELINUX включен, то делаем
fixfilex -f relabel
- Установить систему с LVM, после чего переименовать VG:
- Первым делом можем посмотреть какие Volume Group у нас есть командой
vgs
- Далее можем поменять название VG vgrename <Название которое есть сейчас> <Новое название>. Можем просмотреть новое название
ls -l /dev/mapper
- Далее будем править файлы, чтобы в дальнейшем мы могли загрузиться, первый файл это
/etc/fstab
, заходим в него и меняем старое название на новое - Далее заходим в файл
/etc/default/grub
и в строкеGRUB_CMDLINE_LINUX
изменяем старое название на новое в значенияхrd.lvm.lv
- Далее заходим в файл
/boot/grub2/grub.cfg
и меняем старые название на новое в строкеlinux16
нужного меню - Далее пересоздаем initrd image, в Centos 7 это не обязательно, так как система все равно загружается, однако делаем это чтобы в файлах initrd image поменялся путь монтирования, выполняем
mkinitrd -f -v /boot/initramfs-$(uname -r).img $(uname -r)
. - Перезагружаем компьютер, теперь у нас система загружается с новым названием VG. Также можно менять названия логических томов.
- Добавить модуль в initrd:
- Скрипты модулей хранятся в каталоге /usr/lib/dracut/modules.d/. Для того чтобы добавить свой модуль создаем там папку с именем 01test,
mkdir /usr/lib/dracut/modules.d/01test
- Далее создаем там 2 скрипта -
module-setup.sh
иtest.sh
, делаем их исполняемымиchmod +x
. В скриптmodule-setup.sh
вписываем:
#!/bin/bash
check() { # Функция, которая указывает что модуль должен быть включен по умолчанию
return 0
}
depends() { # Выводит все зависимости от которых зависит наш модуль
return 0
}
install() {
inst_hook cleanup 00 "${moddir}/test.sh" # Запускает скрипт
}
В файле test.sh
:
#!/bin/bash
cat <<'msgend'
Hello! You are in dracut module!
___________________
< I'm dracut module >
-------------------
\
\
.--.
|o_o |
|:_/ |
// \ \
(| | )
/'\_ _/`\
\___)=(___/
msgend
sleep 10
echo " continuing...."
- Далее выполняем команду
dracut -f -v
- Перезагружаемся и видим пингвина
4(*). Сконфигурировать систему без отдельного раздела с /boot, а только с LVM:
parted, далее select /dev/sdb, mklabel msdos, mkpart 1 -1
pvcreate /dev/sdb1/ --bootloaderareasize 1M
vgcreate newRoot /dev/sdb1
lvcreate -n root -l 100%FREE newOtus
Получаем:/dev/mapper/newRoot-root
[root@lvm ~]# pvs
PV VG Fmt Attr PSize PFree
/dev/sda1 newRoot lvm2 a-- <10.00g 0
[root@lvm ~]# vgs
VG #PV #LV #SN Attr VSize VFree
newRoot 1 1 0 wz--n- <10.00g 0
[root@lvm ~]# lvs
LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert
root newRoot -wi-ao---- <10.00g
mkfs.ext4 /dev/mapper/newRoot-root
mkdir /mnt/root
mount /dev/mapper/newRoot-root /mnt/root
rsync -avx / /mnt/root; rsync -avx /boot /mnt/root
mount --rbind /dev/ /mnt/root/dev; mount --rbind /proc /mnt/root/proc; mount --rbind /sys /mnt/root/sys; mount --rbind /run /mnt/root/run
chroot /mnt/root
yum-config-manager --add-repo=https://yum.rumyantsev.com/centos/7/x86_64/
yum install grub2 -y --nogpgcheck
cat /etc/fstab
, меняем на наш новый lvm/dev/mapper/newRoot-root /
и комментируем /bootnano /etc/default/grub
и меняем вGRUB_CMDLINE_LINUX
значение rd.lvm.lv наrd.lvm.lv=newRoot/root
grub2-mkconfig -o /boot/grub2/grub.cfg
dracut -f -v /boot/initramfs-3.10.0-862.2.3.el7.x86_64.img
grub2-install /dev/sdb
nano /etc/selinux/config
и выключить значениемDisabled
SELINUX- выходим и загружаемся с нового диска
[root@lvm ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 10G 0 disk
└─sda1 8:1 0 10G 0 part
└─newRoot-root 253:0 0 10G 0 lvm /
GRUB:
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-862.2.3.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10
.0-862.2.3.el7.x86_64-advanced-c14b0452-22d6-459f-aff0-c26dfd925547' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod lvm
insmod ext2
set root='lvmid/ubAbwR-P8ye-gBeG-KNMG-sdiA-JxqV-kwgcwk/89GBxh-NSIc-dAFo-LXg4-W1jJ-p0bF-rLdNxY'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint='lvmid/ubAbwR-P8ye-gBeG-KNMG-sdiA-JxqV-kwgcwk/89GBxh-NSIc-dAFo-LXg4-W1jJ-p0bF-rLdNxY' c14b0452-22d6-459f-aff0-c26dfd925547
else
search --no-floppy --fs-uuid --set=root c14b0452-22d6-459f-aff0-c26dfd925547
fi
linux16 /boot/vmlinuz-3.10.0-862.2.3.el7.x86_64 root=/dev/mapper/newRoot-root ro no_timer_check console=tty0 console=ttyS0,115200n8 net.ifnames=0 biosdevname=0 elevator=noop crashkernel=auto rd.lvm.lv=newRoot/root rhgb quiet
initrd16 /boot/initramfs-3.10.0-862.2.3.el7.x86_64.img
}
if [ "x$default" = 'CentOS Linux (3.10.0-862.2.3.el7.x86_64) 7 (Core)' ]; then default='Advanced options for CentOS Linux>CentOS Linux (3.10.0-862.2.3.el7.x86_64) 7 (Core)'; fi;
### END /etc/grub.d/10_linux ###
set root='lvmid/ubAbwR-P8ye-gBeG-KNMG-sdiA-JxqV-kwgcwk/89GBxh-NSIc-dAFo-LXg4-W1jJ-p0bF-rLdNxY'
- UID VG и LV.