Изменение размера образа диска / файловой системы для хранения точно определенного набора файлов с почти нулевым свободным пространством

Обычно виртуальный ящик и VMware настраивают сетевое подключение к vm через хост, который будет основан на NAT, в подсети, изолированной от тестовой локальной сети. Это имеет преимущества и недостатки реализации NAT на домашних маршрутизаторах большинства людей. Вы не "видимы" для сети / Интернета, пока не инициируете трафик или не настроите переадресацию портов. В случае серверного приложения вам необходимо, чтобы хост пересылал пакеты на порт, в данном случае 21/22, на ваш IP-адрес гостевой системы.

Я почти всегда настраиваю свою виртуальную машину для работы в мостовом режиме вместо NAT отчасти, чтобы избежать этого. Я не могу сказать вам, как именно это сделать, потому что вы не сказали нам, какое программное обеспечение vm вы используете. Но сделать это очень просто.

В мостовом режиме гость получит IP-адрес от LAN DHCP-сервера и будет находиться в той же локальной сети, что и все другие клиенты, что делает то, что вы пытаетесь сделать, тривиальным.

2
04.10.2016, 22:25
1 ответ

В итоге я использовал комбинацию ложных факторов и итеративный подход (как отказоустойчивый). Это не должно быть так сложно, как я изначально предполагал. Оказывается, на данный момент для FAT требовалось немного подделки, но для ext требовалось огромное количество отрицательных подделок; с нулевым коэффициентом выдумки для ext4 у меня было много свободного места (более 21M). Я перешел на ext2 (кому нужен вонючий журнал ?!), увеличил размер блока и тщательно подсчитал нужные мне inode, и получил еще больше мегабайт свободного места. Полагаю, я мог бы получить «реальный размер» от du и продолжить работу оттуда, но я решил, что подсчет накладных расходов, даже если это разные файловые системы, будет более точным приближением.

# Estimated filesystem overhead, in 512-byte blocks
FS_ESP_FUDGE=256 
FS_ISO_FUDGE=-80000 # Wow!
FS_FUDGE_INCR=1024
...
read ESP_RSIZE d < <(du --summarize --block-size=512 $ESP)
read ISO_RSIZE d < <(du --summarize --block-size=512 $ISO)

success=false
until $success; do 
    let ESP_SIZE=ESP_RSIZE+FS_ESP_FUDGE
    let ISO_SIZE=ISO_RSIZE+FS_ISO_FUDGE
    let ESP_START=2048
    let IMG_SIZE=ESP_SIZE+ISO_SIZE+ESP_START
    let ESP_END=ESP_START+ESP_SIZE-1
    let ISO_START=ESP_END+1

    success=true
...
    sudo /sbin/mkfs.vfat /dev/mapper/$p1 -F 16 \
        || error_exit "mkfs.vfat failed" 5
    # -N: Count the inodes (all files, plus . and .. for each directory,
    # which I can't get "find" to include).  
    sudo /sbin/mke2fs -b 4096 -N $(( $(find $ISO | wc -l ) + 2 * $(find $ISO -type d | wc -l))) -m 0 -q /dev/mapper/$p2 \
        || error_exit "mke2fs failed" 6
...
    if ! tar -C $ESP -c --exclude-vcs --exclude-backups . | \
        sudo tar -C mnt/esp -x; then
        {
            read
            read fs onek used avail use rest
        } < <(df mnt/esp)
        # Are we out of disk space? If not, bail, else increase margin, retry
        [[ $onek -ne $used || $avail -ne 0 || $use != "100%" ]] && \
            error_exit "esp tar failed" 9
        let FS_ESP_FUDGE=FS_ESP_FUDGE+FS_FUDGE_INCR
        success=false
    fi
    if ! tar -C $ISO -c --exclude-vcs --exclude-backups . | \
        sudo tar -C mnt/iso --owner=root --group=root -x ; then
        {
            read
            read fs onek used avail use rest
        } < <(df mnt/iso)
        # Are we out of disk space? If not, bail, else increase margin, retry
        [[ $onek -ne $used || $avail -ne 0 || $use != "100%" ]] && \
            error_exit "iso tar failed" 10
        let FS_ISO_FUDGE=FS_ISO_FUDGE+FS_FUDGE_INCR
        success=false
    fi
    $success || echo "Whoops, I guessed too small; please adjust fudge factor.  Retrying ..."
...
done
0
29.04.2021, 00:09

Теги

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