Сайт | Скачать | Видео | Wiki

Автор Тема: Cli оболочка для быстрого запуска ISO с помощью Qemu/Kvm.  (Прочитано 10090 раз)

0 Пользователей и 5 Гостей просматривают эту тему.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
Этот костыль ищет только флешки (по типу в /sys/block/sd*/queue/rotational, если "1" - значит флешка),
в моей системе проблема с этим скриптом , для тестирования я модифицировал его
 
Код
#!/bin/bash
for device in /sys/block/sd*; do
    echo "$(basename $device): $(cat $device/queue/rotational)"
done

 
и вот результат отладки
 
Код
+ for device in /sys/block/sd*
++ basename /sys/block/sda
++ cat /sys/block/sda/queue/rotational
+ echo 'sda: 1'
sda: 1
+ for device in /sys/block/sd*
++ basename /sys/block/sdb
++ cat /sys/block/sdb/queue/rotational
+ echo 'sdb: 1'
sdb: 1
  из чего я делаю вывод что флэшка определяется как вращаюшеся носитель, и скрипт цепляет оба типа носителей. теперь попробую со строкой от krasnyh
а вот как отрабатывает скрипт со строкой от  krasnyh
Код
  
#!/bin/sh
set -x
sudo umount $mnt_dir*

mnt_dir="/mnt/flash_drives/"
flag="0"

for list in /sys/block/sd*/removable; do
  is_removable=$(sudo cat $list)
 
  if [ "$is_removable" = "1" ]; then
    disk=$(echo $list | cut -f4 -d'/')
    part=$(sudo lsblk /dev/$disk | grep part | cut -f1 -d' ' | grep -oE '[[:alnum:]]+')

    for dev1 in $part; do
      sudo mkdir -p $mnt_dir$dev1
      sudo mount /dev/$dev1 $mnt_dir$dev1

      if [ -f $mnt_dir$dev1/QFlag ]; then
        echo "Нашёл!"
        flag="1"
        break
      else
        sudo umount $mnt_dir$dev1
      fi
    done
  fi
 
  [ $flag = "1" ] && break
done

 
 
вот результат отладки
Код
+ sudo umount cfQemu_10_totiks_gpt.sh cfQemu_10_totiks_gpt.sh.zip cfQemu_12_search_QFlag_totiks_gpt.sh cfQemu_12_search_QFlag_totiks_gpt.sh.zip cfQemu_9_totiks_gpt.sh cfQemu_9_totiks_gpt.sh.zip deprecated flash2qemu_2.sh mount_flash.sh mount_flash_2.sh mount_flash_3.sh mount_flash_4.sh mount_flash_5.sh
umount: cfQemu_10_totiks_gpt.sh: not mounted.
umount: cfQemu_10_totiks_gpt.sh.zip: not mounted.
umount: cfQemu_12_search_QFlag_totiks_gpt.sh: not mounted.
umount: cfQemu_12_search_QFlag_totiks_gpt.sh.zip: not mounted.
umount: cfQemu_9_totiks_gpt.sh: not mounted.
umount: cfQemu_9_totiks_gpt.sh.zip: not mounted.
umount: deprecated: not mounted.
umount: flash2qemu_2.sh: not mounted.
umount: mount_flash.sh: not mounted.
umount: mount_flash_2.sh: not mounted.
umount: mount_flash_3.sh: not mounted.
umount: mount_flash_4.sh: not mounted.
umount: mount_flash_5.sh: not mounted.
+ mnt_dir=/mnt/flash_drives/
+ flag=0
+ sudo cat /sys/block/sda/removable
+ is_removable=0
+ [ 0 = 1 ]
+ [ 0 = 1 ]
+ sudo cat /sys/block/sdb/removable
+ is_removable=1
+ [ 1 = 1 ]
+ cut -f4 -d/
+ echo /sys/block/sdb/removable
+ disk=sdb
+ grep -oE [[:alnum:]]+
+ cut -f1 -d
+ grep part
+ sudo lsblk /dev/sdb
+ part=sdb1
sdb2
sdb3
+ sudo mkdir -p /mnt/flash_drives/sdb1
+ sudo mount /dev/sdb1 /mnt/flash_drives/sdb1
mount: /mnt/flash_drives/sdb1: /dev/sdb1 already mounted on /mnt/sdb1.
+ [ -f /mnt/flash_drives/sdb1/QFlag ]
+ echo Нашёл!
Нашёл!
+ flag=1
+ break
+ [ 1 = 1 ]
+ break

ищет и монтирует но в случае с ventoy метку QFlag придется ставить наверно в раздел ventoyefi, вскорем я вернусь срезультатом.
« Последнее редактирование: 20 Октябрь 2023, 10:27:17 от totiks2012 »

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1739
  • Репутация: +50/-1
  • /dev/hands < /dev/ass
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1739
  • Репутация: +50/-1
  • /dev/hands < /dev/ass
Я забыл после размонтирования удалять созданную папку.
надо заменить
  else
  umount /mnt/$dev1
на
  else
  umount /mnt/$dev1
  rmdir /mnt/$dev1
Одно не пойму - оно и жесткий подхватило (sda)? Не должно. У меня такой чепухи не происходит...

Я это исправление не вносил в выложенный скрипт. Сейчас внесу
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
по ходу приближаемся, что скажете?
Код
#!/bin/sh
set -x
mnt_dir="/mnt/flash_drives/"
flag="0"

for list in /sys/block/sd*/removable; do
  is_removable=$(sudo cat $list)
 
  if [ "$is_removable" = "1" ]; then
    disk=$(echo $list | cut -f4 -d'/')
    part=$(sudo lsblk /dev/$disk | grep part | awk '{print $1}' | sed 's/[^[:alnum:]]//g')

    for dev1 in $part; do
      sudo mkdir -p $mnt_dir$dev1
      sudo mount /dev/$dev1 $mnt_dir$dev1

      if [ -f $mnt_dir$dev1/QFlag ]; then
        echo "Нашёл!"
        flag="1"
      fi
    done

    # Размонтировать все разделы, если не найдена метка
    if [ $flag = "0" ]; then
      for dev1 in $part; do
        sudo umount $mnt_dir$dev1
      done
    fi
  fi

  [ $flag = "1" ] && break
done

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1739
  • Репутация: +50/-1
  • /dev/hands < /dev/ass
if [ -f $mnt_dir$dev1/QFlag ]; then
        echo "Нашёл!"
        flag="1"
else
  umount /mnt/$dev1
  rmdir /mnt/$dev1
fi

Зачем судо в скрипте? Просто его весь с повышением прав выполнять.
И брейки я вводил, чтобы дальше не искало. Нашли первый QFlag - останавливаем циклы.
« Последнее редактирование: 20 Октябрь 2023, 11:37:16 от imp »
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
Зачем судо в скрипте? Просто его весь с повышением прав выполнять.
И брейки я вводил, чтобы дальше не искало. Нашли первый QFlag - останавливаем циклы.
насчёт sudo да согласен можно убрать из скрипта и кому надо выполнить его с правами sudo, это сделает скрипт более универсальным, тем пользователям у которых дистрибутивы с root пользователем. Насчет break понял принял.
upd: Если убрать sudo из скрипта , и выполнить его с применением  sudo ко всему скрипту то он ищет каталог /ISO в /root, что не есть хорошо, всё дело в строке HDD_FILE="$HOME/ISO/flash.qcow2" , это ломает слегка логику скрипта, ибо изначально он был заточен на запуск из домашней директории пользователя.
« Последнее редактирование: 20 Октябрь 2023, 12:22:30 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
всё проблему с sudo решил , теперь нужно запускать скрипт с sudo, и если не будет больше замечаний, может в шапку его?
вот общий код скрипта со всеми изменениями
Код
#!/bin/bash
#set -x
# Задаем переменные для размера оперативной памяти и жесткого диска
MEMORY_SIZE=2048
HDD_SIZE=27G
CPU=2

# Используем peco для выбора опции
ENABLE_CDROM_OPTIONS=("Опт-Прив_вкл" "Опт-Прив_выкл" "Загрузка_с_флэшки")
ENABLE_CDROM=$(echo "${ENABLE_CDROM_OPTIONS[@]}" | tr " " "\n" | peco)

# Путь к файлу для виртуального жесткого диска
HDD_FILE="/home/$SUDO_USER/ISO/flash.qcow2"



# Создаем виртуальный жесткий диск, если он не существует
if [ ! -f "$HDD_FILE" ]; then
    qemu-img create -f qcow2 "$HDD_FILE" "$HDD_SIZE"
fi

# Запускаем QEMU в зависимости от выбора пользователя
if [ "$ENABLE_CDROM" = "Опт-Прив_вкл" ] || [ "$ENABLE_CDROM" = "Опт-Прив_выкл" ]; then
    # Используем peco для выбора файла ISO из каталога ~/ISO
    ISO_FILE=$(find ~/ISO -name "*.iso" | peco)
   
    # Используем имя файла ISO для создания имени виртуального жесткого диска
    BASENAME=$(basename "$ISO_FILE" .iso)
    HDD_FILE="$HOME/ISO/$BASENAME.qcow2"

    if [ -f "$HDD_FILE" ]; then
        qemu-system-x86_64 \
          -boot d \
          -hda "$HDD_FILE" \
          -cdrom "$ISO_FILE" \
          -machine q35,accel=kvm -cpu max \
          -smp cores=${CPU},threads=1,sockets=1 \
          -m "$MEMORY_SIZE" \
          -display gtk \
          -device intel-hda -device hda-duplex \
          -enable-kvm
    else
        qemu-img create -f qcow2 "$HDD_FILE" "$HDD_SIZE"
        qemu-system-x86_64 \
          -boot d \
          -cdrom "$ISO_FILE" \
          -hda "$HDD_FILE" \
          -machine q35,accel=kvm -cpu max \
          -smp cores=${CPU},threads=1,sockets=1 \
          -m "$MEMORY_SIZE" \
          -display gtk \
          -device intel-hda -device hda-duplex \
          -enable-kvm
    fi
elif [ "$ENABLE_CDROM" = "Загрузка_с_флэшки" ]; then
# Путь к каталогу для монтирования
mnt_dir="/mnt/flash_drives/"

# Отмонтируем все устройства в каталоге, если они уже смонтированы
sudo umount $mnt_dir*

flag="0"

for list in /sys/block/sd*/removable; do
  is_removable=$(sudo cat $list)
 
  if [ "$is_removable" = "1" ]; then
    disk=$(echo $list | cut -f4 -d'/')
    part=$(sudo lsblk /dev/$disk | grep part | awk '{print $1}' | sed 's/[^[:alnum:]]//g')

    for dev1 in $part; do
      mkdir -p $mnt_dir$dev1
      mount /dev/$dev1 $mnt_dir$dev1

      if [ -f $mnt_dir$dev1/QFlag ]; then
        echo "Нашёл!"
        flag="1"
        break
      fi
    done

    # Размонтировать все разделы, если не найдена метка
    if [ $flag = "0" ]; then
      for dev1 in $part; do
        umount $mnt_dir$dev1
      done
    fi
  fi

  [ $flag = "1" ] && break
done

# Определяем  флэшки c меткой QFlag
#TYPE_FLESH="$(lsblk -o NAME | grep -E 'sd[b-z]$' | head -n 1)"
result=$( find /mnt/flash_drives -type f -name "QFlag" 2>/dev/null)
device_info=$(df -h "$result" | tail -n 1)
TYPE_FLESH=$(echo "$device_info" | awk '{print $1}' | awk -F/ '{print $3}' | sed 's/[0-9]*$//')
# Путь к устройству флешки
USB_DEVICE="/dev/$TYPE_FLESH"
    # Запускаем QEMU с загрузкой с флэшки
         qemu-system-x86_64 \
        -usb -drive file="$USB_DEVICE",format=raw,snapshot=on \
        -usb -drive file="$HDD_FILE",format=qcow2 \
        -machine q35,accel=kvm -cpu max \
        -smp cores=${CPU},threads=1,sockets=1 \
        -m "$MEMORY_SIZE" \
        -boot order=dc \
        -display gtk \
        -device intel-hda -device hda-duplex \
        -enable-kvm

#mnt_dir="/mnt/flash_drives/"
umount $mnt_dir*
fi


« Последнее редактирование: 20 Октябрь 2023, 13:50:08 от totiks2012 »

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1739
  • Репутация: +50/-1
  • /dev/hands < /dev/ass
  # Размонтировать все разделы, если не найдена метка
    if [ $flag = "0" ]; then
      for dev1 in $part; do
        umount $mnt_dir$dev1
      done
    fi
Зачем?
Было решено через else. Если не найдено - тот раздел, что смонтировался, сразу отмонтируется. А вы вводите еще один цикл. KISS-принцип вышел из чата((
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
Зачем?
Было решено через else  KISS-принцип вышел из чата((
принял, ща попробую исправить.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
imp спасибо! и прошу меня простить , за то что кодом в прежнем скрипте принес вам дискомфорт.

krasnyh спасибо!

следующая попытка
Код
этот код стерт ибо был сломан правильная релизная версия ниже
« Последнее редактирование: 23 Октябрь 2023, 11:28:18 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
 ??? ох дела мои грешные после ввода запуска от sudo сломались секции запуска ISO откачусь и скоро предоставлю исправленый рабочий вариант, ... в глазах аж потемнело...

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
откатился в скрипте с использованием sudo в теле скрипта, ибо если применять общий sudo ко всему скрипту, вместо домашнего ищет в root, применил вроде SUDO_USER в суботу работало, а сегодня в понедельник звезды слегка изменили свою позицию, и скрипт заартачился, почему так происходит  отловить не смог потому откатился
Код
релизный код ниже

  теперь заработало
« Последнее редактирование: 23 Октябрь 2023, 12:22:44 от totiks2012 »

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
Вуффф,разрулил!   вот предлагаю новую версию , внеc дополнительный  функционал, теперь загрузившись в режиме с ISO либо с виртуального образа присоединяется подключеная флешка, и теперь на неё можно установить дистрибутив (например в minios из инсталятора системы) , кроме того убрал необходимость создавать метку QFlag, ибо это усложняет взаимодействие, а моя задача была создать предельно простой в взаимодейсьтвии скрипт,теперь подкоючается первое removable устройство
Код
релизный ниже
оставлю тут еще 2-3 дня потом опубликую в шапке топика
(AZJIO прошу прощение за окупацию этой ветки. )
« Последнее редактирование: 23 Октябрь 2023, 14:21:00 от totiks2012 »

Оффлайн imp

  • cat /dev/ass > /dev/head
  • Ветеран
  • *****
  • Сообщений: 1739
  • Репутация: +50/-1
  • /dev/hands < /dev/ass
теперь подкоючается первое removable устройство
А если образ на втором?))
Дело вкуса. Я бы не заморачивался и дал право выбора пользвователю, какой образ он хочет запускать. И пусть сам монтирует)
Спасибо, что подкидываете развлечения - иногда заняться нечем, но на что-то большое времени не хватает.
Компьютер имеет то преимущество перед мозгом, что им пользуются.

Оффлайн totiks2012

  • Ветеран
  • *****
  • Сообщений: 942
  • Репутация: +24/-0
  • Автор темы
Да согласен и потому для проверки загрузочной флэшки  с Ventoy у которой на втором разделе ресурссы дистрибутива, а на первом загрузочный раздел VENTOYEFI , на нём создаём метку QFlag, и запускаем из пункта меню <Загрузка_с_флэшки_с_меткой_QFlag> , если дистрибутив записан на всю флэшку , без разделов то можно запустить без создания метки , из пункта меню <Загрузка_с_флэшки_без_метки>, код разросся и увы  напрямую не опубликовать потому во вложении.
YD-->> https://disk.yandex.ru/d/CxeRl8x_sJd52w

(Умоляю небеса чтоб это был финальный код.)
вечером были еще правки код вроде стабилизировал, из режима iso записал из инсталятора на флэшку всё отработало, но... флэшка после грузилась в виртуалке но была только в режиме чтения, в общем так и не добил, остальные функции стабильны, и быстро затестить исо образ а также созданую загрузочную флэшку, с меткой QFlag и без можно легко и без напряжения.
« Последнее редактирование: 23 Октябрь 2023, 20:39:02 от totiks2012 »