Оператор case функции Bashrc для импорта случаев из JSON

Как установить несколько дистрибутивов Linux на USB-накопитель?

Предположим:

  • Загрузка BIOS с USB-накопителя
  • Разделы MBR
  • Загрузчик GRUB

Инструменты:

  • супер _grub2 _диск _гибрид _2.02s9.iso
  • pmagic _2013 _08 _01.iso(последняя бесплатная версия Содержит как 32-битную, так и 64-битную версию)
  • memdisk Единственный файл, необходимый для этого, — предварительно скомпилированный двоичный файл memdisk.archive/bios/memdisk
  • рабочий компьютер с виртуальной машиной

Обзор:

  • Обнуление таблицы разделов и загрузочной записи USB-накопителя
  • Создание разделов на USB-накопителе
  • Создание ОС для USB-накопителя на виртуальной машине
  • Клонирование новых ОС с помощью clonezilla
  • Восстановление ОС на USB-накопитель
  • Обновление и настройка GRUB2

Шаг 1

Подготовьте инструменты и определите, какие операционные системы нужно установить на USB, какой размер разделов и будет ли использоваться раздел подкачки.

Общий объем USB-накопителя составляет 32 ГБ.

Разделы, которые мы настроим.

Раздел NTFS 16 ГБ для совместимости с Microsoft.

32-битный сервер Ubuntu14 4 ГБ ext4 с разделом подкачки 1 ГБ

64-битный сервер Ubuntu16 8 ГБ ext4 с разделом подкачки 4 ГБ

ПРИМЕЧАНИЕ.:Если вы не используете ждущий или спящий режим ни на одной из ОС, они могут совместно использовать один раздел подкачки или даже использовать файл подкачки в каждом из разделов ОС.

Схема раздела:

  • P1 --15 ГБ NTFS
  • P2 --4 ГБ, доб.4
  • P3 --8 ГБ, доб.4
  • P4 --расширенный
  • E1 --Подкачка 4 ГБ
  • E2 --Подкачка 1 ГБ

ПРИМЕЧАНИЕ.:BIOS и MBR будут видеть только 4 основных раздела. Используйте расширенный раздел вместо одного основного раздела, чтобы обойти это ограничение.


Шаг 2

Подготовьте USB-накопитель.

Создайте новую виртуальную машину с именем «test». Для этой виртуальной машины не требуется и не требуется жесткий диск. Это должно сделать USB-накопитель /dev/sda. Это упростит задачу в дальнейшем.

Подключите ISO-образ Parted Magic к виртуальной машине и загрузитесь с ISO-образа.

Подключите USB-накопитель и «передайте на виртуальную машину»

Убедитесь, что USB виден в виртуальной машине, и запишите номер устройства.

Запустите Редактор разделов со значка на рабочем столе.

USB-накопитель в моей настройке —:/dev/sda

Обнуление таблицы разделов. Это удалит ВСЮ информацию на этом устройстве. Сначала скопируйте любые данные, которые хотите сохранить.

  • ДОЛЖЕН иметь правильное устройство (пример :/dev/sda ), потому что вы можете сделать ваш компьютер перестанет загружаться, если вы обнулите неправильное устройство.
  • dd if=/dev/zero of=/dev/sda bs=512 count=4

Обновить список дисков в GParted (ctrl+R)

устройство --> создать таблицу разделов «msdos»

Создать разделы:

ПРИМЕЧАНИЕ.:Я создал раздел NTFS последним, чтобы «использовать» оставшееся пространство.

  • Создайте расширенный раздел в конце пространства. 5 ГБ или 5120
  • Создайте оба раздела подкачки в расширенном разделе. Тип линукс -своп. 4 ГБ, 1 ГБ. Расширенный раздел будет заполнен.
  • Создайте 2 раздела ОС в конце нераспределенного пространства. Тип доб4. 4 ГБ, 8 ГБ.
  • Метка 4 ГБ «Ubuntu14» (метка изменится при восстановлении, это помогает в идентификации)
  • Метка 8 ГБ «Ubuntu16» (метка изменится при восстановлении, это помогает в идентификации)
  • Создайте раздел данных NTFS, используя оставшееся нераспределенное пространство. в начале привода. Введите NTFS.
  • Пометить NTFS как «данные»

Применить изменения. Должно выглядеть что-то близкое к этому. Обратите внимание, что объем моего USB-накопителя составляет 1 ТБ, поэтому мой раздел NTFS намного больше.GParted Screen shot


Шаг 3

Подготовьте ОС, которые будут восстановлены на USB-накопитель.

Создана новая виртуальная машина и установлена ​​ОС. В этом примере сервер Ubuntu14 32-битный. Я сделал установочный диск виртуальной машины меньше размера раздела на USB. 4ГБ. Во время установки я использовал MBR, а не LVM, и позволил установке создать раздел подкачки.

Создана новая виртуальная машина и установлена ​​другая ОС. В этом примере сервер Ubuntu16 64-битный. Я сделал установочный диск виртуальной машины меньше размера раздела на USB. 8 ГБ. Во время установки я использовал MBR, а не LVM, и позволил установке создать раздел подкачки.

Внесите любые изменения, обновления и установки для каждой ОС.

Завершение работы новых виртуальных машин

Запустить клонирование новых ВМ.

Подключите pmagic_2013_08_01.isoк каждой новой виртуальной машине и загрузитесь с ISO-образа.

Просмотрите разделы на каждой виртуальной машине. Обратите внимание на расположение установленной ОС. Оба должны быть /dev/sda1.(Если не выполнить настройку позже)

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

Параметры Clonezilla:

  • устройство -образ --клонирование устройства /dev/sda1 в образ
  • ssh _сервер --размещение изображения на моем рабочем столе. Разместите свое где угодно вы можете добраться до него.
  • Режим новичка --большинство значений по умолчанию будут работать
  • saveparts --нам нужен только раздел ОС.
  • дайте изображению имя, которое вы придумаете позже.
  • sda1 --выберите раздел ОС. Должен быть только один выбор, но может нет.
  • пропустить проверку/восстановление исходной файловой системы --Все виртуальные машины должны быть чистый и готовый
  • Да, проверьте сохраненное изображение --Убедитесь, что клонированное изображение является хорошим файл. следуйте подсказкам.
  • подождите.
  • Готово! --На данный момент отключение питания в порядке.

Шаг 4

Восстановите образы ОС на USB-накопитель.

Вернитесь к «тестовой» ВМ, к которой не подключен виртуальный диск, и загрузитесь с pmagic_2013_08_01.iso.

Передайте USB-накопитель на «тестовую» виртуальную машину.

Запустите редактор разделов с помощью значка на рабочем столе. Мы вернулись сюда. См. Скриншот.

Сопоставьте ОС с разделами USB с разделами образа.

Ubuntu14:

  • раздел образа --/dev/sda1
  • Раздел USB --/dev/sda3

Ubuntu16:

  • раздел образа --/dev/sda1
  • Раздел USB --/dev/sda2

ПРИМЕЧАНИЕ:Эта версия clonezilla по умолчанию восстанавливает образ в тот же раздел, из которого он был создан. с /dev/sda1по /dev/sda1. Не то, что мы хотим,так что этот хак восстановит образы на разделах USB.

Взлом clonezilla для восстановления образа в другой раздел, из которого он был клонирован:

Переименуйте все файлы в каталоге изображений с новым идентификатором раздела.

/home/jc/clonezilla_images/ubuntu14/sda1* to /home/jc/clonezilla_images/ubuntu14/sda3*

Modify the content of file /home/jc/clonezilla_images/ubuntu14/parts. Replace 'sda1' with 'sda3'

То же самое для Ubuntu16, скорректируйте числа sda2.

ПРИМЕЧАНИЕ.:Я начал с устройства sda как на виртуальной машине, так и на USB. Если у вас используется другое устройство, например, /dev/sdb, необходимо изменить дополнительные файлы. Просто проще начать с обоих на одном устройстве. /dev/sda.

Восстановление изображений на USB-накопитель с помощью clonezilla

Параметры Clonezilla:

  • устройство -образ --восстановление устройства /dev/sda1 из образа
  • ssh _server --Или куда бы вы ни поместили образ.
  • Режим новичка --большинство значений по умолчанию будут работать
  • restoreparts --восстановление одного раздела
  • выберите изображение для восстановления
  • выберите правильный раздел USB для образа --Ubuntu14 to sda3; От Ubuntu16 до sda2
  • следуйте инструкциям.
  • подождите.
  • Введите приглашение командной строки. --Есть еще изображения для восстановления

Перезапустите clonezilla и повторите для всех изображений.

Мой USB отключался от виртуальной машины между восстановлениями, поэтому мне пришлось снова пройти через USB-накопитель.


Шаг 5

Установите GRUB на USB-накопитель

Загрузчик Grub будет установлен на первые 512 байт USB-накопителя. Этот загрузчик будет указывать на файл grub.cfg. Разместим наш на разделе Ubuntu16. Это может быть везде, где grub может прочитать.

Для этого мы будем использовать нашу основную ОС.

Для этого можно использовать работающую ОС на виртуальной машине.

Следует использовать текущую ОС Linux с grub2.

Подключите USB.

Мой USB-накопитель в настоящее время подключен как устройство /dev/sdf. Ваш будет отличаться.

Смонтируйте раздел, в котором будет жить grub.cfg.

ПРИМЕЧАНИЕ.:Каждая восстановленная ОС будет иметь файл grub.cfg, поскольку она была загружаемой ОС на виртуальной машине. Убедитесь, что вы указываете и изменяете файл grub.cfg, на который указывает загрузчик USB.

Ubuntu16 доб.4

sudo mount /dev/sdf2 /media/usb_u16

установить загрузчик grub на USB-устройство

sudo grub-install --recheck --boot-directory=/media/usb_u16/boot /dev/sdf

Это поместит указатель файла конфигурации в загрузочный каталог раздела Ubuntu16. Обычное место для Ubuntu. Ваш может быть где угодно.

Установка завершена. Об ошибках не сообщается.

Создайте файл grub.cfgдля работы в качестве шаблона.

sudo grub-mkconfig --output=/media/usb_u16/boot/grub/grub.cfg

Здесь важно то, что grub-mkconfigпроверит USB-накопитель и создаст загрузочные записи для ОС, которые мы установили на USB-накопитель. Мы не хотим, чтобы он также проверял все установленные диски на хост-компьютере и создавал для них записи.

Теперь размонтируйте все и проверьте загрузку с USB.

Если все работает, вы сможете загрузить ОС USB. Если не вернуться...


Шаг 6 Настройте файл grub.cfg на USB-накопителе

При загрузке с этого USB-накопителя вы увидите ОС на хост-компьютере, даже если USB-накопитель загружается на другом ПК. Давайте исправим это.

Давайте соберем больше информации.

Каждому разделу присвоен номер UUID. Получите UUID для нашего USB-накопителя.

blkid

/dev/sdf2: UUID="078ecc53-f73c-4cc7-9d45-f78aa534b7c5" TYPE="ext4" PARTUUID="00005785-02"
/dev/sdf3: UUID="a4654333-ee62-4dac-8c09-79a034e3125d" TYPE="ext4" PARTUUID="00005785-03"
/dev/sdf4: LABEL="data" UUID="667308CA28B6BB86" TYPE="ntfs" PARTUUID="00005785-04"
/dev/sdf5: UUID="8646e3f8-4f5c-40d4-a409-c4d65bf98d21" TYPE="swap" PARTUUID="00005785-05"
/dev/sdf6: UUID="61b8680c-22c9-4efc-98a1-2aaaa4a7f304" TYPE="swap" PARTUUID="00005785-06"

Ваш будет отличаться.

2 UUID раздела подкачки сохраняются на потом. Вы добавите их в файл /etc/fstabдля автоматического монтирования при загрузке.

UUID 2 разделов ОС:

/dev/sdf2: UUID="078ecc53-f73c-4cc7-9d45-f78aa534b7c5" -- Ubuntu16
/dev/sdf3: UUID="a4654333-ee62-4dac-8c09-79a034e3125d" -- Ubuntu14

Скопируйте 2 файла memdiskи super_grub2_disk_hybrid_2.02s9.isoв каталог конфигурации grub и образ splash.jpg, если он у вас есть.

Ubuntu16 доб.4

sudo mount /dev/sdf2 /media/usb_u16

sudo cp./memdisk /media/usb_u16/boot

sudo cp./super_grub2_disk_hybrid_2.02s9.iso /media/usb_u16/boot

sudo cp./splash.jpg /media/usb_u16/boot

Создать резервную копию созданногоgrub.cfg

sudo mv /media/usb_u16/boot/grub/grub.cfg /media/usb_u16/boot/grub/grub.cfg.orginal

Создайте свой собственныйgrub.cfg

sudo vi /media/usb_u16/boot/grub/grub.cfg

Короче говоря, нам нужно скопировать из grub.cfg.orginal только самый минимум. Материал установки grub insmod..., элемент отображения gfxmode=... и загрузочные записи. Загрузочные записи можно найти, выполнив поиск номеров UUID сверху. Скопируйте все, включая элементы подменю -или только основной элемент.

memdiskи super_grub2_disk_hybrid_2.02s9.isoпозволяют нам загружаться с любой ОС на хост-компьютере, даже если загрузочные записи не существуют.

Есть много причин, по которым это неправильный способ, но он работает.

Изменить Пример grub.cfg для этого USB-накопителя.

Сделайте резервную копию пользовательского grub.cfgфайла, потому что кто-то попытается перезаписать его.

sudo cp /media/usb_u16/boot/grub/grub.cfg /media/usb_u16/boot/grub/grub.cfg.custom


Шаг 7

Настройка установленных ОС

  • Добавьте UUID раздела подкачки в/etc/fstab
  • Добавьте любые автоматически монтируемые разделы (Данные NTFS, другие ОС ext4 )на USB к/etc/fstab
  • В Ubuntu я бы скорректировал записи grub по умолчанию с моими изменениями, поэтому при обновлении ОС изменения будут распространяться на новый grub меню.

Проверь!

0
26.03.2020, 23:58
2 ответа

Не совсем элегантно, но работает:

in='
{
  "cases": {
    "home": "~",
    "eolas": "/home/eolas/",
    "jdan": "/home/jdan/",
    "kl": "/.kl/"
  }
}
'

case="$(echo "$in" |
          perl -pe 's/"cases". \{/case "\$1" in/;
                    s/: /) eval cd /;
                    s/,/;;/;
                    s/[{}]//g')"

eval "
  function da() {
      $case
    esac
  }
"
-2
19.03.2021, 02:32

Если у вас есть файл JSON, вам автоматически следует подумать об использовании для его разбора.

Вы захотите прочитать этот файл в ассоциативный массив:

declare -A __dirmap
while IFS=$'\t' read -r name dir; do
    [[ $dir == "~" ]] && __dirmap[$name]=$HOME || __dirmap[$name]=$dir
done < <(
    jq -r '.cases | to_entries[] | [.key,.value] | @tsv' file.json
)

Тогда функция может быть

function da() {
    if [[ -v __dirmap[$1] ]]; then
        cd "${__dirmap[$1]}"
    else
        echo "No mapping for $1" >&2
    fi
}
0
19.03.2021, 02:32

Теги

Похожие вопросы