diff --git a/.gitignore b/.gitignore index 26dfec660..3a33bd588 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,7 @@ .vagrant *.vdi +sata* +*.old +*.save + + diff --git a/Lesson1/README.md b/Lesson1/README.md new file mode 100644 index 000000000..ae1049664 --- /dev/null +++ b/Lesson1/README.md @@ -0,0 +1,118 @@ +# Домашнее задание: "Обновить ядро в базовой системе" + +## Описание/Пошаговая инструкция выполнения домашнего задания: + +В материалах к занятию есть методичка, в которой описана процедура обновления ядра из репозитория. +По данной методичке требуется выполнить необходимые действия. +Полученный в ходе выполнения ДЗ Vagrantfile должен быть залит в ваш git-репозиторий. +Для проверки ДЗ необходимо прислать ссылку на него. +Для выполнения ДЗ со * и ** вам потребуется сборка ядра и модулей из исходников. +Методичка Настройка ПК для создания стендов и выполнения домашних заданий +https://docs.google.com/document/d/1fZUXL30bDhJEQpDQgtfv3Nj4WYWto98AaYlC1vJ2LkQ/edit?usp=sharing +Методичка Vagrant-стенд для обновления ядра и создания образа системы +https://docs.google.com/document/d/12sC884LuLGST3-tZYQBDPvn6AH8AGJCK/edit?usp=sharing&ouid=107126378526912727172&rtpof=true&sd=true + +## Решение + +### Создание образа системы +``` +packer build centos.json +``` + +Результат успешного создания образа в Packer: +``` +... +==> Wait completed after 28 minutes 23 seconds + +==> Builds finished. The artifacts of successful builds are: +--> centos-7.9: 'virtualbox' provider box: centos-7.9.2009-kernel-6-x86_64-Minimal.box +``` + +### Импортирование полученного vagrant box в Vagrant: +``` +vagrant box add centos7-kernel6 centos-7.9.2009-kernel-6-x86_64-Minimal.box +``` +вывод: +``` +=> box: Box file was not detected as metadata. Adding it directly... +==> box: Adding box 'centos7-kernel6' (v0) for provider: + box: Unpacking necessary files from: file:///home/vl/otus-linux/Lesson1/centos-7.9.2009-kernel-6-x86_64-Minimal.box +==> box: Successfully added box 'centos7-kernel6' (v0) for 'virtualbox'! +``` + +Запуск ВМ: ```vagrant up``` + +Подключимя к ней по SSH: ``` vagrant ssh ``` + +Проверка версии ядра: +``` +[vagrant@otuslinux ~]$ uname -r +6.0.11-1.el7.elrepo.x86_64 +``` + +## ДЗ с **: в вашем образе нормально работают VirtualBox Shared Folders. + +В Vagrantfile добавлено создание дисков, их форматирование, монтирование. +Добавлена синхронизация shared folders с созданными дисками. + +Для нормальной работы shared folders требуется Добавление vbguest: +``` +vagrant plugin install vagrant-vbguest +vagrant ssh -c "cat /var/log/vboxadd-install.log" +vagrant vbguest +``` + +Установка VirtualBox Addition завершилась с ошибкой: +``` +[otuslinux] GuestAdditions seems to be installed (6.1.38) correctly, but not running. +... +Job for vboxadd.service failed because the control process exited with error code. See "systemctl status vboxadd.service" and "journalctl -xe" for details. +... +/opt/VBoxGuestAdditions-6.1.38/bin/VBoxClient: error while loading shared libraries: libX11.so.6: cannot open shared object file: No such file or directory +``` + +Попытка установить недостающие библиотеки ни к чему не привела: +``` +yum update kernel kernel-headers +``` + +Проверка vbguest +``` +vagrant vbguest --status +``` +![vbguest installed but not running](imgs/vbguest-installed-but-not-running.png) + + +### Загрузка образа в Vagrant cloud +Логин в vagrant cloud: ``` vagrant cloud auth login ``` + +Опубликование образа: +``` +vagrant cloud publish --release /centos8-kernel5 1.0 virtualbox centos-8-kernel-5-x86_64-Minimal.box +``` + +Вносим изменения в Vagrant файл, чтобы при запуске использовался образ из Vagrant Cloud +``` +config.vm.box = "vlyulin/centos7-kernel6" +config.vm.box_version = "1.0" +``` + +### Проверка + +Проверяем настройки запуском виртуальной машины: +``` +vagrant up +``` + +Из-за того, что некорректно поставлена VirtualBoxAddition, не монтируются Shared folders +![Unable to mount shared folders](imgs/vagrant-was-unable-to-mount-shared-folders.png) + +Хотя shared folders показывает: +![Shared folders](imgs/vm-mounted-shared-folders.png) + + + + + + + diff --git a/Lesson1/Vagrantfile b/Lesson1/Vagrantfile new file mode 100644 index 000000000..669c8e675 --- /dev/null +++ b/Lesson1/Vagrantfile @@ -0,0 +1,230 @@ +# -*- mode: ruby -*- +# vi: set ft=ruby : + +MACHINES = { + :otuslinux => { + :box_name => "vlyulin/centos7-kernel6", + :box_version => "1.0", + :ip_addr => '192.168.56.2', + :disks => { + :sata1 => { + :dname => 'sata1', + :dfile => './sata1.vdi', + :size => 250, + :port => 1 + }, + :sata2 => { + :dname => 'sata2', + :dfile => './sata2.vdi', + :size => 250, # Megabytes + :port => 2 + }, + :sata3 => { + :dname => 'sata3', + :dfile => './sata3.vdi', + :size => 250, + :port => 3 + }, + :sata4 => { + :dname => 'sata4', + :dfile => './sata4.vdi', + :size => 250, # Megabytes + :port => 4 + } + + } + }, +} + +$sdb = <<-SCRIPT +if df | grep "/dev/sdb1" +then + echo '/dev/sdb1 exist' +else + parted /dev/sdb mklabel msdos + parted /dev/sdb mkpart primary 0% 100% + mkfs.xfs /dev/sdb1 +fi +mkdir -p /mnt/sata1 +if grep -Fxq "sdb1" /etc/fstab +then + echo 'sdb1 exist in fstab' +else + echo `blkid /dev/sdb1 | awk '{print$2}' | sed -e 's/"//g'` /mnt/sata1 xfs defaults,noatime 0 0 >> /etc/fstab +fi +if mount | grep /mnt/sata1 > /dev/null; then + echo "/dev/sdb1 mounted /mnt/sata1" + umount /mnt/sata1 + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata1 +else + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata1 +fi +SCRIPT + +$sdc = <<-SCRIPT +if df | grep "/dev/sdc1" +then + echo '/dev/sdc1 exist' +else + parted /dev/sdc mklabel msdos + parted /dev/sdc mkpart primary 0% 100% + mkfs.xfs /dev/sdc1 +fi +mkdir -p /mnt/sata2 +if grep -Fxq "sdc1" /etc/fstab +then + echo 'sdc1 exist in fstab' +else + echo `blkid /dev/sdc1 | awk '{print$2}' | sed -e 's/"//g'` /mnt/sata2 xfs defaults,noatime 0 0 >> /etc/fstab +fi +if mount | grep /mnt/sata2 > /dev/null; then + echo "/dev/sdc1 mounted /mnt/sata2" + umount /mnt/sata2 + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata2 +else + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata2 +fi +SCRIPT + +$sdd = <<-SCRIPT +if df | grep "/dev/sdd1" +then + echo '/dev/sdd1 exist' +else + parted /dev/sdd mklabel msdos + parted /dev/sdd mkpart primary 0% 100% + mkfs.xfs /dev/sdd1 +fi +mkdir -p /mnt/sata3 +if grep -Fxq "sdd1" /etc/fstab +then + echo 'sdd1 exist in fstab' +else + echo `blkid /dev/sdd1 | awk '{print$2}' | sed -e 's/"//g'` /mnt/sata3 xfs defaults,noatime 0 0 >> /etc/fstab +fi +if mount | grep /mnt/sata3 > /dev/null; then + echo "/dev/sdd1 mounted /mnt/sata3" + umount /mnt/sata3 + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata3 +else + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata3 +fi +SCRIPT + +$sde = <<-SCRIPT +if df | grep "/dev/sde1" +then + echo '/dev/sde1 exist' +else + parted /dev/sde mklabel msdos + parted /dev/sde mkpart primary 0% 100% + mkfs.xfs /dev/sde1 +fi +mkdir -p /mnt/sata4 +if grep -Fxq "sde1" /etc/fstab +then + echo 'sde1 exist in fstab' +else + echo `blkid /dev/sde1 | awk '{print$2}' | sed -e 's/"//g'` /mnt/sata4 xfs defaults,noatime 0 0 >> /etc/fstab +fi +if mount | grep /mnt/sata4 > /dev/null; then + echo "/dev/sde1 mounted /mnt/sata4" + umount /mnt/sata4 + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata4 +else + mount -t vboxsf -o uid=1000,gid=1000 /mnt/sata4 +fi +SCRIPT + + +# All Vagrant configuration is done below. The "2" in Vagrant.configure +# configures the configuration version (we support older styles for +# backwards compatibility). Please don't change it unless you know what +# you're doing. +Vagrant.configure("2") do |config| + + # if Vagrant.has_plugin?("vagrant-vbguest") then + config.vbguest.auto_update = true + # end + + # Every Vagrant development environment requires a box. You can search for + # boxes at https://vagrantcloud.com/search. + config.vm.box = "vlyulin/centos7-kernel6" + config.vm.box_version = "1.0" + + # Disable automatic box update checking. If you disable this, then + # boxes will only be checked for updates when the user runs + # `vagrant box outdated`. This is not recommended. + # config.vm.box_check_update = false + + # Share an additional folder to the guest VM. The first argument is + # the path on the host to the actual folder. The second argument is + # the path on the guest to mount the folder. And the optional third + # argument is a set of non-required options. + # config.vm.synced_folder "../data", "/vagrant_data" + + MACHINES.each do |boxname, boxconfig| + + config.vm.define boxname do |box| + + box.vm.box = boxconfig[:box_name] + box.vm.box_version = boxconfig[:box_version] + box.vbguest.installer_options = { allow_kernel_upgrade: true } + box.vm.host_name = boxname.to_s + + box.vm.network "private_network", ip: boxconfig[:ip_addr] + + config.vm.provision "shell", inline: <<-SHELL + sudo kdir -p /mnt/cdrom + sudo mount /dev/cdrom /mnt/cdrom + sudo apt-get install make gcc linux-headers-$(uname -r) + sudo /media/cdrom/VBoxLinuxAdditions.run + SHELL + + box.vm.provider :virtualbox do |vb| + vb.customize ["modifyvm", :id, "--memory", "1024"] + needsController = false + # create disks + boxconfig[:disks].each do |dname, dconf| + unless File.exist?(dconf[:dfile]) + vb.customize ['createhd', '--filename', dconf[:dfile], '--variant', 'Fixed', '--size', dconf[:size]] + needsController = true + end + + end + if needsController == true + vb.customize ["storagectl", :id, "--name", "SATA", "--add", "sata" ] + # attach disks + boxconfig[:disks].each do |dname, dconf| + vb.customize ['storageattach', :id, '--storagectl', 'SATA', '--port', dconf[:port], '--device', 0, '--type', 'hdd', '--medium', dconf[:dfile]] + end + end + end + + # format and mount disks + box.vm.provision "shell", inline: $sdb + box.vm.provision "shell", inline: $sdc + box.vm.provision "shell", inline: $sdd + box.vm.provision "shell", inline: $sde + + # fight with Permission denide for mounts + box.vm.provision "shell", inline: <<-SHELL + sudo usermod -aG vboxsf vagrant + sudo chown -R vagrant:vagrant /mnt/sata1/ + sudo chown -R vagrant:vagrant /mnt/sata2/ + sudo chown -R vagrant:vagrant /mnt/sata3/ + sudo chown -R vagrant:vagrant /mnt/sata4/ + SHELL + + # add shared folders + box.vm.provider :virtualbox do |vb| + boxconfig[:disks].each do |dname, dconf| + # if File.exist?(dconf[:dfile]) + config.vm.synced_folder dconf[:dname], "/mnt/#{dconf[:dname]}", create: true + # end + end + end + end + end +end + diff --git a/Lesson1/centos.json b/Lesson1/centos.json new file mode 100644 index 000000000..55c7f4469 --- /dev/null +++ b/Lesson1/centos.json @@ -0,0 +1,80 @@ +{ + "variables": { + "artifact_description": "CentOS 7.9 with kernel 6.x", + "artifact_version": "7.9.2009", + "image_name": "centos-7.9" + }, + + "builders": [ + { + "name": "{{user `image_name`}}", + "type": "virtualbox-iso", + "vm_name": "packer-centos-vm", + + "boot_wait": "10s", + "disk_size": "10240", + "guest_os_type": "RedHat_64", + "http_directory": "http", + + "iso_url": "http://mirror.corbina.net/pub/Linux/centos/7.9.2009/isos/x86_64/CentOS-7-x86_64-Minimal-2009.iso", + "iso_checksum": "07b94e6b1a0b0260b94c83d6bb76b26bf7a310dc78d7a9c7432809fb9bc6194a", + + + "boot_command": [ + " text ks=http://{{ .HTTPIP }}:{{ .HTTPPort }}/ks.cfg" + ], + + "shutdown_command": "sudo -S /sbin/halt -h -p", + "shutdown_timeout" : "5m", + + "ssh_wait_timeout": "40m", + "ssh_username": "vagrant", + "ssh_password": "vagrant", + "ssh_port": 22, + "ssh_pty": true, + + "output_directory": "builds", + + "vboxmanage": [ + [ "modifyvm", "{{.Name}}", "--memory", "1024" ], + [ "modifyvm", "{{.Name}}", "--cpus", "2" ] + ], + + "export_opts": + [ + "--manifest", + "--vsys", "0", + "--description", "{{user `artifact_description`}}", + "--version", "{{user `artifact_version`}}" + ] + + } + ], + + "post-processors": [ + { + "output": "centos-{{user `artifact_version`}}-kernel-6-x86_64-Minimal.box", + "compression_level": "7", + "type": "vagrant" + } + ], + "provisioners": [ + { + "type": "shell", + "execute_command": "{{.Vars}} sudo -S -E bash '{{.Path}}'", + "start_retry_timeout": "1m", + "expect_disconnect": true, + "pause_before": "20s", + "override": { + "{{user `image_name`}}" : { + "scripts" : + [ + "scripts/stage-1-kernel-update.sh", + "scripts/stage-2-clean.sh" + ] + } + } + } + ] + } + diff --git a/Lesson1/http/ks.cfg b/Lesson1/http/ks.cfg new file mode 100644 index 000000000..343c712fc --- /dev/null +++ b/Lesson1/http/ks.cfg @@ -0,0 +1,80 @@ +# Подтверждаем лицензионное соглашение +eula --agreed + +install +cdrom + +# Указываем язык нашей ОС +lang en_US.UTF-8 +# Раскладка клавиутуры +keyboard us +# Указываем часовой пояс +timezone UTC+3 + +# Включаем сетевой интерфейс и получаем ip-адрес по DHCP +network --bootproto=dhcp --device=link --activate +# Задаём hostname otus-c7 +network --hostname=otus-c7 + +# Указываем пароль root пользователя +rootpw vagrant +authconfig --enableshadow --passalgo=sha512 +# Создаём пользователя vagrant, добавляем его в группу Wheel +user --groups=wheel --name=vagrant --password=vagrant --gecos="vagrant" + +# Включаем SELinux в режиме enforcing +selinux --enforcing +# Выключаем штатный межсетевой экран +firewall --disabled + +firstboot --disable + +# Выбираем установку в режиме командной строки +text +# Указываем адрес, с которого установщик возьмёт недостающие компоненты +url --url="http://mirror.centos.org/centos/7.9.2009/os/x86_64/" + +# System bootloader configuration +bootloader --location=mbr --append="ipv6.disable=1 crashkernel=auto" + +skipx +logging --level=info +zerombr +clearpart --all --initlabel +# Автоматически размечаем диск, создаём LVM +autopart --type=lvm +# Перезагрузка после установки +reboot + +%packages --nobase +@Core +openssh-clients +openssh-server +%end + +%post --log=/root/post_install.log + +# Add vagrant to sudoers +cat > /etc/sudoers.d/vagrant << EOF_sudoers_vagrant +vagrant ALL=(ALL) NOPASSWD: ALL +EOF_sudoers_vagrant + +/bin/chmod 0440 /etc/sudoers.d/vagrant +/bin/sed -i "s/^.*requiretty/#Defaults requiretty/" /etc/sudoers + +# Fix sshd config for CentOS 7 1611 (reboot issue) +cat << EOF_sshd_config >> /etc/ssh/sshd_config + +TCPKeepAlive yes +ClientAliveInterval 0 +ClientAliveCountMax 3 + +UseDNS no +UsePAM no +GSSAPIAuthentication no +ChallengeResponseAuthentication no + +EOF_sshd_config + +%end + diff --git a/Lesson1/imgs/vagrant-was-unable-to-mount-shared-folders.png b/Lesson1/imgs/vagrant-was-unable-to-mount-shared-folders.png new file mode 100644 index 000000000..cdb7a6ebb Binary files /dev/null and b/Lesson1/imgs/vagrant-was-unable-to-mount-shared-folders.png differ diff --git a/Lesson1/imgs/vbguest-installed-but-not-running.png b/Lesson1/imgs/vbguest-installed-but-not-running.png new file mode 100644 index 000000000..2fcd06f8d Binary files /dev/null and b/Lesson1/imgs/vbguest-installed-but-not-running.png differ diff --git a/Lesson1/imgs/vm-mounted-shared-folders.png b/Lesson1/imgs/vm-mounted-shared-folders.png new file mode 100644 index 000000000..6e881469c Binary files /dev/null and b/Lesson1/imgs/vm-mounted-shared-folders.png differ diff --git a/Lesson1/scripts/stage-1-kernel-update.sh b/Lesson1/scripts/stage-1-kernel-update.sh new file mode 100644 index 000000000..b29a678b3 --- /dev/null +++ b/Lesson1/scripts/stage-1-kernel-update.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Установка репозитория elrepo +sudo yum install -y http://www.elrepo.org/elrepo-release-7.0-3.el7.elrepo.noarch.rpm + +# Установка нового ядра из репозитория elrepo-kernel +sudo yum --enablerepo elrepo-kernel install kernel-ml -y + +# Обновление параметров GRUB +sudo grub2-mkconfig -o /boot/grub2/grub.cfg +sudo grub2-set-default 0 +echo "Grub update done." + +# Перезагрузка ВМ +sudo shutdown -r now diff --git a/Lesson1/scripts/stage-2-clean.sh b/Lesson1/scripts/stage-2-clean.sh new file mode 100644 index 000000000..1f56996e3 --- /dev/null +++ b/Lesson1/scripts/stage-2-clean.sh @@ -0,0 +1,27 @@ +#!/bin/bash + +# Обновление и очистка всех ненужных пакетов +yum update -y +yum clean all + + +# Добавление ssh-ключа для пользователя vagrant +mkdir -pm 700 /home/vagrant/.ssh +curl -sL https://raw.githubusercontent.com/mitchellh/vagrant/master/keys/vagrant.pub -o /home/vagrant/.ssh/authorized_keys +chmod 0600 /home/vagrant/.ssh/authorized_keys +chown -R vagrant:vagrant /home/vagrant/.ssh + + +# Удаление временных файлов +rm -rf /tmp/* +rm -f /var/log/wtmp /var/log/btmp +rm -rf /var/cache/* /usr/share/doc/* +rm -rf /var/cache/yum +rm -rf /vagrant/home/*.iso +rm -f ~/.bash_history +history -c + +rm -rf /run/log/journal/* +sync +sudo grub2-set-default 1 +echo "### Hi from second stage" >> /boot/grub2/grub.cfg diff --git a/Lesson2/README.md b/Lesson2/README.md new file mode 100644 index 000000000..813b3a2c3 --- /dev/null +++ b/Lesson2/README.md @@ -0,0 +1,178 @@ +# Домашнее задание: ""Работа с mdadm + +## Описание/Пошаговая инструкция выполнения домашнего задания: + +- добавить в Vagrantfile еще дисков; +- сломать/починить raid; +- собрать R0/R5/R10 на выбор; +- прописать собранный рейд в конф, чтобы рейд собирался при загрузке; +- создать GPT раздел и 5 партиций. + +В качестве проверки принимаются - измененный Vagrantfile, скрипт для создания рейда, конф для автосборки рейда при загрузке. + +* доп. задание - Vagrantfile, который сразу собирает систему с подключенным рейдом и смонтированными разделами. После перезагрузки стенда разделы должны автоматически примонтироваться. + +** перенести работающую систему с одним диском на RAID 1. Даунтайм на загрузку с нового диска предполагается. В качестве проверки принимается вывод команды lsblk до и после и описание хода решения (можно воспользоваться утилитой Script). + +Методичка Работа с mdam https://drive.google.com/file/d/1phsvBYkiRPVrDG0EXagy-TF4P5y9XOAX/view?usp=share_link + +## Запуск + +``` +vagrant up +``` + +## Решение + +### Задача: "добавить в Vagrantfile еще дисков" + +В файл Vagrantfile добавлен текст: +``` +MACHINES = { + :otuslinux => { + :box_name => "centos/7", + :ip_addr => '192.168.56.101', + :disks => { +... + :sata5 => { + :dfile => './sata5.vdi', + :size => 50, # Megabytes + :port => 5 + }, + :sata6 => { + :dfile => './sata6.vdi', + :size => 50, # Megabytes + :port => 6 + } +... +``` + +### Задача: "сломать/починить raid" + +Искуственное выведение устройства из работы: +``` +sudo mdadm /edv/md0 --fail /dev/sde +``` +![fail-disk](imgs/fail-disk.png) + +Измененная информация о RAID: +``` +cat /proc/mdstat +``` +![mdstat-for-broken-disk]mdstat-for-broken-disk.png + +``` +sudo mdadm -D /dev/md0 +``` +![d-for_broken-disk](imgs/d-for_broken-disk.png) + +Удаление сломанного диска из массива: +``` +sudo mdadm /dev/md0 --remove /dev/sde +``` +![remove-disk](imgs/remove-disk.png) + +Добавление в RAID нового добавленного диска после замены: +``` +sudo mdadm /dev/md0 --add /dev/sde +``` +![add-disk](imgs/add-disk.png) + + +### Задача: "собрать R0/R5/R10 на выбор" + +Создание RAID 10 выполняется с помощью следующих команд в файле script.sh +``` +... + # Обнуление суперблоков: + echo "sudo mdadm --zero-superblock --force " $DISKS + sudo mdadm --zero-superblock --force $DISKS + # Создание RAID 10 на $DISKS_NUMBER устройствах: + sudo mdadm --create --verbose /dev/md0 -l 10 -n $DISKS_NUMBER -q -f $DISKS <<< y + if [ $? -gt 0 ]; then + # Если RAID создан + # Создание конфигурационного файла mdadm.conf, если он не существует. + FILE=/etc/mdadm/mdadm.conf + if [ ! -f "$FILE" ]; then + sudo mkdir -p /etc/mdadm + sudo touch /etc/mdadm/mdadm.conf + sudo chmod 666 /etc/mdadm/mdadm.conf + sudo echo "DEVICE partitions" > /etc/mdadm/mdadm.conf + sudo mdadm --detail --scan --verbose | awk '/ARRAY/{print}' >> /etc/mdadm/mdadm.conf + fi +... +``` + +Скрипт script.sh вызывается как provision из Vagrantfile: +``` +box.vm.provision "disks", type: "shell", path: "script.sh" +``` + +Данный provision можно вызвать повторно с помощью команды: +``` +vagrant provision --provision-with "disks" +``` + +### Задача: "прописать собранный рейд в конф, чтобы рейд собирался при загрузке;" + +Конфигурационный файл для RAID формируется в скрипте script.sh в строках: +``` + # Создание конфигурационного файла mdadm.conf, если он не существует. + FILE=/etc/mdadm/mdadm.conf + if [ ! -f "$FILE" ]; then + sudo mkdir -p /etc/mdadm + sudo touch /etc/mdadm/mdadm.conf + sudo chmod 666 /etc/mdadm/mdadm.conf + sudo echo "DEVICE partitions" > /etc/mdadm/mdadm.conf + sudo mdadm --detail --scan --verbose | awk '/ARRAY/{print}' >> /etc/mdadm/mdadm.conf + fi + +``` + +![mdadm-after-reboot](imgs/mdadm-after-reboot.png) + +### Задача: "создать GPT раздел и 5 партиций." + +Создание GPT раздела выполняется следующими командами в скрипте script.sh: +``` + # Создание раздела GPT на RAID + sudo parted -s /dev/md0 mklabel gpt + # Создание партиций + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 0% 20% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 20% 40% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 40% 60% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 60% 80% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 80% 100% + # Создание файловых систем + for i in $(seq 1 5); do sudo mkfs.ext4 /dev/md0p$i; done + # Монтирование партиций по каталогам + sudo mkdir -p /raid/part{1,2,3,4,5} + for i in $(seq 1 5); do + sudo mount /dev/md0p$i /raid/part$i; + # Формирование записей в fstab + echo "check md0p$i in fstab" + if sudo grep -Fxq "md0p$i" /etc/fstab + then + echo "md0p$i exists in fstab" + else + echo `blkid /dev/md0p$i | awk '{print$2}' | sed -e 's/"//g'` /raid/part$i xfs defaults,noatime 0 0 | tee -a /etc/fstab > /dev/null + fi + done + +``` + +### доп. задание - Vagrantfile, который сразу собирает систему с подключенным рейдом и смонтированными разделами. После перезагрузки стенда разделы должны автоматически примонтироваться. + +Сбор системы с созданием RAID, его подключением и смонтированными разделами выполняется через скрипт script.sh, который вызывается из файла Vagrantfile: +``` +box.vm.provision "disks", type: "shell", path: "script.sh" +``` + +![vagrant-up](imgs/vagrant-up.png) + + + + + + + diff --git a/Vagrantfile b/Lesson2/Vagrantfile similarity index 75% rename from Vagrantfile rename to Lesson2/Vagrantfile index ac687f524..878535949 100644 --- a/Vagrantfile +++ b/Lesson2/Vagrantfile @@ -4,32 +4,39 @@ MACHINES = { :otuslinux => { :box_name => "centos/7", - :ip_addr => '192.168.11.101', + :ip_addr => '192.168.56.101', :disks => { :sata1 => { :dfile => './sata1.vdi', - :size => 250, + :size => 100, # Megabites :port => 1 }, :sata2 => { :dfile => './sata2.vdi', - :size => 250, # Megabytes + :size => 100, # Megabytes :port => 2 }, :sata3 => { :dfile => './sata3.vdi', - :size => 250, + :size => 100, :port => 3 }, :sata4 => { :dfile => './sata4.vdi', - :size => 250, # Megabytes + :size => 100, # Megabytes :port => 4 - } - + }, + :sata5 => { + :dfile => './sata5.vdi', + :size => 100, # Megabytes + :port => 5 + }, + :sata6 => { + :dfile => './sata6.vdi', + :size => 100, # Megabytes + :port => 6 + } } - - }, } @@ -39,6 +46,7 @@ Vagrant.configure("2") do |config| config.vm.define boxname do |box| + config.vbguest.installer_options = { allow_kernel_upgrade: true } box.vm.box = boxconfig[:box_name] box.vm.host_name = boxname.to_s @@ -68,7 +76,7 @@ Vagrant.configure("2") do |config| cp ~vagrant/.ssh/auth* ~root/.ssh yum install -y mdadm smartmontools hdparm gdisk SHELL - + box.vm.provision "disks", type: "shell", path: "script.sh" end end end diff --git a/Lesson2/imgs/add-disk.png b/Lesson2/imgs/add-disk.png new file mode 100644 index 000000000..5fe4aa3ec Binary files /dev/null and b/Lesson2/imgs/add-disk.png differ diff --git a/Lesson2/imgs/d-for_broken-disk.png b/Lesson2/imgs/d-for_broken-disk.png new file mode 100644 index 000000000..8101c029c Binary files /dev/null and b/Lesson2/imgs/d-for_broken-disk.png differ diff --git a/Lesson2/imgs/fail-disk.png b/Lesson2/imgs/fail-disk.png new file mode 100644 index 000000000..238b367b9 Binary files /dev/null and b/Lesson2/imgs/fail-disk.png differ diff --git a/Lesson2/imgs/mdadm-after-reboot.png b/Lesson2/imgs/mdadm-after-reboot.png new file mode 100644 index 000000000..66f9aa3ac Binary files /dev/null and b/Lesson2/imgs/mdadm-after-reboot.png differ diff --git a/Lesson2/imgs/mdstat-for-broken-disk.png b/Lesson2/imgs/mdstat-for-broken-disk.png new file mode 100644 index 000000000..e6a68c620 Binary files /dev/null and b/Lesson2/imgs/mdstat-for-broken-disk.png differ diff --git a/Lesson2/imgs/mounted-dirs-after-reboot.png b/Lesson2/imgs/mounted-dirs-after-reboot.png new file mode 100644 index 000000000..37d5742ad Binary files /dev/null and b/Lesson2/imgs/mounted-dirs-after-reboot.png differ diff --git a/Lesson2/imgs/remove-disk.png b/Lesson2/imgs/remove-disk.png new file mode 100644 index 000000000..82699a776 Binary files /dev/null and b/Lesson2/imgs/remove-disk.png differ diff --git a/Lesson2/imgs/vagrant-up.png b/Lesson2/imgs/vagrant-up.png new file mode 100644 index 000000000..271ad0085 Binary files /dev/null and b/Lesson2/imgs/vagrant-up.png differ diff --git a/Lesson2/script.sh b/Lesson2/script.sh new file mode 100755 index 000000000..c53b887d0 --- /dev/null +++ b/Lesson2/script.sh @@ -0,0 +1,70 @@ +#!/bin/bash + +# Количество дисков в RAID +DISKS_NUMBER=6 +# Размер каждого диска созданного для RAID +DISK_SIZE="100M" + +# Отбираем только созданные диски размером DISK_SIZE +DISKS=$(lsblk | awk '{if ($4 == $DISK_SIZE) print "/dev/"$1;}' ORS=" ") +echo $DISKS + +# Подсчитываем количество дисков +FOUND_DISKS_NUMBER=$(echo $DISKS | tr -dc ' ' | awk '{ print length+1; }') +echo "Number of disks: '$FOUND_DISKS_NUMBER'" + +# Проверка, что все диски на месте. Только тогда создаем RAID +if [ $FOUND_DISKS_NUMBER=$DISKS_NUMBER ]; then + echo "Проверка, что RAID еще не создан" + sudo mdadm -D /dev/md0 > /dev/null 2>&1 + if [ $? -gt 0 ]; then + # создание RAID + echo 'RAID creation ...' + # Обнуление суперблоков: + echo "sudo mdadm --zero-superblock --force " $DISKS + sudo mdadm --zero-superblock --force $DISKS + # Создание RAID 10 на $DISKS_NUMBER устройствах: + sudo mdadm --create --verbose /dev/md0 -l 10 -n $DISKS_NUMBER -q -f $DISKS <<< y + if [ $? -gt 0 ]; then + # Если RAID создан + # Создание конфигурационного файла mdadm.conf, если он не существует. + FILE=/etc/mdadm/mdadm.conf + if [ ! -f "$FILE" ]; then + sudo mkdir -p /etc/mdadm + sudo touch /etc/mdadm/mdadm.conf + sudo chmod 666 /etc/mdadm/mdadm.conf + sudo echo "DEVICE partitions" > /etc/mdadm/mdadm.conf + sudo mdadm --detail --scan --verbose | awk '/ARRAY/{print}' >> /etc/mdadm/mdadm.conf + fi + # Создание раздела GPT на RAID + sudo parted -s /dev/md0 mklabel gpt + # Создание партиций + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 0% 20% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 20% 40% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 40% 60% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 60% 80% + sudo parted -s -a optimal /dev/md0 mkpart primary ext4 80% 100% + # Создание файловых систем + for i in $(seq 1 5); do sudo mkfs.ext4 /dev/md0p$i; done + # Монтирование партиций по каталогам + sudo mkdir -p /raid/part{1,2,3,4,5} + for i in $(seq 1 5); do + sudo mount /dev/md0p$i /raid/part$i; + # Формирование записей в fstab + echo "check md0p$i in fstab" + if sudo grep -Fxq "md0p$i" /etc/fstab + then + echo "md0p$i exists in fstab" + else + echo `blkid /dev/md0p$i | awk '{print$2}' | sed -e 's/"//g'` /raid/part$i xfs defaults,noatime 0 0 | tee -a /etc/fstab > /dev/null + fi + done + fi + parted -s / + fi +else + echo 'RAID cannot be created.' +fi + +echo 'Done.' + diff --git a/README.md b/README.md index 6faee81be..58f37723c 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ -# Инструкции +# Курс "Administrator Linux. Profeccional", OTUS +Студент: Люлин Вадим -* [Как начать Git](git_quick_start.md) -* [Как начать Vagrant](vagrant_quick_start.md) +## Содержание + +* [ДЗ: Обновить ядро в базовой системе](Lesson1/README.md) +* [ДЗ: Работа с mdadm](Lesson2/README.md) -## otus-linux -Используйте этот [Vagrantfile](Vagrantfile) - для тестового стенда. diff --git a/git_quick_start.md b/git_quick_start.md deleted file mode 100644 index b91c0d30a..000000000 --- a/git_quick_start.md +++ /dev/null @@ -1,13 +0,0 @@ -# Git Quick Start - -1. Регистрируетесь на github.com -2. Нажимате `Fork` этого репозитория (кнопка сверху справа) - в вашем репозитории появится копия проекта -3. На рабочей машине делаете `git clone <ссылка на ваш репозиторий>` - кнопка "clone or download" -4. Вносите правки, работаете над проектом, делаете `git commit -m -a` -5. По окончании работы делаете `git push` -6. В "Чате с преподавателем" отсылаете ссылку на ваш репозиторий - -Полезные ссылки по git: - - - diff --git a/vagrant_quick_start.md b/vagrant_quick_start.md deleted file mode 100644 index 091e34805..000000000 --- a/vagrant_quick_start.md +++ /dev/null @@ -1,53 +0,0 @@ -# Vagrant quick start - -1. Устанавливаете Vagrant: -2. Устанавливаете VirtualBox: -3. Клонируете репозиторий со стендом и запускаете виртуальную машину: - ```bash - git clone git@github.com:erlong15/otus-linux.git - cd otus-linux - vagrant up - vagrant ssh otuslinux - ``` - -Полезные ссылки: - - - -## Tips and FAQs - -1. Почему у меня внезапно выросло занимаемое место в виртуальной машине развернутой с помощью Vagrant? - - Скорее всего вы добавили дополнительное блочное устройство и оно лежит в одной директории - с Vagrantfile. Vagrant в свою очередь при `Vagrant up` делает rsync всего, что есть рядом с - Vagrantfile в директорию виртуальной машины `/vagrant/` - -2. Как добавить дополнительные диски с помощью Vagrantfile - - ```ruby - home = ENV['HOME'] # Используем глобальную переменную $HOME - - MACHINES = { - :otuslinux => { - :box_name => "centos/7", - :ip_addr => '192.168.11.101', - :disks => { - :sata1 => { - :dfile => home + '/VirtualBox VMs/sata1.vdi', # Указываем где будут лежать файлы наших дисков - :size => 8192, - :port => 1 - }, - :sata2 => { - :dfile => home + '/VirtualBox VMs/sata2.vdi', - :size => 1024, # Megabytes - :port => 2 - }, - :sata3 => { - :dfile => home + '/VirtualBox VMs/sata3.vdi', - :size => 1024, - :port => 3 - } - } - }, - } - ```