-
-
Save SkymeFactor/728b5a2478f39f2b432385b3cccdfbde to your computer and use it in GitHub Desktop.
#!/bin/bash | |
# Version with screenshots and results is available by link: | |
# https://docs.google.com/document/d/1kExXVpq4d7KO6Nc78bMv8ANoM96yvspQufao17pgTWE/edit?usp=sharing | |
get_device_id() { | |
udevadm trigger --subsystem-match=block; udevadm settle | |
udevadm info --query all $1 | grep by-id | head -1 | awk '{print $2}' | |
} | |
# 1.--------------------------------------------------------------------------- | |
# Create an empty partition of size 300 Mb | |
fdisk /dev/sda << EOF | |
n # n - for creating a new partition | |
p | |
3 | |
+300M | |
y | |
w | |
EOF | |
# Options in order of input: | |
# | |
# p - for primary partition | |
# 3 - for assigning the 3rd number like sda3 (1st is boot, 2nd is root) | |
# explicitly nothing - just enter to proceed the first empty block | |
# +300M - assign the size value of 300 Mb | |
# w - write changes on disk | |
# 2.--------------------------------------------------------------------------- | |
# Create a new file with UUID of created partition | |
blkid --match-tag UUID /dev/sda3 | awk --field-separator '"' '{print $2}' > /root/UUID | |
# Make an alias to the disk. Contains "disk/by-uuid/UUID" string | |
device=$(get_device_id "/dev/sda3") | |
# 3.--------------------------------------------------------------------------- | |
# Create ext4 file-system with 4096 block-size | |
mkfs --type ext4 -b 4096 /dev/${device} << EOF | |
y | |
EOF | |
# 4.--------------------------------------------------------------------------- | |
# Show info stored within the superblock of created partition | |
dumpe2fs -h /dev/${device} | |
# 5.--------------------------------------------------------------------------- | |
# Set up the fs check each second mount | |
tune2fs -c 2 /dev/${device} | |
# Set up the fs check every two month | |
tune2fs -i 2m /dev/${device} | |
# 6.--------------------------------------------------------------------------- | |
# Create /mnt/newdisk/ and mount /dev/sda3 in there | |
mkdir /mnt/newdisk | |
mount --types ext4 /dev/${device} /mnt/newdisk/ | |
# 7.--------------------------------------------------------------------------- | |
# Create a link to mounted folder within /root/ | |
ln --symbolic --directory /mnt/newdisk/ /root/link_to_sda3 | |
# 8.--------------------------------------------------------------------------- | |
# Create a random folder within the mounted fs | |
mkdir /root/link_to_sda3/random_name | |
# Don’t forget to put some random executable file into that folder | |
touch /mnt/newdisk/random_executible.sh | |
chmod a+x /mnt/newdisk/random_executible.sh | |
# 9.--------------------------------------------------------------------------- | |
# Automatic mounting with no rights to execute and the last access | |
# writing disabled | |
# Put the following line at the end of /etc/fstab: | |
# /dev/sda3 /mnt/newdisk ext4 defaults,noatime,noexec 0 0 | |
echo "/dev/${device} /mnt/newdisk ext4 defaults,noatime,noexec 0 0" >> /etc/fstab | |
# 10.-------------------------------------------------------------------------- | |
# Remove the current partition that we’ve created earlier | |
fdisk /dev/sda << EOF | |
d | |
3 | |
n | |
p | |
3 | |
+350M | |
y | |
w | |
EOF | |
unset device | |
# Make an alias to the disk. Contains "disk/by-uuid/UUID" string | |
device=$(get_device_id "/dev/sda3") | |
# Options in order of input: | |
# d - to delete partition, 3 to specify number 3 | |
# n - to create a new partition, | |
# p - make it primary, | |
# Enter - default size, | |
# +350M - make a larger size | |
# w - to write changes, n to not restructure the existing data | |
# Extend our partition to max size | |
resize2fs /dev/${device} | |
# 11.-------------------------------------------------------------------------- | |
# Chek fs for errors, do not make any changes | |
e2fsck -n /dev/${device} | |
# 12.-------------------------------------------------------------------------- | |
# Create a new partition of size 12Mb, process is identical to paragraph 1 | |
fdisk /dev/sda << EOF | |
n | |
p | |
+12M | |
y | |
w | |
EOF | |
# Make an alias to the disk. Contains "disk/by-uuid/UUID" string | |
partprobe | |
device_slave=$(get_device_id "/dev/sda4") | |
# Creating journal fs on sda4 | |
mke2fs -O journal_dev -b 4096 /dev/${device_slave} << EOF | |
y | |
EOF | |
# Umount sda3 (mandatory) | |
umount /dev/${device} | |
# Disable journal of sda3 | |
tune2fs -O ^has_journal /dev/${device} << EOF | |
y | |
EOF | |
# Enable journaling of sda3 on sda4 | |
tune2fs -o journal_data -j -J device=/dev/${device_slave} /dev/${device} << EOF | |
y | |
EOF | |
# 13.-------------------------------------------------------------------------- | |
# Create two 100Mb partitions. (As far, as there must be at most 4 primary | |
# partitions, we will also delete the previous two). | |
fdisk --wipe always /dev/sda << EOF | |
d | |
3 | |
d | |
4 | |
w | |
EOF | |
fdisk --wipe-partitions always /dev/sda << EOF | |
n | |
p | |
3 | |
+100M | |
y | |
n | |
p | |
+100M | |
y | |
w | |
EOF | |
unset device | |
unset device_slave | |
mkfs.ext4 /dev/sda4 | |
device1=$(get_device_id "/dev/sda3") | |
device2=$(get_device_id "/dev/sda4") | |
# Actions are identical to steps 1 and 10 with the size correction | |
# 14.-------------------------------------------------------------------------- | |
# Make previous volumes logical and create a logical group over them | |
# Create physical volumes | |
pvcreate /dev/${device1} /dev/${device2} | |
# Creating a group of them | |
vgcreate vol_supernewdisk /dev/${device1} /dev/${device2} | |
# Now a logical volume creation | |
lvcreate -L 182M -n logical_vol vol_supernewdisk | |
# Make a new mount directory | |
mkdir /mnt/supernewdisk | |
# Make fs on this device | |
mke2fs -t ext4 /dev/vol_supernewdisk/logical_vol | |
# Mount it | |
mount /dev/vol_supernewdisk/logical_vol /mnt/supernewdisk | |
unset device1 | |
unset device2 | |
# 15.-------------------------------------------------------------------------- | |
# Create a new folder in /mnt | |
mkdir /mnt/share | |
# Connect an external folder (my parameters must probably be changed) | |
mount.cifs //192.168.0.10/public /mnt/share -o username=kalipi,password=**** | |
# 16.-------------------------------------------------------------------------- | |
# Create the config file /etc/.smbclient containing following lines: | |
# username=kalipi | |
# password=**** | |
# domain=kalipi.local | |
cat > /etc/.smbclient << EOF | |
username=kalipi | |
password=**** | |
domain=kalipi.local | |
EOF | |
# Put the next line into /etc/fstab | |
# //192.168.0.10/public /mnt/share cifs user,rw,credentials=/etc/.smbclient 0 0 | |
echo "//192.168.0.10/public /mnt/share cifs user,rw,credentials=/etc/.smbclient 0 0" >> /etc/fstab |
@AlexTalker , я автоматизировал. Не то что бы это упростило проверку, ревьюить всё равно вручную нужно, много нюансов
Ну я так понимаю Вашим главным нюансом являются пробелы в начале строк.
И где вы их только берёте.
@AlexTalker После python ещё не отошёл) На самом деле, с пробелами нормально собирается, я про исполнение имел ввиду. В целом, я в комментариях все действия описал и ссылку на док со скринами выполнения и результатами в начале прикрепил
Пробелы внутри HEREDOC явно лишняя затея, да и в целом так делать не комильфо.
Изучите содержимое /dev/disk (и команду udevadm info
) и утилизируйте его там где передаёте пути к блочным устройствам.Разберитесь почему так - лучше.
@AlexTalker, я изменил код, даже пробелы подтянул, хотя мне это и не нравится эстетически. Почему лучше использовать /dev/disk - это, очевидно, потому что /dev/sd~ могут менять буквы после перезагрузки, НО я считаю, что udevadm info здесь использовать вообще не к месту, поскольку:
а. мы исполняемся в скрипте, а значит даже при наличие нескольких sata контроллеров буква диска не изменится ни при каких условиях (имеет смысл только для mount в fstab прописывать, но, опять же, есть нюанс)
б. даже если прописывать только в fstab, то удобнее через blkid -s UUID /dev/sda~ получить uuid и прописать как UUID=some_uuid (и это best practice)
в. чтобы из udevadm info что-либо извлечь нужно выполнить больше команд, чем реально требуется для решения задачи
Что-то Вы перемудрили, ведь достаточно очевидно что должно быть что-то в духе:
rootbdev=$(udevadm info /dev/sdb --query=symlink --root | tr " " "\n" | grep "^/dev/disk/by-id")
part1="${rootbdev}-part1"
Касательно использования данных путей заместо /dev/sd*
- помимо упомянутой проблемы с ребутом(что - частный случай) они также более информативны, что полезно при возникновении ошибок,
так как порой Вам может прийтись исследовать логи скрипта задолго после его выполнения, тогда когда диск могли уже например убрать из системы.
@AlexTalker, это примерно то же самое в плане кода, только в моём случае он каждый раз запрашивается заново. Согласен, что id уникален в отличие от uuid, но я просто перестраховался, и получал его для каждого тома отделбно после создания. Кроме прочего это позволяет диагностировать, создался ли линк на partition в /dev/* (были случаи, что у меня только что созданный партишен не отображался в /dev/disk, хотя fdisk его видел). Про логи - да, согласен, не подумал, звучит логично :)
Ну вот отдельно каждый раз запрашивать это конечно чересчур(конкатенация сойдёт, да и в целом раз вы делаете одно и то же много раз, то отчего не написать функцию).
Но если Вы говорите что пути не появлялись, можете для продвинутого решения почитать man udevadm
найдя там команду которая Вам вероятно пригодится.
@AlexTalker, функцию написал, я вместо udevadm использовал partprobe, мне кажется, так лучше
echo
лишний если результат команд должен являться результатом функции.
partprobe
возможно окончательно не решает проблему, так как Вы по-прежнему можете попасть на момент между созданием блочного устройства партиции и созданием символических ссылок.
Ознакомтесь с https://www.mankier.com/8/udevadm#Options-udevadm_settle_%5Boptions%5D
@AlexTalker, ок, переписал
@AlexTalker, что теперь делать?
Раз уж Вы использовали partprobe
, не было необходимости в udevadm trigger
, но в udevadm settle
как оптимистичным ожиданием(в том плане что событие по завершению partprobe
уже должно было прийти в udev
, но не факт что все правила отработали).
В вызовах fstab
например применение оных путей по-прежнему упущено.
Также Вы по-прежнему игнорируете --root
😄
К защите изучите что будет если записать некоторые данные на блочное устройство с одной системы(VM), а затем в то же время прочитать их с другой и почему(диск должен быть подключен к двум VM единовременно в таком случае).
@AlexTalker, я partprobe в итоге отключил же) а udevadm settle там используется, просто в той же строке написан через точку с запятой. А во сколько защита будет?
Так то что прописан я вижу,
суть в том что НЕ НАДО триггерить событие которое и так придёт,
притом триггеря все остальные устройства, это не комильфо.
Защита будет на парах.
Переименуйтесь в Discord-е, чтобы было понятно, кто Вы.
Также, переделайте в полноценный скрипт.
Автоматизируйте интерактивный ввод при помощи HEREDOC https://tldp.org/LDP/abs/html/here-docs.html везде.