LinuxForum.Fans
Тема

Помогите пожалуйста со скриптом zsys-setup в Ubuntu 20.04

Автор: soket 7 сообщений 1893 просмотров
08.03.2021 15:54 #436085

Уважаемые гуру, помогите, пожалуйста понять где в этом скрипте задаётся размер раздела подкачки и как его уменьшить до минимума.
Полностью убрать вроде не получиться сами разработчики пишут, что это ломает скрипт. Но уменьшитьвроде можно.
https://gist.github.com/andaag/1379d6c2adcf4a84c91957a46bee3418
Хотел сначала убрать совсем но подсказали, что этого делать не стоит. Теперь хочу убрать на 3.0 флешку
Просто на 64 гигах оперативки толку от него чуть,

Оставлять свап на системном SSD я не хочу в принципеб а терять 2 гигабайта диска не хочется. :)
Поскольку в своей работе поменял тучу жестких дисков, где выделенная область под подкачку (линук виндовс не важно) была самой повреждённой. И даже на "умных" контроллерах SSD которые равномерно распределяют циклы перезаписи по диску это всё равно быстрее выводит их из строя.
Поэтому свап в таком случае проще поместить на USB 3.0 флешку которую быстро и дешево поменять.

Сами разработчики говорят что это возможно:

Показать
Tweaking partition layout
As told in the introduction, nothing is hardcoded in term of ZSys support for your partition layout (as long as you don’t have multiple pools with the same name, of course).

If you want to tweak the partition layout to your wish. For instance, to use multiple pools in mirrors, or using RAID-Z, you can for now (until we support manual partition layout in the installer) edit manually the zsys-setup script on the live ubuntu 20.04 LTS desktop image before reaching the partitioning page. This one is located at /usr/share/ubiquity/zsys-setup.

I think you saw that there has been a lot of thoughts and care in our default partition layout, so edit with care. :)

И судя по коду это делается где-то в этих местах, но дальше я понять не могу.

Здесь ...

Показать
text
get_layout() {
    # Returns disk, base name of the partition and partition numbers to create
    target="$1"
    disk="$2"

if [ -z "${disk}" ]; then # The entire disk has been formatted with use_device # There is either one ext4 partition or one ext4 and one ESP part="$(grep -E "\s${target}\s" /proc/mounts | awk '{print $1}')" partbase=""

if [ -n "${part}" ]; then disk="$(lsblk -lns -o TYPE,PATH ${part}| grep disk| awk '{print $2}')" if [ -z "${disk}" ]; then echo "E: Couldn't identify disk for partition ${part}. Exiting!" exit 1 fi # Some disks have letters in the partition number like /dev/nvme0n1p1 # In this case we want to retrieve 'p' so we deal only with partition number # in the rest of the script and prepend the base. partbase="$(echo ${part} | sed -e 's/[0-9]*$//' | sed -e "s#${disk}##")" fi else # The only purpose of this code is to display a friendly message in ubiquity to show the user # what partitioning will be performed. However, on first call, the disk is not yet partitioned # and collecting the information about disk partitioning would require to query partman. But we # don't want to add this extra complexity just to display a message. Instead we hardcode the # extension of the partition name depending on the type of disk, basically it's 'p' for anything # else than standard drives (eg nvme01pX) case "${disk}" in /dev/sd*|/dev/hd*|/dev/vd*) partbase="" ;; *) partbase="p" esac fi

partesp=1 if is_gpt "${disk}"; then # No extended partition on EFI + GPT # The layout is # 1: ESP # 2: swap # 3: bpool # 4: rpool partswap=2 partbpool=3 partrpool=4 else # MBR pools are on extended partition # The layout is: # 1: ESP # 2: Extended # 5: swap # 6: bpool # 7: rpool partswap=5 partbpool=6 partrpool=7 fi

echo "OK|${disk}|${partbase}|${partesp}|${partswap}|${partbpool}|${partrpool}" }

format_disk() { disk="$1" partbase="$2" partesp="$3" partbpool="$4" partrpool="$5" ss="$6" partswap=$(( partbpool - 1 )) partext=$(( partesp + 1 )) partprefix="${disk}${partbase}"

sfdisktmp="${ZSYSTMP}/sfdisk.cfg" rm -f "${sfdisktmp}"

echo "I: Formatting disk $disk with partitions ESP:${partesp} ext:${partext} swap:${partswap} bpool:${partbpool} rpool:${partrpool}"

# bpool size: 500M < 5% of ZFS allocated space < 2G # partswap is partition 2 on GPT systems and first extended partition on MBR. size_percent=$(expr \( $(blockdev --getsize64 ${partprefix}${partswap}) / 1024 / 1024 \) \* 5 / 100) bpool_size=500 [ ${size_percent} -gt ${bpool_size} ] && bpool_size=${size_percent} [ ${bpool_size} -gt 2048 ] && bpool_size=2048

if is_gpt "${disk}"; then # Improvement: Delete all the partitions but the ESP # There should be only 1 or 2 partitions but it can be made generic if ! esp_exists "${disk}"; then start=$(sfdisk -l "${disk}"|grep "^${partprefix}${partesp}"|awk '{print $2}') cat > "${sfdisktmp}" <<EOF ${partprefix}${partesp} : start= ${start}, size= 512M, type=C12A7328-F81F-11D2-BA4B-00A0C93EC93B, bootable EOF else sfdisk --delete "${disk}" ${partswap} fi

cat >> "${sfdisktmp}" <<EOF ${partprefix}${partswap} : size= ${ss}M, type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F ${partprefix}${partbpool} : size= ${bpool_size}M, type=6A82CB45-1DD2-11B2-99A6-080020736631 ${partprefix}${partrpool} : type=6A85CF4D-1DD2-11B2-99A6-080020736631 EOF else if ! esp_exists "${disk}"; then start=$(sfdisk -l "${disk}"|grep "^${partprefix}${partesp}"|awk '{print $2}') cat > "${sfdisktmp}" <<EOF ${partprefix}${partesp} : start= ${start}, size= 512M, type=ef, bootable EOF else sfdisk --delete "${disk}" ${partswap} fi

cat >> "${sfdisktmp}" <<EOF ${partprefix}${partswap} : size= ${ss}M, type=82 ${partprefix}${partbpool} : size= ${bpool_size}M, type=a5 ${partprefix}${partrpool} : type=a5 EOF

fi cat "${sfdisktmp}" | sfdisk --append "${disk}"

# Force a re-read of the partition table echo "I: Re-reading partition table" partx --add "${disk}" 2>/dev/null || true partx --show "${disk}" }

... и здесь

Показать
text
    # Swap files are not supported on ZFS, we use a swap partition instead:
    SWAPFILE="$(grep "^${TARGET}" /proc/swaps |awk '{print $1}')"
    # Give us a minimum swap partition size of 4MB in case we decide on
    # no swap, just to keep the partition layout stable:
    SWAPSIZE=4194304

# Disable swap and get the swap volume size: if [ -n "${SWAPFILE}" ]; then SWAPSIZE=$(stat -c%s "${SWAPFILE}") echo "I: Found swapfile with size ${SWAPSIZE}. Disabling" swapoff "${SWAPFILE}" fi # Convert to MiB to align the size on the size of a block SWAPVOLSIZE=$(( SWAPSIZE / 1024 / 1024 ))

Но дальше я пока не понял. Мои эксперименты пока приводят к падению скрипта с ошибкой. :) :'(
Добавлено: 08.03.2021 15:54:47

Кроме того я не хочу бездумно ставить и надеяться, что всё заработает, а понимать как это работает, чтобы можно было в случае чего починить. Ну и просто интересно.
Очень много инфы почерпнул отсюда. Но к сожалению аглицкий я могу читать только с гугл переводчиком.

08.03.2021 17:24 #436086

soket, какой дистрибутив?
И если не нужен раздел подкачки, можно просто его убрать.
[console]sudo nano /etc/fstab[/console]
Если не понимаете, что править, выложите сюда содержимое файла, поможем.

08.03.2021 17:25 #436087

soket, *SCRATCH* переместить-то его можно, но толку будет ещё меньше.

10.03.2021 12:24 #436091
Rizado написал:
soket, какой дистрибутив?
И если не нужен раздел подкачки, можно просто его убрать.
[console]sudo nano /etc/fstab[/console]
Если не понимаете, что править, выложите сюда содержимое файла, поможем.

Благодарю я знаю, что так можно, :) и как это сделать.
Я хочу чтобы раздел в принципе не создавался на системном диске. А потом, буде понабиться, создать его сам там где надо. Поэтому и ковыряю скрипт.
И да я понимаю, что это всего 2 гига неиспользуемого пространства и можно забить, но разобраться хочется. :)

Wolfenberg написал:
soket, *SCRATCH* переместить-то его можно, но толку будет ещё меньше.

Вобщем поначитался по свопам и вывихнул мозг ;D
И пока всё что вывел для себя это:
своп используется только при нехватке памяти и файловых операциях копирования записи.
система старается минимизировать запись в своп, чтение не ограничено.
Размер свопа это не минимум 20% процентов от оперативки. Его размер вычисляется от размера данных которые грузятся в память. т.е. если вы используете программы которые сами по себе оперируют малыми объёмами памяти, но их много вам может хватить маленького свопа. А если программы занимают большой объём данных то, во избежании трэшинга, свап нужно делать больше.

Пока в голове вывод: при большом количестве оперативки своп может вообще не использоваться, но лучше чтобы он был, но не всегда. Его размер, а также необходимость его присутствия для нестандартных задач нужно вычислять исходя из ситуации.
По этому сейчас на работе поставил своп на быструю флешку с индикатором и физически смотрю как часто к ней будет обращение. потом тот же финт проверну на виртуалке с ZFS. И по результатам сделаю выводы. :)

11.03.2021 11:49 #436094

soket, :) SWAP нужен системе для режима гибернации либо если у вас жуткая нехватка ОЗУ.
Как правило, при ОЗУ свыше 8Гб он вообще не требуется. И чтение данных из этого раздела намного (до 20 раз) медленнее,
чем из оперативной памяти.

11.03.2021 14:23 #436099

Wolfenberg
Как показал мой эксперимент не только
Я таки вынес ради интереса свап на флешку с индикатором. Для того чтобы посмотреть, когда система его использует. Также мониторил через nmon пишет или читает система свап раздел.
Ну так вот
Раздел не используется почти никогда пока оперативной памяти достаточно, потом начинается активная выгрузка в свап и чтение из него. Но вот когда копируешь большое количество мелких файлов, даже при оперативной памяти занятой менее чем на 20% (на тестовом ПК установлено 16Гб) начинается активная запись в свап, каких то мелких объёмов данных мегабайт по 50. причем только запись, а не чтение. Копировал с ntfs раздела в ntfs и естественно эти разделы не находились на одном физическом диске со свапом.
Пока выясняю, что он туда скидывал.
Добавлено: 11.03.2021 14:23:10

Интересно, что практически всегда когда задаешь вопрос на который нет готового ответа и надо либо глубоко копаться в вопросе, либо просто знать (быть разработчиком), тема почти всегда сваливается во флуд. :D Мне так ответ пришел через 2 года я уж и забыл, что спрашивал. Как то сам решил вопрос через костыли, но зато тема обросла вопросами типа, а зачем мне это. Да какая разница зачем пусть даже просто интересно :D .
У нас это как то в менталитете зашито что ли. К примеру если на буржуйском форуме, что-то спросишь то там либо прямо отвечают, что не могут помочь, либо четко отвечают на поставленный вопрос иногда с комментариями почему этого делать не стоит и только потом могут спросить зачем. А у нас в основном за поговорить :D
Без обид, никого конкретно не имел в виду просто смешно. :D

30.03.2021 12:57 #436169

Вообчем сточив лопату нашел таки место где руками можно задать размер файла подкачки.
Вот эти 2 строчки:

text
${partprefix}${partswap}  :   size= ${ss}M,         type=0657FD6D-A4AB-43C4-84E5-0933C84B4F4F

${partprefix}${partswap} : size= ${ss}M, type=82

Если вместо ${ss} прописать размер в мебибайтах, то получим нужный размер раздела. Естественно если указать другой модификатор вместо "М" по и размер будет считаться уже согласно него. Минимальный возможный размер 4MiB. Если делать меньше скрипт отрабатывает, но установка падает.
Поиском по тексту нашел, что ss="$6" т.е. это параметр командной строки и получается, что размер раздела задаётся при вызове скрипта и надо копать программу которая его вызывает или этот параметр так же может быть прописан в теле скрипта?

Само по себе меня это решение устраивает, хотелось бы только разобраться что всё-таки задаёт размер раздела?

По поводу подкачки поигравшись с программкой из статьи, пришел к выводу, что лучше пусть будет. ;D

В установке свапа на флешку не нахожу ничего предосудительного поскольку скорости передачи данных современных USB интерфейсов давно сравнимы со скоростями SATA. По край ней мере вот такой диск WDS240G20A даёт одну и туже скорость чтения и записи, будь он подключен напрямую или через SATA to USB 3.0 конвертер. Здесь остаётся вопрос только в надёжности самих флешек и в их скорости. Скоростные флешки существуют, но стоимость их сравнима со стоимостью бытовых SSD на тот же объём. И поэтому я выбрал SSD. Как подключать решу по месту. Главное чтобы конвертер был надёжный.
И ИМХО ставить SWAP на системный диск это моветон. :)

Войдите или зарегистрируйтесь, чтобы ответить.