Как стать автором
Обновить

Комментарии 104

zfs
На мой взгляд идеальная фс, жаль только под линей+fuse дико тормозит.
zfs способна координироваться с нижележащим блочным устройством? Как? Как выглядит процесс освобождения блоков?
что вы подразумеваете под этой витиеватой фразой?
Каким образом zfs даёт знать блочному устройству, что указанный блок можно убрать? И как это будет обрабатываться блочным устройством?

Речь именно про блочные устройства, про то, каким образом они могут взаимодействовать с файловой системой в вопросах «добавить/удалить место».

Если не понятно: вопрос о том, как с помощью файловой системы уменьшать размер VDI на диске.
ну смотрите, идеология ZFS:
1) Делаем «пул» из блочных устройств по типу LVM-а
2) Поверх пула делаем «разделы», только делаются они по типу папок (никаих фоматов, фдисков и прочего — делается все моментально).
— Ты можешь сделать один раздел на весь пул.
— Можешь два и ограничить их размером в половину пула каждый.
— А можешь три, и без ограничений, и они будут занимать именно столько места, сколько данных на них есть.
Там нет нужны уменьшать\увеличивать размер раздела, можно поставить принудительно ограничение на размер конкретного раздела, чтобы он не занимал более определенного объема.
Увеличение размера пула — без проблем, уменьшение — без проблем. Но естественно, если у тебя раздел 5тб, да еще и raidz, процесс может занять неделю, но это ИМХО, проблема «универсальности» ЦП и медленная работа ЖД.
Смотрю. И всё ещё не понимаю, каким образом, удаляя файл на 1Тб на одной виртуальной машине, я освобождаю 1Тб для остальных виртуальных машин.
пул занимает все возможное дисковое пространство(и легко расширяем если понадобится), а для каждой виртуалки можно выделять разделы на пуле — у них обьем будет равен занятому месту данными. Записали в раздел еще данных — он увеличился за счет свободного места из пула, удалили данные — раздел уменьшился и отдал пустое пространство в пул где его может использовать раздел любой другой виртуалки. Както так)
Раздел уменьшился? Как он понял, что нужно уменьшаться? Через какое API это делается?
это не через апи делается) это делает сама фс — она так устроена. Все физически доступное место является пулом, а все разделы внутри него занимают места ровно столько сколько в них данных. Данных добавили раздел увеличился за счет свободного места в пуле, данные удалили — свободное место опять отдается в пул на пользование другим разделам.
Ага. Уже интересно. Теперь вопрос: как обеспечить сосуществование двух и более VM на одном блочном устройстве?
вот тут уже точно не скажу, надо пробовать на практике. если с обычными фс там все просто — при форматировании появляется новое вирт блочное устройство, то тут я не уверен ведут ли разделы себя также. Хотя мне кажется это уже проблема системы виртуализации, а не фс — выдать каждой VM определенный раздел. А квоты(макс обьем раздела до которого позволено разростатся) можно уже и средствами фс ставить.
Можно попробовать расшарить раздел (ну т.е. файловую систему zfs) через iscsi. И вообще по хорошему вы пытаетесь изобрести велосипед — уже давно оформилось разделение между серверами и стораджами. Советую вам посмотреть на последние достичения в области storage и подключения по iscsi через гигабит или FB.

RAID-Z на этом построен.

Ну, и для reiser4 (он, кстати, reiser, а не raiser) можно сделать плагин.

Reiserfs умеет динамическое увеличение без остановки.
Они все умеют динамическое увеличение. Вопрос в том, сколько ресурсов при этом потребляют. И насколько это штатный режим?
Reiserfs вполне стабилен при увеличении раздела.
Что значит стабилен? Я спрашиваю про штатность (т.е. автоматичность) операции.

Я пишу на раздел в 2Гб файл в 4Гб. Блочное устройство (допустим) предоставляет места на 10Гб. Оно само раздвинется? Если нет, это строго то, о чём я написал в начале.
недавно проскакивала новость что уже написали модуль ядра для zfs, скоро про fuse можно будет забыть
ZFS + Solaris. Доступны любые представимые действия с файловой системой.

Линукс же в настоящее время работает с ZFS только через костыли.
Да не подходит ZFS. ZFS отлично (в этой части) эмулируется с помощью LVM + обычная FS, но это явно не автоматическое on-demand выделение и освобождение места. Кроме того, совершенно не ясно, как именно ZFS может пережить изменение диска (1шт) с 10Гб до 5Гб.
>>>изменение диска (1шт) с 10Гб до 5Гб
Легко. Добавляем в пул диск в 5 гигов, удаляем 10 гиговый, это при условии что не используется RAIDZ\Stripe и данных в пуле меньше 5 гигов.
И это будет штатным режимом работы zfs? Не верю. С большой вероятностью этот манёвр вызовет просто взрыв дисковых операций.
Конечно вызовет. Вы меняете один физический диск на дугой физический диск. Как минимум данные нужно перенести.
Вот если разделу в пуле размер менять — это никаких проблем, но тут идеология разделов немного другая, почитайте выше.
zfs autoexpand — почему нет?
Мне очень интересна эта тема. Если пропущу путный ответ — пожалуйста, напиши в хабрапочту.

Мы думали, думали… и так и не нашли «дешевого» в плане разработки и внедрения решения (Xen). С CIFS/SMB все хорошо. С блочными устройствами — плохо. как минимум — прийдется его отмонтировать и ресайзнуть неким управляющим скриптом, потом примонтировать в гостевой OS.
Ну, отмонтировать не обязательно. Если том лежит на NFS, то его можно изменять в размере динамически. Но файловой системе всё равно приходится ресайзить, и это явно не прозрачная операция, которая может быть инициализирована самой файловой системой…
Есть виртуальная инфраструктура VMware ESX 3.5 + vSphere. Регулярно меняю размер системных разделов на работающих виртуальных серверах 2003, 2008 и 2008 R2. Для расширения системного диска внутри виртуалки с 2003 виндой требуется утилита от Dell под названием ExtPart. Увеличение размера происходит прямо в онлайне, без остановки виртуальной машины. В винде же 2008 и старше увеличение размера осуществляется штатными средствами, через оснастку «управление дисками», в 2 клика, опять же без остановки.

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

Как говорится, enlarge and enjoy :)
Да и с уменьшением (shrink) на лету системных разделов под NTFS в Windows Server 2008 и выше стандартными утилитами проблем никаких нет.

Файловая система должна быть минимально возможного размера. Если у нас занято 2Гб, то размер файловой системы 2Гб + служебные данные.

А это уже, на мой взгляд, должно быть проблемой совсем не файловой системы, а СХД, и, кстати, у многих вендоров Thin Provisioning реализован и вполне успешно работает.
вы это делаете руками или из скриптов. Я же говорю про ситуацию, когда у вас кто-то начинает писать файл в 1Тб на системный диск в 2Гб размером… И успешно записывает, потому что файловая система запросила 1Тб у блочного устройства, блочное устройство увеличилось в размере, файловая система увеличилась в размере…

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

Вопрос звучит так: а может ли гостевая ОС воспользоваться этим местом свободно? Этот вопрос выходит за рамки виртуализации и является общим вопросом: есть ли у нас файловые системы, которые способны динамически изменяться в размере в штатном режиме?
Если приходится писать терабайтные файлы на системный раздел, значит, инфраструктура спроектирована отвратительно. Под подобные задачи нужен отдельный сторедж, специально рассчитанный на работу с громадными объемами данных. Облако хранения, или High-End хранилище с собственной логикой.
А если мы уже про облако говорим? И «системный раздел» лишь условность, оно всё лежит на сетевом сторе?
Если мы уже говорим про облако, то у нас нет задачи менять системный раздел. Логика у нас живет в ПЗУ, либо в специально отведенной флешке (или на отдельном диске/массиве).

Из сравнительно простого, что приходилось щупать руками — сторедж с ZFS. Имеется, к примеру, 10 терабайтных дисков в одном ZFS пуле. Внутри этого пула создаются разделы — сколько угодно — которые шарятся любым способом — NFS, CIFS, iSCSI, FC. Если не ограничивать размер раздела, он может занять всё свободное на пуле место, все 10 условных терабайт. Файлы удаляются — место освобождается, и всё это в автоматическом режиме без участия админа. Можно добавлять/удалять физические диски (hot-spare, разумеется), при этом размер пула соответственно изменяется.

В общем, я не нахожу резона усложнять то, что мы условно называем системным разделом. Лишняя гибкость может выйти боком. Винда даже запрещает обычным юзерам запись на системный раздел. Вот дополнительный сторедж можно колбасить по полной, да.

P.S. Как-то мы лихо уехали от виртуалок в облака…
Тыг, повторю ещё раз: облака — это метод учёта ресурсов. В частности, для виртуалки. И чтобы виртуалка стала облачной, ей нужно дать места «жри сколько хочешь, заплатишь за сожранное».
Ну так и не надо здесь локальных файловых систем, пусть виртуалка по NFS/CIFS до стореджа доступается. Папка /docs или сетевой диск. А сторедж on-demand сам разрулит, кому сколько выделить. Зачем усложнять локальную файловую систему, если уже есть решения, заточенные под гибкое хранение?
Ага. Теперь следующий вопрос: как бы это совместить с необходимостью грузить систему?

Я уже думал о «бездисковой виртуальной машине», которая бы с NFS грузилась бы, но как-то это очень громоздко выглядит…
Давайте более конкретно, что в итоге нужно получить? Не хочется городить сферическую виртуалку со сферическим хранилищем в вакууме.
Здесь есть проблема с безопасностью доступа. Пока мы имеет storage network и опосредованный доступ через платформу виртуализации, нет опасности прослышивания трафика.
Как только подключим сторадж прямо в виртуалку, например Microsoft iSCSI Initiator, скажем «до свидания» безопасности.
Ну, для этого и существует nfsv4 с керберосом. А там уже на выбор krb5, krb5i, krb5p.

Алсо, слушать трафик на виртуалке никто не даст, виртуальный интерфейс воткнут в виртуальный коммутатор, который прекрасно заметит хулиганство со стороны VM. (а в принципе, его можно вообще запретить как класс).
Виртуальный коммутатор воткнут в физический коммутатор.
И? Трафик-то фильтруется на вируальном коммутаторе. Не пройдя его дорваться до вышестоящих коммутаторов не получится. А фильтр «не флудить маками» на самом деле очень легко пишется (по-крайней мерере в Open vSwitch, который в Xen Cloud Platform идёт).
iSCSI трафик уходит с виртуального коммутатора на физический и так до iSCSI target. Вот как только он ушел в физическую сеть, его можно слушать, поскольку он ушел не в выделенный сегмент для iSCSI а через general purpose.
Простите, КТО будет слушать трафик в сети между хостом/iscsi target? Гостевые VM? Я написал выше.
Тот, кто подключен к тому же физическому коммутатору.
К фическому коммутатору подключен шлюз, хосты виртуализации, сторедж, виртуальные коммутаторы внутри хост.
В случае использования Software iSCSI из гостевой ОС идет чистый нешифрованный трафик:
гостевая ОС -> виртуальный коммутатор -> физический коммутатор ->… -> физический коммутатор -> iSCSI Target

причем он идет на физический коммутатор по тому же линку, что и обычный трафик виртуальных машин, с теми же настройками безопасности. Прослушать iSCSI трафик = украсть диск можно на любой физической точке от хоста до таргета.

Если же iSCSI используется (на примере VMware) для создания VMFS датастора, то по всем рекомендациями и руководствам iSCSI сеть ввиду ее незащищенности должна быть отделена физически или как минимум в отдельный VLAN. Трафик iSCSI не встречается с general purpose трафиком, к которому имеет доступ кто угодно и может подключиться откуда угодно.
НЛО прилетело и опубликовало эту надпись здесь
Системный раздел не условность, если речь идет о винде.
1) если по какой-то причине надо переустановить ОС, то можно не беспокоиться о сохранности данных — он будут лежать не на системном разделе
2) виртуальный диск с ОС может лежать на low-end storage, ведь по сути надо только заугрзиться. А данные на сверхможном дорогом массиве
Я не могу сказать про винды, но debian занимает примерно 200-400Мб в серверной установке, тут нет нужды париться на разделение системного диска и данных.
> Windows тут выглядит полным ауткастером, так как не поддерживает изменение размера файловой системы NTFS, особенно, на системных дисках.

либо «не поддерживает» (вообще не поддерживает), либо «особенно, на системных дисках» (поддерживает, но есть известные проблемы)

и вообще пи… дёжь и провокация: ещё в 2k были реализованы динамические диски и тома

А разве высокая степерь виртуализации не подразумевает максимальное абстрагирование от аппаратной части. Я к тому, что при таких задачах (облако) наверное надо не блочные устройства эмулировать, а по максимуму использовать файловый доступ (NFS/SMB).
NFS/SMB — бесконечно медленно, по сравнению со скоростью операций с блочными устройствами.
Насчёт SMB не скажу, но в сравнении NFS/iSCSI я не заметил существенных различий.
iSCSI — тоже далеко не предел мечтаний. TCP/IP все же сильно тупит всю передачу, особенно при большой нагрузке множеством потоков.

Если у вас действительно серьезные задачи с серьезной нагрузкой, то никаких SMB/NFS/iSCSI. Fibre Channel, Infiniband и иже с ними.
Ну, насколько я понимаю, при 10G сожрать полосу так, чтобы поплохело TCP, несколько проблемно…
При 10G да. Просто я встречал множество сисадминов, которые страшно удивлялись, чего это у них все тупит по двум агрегированным гигабитным портам )
Динамические тома-то она поддерживает. А изменение размера системного диска? Не затруднит ткнуть в команду в 2003/2008 для этого?
Аналогичным образом из консоли можно сделать Diskpart'ом.
Интересно. Я с виндами распрощался ещё на уровне 2003, 2008 плотно не смотрел. Будет под руками тестовый образец, проверю. Возможно, они этот вопрос допилили…
...Windows тут выглядит полным ауткастером...
… с виндами распрощался ещё на уровне 2003...
Так распрощались или всё-таки ауткастером?
По состоянию на 2003R2 — ауткастером. Возможно, догнали.
Только для 2008
Ну, этот вариант я тоже прорабатываю. Проблема в том, что в отличие от блочного устройства, на NFS очень сложно учитывать число дисковых операций.
В списке фич btrfs есть еще:
Block discard support (reclaims space on some virtualization setups or improves wear leveling on SSDs by notifying the underlying device that storage is no longer in use)
Да. В зеновскую рассылку я уже написал, ждём ответа.
Проблема далеко не новая, и для нее уже давно есть решение.
Thin Provisioning
А, в комментарии выше уже упомянули, не заметил.
Спасибо. Прочитал. Издалека выглядит как то, что нужно, но совсем не ясно, с помощью чего это делать.
НЛО прилетело и опубликовало эту надпись здесь
Мне бы в более техничных терминах. Кто-то создаёт файл большого размера (в локальной FS, для драматизма, допустим, что прямо в '/'). Этот запрос: (вот тут бы мне вписать нужное)…
Разбирался с этой штукой года полтора назад, поэтому возможно что-то забыл, пусть комментаторы меня поправят.

Выглядит это так — есть у вас некая СХД (EMC, Hitachi, NetApp, Infortrend — у них у всех это есть). Есть у вас, некая рейд-группа на имеющихся дисках, пусть полезный объем будет 15 Тб. вы берете, и с помощью Thin Provisioning создаете 30 лунов по 1 Тб (условно) и мапите их к вашим виртуальным серверам или вообще куда угодно. Соответственно ваши сервера видят свои блочные устройства по 1 Тб и вообще понятия не имеют, что там на массиве при этом творится. Вся головная боль по распределению и хранению данных ложится на СХД. Если при этом в процессе работы у вас начинает заканчиваться место — вы докупаете еще диски и дисковые полки, расширяете рейд-группу и т.д.

Вся прелесть такого подхода раскрывается в связке с дедупликацией, когда при наличии множества одинаковых виртуалок, реально на СХД занято очень-очень мало места.

Вот как-то так.
>Вся прелесть такого подхода раскрывается в связке с дедупликацией

В случае интенсивной работы виртуалок с дисковой системой, когда кладутся и удаляются большие файлы, необходимо предусмотреть регулярное обнуление свободного пространства, чтобы онво дедуплицировалось и диски на СХД освободились для новых данных.
Вот-вот, я про это и говорю: должна быть поддержка команды TRIM на уровне виртуального блочного устройства… Сейчас в рассылку зена напишу.
Опять же не ясно, каким образом место от удалённых файлов будет возвращаться в общий пул.
Регулярное обнуление дискового пространства?
ну хранить не виртуальный образ, а напрямую использовать через nfs/smb
Veritas File System + Veritas Volume Manager.
Изменение размера образа диска по состоянию файловой системы виртуальной машины — прерогатива гипервизора. В качестве виртуального диска выделяется определенный файл, но менять его размер гостевая система не сможет, только гипервизор. То есть подобную функциональность стоит требовать от системы виртуализации, а не от файловой системы.
Думаю, можно создать 10 Тб сжатых нулей и использовать гипервизором в качестве диска, а в гостевой системе удалять данные с заполнением нулями.
Вопрос: почему гость не может попросить этого у гипервизора? (да, у гостя есть лимиты, но...)

Кстати, идея! Ведь есть команда TRIM, которую можно отлично эмулировать (со стороны гипервизора).

Пожалуй, над этой идеей стоит подумать…
По-моему автор немного смешал 2 понятия: из ОС у нас может быть доступ на уровне ФС и на уровне блочного устройства.

Блочное устройство позволяет гораздо больше, например довесить к некоторым типам ФС модули вроде квот, либо вообще сменить ФС, или совсем уж без ФС работать (tar на раздел к примеру или свап), а на ФС — теоретической возможности unerase пока еще неперезаписанных данных. Эти дополнительные возможности САМИ ПО СЕБЕ исключают возможность создания метаинформации о занятости/незанятости определенного места на блочном устройстве.

Однако чаще всего в типовых виртуалках (VPS/VDS) эти возможности не очень-то и нужны, и вполне достаточно было бы NFS/SMB-like (только с более упрощенным интерфейсом на хост-систему, чтобы не было оверхеда на сетевой стек) файловой системы с чуть более расширенными возможностями, вроде опять же, соответствующих ОС системе прав доступа, квот на иерархию (к примеру чтобы /var не занял все место, что сейчас реализуется размером раздела отчасти)… В принципе что-то вроде этого и реализовано в OpenVZ например, но это конечно же сугубо частное решение в плане ОСозависимости ;)

В общем, для решения проблемы ИМХО надо думать в сторону отказа от излишней промежуточной эмуляции блочного устройства.
так а nfs поддерживает упомянутые операции?
Да, только несколько в иной форме. NFS предполагается «общей» для разных VM: как только один гость удаляет файл, место сразу же доступно для других гостей для записи.
ну так её же можно реализовать через «паравиртуальный сетевой интерфейс»,
(paravirtualized network adapter), чтобы избавиться от расходов на лишнюю виртуализацию.
и будет всем счастие, наверно.
да, есть такое решение. Проблема только в учёте дисковых операций…
а какие проблемы с учётом операций?
Для блочного устройства мы (как гипервизор и особы к нему приближённые) можем точно знать, сколько было iops'ов и сколько байт было передано. В случае в NFS мы не можем знать, сколько IOPS'ов вызвала та или иная операция (точнее, мы не сможем выделить долю клиента в дисковых операциях NFS-сервера).
вот этот момент мне непонятен.

разве nfs-серверу не доступна информация какой клиент какие операции совершает?
разве это проблематично прикрутить?
nfs-сервер не знает, сколько он иопсов делает. Это знает внешний аккаунтинг. А внешний аккаунтинг не знает, какой из запросов NFS кому принадлежит.
вроде бы в NFSv4 есть учёт операций и даже квоты.
Квоты — да. А вот учёт операций, если покажете ссылку, буду очень благодарен.
а хотя какой нафик виртуальный сетевой интерфейс.
я ч-то-то туплю.
оно же через rpc работает. а их можно завернуть хоть через локальные сокеты, хоть через чёрталысого, специально адаптированного.

непонятно только, насколько существенны получатся расходы на rpc.
Ну, тут изобретать-то особо нечего: виртуальный сетевой адаптер, разворачивающийся в отдельный вилан. Вопрос только в одном: как это считать…
виртуальный сетевой адаптер съест заметную долю ресурсов на реализацию аппаратной части.
наверняка реализацию nfs можно существенно оптимизировать, если сделать другой транспортный уровень (не заморачиваясь физическим, канальным, сетевым).
М… Если мы про xen, то нет. Там паравиртуализация всего железа, накладные расходы стремятся к нулю (только на сетевой стек).
Выглядит как lvm-over-iscsi, динамического пула, с автоматическим выделением и освобождением места между виртуалками не вижу…
А можно спросить, какую практическую задачу вы хотите решить? Если я правильно понял по комментариям, все это про облачные хостинги. Тогда какие нужные преимущества для клиентов (или с точки зрения себестоимости?) такой online-resize даст? Может быть, есть другие способы этого добиться. Или не добиваться.
Ну, очевидное: если вы положили файл на 1Тб на 2 часа (временный дамп) то платить за него за месяц — глупо.
А nfs/cifs не подходит, потому что непонятно, как iops клиентов считать? Смотрели вокруг CONFIG_TASK_IO_ACCOUNTING и CONFIG_TASK_IO_THROTTLE? Не чистые iops, конечно, но и клиентам продать это будет сложнее (или невозможно), чем bandwidth до шары.
Ещё не смотрел. За кейворды спасибо.
>Сторонние утилиты умеют это делать, но не на ходу…

Dell ExtPart (36кБ, бесплатная) умеет увеличивать размер системного раздела «на ходу»
Вы неправильно понимаете «на ходу». На ходу — это не когда админ сказал «дайте мне ещё», а когда файловая система обнаружила, что на запрос нет свободного места и попросила ещё.
Кстати, а AFS разве этого не умеет?
за исключением системного раздела в винде можно и увеличивать и уменьшать разделы
вполне очевидно что это долго — ведь надо все файлы с освобождаемого места убрать
почему вы удивляетесь?
а на линуксе обычно сотни миллионов файлов, вот и 12 часов вам…
Трэд не читал но скажу. Полностью правильное решение должно включать в себя и файловую систему в госте — туда должен прокидываться не блок-девайс а блок-аллокатор. Такого похоже ещё нет.
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации