Чтобы увидеть, что на самом деле делает LXC, давайте создадим новый контейнер и проследим процесс его запуска черезstrace(1)
:
[root@localhost /]# lxc-create -n testcontainer -t debian
[root@localhost /]# strace -e trace=clone,chdir,mount,pivot_root,execve \
-f -o lxclog \
lxc-start -n testcontainer
Полученная трассировка записывается в lxclog файл, и здесь представлены наиболее важные ее части (многоточие добавлено мной, где опущены некоторые -несущественные вызовы):
14671 clone(child_stack=0x7fff9379eb80, flags=CLONE_NEWNS|CLONE_NEWUTS|CLONE_NEWIPC|CLONE_NEWPID|CLONE_NEWNET|SIGCHLD) = 14677
<...>
14677 mount("/var/lib/lxc/testcontainer/rootfs", "/usr/lib64/lxc/rootfs", 0x7fe4c2d10eac, MS_BIND|MS_REC, NULL) = 0
<...>
14677 chdir("/usr/lib64/lxc/rootfs") = 0
14677 pivot_root(".", "/usr/lib64/lxc/rootfs/lxc_putold") = 0
14677 chdir("/")
<...>
14677 execve("/sbin/init", ["/sbin/init"], [/* 1 var */]) = 0
Во-первых, новый процесс (PID 14677 )порождаетсяlxc-start
(PID 14671 )с использованием clone(2)
и помещается в новое пространство имен монтирования(CLONE_NEWNS
флаг ). Затем внутри этого нового пространства имен монтирования корневая файловая система контейнера(/var/lib/lxc/testcontainer/rootfs)привязывается -монтируется(MS_BIND
флаг )к /usr/lib64 /lxc/rootfs , который затем становится новым корнем. Наконец, когда инициализация контейнера завершена, процесс 14677 становится init
контейнера.
Здесь важно то, что корневой каталог пространства имен монтирования контейнера является привязкой монтирования каталога , принадлежащего корневой ФС хоста. Вот почему корневое монтирование контейнера по-прежнему имеет /dev/sda1 в качестве источника в выводе mount(8)
. Однако,также есть разница, которую не показывает mount(8)
-, чтобы увидеть ее, попробуйте findmnt(8)
внутри контейнера:
root@testcontainer:~# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1[/var/lib/lxc/testcontainer/rootfs]
Сравните это с выводом findmnt(8)
хост-системы:
[root@localhost /]# findmnt
TARGET SOURCE FSTYPE OPTIONS
/ /dev/sda1
Обратите внимание, что исходный такой же, но внутри контейнера вы также видите исходный каталог монтирования привязки.
the scroll bar is solid and won't work
Вы переключились на альтернативный буфер экрана. Konsole — один из нескольких эмуляторов терминала, в котором альтернативный экранный буфер волшебным образом отличается от основного. Он волшебным образом не прокручивается и не имеет буфера прокрутки.
Переключитесь обратно с помощьюtput
:
tput te(имя терминальной информации для этой возможности
rmcup
)или с помощью моего портативного setterm
инструмента:setterm --altbuffer offили просто выведите управляющую последовательность (RM частного режима DEC 1047 )от руки с
printf
. setterm
. Направляющая ноша . Программное обеспечение. Я решил проблему, изменив локальную переменную окружения TERM. Я пробовал несколько вариантов этого при входе в удаленный сеанс через экран , но ни одна из стандартных эмуляций VT100 / xterm не имела никакого значения.
Проблема, по-видимому, связана с экраном , принимающим определение терминала сеанса консоли и создающим на лету другой TERMCAP. Решение состоит в том, чтобы изменить переменную среды TERM :" TERM=vt100 ssh -t user@host screen -RR " для сеанса. Полученный TERMCAP имеет правильное поведение полосы прокрутки.
Не уверен, что это имеет смысл, но мне помогло.