not= && while :; do
while IFS= read -r -d '' f; do
[[ -z "${not}" ]] && target="large_files" || target="small_files"
[[ ! -d "${target}" ]] && mkdir "${target}"
mv "${f} "${target}/${f}"
done < <(find. -maxdepth 1 -type f ${not} -size +1000k -printf "%f\0" 2>/dev/random)
[[ -n "${not}" ]] && break
not=!
done
Внешний цикл for
динамически изменяет размер поиска с более чем 1M на менее или равный 1M. Ошибки перенаправляются на /dev/random
(, предполагая, что вы работаете в Linux, добавляете к энтропии -, измените его на /dev/null
, если у вас нет/dev/random
).
Целевой каталог изменяется на большие _файлы перед установкой ${not}
и создается целевой каталог, если он еще не существует. Следующая итерация устанавливает ${not}
в !
и находит файлы, которые не превышают 1M (меньше или равны ), а также создает каталог небольших _файлов, если он еще не существует.
Файлы перемещаются в соответствующие каталоги.
После первой установки not
логика внутреннего цикла запускается еще раз после установки not
, после чего цикл прерывается.
Примечание. :нулевой байт используется для обработки цикла while, поскольку он более надежен, IFS=
сбрасывает внутренний разделитель полей для обработки списков, разделенных нулевыми байтами, и -d ''
устанавливает разделитель в нулевой байт, -r
] защищает обратную косую черту от удаления/интерпретации.
Использование /boot
и /boot/efi
в качестве отдельных файловых систем является излишним, но:
/boot
раздел, чтобы избежать ограничений BIOS /boot/efi
или эквивалентный раздел ESP, поскольку именно в нем микропрограмма ожидает найти файл загрузчика. /boot
позволит использовать любой метод шифрования, поддерживаемый cryptsetup
в корневой файловой системе, вместо более ограниченного набора шифрования, понимаемого GRUB. По умолчанию в современных Debian/Ubuntu оба раздела разделены на отдельные разделы, поэтому конфигурация по умолчанию может охватывать максимально широкий диапазон систем.
Как упоминалось в комментариях oldfred, UEFI идентифицирует раздел ESP для использования уникальным GUID раздела -в таблице разделов GPT. Этот GUID известен как PARTUUID в Linux. lsblk -o +partuuid
отобразит его.
Ваша команда efibootmgr
была почти правильной. Чтобы создать вариант загрузки ubuntuNew с использованием правильного диска, вы должны были использовать:
sudo efibootmgr -c -d /dev/nvme0n1 -L ubuntuNew -l \\EFI\\UBUNTU\\SHIMX64.EFI
efibootmgr
самостоятельно ищет PARTUUID и автоматически использует его для создания новой загрузочной записи. Вам нужно будет указать только диск (, если только на нем нет нескольких системных разделов EFI ).
Как только shimx64.efi
загрузит grubx64.efi
, в системах, настроенных в стиле Debian/Ubuntu -, он будет читать grub.cfg
в том же каталоге, что и grubx64.efi
. Этот файл содержит всего несколько строк, идентифицирующих UUID файловой системы файловой системы, которая содержит каталог /boot
(, независимо от того, является ли он отдельным разделом или просто обычным каталогом в корневой файловой системе ). В результате системы Debian/Ubuntu могут всегда иметь «основной» файл конфигурации GRUB по адресу /boot/grub/grub.cfg
, независимо от того, использует ли система BIOS или UEFI. Если у вас большое количество систем разного возраста, это удобно.
Для справки:RedHat 7 и 8 имеют фактическую конфигурацию GRUB в /boot/grub2/grub.cfg
в системах стиля BIOS -и в /boot/efi/EFI/redhat/grub.cfg
в системах UEFI.
Тем не менее , если вы хотите объединить /boot
и /boot/efi
, обратите внимание на некоторые вещи:
efibootmgr
, основан на корне файловой системы ESP. Первоначально этот путь начинается с /boot/efi
, поэтому \\EFI\\UBUNTU\\SHIMX64.EFI
относится к /boot/efi/EFI/UBUNTU/SHIMX64.EFI
, если смотреть из Linux. Если вы используете только /boot
, вам нужно либо переместить каталог UBUNTU на один уровень выше, либо указать путь к загрузчику как \\EFI\\EFI\\UBUNTU\\SHIMX64.EFI
. /boot
должен быть чем-то, что понимается GRUB, чтобы оттуда можно было загружать файлы ядра и initramfs. UEFI-версия GRUB для Ubuntu определенно понимает ext2 и vfat; поэтому, если вы объедините /boot
и /boot/efi
в один раздел vfat, у GRUB не будет проблем. Вы не можете использовать ext2, потому что прошивка должна будет прочитать SHIMX64.EFI и GRUBX64.EFI из этого раздела, а обычная прошивка UEFI не сможет понять ext2. /boot
требуется только для GRUB, а не для ядра Linux :вы можете оставить /boot
несмонтированным, и система все равно будет нормально загружаться. Но вы захотите оставить /boot
смонтированным, чтобы обновления ядра могли происходить нормально. (Или, если вы действительно хотите скрыть его, оставив его размонтированным, вы можете добавить скрипты в /etc/kernel/pre*.d/
для автоматического монтирования перед установкой обновлений ядра, и в /etc/kernel/post*.d
для повторного размонтирования после установки/удаления конкретный пакет ядра готов.)Загрузчик часто воспринимается как «страшный и опасный», если вы не имеете четкого представления о требованиях. С другой стороны, он, как правило, самодостаточен -, поэтому проблемы, связанные только с загрузчиком, обычно не так сложно исправить... как только вы преодолеете первое препятствие загрузки системы с внешнего носителя, вы сможете начни исправлять.Я бы не сказал, что система с неработающим -загрузчиком «тостирует» :, ей просто нужна небольшая внешняя помощь.
Загрузчик будет искать то, что вы в настоящее время смонтировали в /boot/efi
, поэтому, если вы не хотите также увеличивать этот раздел, вы можете оставить этот раздел как есть и просто внести небольшое изменение в файл, как описано ниже.
ext2
желаемого размера. Этому разделу не нужен загрузочный флаг -, ваш раздел efi является точкой входа и будет делегирован этому новому разделу. /newBoot
например rsync --recursive --delete --archive /boot/ /newBoot/
/newBoot/efi/
, здесь была только одна папка:rm -rf /newBoot/efi/EFI/
. Не удаляйте newBoot/efi/
. Туда мы хотим смонтировать старую папку efi
. efi
, чтобы использовать новый раздел Определите UUID /newBoot
пользователя:
$ lsblk -e 7 -o name,fstype,size,fsused,label,partlabel,mountpoint,uuid,partuuid
NAME FSTYPE SIZE FSUSED LABEL PARTLABEL MOUNTPOINT UUID PARTUUID
nvme0n1 931.5G
├─nvme0n1p1 vfat 512M 5.3M EFI System Partition /boot/efi FD0E-EECA 587cf214-f068-4879-a833-9dffa5ec6e3d
├─nvme0n1p2 ext2 488M 313.7M /boot 606a1976-d1c2-4246-a256-a8afddb04f84 2e10e277-560f-4f5e-abce-1dce5187a7f0
├─nvme0n1p3 crypto_LUKS 927.7G e7f674b8-4bec-4502-a1e5-0e93aa34786f 2fed2ecb-b548-479b-aa3f-7f1bbfb9981f
│ └─sda3_crypt LVM2_member 927.7G 9tx8Yv-XDCR-RmGf-fmXo-WiX2-SDpG-xH1si4
│ ├─ubuntu--gnome--vg-root ext4 911.6G 734.2G / 1cccfb0a-69da-4246-a071-52f882681418
│ └─ubuntu--gnome--vg-swap_1 swap 15.8G [SWAP] e3facfb8-db2e-426d-aef4-b6c81004fd6f
└─nvme0n1p4 ext2 1.5G newBoot newBoot 5aca79e7-b740-46d3-bc76-aa7e8b8b93da 9e8baf2f-2118-4042-9c47-7ffb824ada52
Отредактируйте /boot/efi/EFI/ubuntu/grub.cfg
соответствующим образом, заменив старый текущий UUID новым:
# cat /boot/efi/EFI/ubuntu/grub.cfg
# search.fs_uuid 606a1976-d1c2-4246-a256-a8afddb04f84 root
search.fs_uuid 5aca79e7-b740-46d3-bc76-aa7e8b8b93da root
set prefix=($root)'/grub'
configfile $prefix/grub.cfg
Теперь система уже должна загружаться с нового раздела, но /boot/
будет старым после загрузки с нового. Отредактируйте /etc/fstab
, чтобы системные обновления находили все файлы на своих местах:
# UUID=606a1976-d1c2-4246-a256-a8afddb04f84 /boot ext2 defaults 0 2
UUID=5aca79e7-b740-46d3-bc76-aa7e8b8b93da /boot ext2 defaults 0 2
Строка /boot/efi
в /etc/fstab
остается прежней:
UUID=FD0E-EECA /boot/efi vfat umask=0077 0 1