Информация
Услуги
  • Внедрение
  • Настройка
  • Поддержка
  • Ремонт
Контакты
Оплата
Новости
Доставка
Загрузки
Форум
Настройка
    info@proxmox.su
    +7 (495) 320-70-49
    Заказать звонок
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Войти
    0 Сравнение
    0 Избранное
    0 Корзина
    Аспро: ЛайтШоп
    Телефоны
    +7 (495) 320-70-49
    Заказать звонок
    0
    0
    0
    Аспро: ЛайтШоп
    • +7 (495) 320-70-49
      • Назад
      • Телефоны
      • +7 (495) 320-70-49
      • Заказать звонок
    • info@proxmox.su
    • Москва, Бакунинская улица, 69с1
    • Пн-Пт: 09-00 до 18-00
      Сб-Вс: выходной
    • 0 Сравнение
    • 0 Избранное
    • 0 Корзина
    Главная
    Форум
    Proxmox Виртуальная Среда
    Получить все снимки виртуальных машин.

    Форумы: Proxmox Виртуальная Среда, Proxmox Backup Server, Proxmox Mail Gateway, Proxmox Datacenter Manager
    Поиск  Пользователи  Правила  Войти
    Страницы: 1
    RSS
    Получить все снимки виртуальных машин., Proxmox Виртуальная Среда
     
    oguz
    Guest
    #1
    0
    24.03.2021 11:28:00
    Привет! Как получить все снапшоты для виртуальной машины? Когда я делаю снапшот через UI, создаётся новый диск, но при использовании команды Code: qm snapshot <vmID> я не вижу нового диска. Не мог бы кто-нибудь помочь? Спасибо.
     
     
     
    damo2929
    Guest
    #2
    0
    09.08.2024 16:52:00
    Было бы интересно получать эту информацию из API, но перечислять все серверы…
     
     
     
    LnxBil
    Guest
    #3
    0
    09.08.2024 18:30:00
    Если это не видно сразу, возможно, придется перебирать все узлы через API.
     
     
     
    Mikachu
    Guest
    #4
    0
    02.02.2025 12:53:00
    Привет! Я наткнулся на эту проблему и написал простой скрипт, который перечисляет все снапшоты в формате JSON (он также создаёт файл snapshot.json). Пожалуйста, всегда проверяй и тестируй скрипты, прежде чем их запускать. Я не несу ответственности, если что-то пойдёт не так (хотя ничего не должно случиться, он просто переcчитывает их). Использует команды pct listsnapshot <LXCID> и qm listsnapshot <VMID>.

    *   Перечисляет все снапшоты для обеих ВМ и контейнеров.
    *   Исключает "current" снапшоты (это не настоящие снапшоты — это "Ты здесь").
    *   Извлекает имя снапшота, метку времени и описание.
    *   Форматирует вывод в чистый JSON для удобства разбора.

    Просто сохрани скрипт как list_snapshots в твоем узле Proxmox и запусти его с помощью bash list_snapshots. Если хочешь, можешь поместить его в /bin, чтобы не пришлось каждый раз указывать путь к файлу. Хотя я не уверен, что это сломает что-нибудь при обновлении.

    `#!/bin/bash`

    # Инициализируем JSON объект
    echo "{ \"vms\": [" > snapshots.json

    # Получаем снапшоты ВМ
    first_vm=true
    for vm in $(qm list | awk 'NR>1 {print $1}'); do
       snapshot_list=$(qm listsnapshot $vm | grep -v "current" | awk '{$1=""; print $0}' | sed 's/^ *//')

       if [[ ! -z "$snapshot_list" ]]; then
           if [ "$first_vm" = false ]; then
               echo "," >> snapshots.json
           fi
           first_vm=false
           echo "[" >> snapshots.json

           while read -r name date time desc; do
               name=$(echo "$name" | sed 's/`->//g' | xargs)  # Удаляем маркер в начале и убираем лишние пробелы
               timestamp="$date $time"
               description=$(echo "$desc" | xargs)  # Убираем лишние пробелы

               # Обрабатываем случай, когда описание отсутствует
               if [[ -z "$description" ]]; then
                   description="no-description"
               fi

               echo "  { \"vmid\": \"$vm\", \"name\": \"$name\", \"timestamp\": \"$timestamp\", \"description\": \"$description\" }," >> snapshots.json
           done <<< "$snapshot_list"

           # Удаляем последнюю запятую и закрываем JSON массив
           sed -i '$ s/,$//' snapshots.json
           echo "]" >> snapshots.json
       fi
    done

    echo "], \"containers\": [" >> snapshots.json

    # Получаем снапшоты контейнеров
    first_ct=true
    for ct in $(pct list | awk 'NR>1 {print $1}'); do
       snapshot_list=$(pct listsnapshot $ct | grep -v "current" | awk '{$1=""; print $0}' | sed 's/^ *//')

       if [[ ! -z "$snapshot_list" ]]; then
           if [ "$first_ct" = false ]; then
               echo "," >> snapshots.json
           fi
           first_ct=false
           echo "[" >> snapshots.json

           while read -r name date time desc; do
               name=$(echo "$name" | sed 's/`->//g' | xargs)  # Удаляем маркер в начале и убираем лишние пробелы
               timestamp="$date $time"
               description=$(echo "$desc" | xargs)  # Убираем лишние пробелы

               # Обрабатываем случай, когда описание отсутствует
               if [[ -z "$description" ]]; then
                   description="no-description"
               fi

               echo "  { \"ctid\": \"$ct\", \"name\": \"$name\", \"timestamp\": \"$timestamp\", \"description\": \"$description\" }," >> snapshots.json
           done <<< "$snapshot_list"

           # Удаляем последнюю запятую и закрываем JSON массив
           sed -i '$ s/,$//' snapshots.json
           echo "]" >> snapshots.json
       fi
    done

    echo "] }" >> snapshots.json

    # Выводим JSON
    cat snapshots.json

    Ожидаемый вывод: JSON: {
     "vms": [
       [
         { "vmid": "112", "name": "goti", "timestamp": "2024-05-17 21:27:03", "description": "no-description" }
       ],
       [
         { "vmid": "131", "name": "ansible_test", "timestamp": "2024-11-04 12:32:39", "description": "no-description" }
       ],
       [
         { "vmid": "530", "name": "totally_legit_snapshot_name", "timestamp": "2025-01-17 14:29:16", "description": "no-description" }
       ]
     ],
     "containers": [
       [
         { "ctid": "135", "name": "update", "timestamp": "2024-11-30 12:15:26", "description": "no-description" }
       ]
     ]
    }
     
     
     
    BeWog
    Guest
    #5
    0
    15.02.2025 15:34:00
    У меня не получается получить одинаковый результат с командой qm listsnapshot.

    Bash: root@pve-01:~# qm listsnapshot 100
    `-> snap_clean 2025-02-12 09:08:01 Installation
    `-> courant Вы здесь! Эти обратные кавычки усложняют отображение!
    Bash: # qm listsnapshot 100 | grep -v "current"
    grep: (standard input): binary file matches
     
     
     
    Mikachu
    Guest
    #6
    0
    16.02.2025 00:30:00
    Привет @BeWog, спасибо за обратную связь, тебе повезло, я уже переписал скрипт с нуля, так как в нём были проблемы. Может быть, это тоже исправит твою проблему, но я не могу протестировать, так как не говорю по-французски. Кстати, я бы рекомендовал запускать Proxmox на английской версии Linux, потому что у многих скриптов возникают проблемы с разными языками, и в худшем случае это может даже привести к простоям, если фрагмент кода Proxmox не переведён правильно и вызывает ошибку.

    Примечание: для работы скрипта требуется установленный `jq`, иначе вывод не будет отформатирован.

    Bash: #!/bin/bash

    vms_array=""
    cts_array=""

    # ---------- VMs ----------
    readarray -t vm_ids < <(qm list | awk 'NR>1 {print $1}')
    # Если виртуальных машин нет, vm_ids будет пустым

    # Собираем все снимки для каждого ID виртуальной машины
    vm_json_parts=()  # Здесь храним подмассивы (если у ВМ есть снимки)

    for vm in "${vm_ids[@]}"; do
     [[ -z "$vm" ]] && continue
     snapshot_list=$(qm listsnapshot "$vm" | grep -v "current" | awk '{$1=""; print $0}' | sed 's/^ *//')

     # Если снимков нет, пропускаем
     [[ -z "$snapshot_list" ]] && continue

     # Строим массив JSON для этой виртуальной машины, где каждый элемент — объект JSON, представляющий снимок.
     this_vm_snapshots="["

     # Парсим построчно
     first_line=true
     while read -r line; do
       [[ -z "$line" ]] && continue
       # line обычно содержит: <имя_снимка> <ГГГГ-ММ-ДД> <ЧЧ:ММ:СС> <описание...>
       # Разделяем:
       name=$(awk '{print $1}' <<< "$line" | sed 's/->//g')
       date=$(awk '{print $2}' <<< "$line")
       time=$(awk '{print $3}' <<< "$line")
       desc=$(awk '{$1=""; $2=""; $3=""; print $0}' <<< "$line" | xargs)

       [[ -z "$desc" ]] && desc="no-description"
       timestamp="$date $time"

       # Первая запись -> нет запятой, после неё всегда добавляем запятую
       if $first_line; then
         first_line=false
       else
         this_vm_snapshots+=","
       fi

       # Преобразуем в объекты JSON
       this_vm_snapshots+="{\"vmid\":\"$vm\",\"name\":\"$name\",\"timestamp\":\"$timestamp\",\"description\":\"$desc\"}"
     done <<< "$snapshot_list"

     this_vm_snapshots+="]"  # Закрываем массив

     # Добавляем этот блок массива к vms_array
     vm_json_parts+=( "$this_vm_snapshots" )
    done

    # Теперь собираем vm_json_parts в массив JSON
    # (Каждый элемент vm_json_parts — это уже массив, например, "[ {...}, {...} ]")
    if ((${#vm_json_parts[@]} == 0)); then
     # Снимков не найдено -> пустой массив
     vms_array="[]"
    else
     # Объединяем с запятыми
     vms_array="["
     for (( i=0; i<${#vm_json_parts[@]}; i++ )); do
       [[ $i -gt 0 ]] && vms_array+=","
       vms_array+="${vm_json_parts[$i]}"
     done
     vms_array+="]"
    fi

    # ---------- Containers ----------
    readarray -t ct_ids < <(pct list | awk 'NR>1 {print $1}')

    ct_json_parts=()
    for ct in "${ct_ids[@]}"; do
     [[ -z "$ct" ]] && continue
     snapshot_list=$(pct listsnapshot "$ct" | grep -v "current" | awk '{$1=""; print $0}' | sed 's/^ *//')

     [[ -z "$snapshot_list" ]] && continue

     this_ct_snapshots="["
     first_line=true
     while read -r line; do
       [[ -z "$line" ]] && continue
       name=$(awk '{print $1}' <<< "$line" | sed 's/->//g')
       date=$(awk '{print $2}' <<< "$line")
       time=$(awk '{print $3}' <<< "$line")
       desc=$(awk '{$1=""; $2=""; $3=""; print $0}' <<< "$line" | xargs)

       [[ -z "$desc" ]] && desc="no-description"
       timestamp="$date $time"

       if $first_line; then
         first_line=false
       else
         this_ct_snapshots+=","
       fi

       this_ct_snapshots+="{\"ctid\":\"$ct\",\"name\":\"$name\",\"timestamp\":\"$timestamp\",\"description\":\"$desc\"}"
     done <<< "$snapshot_list"

     this_ct_snapshots+="]"
     ct_json_parts+=( "$this_ct_snapshots" )
    done

    if ((${#ct_json_parts[@]} == 0)); then
     cts_array="[]"
    else
     cts_array="["
     for (( i=0; i<${#ct_json_parts[@]}; i++ )); do
       [[ $i -gt 0 ]] && cts_array+=","
       cts_array+="${ct_json_parts[$i]}"
     done
     cts_array+="]"
    fi

    # Собираем финальный JSON
    snapshots_json="{\"vms\":$vms_array,\"containers\":$cts_array}"

    echo "$snapshots_json" | jq
     
     
     
    BeWog
    Guest
    #7
    0
    16.02.2025 09:30:00
    Спасибо за помощь. Локаль уже en_US.UTF-8. Не знаю, откуда взялись эти обратные кавычки! PVE 8.3.3 (на Debian 12.9)
     
     
     
    Страницы: 1
    Читают тему
    +7 (495) 320-70-49
    info@proxmox.su

    Конфиденциальность Оферта
    © 2026 Proxmox.su
    Главная Каталог 0 Корзина 0 Избранные Кабинет 0 Сравнение Акции Контакты Услуги Бренды Отзывы Компания Лицензии Документы Реквизиты Поиск Блог Обзоры