projects:temp
Различия
Показаны различия между двумя версиями страницы.
| Следующая версия | Предыдущая версия | ||
| projects:temp [2025/04/02 17:57] – создано - внешнее изменение 127.0.0.1 | projects:temp [2025/04/02 20:38] (текущий) – [1] | ||
|---|---|---|---|
| Строка 1: | Строка 1: | ||
| - | ====== | + | ====== |
| - | Если снять новый образ с sd карты raspberry которая ни разу не запускалась, | + | |
| - | + | ||
| - | - находит последний сектор второго раздела (p2) в .img;\\ | + | |
| - | + | ||
| - | - рассчитывает нужный размер; | + | |
| - | + | ||
| - | - делает безопасную обрезку .img с запасом.\\ | + | |
| + | ===== 1 ===== | ||
| <code bash> | <code bash> | ||
| #!/bin/bash | #!/bin/bash | ||
| + | export LANG=en_US.UTF-8 | ||
| + | export LC_ALL=en_US.UTF-8 | ||
| + | # 06_patch_img_stretch.sh — внедрение stretch_limited в initramfs и образ .img с проверками и подтверждением | ||
| + | |||
| set -euo pipefail | set -euo pipefail | ||
| + | [[ $EUID -ne 0 ]] && exec sudo " | ||
| - | IMG="$1" | + | MOUNT_DIR="/ |
| - | SAFETY_MB=4 | + | INITRD_SCRIPT="/ |
| - | [[ ! -f "$IMG" ]] && | + | # === 📁 Поиск и выбор устройств === |
| + | mapfile | ||
| + | if [[ ${# | ||
| + | | ||
| + | | ||
| + | fi | ||
| - | echo "📂 Анализируем: $IMG" | + | echo "📍 Выбери куда подключён образ .img:" |
| - | END_SECTOR=$(fdisk -l "$IMG" | awk '/ | + | i=1 |
| - | SECTOR_SIZE=$(fdisk | + | for dev in "${DEVICES[@]}"; do |
| - | SECTOR_SIZE=${SECTOR_SIZE:-512} | + | IFS=":" |
| + | status="" | ||
| + | [[ -z "$mnt" | ||
| + | echo " | ||
| + | ((i++)) | ||
| + | done | ||
| + | read -rp "🔀 Выбор: " choice | ||
| + | [[ " | ||
| - | FINAL_BYTES=$(( (END_SECTOR + 1 + (SAFETY_MB * 1024 * 1024 / SECTOR_SIZE)) * SECTOR_SIZE | + | SEL_DEV=" |
| - | FINAL_MB=$(( FINAL_BYTES / 1024 / 1024 )) | + | IFS=":" |
| - | echo "📏 Конец rootfs в секторе: | + | if [[ -z "$DEV_MNT" |
| - | echo "📦 Новый размер: | + | |
| + | mkdir -p "$MNT_PATH" | ||
| + | mount " | ||
| + | TARGET_DIR=" | ||
| + | else | ||
| + | TARGET_DIR=" | ||
| + | fi | ||
| - | read -rp "✅ Обрезать .img до $FINAL_MB МБ? [y/N] " confirm | + | # === 📂 Поиск образов === |
| - | [[ " | + | mapfile |
| + | if [[ ${# | ||
| + | echo " | ||
| + | exit 1 | ||
| + | fi | ||
| + | |||
| + | echo "📂 Образы:" | ||
| + | i=1 | ||
| + | for img in " | ||
| + | echo " | ||
| + | ((i++)) | ||
| + | done | ||
| + | read -rp "🔀 Выбор образа: " img_choice | ||
| + | [[ " | ||
| + | |||
| + | IMGFILE=" | ||
| + | |||
| + | # === Запрос лимита === | ||
| + | while true; do | ||
| + | read -rp "📆 Укажи лимит размера rootfs в ГБ (0 = до конца диска, по умолчанию 30): " input_limit | ||
| + | if [[ -z "$input_limit" | ||
| + | read -rp "🔁 Установить 30 ГБ? [Y/n] " confirm | ||
| + | | ||
| + | elif [[ " | ||
| + | LIMIT_GB=" | ||
| + | break | ||
| + | else | ||
| + | echo "⛔ Только целые числа, пожалуйста." | ||
| + | fi | ||
| + | done | ||
| + | |||
| + | MAX_MB=$((LIMIT_GB * 1024)) | ||
| + | |||
| + | # === Установка stretch_limited в initramfs === | ||
| + | mkdir -p " | ||
| + | cat > " | ||
| + | #!/bin/sh | ||
| + | PRIORITY=top | ||
| + | |||
| + | exec 1>>/ | ||
| + | set -eux | ||
| + | |||
| + | echo " | ||
| + | DEV="/ | ||
| + | PART=" | ||
| + | FLAG_FILE="/ | ||
| + | MAX_MB=$MAX_MB | ||
| + | |||
| + | if [ -f " | ||
| + | echo " | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | START=\$(fdisk -l " | ||
| + | END=\$(fdisk -l " | ||
| + | SECTOR_SIZE=\$(blockdev --getss " | ||
| + | CURRENT_MB=\$(( (END - START + 1) * SECTOR_SIZE / 1024 / 1024 )) | ||
| + | |||
| + | echo "Текущий размер: | ||
| + | |||
| + | if [ " | ||
| + | echo " | ||
| + | touch " | ||
| + | exit 0 | ||
| + | fi | ||
| + | |||
| + | echo "Изменение раздела..." | ||
| + | parted -s " | ||
| + | partprobe " | ||
| + | sleep 2 | ||
| + | resize2fs " | ||
| + | touch " | ||
| + | echo "✅ Готово" | ||
| + | EOF | ||
| + | |||
| + | chmod +x " | ||
| + | |||
| + | chroot " | ||
| + | ln -sf / | ||
| + | |||
| + | echo "✅ stretch_limited установлен в initramfs и образ. Будет выполнен при загрузке до монтирования rootfs." | ||
| - | truncate -s " | ||
| - | echo "✅ Готово: | ||
| </ | </ | ||
| - | запуск | + | ===== 2 ===== |
| + | Проверка | ||
| + | < | ||
| + | lsinitramfs / | ||
| + | </ | ||
| <code bash> | <code bash> | ||
| - | chmod +x hard_shrink_img.sh | + | lsinitramfs / |
| - | ./hard_shrink_img.sh /media/pi/DEXP_SSD/ | + | lsinitramfs |
| + | </code> | ||
| + | <code bash> | ||
| + | cat /boot/stretch_limiter.log | ||
| + | df -h / | ||
| </ | </ | ||
| - | |||
projects/temp.1743605852.txt.gz · Последнее изменение: — 127.0.0.1
