Существует ли простой способ перемещения подтомов btrfs в другую файловую систему btrfs?

метод № 1: с chsh

Обычно можно использовать команду chsh изменить Вашу оболочку, не имея необходимость иметь доступ к /etc/passwd. Это - файл, который обычно перечисляет Вашу оболочку по умолчанию, например:

saml:x:500:501:Sam M. (local):/home/saml:/bin/zsh

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

$ chsh --list-shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
/bin/zsh

Для изменения оболочки, можно использовать эту команду:

$ chsh -s /bin/zsh saml
Changing shell for saml.
Password: 
Shell changed.

Эффект очевиден, если Вы заглядываете /etc/passwd файл:

$ grep saml /etc/passwd
saml:x:500:501:Sam M. (local):/home/saml:/bin/zsh

Вы не будете сразу видеть изменения. Необходимо будет выйти из системы/войти для наблюдения его:

[saml@grinchy]~% echo $SHELL
/bin/zsh

метод № 2: /usr/bin/passwd -e

Если у Вас нет доступа к команде chsh который, по-видимому, Вы не делаете на Солярисе, и у Вас нет корневого доступа для изменения его в /etc/passwd, Вы смогли все еще делать то же с этой командой:

$ /usr/bin/passwd -e

метод № 3: вручную установите его метод

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

  1. оболочка по умолчанию:/bin/csh или/bin/tcsh

    Добавьте следующие строки к $HOME/.login:

    setenv SHELL=/bin/bash
    exec $SHELL
    
  2. оболочка по умолчанию:/bin/bash

    Добавьте следующее к $HOME/.bash_profile:

    export SHELL=/bin/zsh
    exec $SHELL
    

Некоторые дополнительные вещи рассмотреть с вышеупомянутым, можно сделать их более пуленепробиваемыми путем выполнения проверки, чтобы видеть, ли текущий $SHELL уже /bin/bash например, до установки его. Если это, ничего не сделайте, иначе идите вперед и выполните exec $SHELL.

Ссылки

5
28.06.2015, 15:02
2 ответа

Я почти уверен, что вам не обойтись без btrfs-send / btrfs-receive. Другой вариант - скопировать вложенные тома и затем дедуплицировать их в месте назначения, но это займет много времени.

Что касается проблемы только для чтения: поскольку это ежедневные снимки, разве большинство томов не доступны только для чтения?

Я бы сделал

$btrfs subvolume create /subvolumeA/source
$for i in /filesystemA/subvolume*; do btrfs subvolume snapshot -r $i /filesystemA/source/$i; done

Теперь у вас есть все подтомы в / filesystemA / source / readonly.

Теперь вы можете посылать их в цикле постепенно с помощью btrfs-send с родительским оператором в пункт назначения.

Если некоторые из снимков снова должны быть доступны для записи, вы можете скопировать их содержимое в новый доступный для записи подтом, используя cp --reflink .

2
27.01.2020, 20:41

Надеюсь, вы попали куда-нибудь со своим списком.Вы уверены, что команды property не задокументированы в этой версии? В этом ответе предлагается использовать команду типа btrfs property set -ts /path/to/snapshot ro true, чтобы исправить проблему.

Для будущих читателей: установите для новых моментальных снимков доступ только для чтения с параметром -r при их создании. Я использую что-то вроде этого в своем сценарии:

comm -23 \
    <(btrfs subvolume list -ors --sort=path /fsA/ | perl -ne 'print if s/.+?\spath\s+(.+)/\1/') \
    <(btrfs subvolume list -ors --sort=path /fsB/ | perl -ne 'print if s/.+?\spath\s+(.+)/\1/')

Это должно предоставить список доступных только для чтения томов моментальных снимков в файловой системе A, которые не в файловой системе В. Вы можете перебирать список, выполняя отправку/получение для каждого из них для синхронизации.

2
27.01.2020, 20:41

Теги

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