%20%D1%83%D1%81%D1%82%D1%80%D0%BE%D0%B9%D1%81%D1%82%D0%B2%D0%BE..png)
Увеличить экземпляр EC2 проще простого (например, создать AMI, запустить из него экземпляр, а затем изменить размер хранилища).
Но уменьшить его становится сложнее. Я хотел бы уменьшить размер корневого тома Elastic Block Store (EBS) экземпляра Amazon Web Services (AWS) EC2. В сети есть несколько старых высокоуровневых процедур. Более подробная версия, которую я нашел, — это ответ годичной давности на вопрос StackOverflow:как я могу уменьшить объем моего ebs, шаги имеют довольно высокий уровень:
Создайте новый том EBS нужного размера (например, /dev/xvdg)
Запустите экземпляр и подключите к нему оба тома EBS.
Проверьте файловую систему (исходного корневого тома): (например) e2fsck -f /dev/xvda1
Максимально сжать исходный корневой том: (например, ext2/3/4) resize2fs -M -p /dev/xvda1
Скопируйте данные с помощью dd:
Выберите размер фрагмента (мне нравится 16 МБ)
Рассчитайте количество фрагментов (используя количество блоков из вывода resize2fs): блоки*4/(размер_фрагмента_в_МБ*1024) — округлите немного в большую сторону для безопасности
Скопируйте данные: (например) dd if=/dev/xvda1 ibs=16M of=/dev/xvdg obs=16M count=80
Измените размер файловой системы на новом (меньшем) томе EBS: (например) resize2fs -p /dev/xvdg
Проверьте файловую систему (исходного корневого тома): (например) e2fsck -f /dev/xvdg
Отсоедините новый корневой том EBS и присоедините его к исходному экземпляру.
Я не могу найти подробное пошаговое решение.
Мой корневой том EBS подключен к экземпляру HVM Ubuntu.
Любая помощь могла бы быть полезна.
решение1
Ни одно из других решений не сработает, если том используется как корневое (загрузочное) устройство.
На недавно созданном диске отсутствует загрузочный раздел, поэтому на нем необходимо установить GRUB и правильно настроить некоторые флаги, прежде чем экземпляр сможет использовать его в качестве корневого тома.
Мой (на сегодняшний день,работающий) решение для уменьшения объема корня:
Фон:У нас есть экземпляр A, корневой том которого мы хотим уменьшить. Назовем этот том VA. Мы хотим уменьшить VA с 30 ГБ до, скажем, 10 ГБ
- Создайте новый экземпляр ec2, B, с той же ОС, что и у экземпляра A. Также ядра должны совпадать, поэтому при необходимости выполните обновление или понижение. В качестве хранилища выберите том того же типа, что и VA, но с размером 10 ГБ. (или любым другим целевым размером). Теперь у нас есть экземпляр B, который использует этот новый том (назовем его VB) в качестве корневого тома.
- Как только новый экземпляр (B) запустится, остановите его и отсоедините его корневой том (VB).
ПРИМЕЧАНИЕ: Следующие шаги в основном взяты из решения @bill:
Остановите экземпляр, размер которого вы хотите изменить (A).
Создайте снимок тома VA, а затем создайте из этого снимка том "General Purpose SSD". Этот том мы назовем VASNAP.
Запустите новый экземпляр с помощью Amazon Linux, назовем его C. Мы просто используем этот экземпляр для копирования содержимого VASNAP в VB. Вероятно, мы могли бы также использовать экземпляр A для выполнения этих шагов, но я предпочитаю делать это на независимой машине.
Присоедините следующие тома к экземпляру C. /dev/xvdf для VB. /dev/xvdg для VASNAP.
Перезагрузите экземпляр C.
Войдите в экземпляр C через SSH.
Создайте следующие новые каталоги:
mkdir /source /target
- Отформатируйте основной раздел VB в файловой системе ext4:
mkfs.ext4 /dev/xvdf1
Если ошибок нет, перейдите к шагу 11. В противном случае, если у вас нет /dev/xvdf1
, вам необходимо создать раздел, выполнив следующие действия i-vii:
i) Если /dev/xvdf1
по какой-либо причине не существует, вам нужно его создать. Сначала введите:
sudo fdisk /dev/xvdf
.
ii) Очистите диск, введя:
wipefs
iii) Создайте новый раздел, введя:
n
iv) Нажмите Enter p
, чтобы создать основной раздел.
v) Продолжайте нажимать Enter, чтобы продолжить с настройками по умолчанию.
vi) Когда снова появится запрос на ввод команды, нажмите Enter, w
чтобы записать изменения и выйти.
vii) Убедитесь, что у вас есть /dev/xvdf1
раздел, выполнив следующие действия:
lsblk
Вы должны увидеть что-то вроде:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
xvda 202:0 0 250G 0 disk
└─xvda1 202:1 0 250G 0 part
xvdf 202:80 0 80G 0 disk
└─xvdf1 202:81 0 80G 0 part
xvdg 202:96 0 250G 0 disk
└─xvdg1 202:97 0 250G 0 part
Теперь перейдите к шагу 11.
- Смонтируйте его в этот каталог:
mount -t ext4 /dev/xvdf1 /target
- Это очень важно, файловой системе нужна метка e2label, чтобы Linux ее распознал и загрузил, используйте «e2label /dev/xvda1» на активном экземпляре, чтобы увидеть, какой она должна быть, в данном случае метка: «/»
e2label /dev/xvdf1 /
- Смонтируйте VASNAP на /source:
mount -t ext4 /dev/xvdg1 /source
- Скопируйте содержимое:
rsync -vaxSHAX /source/ /target
Примечание: после "/target" нет "/". Также могут быть некоторые ошибки с символическими ссылками и атрибутами, но изменение размера все равно прошло успешно
- Размонтировать VB:
umount /target
Вернитесь в AWS Console: отсоедините VB от экземпляра C, а также отсоедините VA от A.
Присоедините том нового размера (VB) к экземпляру как: "/dev/xvda"
Загрузочный экземпляр A, теперь его корневое устройство — 10 ГБ :)
Удалите оба экземпляра B и C, а также все тома, кроме VB, который теперь является корневым томом экземпляра A.
решение2
В консоли AWS:
Остановите экземпляр, размер которого вы хотите изменить.
Создайте снимок активного тома, а затем создайте из этого снимка том «SSD общего назначения».
Создайте еще один том «SSD общего назначения» нужного вам размера.
Прикрепите эти 3 тома к экземпляру как:
- /dev/sda1 для активного тома.
- /dev/xvdf для тома, размер которого является целевым.
- /dev/xvdg для тома, созданного из снимка активного тома.
Запустите экземпляр.
Войдите в новый экземпляр через SSH.
создайте эти новые каталоги:
mkdir /source /target
- создайте файловую систему ext4 на новом томе:
mkfs.ext4 /dev/xvdf
- смонтируйте его в этот каталог:
mount -t ext4 /dev/xvdf /target
- Это очень важно, файловой системе нужна метка e2label, чтобы Linux ее распознал и загрузил, используйте «e2label /dev/xvda1» на активном экземпляре, чтобы увидеть, какой она должна быть, в этом случае метка: «/»
e2label /dev/xvdf /
- смонтируйте том, созданный из снимка:
mount -t ext4 /dev/xvdg /source
- Скопируйте содержимое:
rsync -ax /source/ /target
Примечание: после "/target" нет "/". Также могут быть некоторые ошибки с символическими ссылками и атрибутами, но изменение размера все равно прошло успешно
- Размонтируйте файловые системы:
umount /target
umount /source
Вернитесь в AWS Console: остановите экземпляр и отсоедините все тома.
Подключите том нового размера к экземпляру как: "/dev/sda1"
Запустите экземпляр, и он должен загрузиться.
ШАГ 10 ВАЖЕН: Пометьте новый том как «e2label», как указано выше, иначе экземпляр будет загружаться в aws, но не пройдет проверку соединения.
решение3
1. Создайте новый том ebs и присоедините его к экземпляру.
Создайте новый том EBS. Например, если у вас изначально было 20G, и вы хотите сжать его до 8G, то создайте новый том EBS 8G, убедитесь, что он находится в той же зоне доступности. Присоедините его к экземпляру, корневой раздел которого вам нужно сжать.
2. Разбейте, отформатируйте и синхронизируйте файлы на вновь созданном томе ebs.
(1. Проверьте состояние разделаСначала мы используем команду sudo parted -l
для проверки информации о разделах исходного тома:
[root@ip-172-31-16-92 conf.d]# sudo parted -l
Model: NVMe Device (nvme)
Disk /dev/nvme0n1: 20G
Sector size (logical/physical): 512B/512B
Partition Table: gpt
Disk Flags:
Number Start End Size File system Name Flags
1 1049kB 2097kB 1049kB bbp bios_grub
2 2097kB 20480MB 24G xfs root
Видно, что этот том корневого устройства 20G разделен на два раздела, один называется bbp, а другой — root. В разделе bbp нет файловой системы, но есть флаг bios_grub, который показывает, что эта система загружается grub. Также он показывает, что корневой том разбит на разделы с использованием gpt. Что касается того, что такое bios_grub, то это на самом деле загрузочный раздел BIOS. Ссылка выглядит следующим образом:
https://en.wikipedia.org/wiki/BIOS_boot_partition https://www.cnblogs.com/f-ck-need-u/p/7084627.html
Это около 1 МБ, и есть раздел, называемый root, на котором нам нужно сосредоточиться. Этот раздел хранит все файлы исходной системы. Итак, идея резервного копирования заключается в том, чтобы перенести файлы из этого раздела в другой меньший раздел на новом томе ebs.
(2 Используйтеparted
для разбиения на разделы и форматирования нового тома ebs.
Используйте lsblk
для вывода списка блоков:
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
Новый том ebs — это устройство nvme1n1, и нам нужно разбить его на разделы.
~# parted /dev/nvme1n1
GNU Parted 3.2
Using /dev/xvdg
Welcome to GNU Parted! Type 'help' to view a list of commands.
(parted) mklabel gpt #Using the gpt layout would take up the first 1024 sectors
(parted) mkpart bbp 1MB 2MB # Since the first 1024 sectors are used, the start address here is 1024kb or 1MB, and bbp is the partition name, that is, BIOS boot partition, which needs to take up 1MB, so the end address is 2MB
(parted) set 1 bios_grub on #Set partition 1 as BIOS boot partition
(parted) mkpart root xfs 2MB 100% #allocate the remaining space (2MB to 100%) to the root partition.
После разбиения на разделы, используем lsblk
снова, мы можем видеть
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
nvme0n1 259:0 0 20G 0 disk
├─nvme0n1p1 259:1 0 1M 0 part
└─nvme0n1p2 259:2 0 20G 0 part /
nvme1n1 270:0 0 8G 0 disk
├─nvme1n1p1 270:1 0 1M 0 part
└─nvme1n1p2 270:2 0 8G 0 part /
Вы можете видеть, что есть еще два раздела, nvme1n1p1 и nvme1n1p2, где nvme1n1p2 — наш новый корневой раздел. Используйте следующую команду для форматирования раздела:
mkfs.xfs /dev/nvme1n1p2
После форматирования нам необходимо смонтировать раздел, например, мы монтируем его в /mnt/myroot.
mkdir -p /mnt/myroot
mount /dev/nvme1n1p2 /mnt/myroot
(3 Используйте rsync для переноса всего содержимого в соответствующий корневой раздел нового тома.
sudo rsync -axv / /mnt/myroot/
Обратите внимание, что указанный выше -x
параметр очень важен, поскольку он предназначен для резервного копирования корневого каталога текущего экземпляра. Поэтому, если вы не добавите этот параметр, он сам будет резервировать /mnt/myroot в /mnt/myroot и попадет в бесконечный цикл. (Параметр –exclude также допустим) Команда rsync отличается от команды cp. Команда cp перезапишет, в то время как rsync — это синхронное инкрементное резервное копирование. Это сэкономит много времени. Выпейте кофе и дождитесь завершения синхронизации.
3.Замените uuid в соответствующем файле.
Поскольку том изменился, то и uuid тома изменился. Нам нужно заменить uuid в загрузочных файлах. Следующие два файла необходимо изменить:
/boot/grub2/grub.cfg #or /boot/grub/grub.cfg
/etc/fstab
Так что же нужно изменить? Во-первых, нужно вывести uuid соответствующего тома через blkid:
[root@ip-172-31-16-92 boot]# sudo blkid
/dev/nvme0n1p2: LABEL="/" UUID="add39d87-732e-4e76-9ad7-40a00dbb04e5" TYPE="xfs" PARTLABEL="Linux" PARTUUID="47de1259-f7c2-470b-b49b-5e054f378a95"
/dev/nvme1n1p2: UUID="566a022f-4cda-4a8a-8319-29344c538da9" TYPE="xfs" PARTLABEL="root" PARTUUID="581a7135-b164-4e9a-8ac4-a8a17db65bef"
/dev/nvme0n1: PTUUID="33e98a7e-ccdf-4af7-8a35-da18e704cdd4" PTTYPE="gpt"
/dev/nvme0n1p1: PARTLABEL="BIOS Boot Partition" PARTUUID="430fb5f4-e6d9-4c53-b89f-117c8989b982"
/dev/nvme1n1: PTUUID="0dc70bf8-b8a8-405c-93e1-71c3b8a887c7" PTTYPE="gpt"
/dev/nvme1n1p1: PARTLABEL="bbp" PARTUUID="82075e65-ae7c-4a90-90a1-ea1a82a52f93"
Вы можете видеть, что uuid корневого раздела старого большого тома EBS — add39d87-732e-4e76-9ad7-40a00dbb04e5
, а uuid нового малого тома EBS — 566a022f-4cda-4a8a-8319-29344c538da9
. Используйте команду sed, чтобы заменить его:
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /boot/grub2/grub.cfg
sed 's/add39d87-732e-4e76-9ad7-40a00dbb04e5/566a022f-4cda-4a8a-8319-29344c538da9/g' /etc/fstab
Конечно, вы также можете попробовать вручную сгенерировать файлы grub, используя grub-install
(в некоторых системах grub2-install
) здесь, просто для удобства.
4.Отсоедините два тома, затем снова присоедините новый меньший том.
Затем используйте umount
для размонтирования нового тома ebs:
umount /mnt/myroot/
Если он выдает сообщение, что target занят. Вы можете использовать , fuser -mv /mnt/myroot
чтобы увидеть, какой процесс в нем работает. Я нашел bash, что означает, что вам нужно выйти из этого каталога в bash. Используйте , cd
чтобы вернуться в домашний каталог и снова введите команду выше, чтобы размонтировать.
Затем отсоедините оба тома (конечно, сначала остановите экземпляр) и снова подключите новый том в качестве корневого устройства, указав здесь имя устройства, /dev/xvda
как показано ниже .
Затем запустите экземпляр. Если ssh-подключение не удалось, вы можете использовать следующие методы отладки:
1. получить системный журнал
Ссылка:
1.https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/TroubleshootingInstances.html#InitialSteps
2.https://www.daniloaz.com/en/partitioning-and-resizing-the-ebs-root-volume-of-an-aws-ec2-instance/
3.https://medium.com/@m.yunan.helmy/уменьшить-размер-объема-ebs-в-вашем-экземпляре-ec2-ea326e951bce
решение4
Статья ниже — это хорошее и простое руководство по уменьшению размера тома EBS. Оно содержит простое пошаговое руководство и скриншоты.