€•Œsphinx.addnodes”Œdocument”“”)�”}”(Œ rawsource”Œ”Œchildren”]”(Œ translations”Œ LanguagesNode”“”)�”}”(hhh]”(hŒ pending_xref”“”)�”}”(hhh]”Œdocutils.nodes”ŒText”“”ŒChinese (Simplified)”…”�”}”Œparent”hsbaŒ attributes”}”(Œids”]”Œclasses”]”Œnames”]”Œdupnames”]”Œbackrefs”]”Œ refdomain”Œstd”Œreftype”Œdoc”Œ reftarget”Œ5/translations/zh_CN/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuŒtagname”hhh ubh)�”}”(hhh]”hŒChinese (Traditional)”…”�”}”hh2sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/zh_TW/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒItalian”…”�”}”hhFsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/it_IT/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒJapanese”…”�”}”hhZsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ja_JP/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒKorean”…”�”}”hhnsbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/ko_KR/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒPortuguese (Brazilian)”…”�”}”hh‚sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/pt_BR/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubh)�”}”(hhh]”hŒSpanish”…”�”}”hh–sbah}”(h]”h ]”h"]”h$]”h&]”Œ refdomain”h)Œreftype”h+Œ reftarget”Œ5/translations/sp_SP/virt/uml/user_mode_linux_howto_v2”Œmodname”NŒ classname”NŒ refexplicit”ˆuh1hhh ubeh}”(h]”h ]”h"]”h$]”h&]”Œcurrent_language”ŒEnglish”uh1h hhŒ _document”hŒsource”NŒline”NubhŒcomment”“”)�”}”(hŒ SPDX-License-Identifier: GPL-2.0”h]”hŒ SPDX-License-Identifier: GPL-2.0”…”�”}”hh·sbah}”(h]”h ]”h"]”h$]”h&]”Œ xml:space”Œpreserve”uh1hµhhh²hh³ŒO/var/lib/git/docbuild/linux/Documentation/virt/uml/user_mode_linux_howto_v2.rst”h´KubhŒsection”“”)�”}”(hhh]”(hŒtitle”“”)�”}”(hŒ UML HowTo”h]”hŒ UML HowTo”…”�”}”(hhÏh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hÍhhÊh²hh³hÇh´KubhŒtopic”“”)�”}”(hhh]”hŒ bullet_list”“”)�”}”(hhh]”(hŒ list_item”“”)�”}”(hhh]”(hŒ paragraph”“”)�”}”(hhh]”hŒ reference”“”)�”}”(hhh]”hŒ Introduction”…”�”}”(hhóh²hh³Nh´Nubah}”(h]”Œid1”ah ]”h"]”h$]”h&]”Œrefid”Œ introduction”uh1hñhhîubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhhéubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ>How is UML Different from a VM using Virtualization package X?”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid2”ah ]”h"]”h$]”h&]”Œrefid”Œ=how-is-uml-different-from-a-vm-using-virtualization-package-x”uh1hñhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ!Why Would I Want User Mode Linux?”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”Œid3”ah ]”h"]”h$]”h&]”Œrefid”Œ why-would-i-want-user-mode-linux”uh1hñhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒWhy not to run UML”…”�”}”(hjVh²hh³Nh´Nubah}”(h]”Œid4”ah ]”h"]”h$]”h&]”Œrefid”Œwhy-not-to-run-uml”uh1hñhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhhéubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒBuilding a UML instance”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”Œid5”ah ]”h"]”h$]”h&]”Œrefid”Œbuilding-a-uml-instance”uh1hñhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj~ubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒCreating an image”…”�”}”(hj£h²hh³Nh´Nubah}”(h]”Œid6”ah ]”h"]”h$]”h&]”Œrefid”Œcreating-an-image”uh1hñhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjšubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒEdit key system files”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”Œid7”ah ]”h"]”h$]”h&]”Œrefid”Œedit-key-system-files”uh1hñhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjšubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhj~ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒSetting Up UML Networking”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”Œid8”ah ]”h"]”h$]”h&]”Œrefid”Œsetting-up-uml-networking”uh1hñhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjíubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Network configuration privileges”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid9”ah ]”h"]”h$]”h&]”Œrefid”Œ network-configuration-privileges”uh1hñhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj ubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒConfiguring vector transports”…”�”}”(hj4h²hh³Nh´Nubah}”(h]”Œid10”ah ]”h"]”h$]”h&]”Œrefid”Œconfiguring-vector-transports”uh1hñhj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj.ubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒCommon options”…”�”}”(hjSh²hh³Nh´Nubah}”(h]”Œid11”ah ]”h"]”h$]”h&]”Œrefid”Œcommon-options”uh1hñhjPubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjMubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒShared Options”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”Œid12”ah ]”h"]”h$]”h&]”Œrefid”Œshared-options”uh1hñhjrubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjoubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ tap transport”…”�”}”(hj—h²hh³Nh´Nubah}”(h]”Œid13”ah ]”h"]”h$]”h&]”Œrefid”Œ tap-transport”uh1hñhj”ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒhybrid transport”…”�”}”(hj¹h²hh³Nh´Nubah}”(h]”Œid14”ah ]”h"]”h$]”h&]”Œrefid”Œhybrid-transport”uh1hñhj¶ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj³ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒraw socket transport”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”Œid15”ah ]”h"]”h$]”h&]”Œrefid”Œraw-socket-transport”uh1hñhjØubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒGRE socket transport”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”Œid16”ah ]”h"]”h$]”h&]”Œrefid”Œgre-socket-transport”uh1hñhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒl2tpv3 socket transport”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid17”ah ]”h"]”h$]”h&]”Œrefid”Œl2tpv3-socket-transport”uh1hñhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒBESS socket transport”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”Œid18”ah ]”h"]”h$]”h&]”Œrefid”Œbess-socket-transport”uh1hñhj>ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒVDE vector transport”…”�”}”(hjch²hh³Nh´Nubah}”(h]”Œid19”ah ]”h"]”h$]”h&]”Œrefid”Œvde-vector-transport”uh1hñhj`ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjJubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhj.ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhj ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhjíubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Running UML”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”Œid20”ah ]”h"]”h$]”h&]”Œrefid”Œ running-uml”uh1hñhjšubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj—ubhã)�”}”(hhh]”(hè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Arguments”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”Œid21”ah ]”h"]”h$]”h&]”Œrefid”Œ arguments”uh1hñhj¹ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj¶ubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒMandatory Arguments:”…”�”}”(hjÛh²hh³Nh´Nubah}”(h]”Œid22”ah ]”h"]”h$]”h&]”Œrefid”Œmandatory-arguments”uh1hñhjØubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjÕubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÒubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒImportant Optional Arguments”…”�”}”(hjýh²hh³Nh´Nubah}”(h]”Œid23”ah ]”h"]”h$]”h&]”Œrefid”Œimportant-optional-arguments”uh1hñhjúubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj÷ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÒubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhj¶ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhj³ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Starting UML”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”Œid24”ah ]”h"]”h$]”h&]”Œrefid”Œ starting-uml”uh1hñhj(ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj%ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj³ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Logging in”…”�”}”(hjMh²hh³Nh´Nubah}”(h]”Œid25”ah ]”h"]”h$]”h&]”Œrefid”Œ logging-in”uh1hñhjJubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjGubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj³ubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒThe UML Management Console”…”�”}”(hjoh²hh³Nh´Nubah}”(h]”Œid26”ah ]”h"]”h$]”h&]”Œrefid”Œthe-uml-management-console”uh1hñhjlubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjiubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒversion”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”Œid27”ah ]”h"]”h$]”h&]”Œrefid”Œversion”uh1hñhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjˆubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒhelp”…”�”}”(hj°h²hh³Nh´Nubah}”(h]”Œid28”ah ]”h"]”h$]”h&]”Œrefid”Œhelp”uh1hñhj­ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjªubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒhalt and reboot”…”�”}”(hjÒh²hh³Nh´Nubah}”(h]”Œid29”ah ]”h"]”h$]”h&]”Œrefid”Œhalt-and-reboot”uh1hñhjÏubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjÌubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒconfig”…”�”}”(hjôh²hh³Nh´Nubah}”(h]”Œid30”ah ]”h"]”h$]”h&]”Œrefid”Œconfig”uh1hñhjñubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjîubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒremove”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid31”ah ]”h"]”h$]”h&]”Œrefid”Œremove”uh1hñhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒsysrq”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”Œid32”ah ]”h"]”h$]”h&]”Œrefid”Œsysrq”uh1hñhj5ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj2ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒcad”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”Œid33”ah ]”h"]”h$]”h&]”Œrefid”Œcad”uh1hñhjWubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjTubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒstop”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”Œid34”ah ]”h"]”h$]”h&]”Œrefid”Œstop”uh1hñhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒgo”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”Œid35”ah ]”h"]”h$]”h&]”Œrefid”Œgo”uh1hñhj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒproc”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”Œid36”ah ]”h"]”h$]”h&]”Œrefid”Œproc”uh1hñhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒstack”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”Œid37”ah ]”h"]”h$]”h&]”Œrefid”Œstack”uh1hñhjßubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjÜubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj…ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhjiubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhj³ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhj—ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒAdvanced UML Topics”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid38”ah ]”h"]”h$]”h&]”Œrefid”Œadvanced-uml-topics”uh1hñhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjubhã)�”}”(hhh]”(hè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ,Sharing Filesystems between Virtual Machines”…”�”}”(hj;h²hh³Nh´Nubah}”(h]”Œid39”ah ]”h"]”h$]”h&]”Œrefid”Œ,sharing-filesystems-between-virtual-machines”uh1hñhj8ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj5ubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒUsing layered block devices”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”Œid40”ah ]”h"]”h$]”h&]”Œrefid”Œusing-layered-block-devices”uh1hñhjWubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjTubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjQubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Disk Usage”…”�”}”(hj|h²hh³Nh´Nubah}”(h]”Œid41”ah ]”h"]”h$]”h&]”Œrefid”Œ disk-usage”uh1hñhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjQubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ COW validity.”…”�”}”(hjžh²hh³Nh´Nubah}”(h]”Œid42”ah ]”h"]”h$]”h&]”Œrefid”Œ cow-validity”uh1hñhj›ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj˜ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjQubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒACows can moo - uml_moo : Merging a COW file with its backing file”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”Œid43”ah ]”h"]”h$]”h&]”Œrefid”Œ=cows-can-moo-uml-moo-merging-a-cow-file-with-its-backing-file”uh1hñhj½ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjºubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjQubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhj5ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhj2ubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒHost file access”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”Œid44”ah ]”h"]”h$]”h&]”Œrefid”Œhost-file-access”uh1hñhjëubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjèubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Using hostfs”…”�”}”(hj h²hh³Nh´Nubah}”(h]”Œid45”ah ]”h"]”h$]”h&]”Œrefid”Œ using-hostfs”uh1hñhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒhostfs as the root filesystem”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”Œid46”ah ]”h"]”h$]”h&]”Œrefid”Œhostfs-as-the-root-filesystem”uh1hñhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj)ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒHostfs Caveats”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”Œid47”ah ]”h"]”h$]”h&]”Œrefid”Œhostfs-caveats”uh1hñhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhjèubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhj2ubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Tuning UML”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid48”ah ]”h"]”h$]”h&]”Œrefid”Œ tuning-uml”uh1hñhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjyubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj2ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhjubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ+Contributing to UML and Developing with UML”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”Œid49”ah ]”h"]”h$]”h&]”Œrefid”Œ+contributing-to-uml-and-developing-with-uml”uh1hñhjªubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj§ubhã)�”}”(hhh]”(hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒ Tracing UML”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”Œid50”ah ]”h"]”h$]”h&]”Œrefid”Œ tracing-uml”uh1hñhjÉubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjÆubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÃubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒKernel debugging”…”�”}”(hjîh²hh³Nh´Nubah}”(h]”Œid51”ah ]”h"]”h$]”h&]”Œrefid”Œkernel-debugging”uh1hñhjëubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjèubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÃubhè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒDeveloping Device Drivers”…”�”}”(hjh²hh³Nh´Nubah}”(h]”Œid52”ah ]”h"]”h$]”h&]”Œrefid”Œdeveloping-device-drivers”uh1hñhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÃubhè)�”}”(hhh]”(hí)�”}”(hhh]”hò)�”}”(hhh]”hŒUsing UML as a Test Platform”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”Œid53”ah ]”h"]”h$]”h&]”Œrefid”Œusing-uml-as-a-test-platform”uh1hñhj/ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj,ubhã)�”}”(hhh]”hè)�”}”(hhh]”hí)�”}”(hhh]”hò)�”}”(hhh]”hŒSecurity Considerations”…”�”}”(hjQh²hh³Nh´Nubah}”(h]”Œid54”ah ]”h"]”h$]”h&]”Œrefid”Œsecurity-considerations”uh1hñhjNubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhjKubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjHubah}”(h]”h ]”h"]”h$]”h&]”uh1hâhj,ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÃubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhj§ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhhäubeh}”(h]”h ]”h"]”h$]”h&]”uh1hâhhßh²hh³Nh´Nubah}”(h]”Œcontents”ah ]”(Œcontents”Œlocal”eh"]”Œcontents”ah$]”h&]”uh1hÝh³hÇh´KhhÊh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Introduction”h]”hŒ Introduction”…”�”}”(hj˜h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefid”hüuh1hÍhj•h²hh³hÇh´K ubhí)�”}”(hŒWelcome to User Mode Linux”h]”hŒWelcome to User Mode Linux”…”�”}”(hj§h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´K hj•h²hubhí)�”}”(hŒŒUser Mode Linux is the first Open Source virtualization platform (first release date 1991) and second virtualization platform for an x86 PC.”h]”hŒŒUser Mode Linux is the first Open Source virtualization platform (first release date 1991) and second virtualization platform for an x86 PC.”…”�”}”(hjµh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Khj•h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ>How is UML Different from a VM using Virtualization package X?”h]”hŒ>How is UML Different from a VM using Virtualization package X?”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦juh1hÍhjÃh²hh³hÇh´Kubhí)�”}”(hX—We have come to assume that virtualization also means some level of hardware emulation. In fact, it does not. As long as a virtualization package provides the OS with devices which the OS can recognize and has a driver for, the devices do not need to emulate real hardware. Most OSes today have built-in support for a number of "fake" devices used only under virtualization. User Mode Linux takes this concept to the ultimate extreme - there is not a single real device in sight. It is 100% artificial or if we use the correct term 100% paravirtual. All UML devices are abstract concepts which map onto something provided by the host - files, sockets, pipes, etc.”h]”hX›We have come to assume that virtualization also means some level of hardware emulation. In fact, it does not. As long as a virtualization package provides the OS with devices which the OS can recognize and has a driver for, the devices do not need to emulate real hardware. Most OSes today have built-in support for a number of “fakeâ€� devices used only under virtualization. User Mode Linux takes this concept to the ultimate extreme - there is not a single real device in sight. It is 100% artificial or if we use the correct term 100% paravirtual. All UML devices are abstract concepts which map onto something provided by the host - files, sockets, pipes, etc.”…”�”}”(hjÔh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KhjÃh²hubhí)�”}”(hX\The other major difference between UML and various virtualization packages is that there is a distinct difference between the way the UML kernel and the UML programs operate. The UML kernel is just a process running on Linux - same as any other program. It can be run by an unprivileged user and it does not require anything in terms of special CPU features. The UML userspace, however, is a bit different. The Linux kernel on the host machine assists UML in intercepting everything the program running on a UML instance is trying to do and making the UML kernel handle all of its requests. This is different from other virtualization packages which do not make any difference between the guest kernel and guest programs. This difference results in a number of advantages and disadvantages of UML over let's say QEMU which we will cover later in this document.”h]”hX^The other major difference between UML and various virtualization packages is that there is a distinct difference between the way the UML kernel and the UML programs operate. The UML kernel is just a process running on Linux - same as any other program. It can be run by an unprivileged user and it does not require anything in terms of special CPU features. The UML userspace, however, is a bit different. The Linux kernel on the host machine assists UML in intercepting everything the program running on a UML instance is trying to do and making the UML kernel handle all of its requests. This is different from other virtualization packages which do not make any difference between the guest kernel and guest programs. This difference results in a number of advantages and disadvantages of UML over let’s say QEMU which we will cover later in this document.”…”�”}”(hjâh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´K!hjÃh²hubeh}”(h]”j!ah ]”h"]”Œ>how is uml different from a vm using virtualization package x?”ah$]”h&]”uh1hÈhj•h²hh³hÇh´KubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ!Why Would I Want User Mode Linux?”h]”hŒ!Why Would I Want User Mode Linux?”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j=uh1hÍhj÷h²hh³hÇh´K2ubhã)�”}”(hhh]”(hè)�”}”(hŒÖIf User Mode Linux kernel crashes, your host kernel is still fine. It is not accelerated in any way (vhost, kvm, etc) and it is not trying to access any devices directly. It is, in fact, a process like any other. ”h]”hí)�”}”(hŒÕIf User Mode Linux kernel crashes, your host kernel is still fine. It is not accelerated in any way (vhost, kvm, etc) and it is not trying to access any devices directly. It is, in fact, a process like any other.”h]”hŒÕIf User Mode Linux kernel crashes, your host kernel is still fine. It is not accelerated in any way (vhost, kvm, etc) and it is not trying to access any devices directly. It is, in fact, a process like any other.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´K5hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj h²hh³hÇh´Nubhè)�”}”(hŒuYou can run a usermode kernel as a non-root user (you may need to arrange appropriate permissions for some devices). ”h]”hí)�”}”(hŒtYou can run a usermode kernel as a non-root user (you may need to arrange appropriate permissions for some devices).”h]”hŒtYou can run a usermode kernel as a non-root user (you may need to arrange appropriate permissions for some devices).”…”�”}”(hj' h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´K9hj# ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj h²hh³hÇh´Nubhè)�”}”(hŒdYou can run a very small VM with a minimal footprint for a specific task (for example 32M or less). ”h]”hí)�”}”(hŒcYou can run a very small VM with a minimal footprint for a specific task (for example 32M or less).”h]”hŒcYou can run a very small VM with a minimal footprint for a specific task (for example 32M or less).”…”�”}”(hj? h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´K 8Gbit”h]”hŒ> 8Gbit”…”�”}”(hj0 h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÈhj- ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjå ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒhybrid”h]”hŒhybrid”…”�”}”(hjP h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÊhjM ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjJ ubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hjg h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÊhjd ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjJ ubjw )�”}”(hhh]”hí)�”}”(hŒchecksum, tso, multipacket rx”h]”hŒchecksum, tso, multipacket rx”…”�”}”(hj~ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÊhj{ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjJ ubjw )�”}”(hhh]”hí)�”}”(hŒ> 6GBit”h]”hŒ> 6GBit”…”�”}”(hj• h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÊhj’ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjJ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒraw”h]”hŒraw”…”�”}”(hjµ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÌhj² ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¯ ubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hjÌ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÌhjÉ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¯ ubjw )�”}”(hhh]”hí)�”}”(hŒ"checksum, tso, multipacket rx, tx"”h]”hŒ$checksum, tso, multipacket rx, txâ€�”…”�”}”(hjã h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÌhjà ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¯ ubjw )�”}”(hhh]”hí)�”}”(hŒ> 6GBit”h]”hŒ> 6GBit”…”�”}”(hjú h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÌhj÷ ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¯ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒEoGRE”h]”hŒEoGRE”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÎhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hj1h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÎhj.ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjubjw )�”}”(hhh]”hí)�”}”(hŒmultipacket rx, tx”h]”hŒmultipacket rx, tx”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÎhjEubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjubjw )�”}”(hhh]”hí)�”}”(hŒ> 3Gbit”h]”hŒ> 3Gbit”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÎhj\ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒEol2tpv3”h]”hŒEol2tpv3”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÐhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjyubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hj–h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÐhj“ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjyubjw )�”}”(hhh]”hí)�”}”(hŒmultipacket rx, tx”h]”hŒmultipacket rx, tx”…”�”}”(hj­h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÐhjªubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjyubjw )�”}”(hhh]”hí)�”}”(hŒ> 3Gbit”h]”hŒ> 3Gbit”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÐhjÁubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjyubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒbess”h]”hŒbess”…”�”}”(hjäh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÒhjáubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjÞubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÒhjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjÞubjw )�”}”(hhh]”hí)�”}”(hŒmultipacket rx, tx”h]”hŒmultipacket rx, tx”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÒhjubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjÞubjw )�”}”(hhh]”hí)�”}”(hŒ> 3Gbit”h]”hŒ> 3Gbit”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÒhj&ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjÞubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒfd”h]”hŒfd”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÔhjFubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjCubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÔhj]ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjCubjw )�”}”(hhh]”hí)�”}”(hŒdependent on fd type”h]”hŒdependent on fd type”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÔhjtubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjCubjw )�”}”(hhh]”hí)�”}”(hŒvaries”h]”hŒvaries”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÔhj‹ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hjCubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubjr )�”}”(hhh]”(jw )�”}”(hhh]”hí)�”}”(hŒvde”h]”hŒvde”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÖhj«ubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¨ubjw )�”}”(hhh]”hí)�”}”(hŒvector”h]”hŒvector”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÖhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¨ubjw )�”}”(hhh]”hí)�”}”(hŒ!dep. on VDE VPN: Virt.Net Locator”h]”hŒ!dep. on VDE VPN: Virt.Net Locator”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÖhjÙubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¨ubjw )�”}”(hhh]”hí)�”}”(hŒvaries”h]”hŒvaries”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÖhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1jv hj¨ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jq hjâ ubeh}”(h]”h ]”h"]”h$]”h&]”uh1jà hj? ubeh}”(h]”h ]”h"]”h$]”h&]”Œcols”Kuh1j= hj: ubah}”(h]”h ]”h"]”h$]”h&]”uh1j8 hj h²hh³hÇh´Nubhã)�”}”(hhh]”(hè)�”}”(hŒgAll transports which have tso and checksum offloads can deliver speeds approaching 10G on TCP streams. ”h]”hí)�”}”(hŒfAll transports which have tso and checksum offloads can deliver speeds approaching 10G on TCP streams.”h]”hŒfAll transports which have tso and checksum offloads can deliver speeds approaching 10G on TCP streams.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÙhj#ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj h²hh³hÇh´Nubhè)�”}”(hŒaAll transports which have multi-packet rx and/or tx can deliver pps rates of up to 1Mps or more. ”h]”hí)�”}”(hŒ`All transports which have multi-packet rx and/or tx can deliver pps rates of up to 1Mps or more.”h]”hŒ`All transports which have multi-packet rx and/or tx can deliver pps rates of up to 1Mps or more.”…”�”}”(hj?h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KÜhj;ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj h²hh³hÇh´Nubhè)�”}”(hŒ~GRE and L2TPv3 allow connections to all of: local machine, remote machines, remote network devices and remote UML instances. ”h]”hí)�”}”(hŒ|GRE and L2TPv3 allow connections to all of: local machine, remote machines, remote network devices and remote UML instances.”h]”hŒ|GRE and L2TPv3 allow connections to all of: local machine, remote machines, remote network devices and remote UML instances.”…”�”}”(hjWh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´KßhjSubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´KÙhj h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Network configuration privileges”h]”hŒ Network configuration privileges”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦juh1hÍhjqh²hh³hÇh´Käubhí)�”}”(hŒÜThe majority of the supported networking modes need ``root`` privileges. For example, for vector transports, ``root`` privilege is required to fire an ioctl to setup the tun interface and/or use raw sockets where needed.”h]”(hŒ4The majority of the supported networking modes need ”…”�”}”(hj‚h²hh³Nh´Nubj“ )�”}”(hŒ``root``”h]”hŒroot”…”�”}”(hjŠh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj‚ubhŒ1 privileges. For example, for vector transports, ”…”�”}”(hj‚h²hh³Nh´Nubj“ )�”}”(hŒ``root``”h]”hŒroot”…”�”}”(hjœh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj‚ubhŒg privilege is required to fire an ioctl to setup the tun interface and/or use raw sockets where needed.”…”�”}”(hj‚h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Kæhjqh²hubhí)�”}”(hX*This can be achieved by granting the user a particular capability instead of running UML as root. In case of vector transport, a user can add the capability ``CAP_NET_ADMIN`` or ``CAP_NET_RAW`` to the uml binary. Thenceforth, UML can be run with normal user privileges, along with full networking.”h]”(hŒžThis can be achieved by granting the user a particular capability instead of running UML as root. In case of vector transport, a user can add the capability ”…”�”}”(hj´h²hh³Nh´Nubj“ )�”}”(hŒ``CAP_NET_ADMIN``”h]”hŒ CAP_NET_ADMIN”…”�”}”(hj¼h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj´ubhŒ or ”…”�”}”(hj´h²hh³Nh´Nubj“ )�”}”(hŒ``CAP_NET_RAW``”h]”hŒ CAP_NET_RAW”…”�”}”(hjÎh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj´ubhŒh to the uml binary. Thenceforth, UML can be run with normal user privileges, along with full networking.”…”�”}”(hj´h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Kêhjqh²hubhí)�”}”(hŒ For example::”h]”hŒ For example:”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Kðhjqh²hubj{ )�”}”(hŒ0# sudo setcap cap_net_raw,cap_net_admin+ep linux”h]”hŒ0# sudo setcap cap_net_raw,cap_net_admin+ep linux”…”�”}”hjôsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Kòhjqh²hubeh}”(h]”j!ah ]”h"]”Œ network configuration privileges”ah$]”h&]”uh1hÈhj h²hh³hÇh´KäubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒConfiguring vector transports”h]”hŒConfiguring vector transports”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j=uh1hÍhj h²hh³hÇh´Kõubhí)�”}”(hŒ/All vector transports support a similar syntax:”h]”hŒ/All vector transports support a similar syntax:”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´K÷hj h²hubhí)�”}”(hŒ]If X is the interface number as in vec0, vec1, vec2, etc, the general syntax for options is::”h]”hŒ\If X is the interface number as in vec0, vec1, vec2, etc, the general syntax for options is:”…”�”}”(hj(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Kùhj h²hubj{ )�”}”(hŒJvecX:transport="Transport Name",option=value,option=value,...,option=value”h]”hŒJvecX:transport="Transport Name",option=value,option=value,...,option=value”…”�”}”hj6sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Kühj h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒCommon options”h]”hŒCommon options”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j\uh1hÍhjDh²hh³hÇh´Kÿubhí)�”}”(hŒ,These options are common for all transports:”h]”hŒ,These options are common for all transports:”…”�”}”(hjUh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MhjDh²hubhã)�”}”(hhh]”(hè)�”}”(hX-``depth=int`` - sets the queue depth for vector IO. This is the amount of packets UML will attempt to read or write in a single system call. The default number is 64 and is generally sufficient for most applications that need throughput in the 2-4 Gbit range. Higher speeds may require larger values. ”h]”hí)�”}”(hX,``depth=int`` - sets the queue depth for vector IO. This is the amount of packets UML will attempt to read or write in a single system call. The default number is 64 and is generally sufficient for most applications that need throughput in the 2-4 Gbit range. Higher speeds may require larger values.”h]”(j“ )�”}”(hŒ ``depth=int``”h]”hŒ depth=int”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjjubhX - sets the queue depth for vector IO. This is the amount of packets UML will attempt to read or write in a single system call. The default number is 64 and is generally sufficient for most applications that need throughput in the 2-4 Gbit range. Higher speeds may require larger values.”…”�”}”(hjjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjfubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjch²hh³hÇh´Nubhè)�”}”(hŒ?``mac=XX:XX:XX:XX:XX`` - sets the interface MAC address value. ”h]”hí)�”}”(hŒ>``mac=XX:XX:XX:XX:XX`` - sets the interface MAC address value.”h]”(j“ )�”}”(hŒ``mac=XX:XX:XX:XX:XX``”h]”hŒmac=XX:XX:XX:XX:XX”…”�”}”(hj”h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj�ubhŒ( - sets the interface MAC address value.”…”�”}”(hj�h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M hjŒubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjch²hh³hÇh´Nubhè)�”}”(hXX``gro=[0,1]`` - sets GRO off or on. Enables receive/transmit offloads. The effect of this option depends on the host side support in the transport which is being configured. In most cases it will enable TCP segmentation and RX/TX checksumming offloads. The setting must be identical on the host side and the UML side. The UML kernel will produce warnings if it is not. For example, GRO is enabled by default on local machine interfaces (e.g. veth pairs, bridge, etc), so it should be enabled in UML in the corresponding UML transports (raw, tap, hybrid) in order for networking to operate correctly. ”h]”hí)�”}”(hXW``gro=[0,1]`` - sets GRO off or on. Enables receive/transmit offloads. The effect of this option depends on the host side support in the transport which is being configured. In most cases it will enable TCP segmentation and RX/TX checksumming offloads. The setting must be identical on the host side and the UML side. The UML kernel will produce warnings if it is not. For example, GRO is enabled by default on local machine interfaces (e.g. veth pairs, bridge, etc), so it should be enabled in UML in the corresponding UML transports (raw, tap, hybrid) in order for networking to operate correctly.”h]”(j“ )�”}”(hŒ ``gro=[0,1]``”h]”hŒ gro=[0,1]”…”�”}”(hjºh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¶ubhXJ - sets GRO off or on. Enables receive/transmit offloads. The effect of this option depends on the host side support in the transport which is being configured. In most cases it will enable TCP segmentation and RX/TX checksumming offloads. The setting must be identical on the host side and the UML side. The UML kernel will produce warnings if it is not. For example, GRO is enabled by default on local machine interfaces (e.g. veth pairs, bridge, etc), so it should be enabled in UML in the corresponding UML transports (raw, tap, hybrid) in order for networking to operate correctly.”…”�”}”(hj¶h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M hj²ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjch²hh³hÇh´Nubhè)�”}”(hŒ%``mtu=int`` - sets the interface MTU ”h]”hí)�”}”(hŒ$``mtu=int`` - sets the interface MTU”h]”(j“ )�”}”(hŒ ``mtu=int``”h]”hŒmtu=int”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjÜubhŒ - sets the interface MTU”…”�”}”(hjÜh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MhjØubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjch²hh³hÇh´Nubhè)�”}”(hŒ‰``headroom=int`` - adjusts the default headroom (32 bytes) reserved if a packet will need to be re-encapsulated into for instance VXLAN. ”h]”hí)�”}”(hŒˆ``headroom=int`` - adjusts the default headroom (32 bytes) reserved if a packet will need to be re-encapsulated into for instance VXLAN.”h]”(j“ )�”}”(hŒ``headroom=int``”h]”hŒ headroom=int”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjubhŒx - adjusts the default headroom (32 bytes) reserved if a packet will need to be re-encapsulated into for instance VXLAN.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjþubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjch²hh³hÇh´Nubhè)�”}”(hŒJ``vec=0`` - disable multipacket IO and fall back to packet at a time mode ”h]”hí)�”}”(hŒI``vec=0`` - disable multipacket IO and fall back to packet at a time mode”h]”(j“ )�”}”(hŒ ``vec=0``”h]”hŒvec=0”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj(ubhŒ@ - disable multipacket IO and fall back to packet at a time mode”…”�”}”(hj(h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhj$ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjch²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´MhjDh²hubeh}”(h]”jbah ]”h"]”Œcommon options”ah$]”h&]”uh1hÈhj h²hh³hÇh´KÿubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒShared Options”h]”hŒShared Options”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j~uh1hÍhjWh²hh³hÇh´Mubhã)�”}”(hhh]”(hè)�”}”(hŒ``ifname=str`` Transports which bind to a local network interface have a shared option - the name of the interface to bind to. ”h]”hí)�”}”(hŒ~``ifname=str`` Transports which bind to a local network interface have a shared option - the name of the interface to bind to.”h]”(j“ )�”}”(hŒ``ifname=str``”h]”hŒ ifname=str”…”�”}”(hjsh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjoubhŒp Transports which bind to a local network interface have a shared option - the name of the interface to bind to.”…”�”}”(hjoh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M hjkubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjhh²hh³hÇh´Nubhè)�”}”(hŒ·``src, dst, src_port, dst_port`` - all transports which use sockets which have the notion of source and destination and/or source port and destination port use these to specify them. ”h]”hí)�”}”(hŒ¶``src, dst, src_port, dst_port`` - all transports which use sockets which have the notion of source and destination and/or source port and destination port use these to specify them.”h]”(j“ )�”}”(hŒ ``src, dst, src_port, dst_port``”h]”hŒsrc, dst, src_port, dst_port”…”�”}”(hj™h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj•ubhŒ– - all transports which use sockets which have the notion of source and destination and/or source port and destination port use these to specify them.”…”�”}”(hj•h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M#hj‘ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjhh²hh³hÇh´Nubhè)�”}”(hXu``v6=[0,1]`` to specify if a v6 connection is desired for all transports which operate over IP. Additionally, for transports that have some differences in the way they operate over v4 and v6 (for example EoL2TPv3), sets the correct mode of operation. In the absence of this option, the socket type is determined based on what do the src and dst arguments resolve/parse to. ”h]”hí)�”}”(hXt``v6=[0,1]`` to specify if a v6 connection is desired for all transports which operate over IP. Additionally, for transports that have some differences in the way they operate over v4 and v6 (for example EoL2TPv3), sets the correct mode of operation. In the absence of this option, the socket type is determined based on what do the src and dst arguments resolve/parse to.”h]”(j“ )�”}”(hŒ ``v6=[0,1]``”h]”hŒv6=[0,1]”…”�”}”(hj¿h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj»ubhXh to specify if a v6 connection is desired for all transports which operate over IP. Additionally, for transports that have some differences in the way they operate over v4 and v6 (for example EoL2TPv3), sets the correct mode of operation. In the absence of this option, the socket type is determined based on what do the src and dst arguments resolve/parse to.”…”�”}”(hj»h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M'hj·ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjhh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´M hjWh²hubeh}”(h]”j„ah ]”h"]”Œshared options”ah$]”h&]”uh1hÈhj h²hh³hÇh´MubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ tap transport”h]”hŒ tap transport”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j uh1hÍhjêh²hh³hÇh´M/ubhí)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M1hjêh²hubj{ )�”}”(hŒ.vecX:transport=tap,ifname=tap0,depth=128,gro=1”h]”hŒ.vecX:transport=tap,ifname=tap0,depth=128,gro=1”…”�”}”hj sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M3hjêh²hubhí)�”}”(hŒnThis will connect vec0 to tap0 on the host. Tap0 must already exist (for example created using tunctl) and UP.”h]”hŒnThis will connect vec0 to tap0 on the host. Tap0 must already exist (for example created using tunctl) and UP.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M5hjêh²hubhí)�”}”(hŒÎtap0 can be configured as a point-to-point interface and given an IP address so that UML can talk to the host. Alternatively, it is possible to connect UML to a tap interface which is connected to a bridge.”h]”hŒÎtap0 can be configured as a point-to-point interface and given an IP address so that UML can talk to the host. Alternatively, it is possible to connect UML to a tap interface which is connected to a bridge.”…”�”}”(hj%h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M8hjêh²hubhí)�”}”(hXœWhile tap relies on the vector infrastructure, it is not a true vector transport at this point, because Linux does not support multi-packet IO on tap file descriptors for normal userspace apps like UML. This is a privilege which is offered only to something which can hook up to it at kernel level via specialized interfaces like vhost-net. A vhost-net like helper for UML is planned at some point in the future.”h]”hXœWhile tap relies on the vector infrastructure, it is not a true vector transport at this point, because Linux does not support multi-packet IO on tap file descriptors for normal userspace apps like UML. This is a privilege which is offered only to something which can hook up to it at kernel level via specialized interfaces like vhost-net. A vhost-net like helper for UML is planned at some point in the future.”…”�”}”(hj3h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M<hjêh²hubhí)�”}”(hŒ3Privileges required: tap transport requires either:”h]”hŒ3Privileges required: tap transport requires either:”…”�”}”(hjAh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MChjêh²hubhã)�”}”(hhh]”(hè)�”}”(hŒ€tap interface to exist and be created persistent and owned by the UML user using tunctl. Example ``tunctl -u uml-user -t tap0`` ”h]”hí)�”}”(hŒtap interface to exist and be created persistent and owned by the UML user using tunctl. Example ``tunctl -u uml-user -t tap0``”h]”(hŒatap interface to exist and be created persistent and owned by the UML user using tunctl. Example ”…”�”}”(hjVh²hh³Nh´Nubj“ )�”}”(hŒ``tunctl -u uml-user -t tap0``”h]”hŒtunctl -u uml-user -t tap0”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjVubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MEhjRubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjOh²hh³hÇh´Nubhè)�”}”(hŒ+binary to have ``CAP_NET_ADMIN`` privilege ”h]”hí)�”}”(hŒ*binary to have ``CAP_NET_ADMIN`` privilege”h]”(hŒbinary to have ”…”�”}”(hj|h²hh³Nh´Nubj“ )�”}”(hŒ``CAP_NET_ADMIN``”h]”hŒ CAP_NET_ADMIN”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj|ubhŒ privilege”…”�”}”(hj|h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MHhjxubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjOh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´MEhjêh²hubeh}”(h]”j¦ah ]”h"]”Œ tap transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´M/ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒhybrid transport”h]”hŒhybrid transport”…”�”}”(hj²h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jÂuh1hÍhj¯h²hh³hÇh´MKubhí)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hjÀh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MMhj¯h²hubj{ )�”}”(hŒ1vecX:transport=hybrid,ifname=tap0,depth=128,gro=1”h]”hŒ1vecX:transport=hybrid,ifname=tap0,depth=128,gro=1”…”�”}”hjÎsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´MOhj¯h²hubhí)�”}”(hŒÎThis is an experimental/demo transport which couples tap for transmit and a raw socket for receive. The raw socket allows multi-packet receive resulting in significantly higher packet rates than normal tap.”h]”hŒÎThis is an experimental/demo transport which couples tap for transmit and a raw socket for receive. The raw socket allows multi-packet receive resulting in significantly higher packet rates than normal tap.”…”�”}”(hjÜh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MQhj¯h²hubhí)�”}”(hŒ‚Privileges required: hybrid requires ``CAP_NET_RAW`` capability by the UML user as well as the requirements for the tap transport.”h]”(hŒ%Privileges required: hybrid requires ”…”�”}”(hjêh²hh³Nh´Nubj“ )�”}”(hŒ``CAP_NET_RAW``”h]”hŒ CAP_NET_RAW”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjêubhŒN capability by the UML user as well as the requirements for the tap transport.”…”�”}”(hjêh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MUhj¯h²hubeh}”(h]”•jÈah ]”h"]”Œhybrid transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´MKubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒraw socket transport”h]”hŒraw socket transport”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jäuh1hÍhjh²hh³hÇh´MYubhí)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M[hjh²hubj{ )�”}”(hŒ1vecX:transport=raw,ifname=p-veth0,depth=128,gro=1”h]”hŒ1vecX:transport=raw,ifname=p-veth0,depth=128,gro=1”…”�”}”hj0sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M]hjh²hubhí)�”}”(hŒØThis transport uses vector IO on raw sockets. While you can bind to any interface including a physical one, the most common use it to bind to the "peer" side of a veth pair with the other side configured on the host.”h]”hŒÜThis transport uses vector IO on raw sockets. While you can bind to any interface including a physical one, the most common use it to bind to the “peerâ€� side of a veth pair with the other side configured on the host.”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M`hjh²hubhí)�”}”(hŒ&Example host configuration for Debian:”h]”hŒ&Example host configuration for Debian:”…”�”}”(hjLh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mehjh²hubhí)�”}”(hŒ**/etc/network/interfaces**::”h]”(jã )�”}”(hŒ**/etc/network/interfaces**”h]”hŒ/etc/network/interfaces”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jâ hjZubhŒ:”…”�”}”(hjZh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mghjh²hubj{ )�”}”(hŒÍauto veth0 iface veth0 inet static address 192.168.4.1 netmask 255.255.255.252 broadcast 192.168.4.3 pre-up ip link add veth0 type veth peer name p-veth0 && \ ifconfig p-veth0 up”h]”hŒÍauto veth0 iface veth0 inet static address 192.168.4.1 netmask 255.255.255.252 broadcast 192.168.4.3 pre-up ip link add veth0 type veth peer name p-veth0 && \ ifconfig p-veth0 up”…”�”}”hjvsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Mihjh²hubhí)�”}”(hŒ'UML can now bind to p-veth0 like this::”h]”hŒ&UML can now bind to p-veth0 like this:”…”�”}”(hj„h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mqhjh²hubj{ )�”}”(hŒ1vec0:transport=raw,ifname=p-veth0,depth=128,gro=1”h]”hŒ1vec0:transport=raw,ifname=p-veth0,depth=128,gro=1”…”�”}”hj’sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Mshjh²hubhí)�”}”(hŒpIf the UML guest is configured with 192.168.4.2 and netmask 255.255.255.0 it can talk to the host on 192.168.4.1”h]”hŒpIf the UML guest is configured with 192.168.4.2 and netmask 255.255.255.0 it can talk to the host on 192.168.4.1”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mvhjh²hubhí)�”}”(hŒ�The raw transport also provides some support for offloading some of the filtering to the host. The two options to control it are:”h]”hŒ�The raw transport also provides some support for offloading some of the filtering to the host. The two options to control it are:”…”�”}”(hj®h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Myhjh²hubhã)�”}”(hhh]”(hè)�”}”(hŒI``bpffile=str`` filename of raw bpf code to be loaded as a socket filter ”h]”hí)�”}”(hŒH``bpffile=str`` filename of raw bpf code to be loaded as a socket filter”h]”(j“ )�”}”(hŒ``bpffile=str``”h]”hŒ bpffile=str”…”�”}”(hjÇh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjÃubhŒ9 filename of raw bpf code to be loaded as a socket filter”…”�”}”(hjÃh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M|hj¿ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj¼h²hh³hÇh´Nubhè)�”}”(hŒ™``bpfflash=int`` 0/1 allow loading of bpf from inside User Mode Linux. This option allows the use of the ethtool load firmware command to load bpf code. ”h]”hí)�”}”(hŒ˜``bpfflash=int`` 0/1 allow loading of bpf from inside User Mode Linux. This option allows the use of the ethtool load firmware command to load bpf code.”h]”(j“ )�”}”(hŒ``bpfflash=int``”h]”hŒ bpfflash=int”…”�”}”(hjíh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjéubhŒˆ 0/1 allow loading of bpf from inside User Mode Linux. This option allows the use of the ethtool load firmware command to load bpf code.”…”�”}”(hjéh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M~hjåubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj¼h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´M|hjh²hubhí)�”}”(hŒøIn either case the bpf code is loaded into the host kernel. While this is presently limited to legacy bpf syntax (not ebpf), it is still a security risk. It is not recommended to allow this unless the User Mode Linux instance is considered trusted.”h]”hŒøIn either case the bpf code is loaded into the host kernel. While this is presently limited to legacy bpf syntax (not ebpf), it is still a security risk. It is not recommended to allow this unless the User Mode Linux instance is considered trusted.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M‚hjh²hubhí)�”}”(hŒLPrivileges required: raw socket transport requires `CAP_NET_RAW` capability.”h]”(hŒ3Privileges required: raw socket transport requires ”…”�”}”(hjh²hh³Nh´NubhŒtitle_reference”“”)�”}”(hŒ `CAP_NET_RAW`”h]”hŒ CAP_NET_RAW”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j'hjubhŒ capability.”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M‡hjh²hubeh}”(h]”jêah ]”h"]”Œraw socket transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´MYubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒGRE socket transport”h]”hŒGRE socket transport”…”�”}”(hjKh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦juh1hÍhjHh²hh³hÇh´M‹ubhí)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hjYh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M�hjHh²hubj{ )�”}”(hŒ.vecX:transport=gre,src=$src_host,dst=$dst_host”h]”hŒ.vecX:transport=gre,src=$src_host,dst=$dst_host”…”�”}”hjgsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M�hjHh²hubhí)�”}”(hŒÑThis will configure an Ethernet over ``GRE`` (aka ``GRETAP`` or ``GREIRB``) tunnel which will connect the UML instance to a ``GRE`` endpoint at host dst_host. ``GRE`` supports the following additional options:”h]”(hŒ%This will configure an Ethernet over ”…”�”}”(hjuh²hh³Nh´Nubj“ )�”}”(hŒ``GRE``”h]”hŒGRE”…”�”}”(hj}h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjuubhŒ (aka ”…”�”}”(hjuh²hh³Nh´Nubj“ )�”}”(hŒ ``GRETAP``”h]”hŒGRETAP”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjuubhŒ or ”…”�”}”(hjuh²hh³Nh´Nubj“ )�”}”(hŒ ``GREIRB``”h]”hŒGREIRB”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjuubhŒ2) tunnel which will connect the UML instance to a ”…”�”}”(hjuh²hh³Nh´Nubj“ )�”}”(hŒ``GRE``”h]”hŒGRE”…”�”}”(hj³h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjuubhŒ endpoint at host dst_host. ”…”�”}”(hjuh²hh³Nh´Nubj“ )�”}”(hŒ``GRE``”h]”hŒGRE”…”�”}”(hjÅh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjuubhŒ+ supports the following additional options:”…”�”}”(hjuh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M’hjHh²hubhã)�”}”(hhh]”(hè)�”}”(hŒZ``rx_key=int`` - GRE 32-bit integer key for rx packets, if set, ``txkey`` must be set too ”h]”hí)�”}”(hŒY``rx_key=int`` - GRE 32-bit integer key for rx packets, if set, ``txkey`` must be set too”h]”(j“ )�”}”(hŒ``rx_key=int``”h]”hŒ rx_key=int”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjäubhŒ2 - GRE 32-bit integer key for rx packets, if set, ”…”�”}”(hjäh²hh³Nh´Nubj“ )�”}”(hŒ ``txkey``”h]”hŒtxkey”…”�”}”(hjúh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjäubhŒ must be set too”…”�”}”(hjäh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M—hjàubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÝh²hh³hÇh´Nubhè)�”}”(hŒZ``tx_key=int`` - GRE 32-bit integer key for tx packets, if set ``rx_key`` must be set too ”h]”hí)�”}”(hŒY``tx_key=int`` - GRE 32-bit integer key for tx packets, if set ``rx_key`` must be set too”h]”(j“ )�”}”(hŒ``tx_key=int``”h]”hŒ tx_key=int”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjubhŒ1 - GRE 32-bit integer key for tx packets, if set ”…”�”}”(hjh²hh³Nh´Nubj“ )�”}”(hŒ ``rx_key``”h]”hŒrx_key”…”�”}”(hj2h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjubhŒ must be set too”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mšhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÝh²hh³hÇh´Nubhè)�”}”(hŒ)``sequence=[0,1]`` - enable GRE sequence ”h]”hí)�”}”(hŒ(``sequence=[0,1]`` - enable GRE sequence”h]”(j“ )�”}”(hŒ``sequence=[0,1]``”h]”hŒsequence=[0,1]”…”�”}”(hjXh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjTubhŒ - enable GRE sequence”…”�”}”(hjTh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M�hjPubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÝh²hh³hÇh´Nubhè)�”}”(hŒ“``pin_sequence=[0,1]`` - pretend that the sequence is always reset on each packet (needed to interoperate with some really broken implementations) ”h]”hí)�”}”(hŒ’``pin_sequence=[0,1]`` - pretend that the sequence is always reset on each packet (needed to interoperate with some really broken implementations)”h]”(j“ )�”}”(hŒ``pin_sequence=[0,1]``”h]”hŒpin_sequence=[0,1]”…”�”}”(hj~h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjzubhŒ| - pretend that the sequence is always reset on each packet (needed to interoperate with some really broken implementations)”…”�”}”(hjzh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MŸhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÝh²hh³hÇh´Nubhè)�”}”(hŒ7``v6=[0,1]`` - force IPv4 or IPv6 sockets respectively ”h]”hí)�”}”(hŒ6``v6=[0,1]`` - force IPv4 or IPv6 sockets respectively”h]”(j“ )�”}”(hŒ ``v6=[0,1]``”h]”hŒv6=[0,1]”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj ubhŒ* - force IPv4 or IPv6 sockets respectively”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M£hjœubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÝh²hh³hÇh´Nubhè)�”}”(hŒ(GRE checksum is not presently supported ”h]”hí)�”}”(hŒ'GRE checksum is not presently supported”h]”hŒ'GRE checksum is not presently supported”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M¥hjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjÝh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´M—hjHh²hubhí)�”}”(hŒGRE has a number of caveats:”h]”hŒGRE has a number of caveats:”…”�”}”(hjàh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M§hjHh²hubhã)�”}”(hhh]”(hè)�”}”(hŒœYou can use only one GRE connection per IP address. There is no way to multiplex connections as each GRE tunnel is terminated directly on the UML instance. ”h]”hí)�”}”(hŒ›You can use only one GRE connection per IP address. There is no way to multiplex connections as each GRE tunnel is terminated directly on the UML instance.”h]”hŒ›You can use only one GRE connection per IP address. There is no way to multiplex connections as each GRE tunnel is terminated directly on the UML instance.”…”�”}”(hjõh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M©hjñubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjîh²hh³hÇh´Nubhè)�”}”(hŒ¶The key is not really a security feature. While it was intended as such its "security" is laughable. It is, however, a useful feature to ensure that the tunnel is not misconfigured. ”h]”hí)�”}”(hŒµThe key is not really a security feature. While it was intended as such its "security" is laughable. It is, however, a useful feature to ensure that the tunnel is not misconfigured.”h]”hŒ¹The key is not really a security feature. While it was intended as such its “securityâ€� is laughable. It is, however, a useful feature to ensure that the tunnel is not misconfigured.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M­hj ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjîh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´M©hjHh²hubhí)�”}”(hŒ}An example configuration for a Linux host with a local address of 192.168.128.1 to connect to a UML instance at 192.168.129.1”h]”hŒ}An example configuration for a Linux host with a local address of 192.168.128.1 to connect to a UML instance at 192.168.129.1”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M±hjHh²hubhí)�”}”(hŒ**/etc/network/interfaces**::”h]”(jã )�”}”(hŒ**/etc/network/interfaces**”h]”hŒ/etc/network/interfaces”…”�”}”(hj9h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jâ hj5ubhŒ:”…”�”}”(hj5h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M´hjHh²hubj{ )�”}”(hŒäauto gt0 iface gt0 inet static address 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 mtu 1500 pre-up ip link add gt0 type gretap local 192.168.128.1 \ remote 192.168.129.1 || true down ip link del gt0 || true”h]”hŒäauto gt0 iface gt0 inet static address 10.0.0.1 netmask 255.255.255.0 broadcast 10.0.0.255 mtu 1500 pre-up ip link add gt0 type gretap local 192.168.128.1 \ remote 192.168.129.1 || true down ip link del gt0 || true”…”�”}”hjQsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M¶hjHh²hubhí)�”}”(hŒHAdditionally, GRE has been tested versus a variety of network equipment.”h]”hŒHAdditionally, GRE has been tested versus a variety of network equipment.”…”�”}”(hj_h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÀhjHh²hubhí)�”}”(hŒ1Privileges required: GRE requires ``CAP_NET_RAW``”h]”(hŒ"Privileges required: GRE requires ”…”�”}”(hjmh²hh³Nh´Nubj“ )�”}”(hŒ``CAP_NET_RAW``”h]”hŒ CAP_NET_RAW”…”�”}”(hjuh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjmubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÂhjHh²hubeh}”(h]”j ah ]”h"]”Œgre socket transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´M‹ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒl2tpv3 socket transport”h]”hŒl2tpv3 socket transport”…”�”}”(hj“h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j(uh1hÍhj�h²hh³hÇh´MÅubhí)�”}”(hX_Warning_. L2TPv3 has a "bug". It is the "bug" known as "has more options than GNU ls". While it has some advantages, there are usually easier (and less verbose) ways to connect a UML instance to something. For example, most devices which support L2TPv3 also support GRE.”h]”hX_Warning_. L2TPv3 has a “bugâ€�. It is the “bugâ€� known as “has more options than GNU lsâ€�. While it has some advantages, there are usually easier (and less verbose) ways to connect a UML instance to something. For example, most devices which support L2TPv3 also support GRE.”…”�”}”(hj¡h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÇhj�h²hubhí)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÌhj�h²hubj{ )�”}”(hŒ�vec0:transport=l2tpv3,udp=1,src=$src_host,dst=$dst_host,srcport=$src_port,dstport=$dst_port,depth=128,rx_session=0xffffffff,tx_session=0xffff”h]”hŒ�vec0:transport=l2tpv3,udp=1,src=$src_host,dst=$dst_host,srcport=$src_port,dstport=$dst_port,depth=128,rx_session=0xffffffff,tx_session=0xffff”…”�”}”hj½sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´MÎhj�h²hubhí)�”}”(hŒÄThis will configure an Ethernet over L2TPv3 fixed tunnel which will connect the UML instance to a L2TPv3 endpoint at host $dst_host using the L2TPv3 UDP flavour and UDP destination port $dst_port.”h]”hŒÄThis will configure an Ethernet over L2TPv3 fixed tunnel which will connect the UML instance to a L2TPv3 endpoint at host $dst_host using the L2TPv3 UDP flavour and UDP destination port $dst_port.”…”�”}”(hjËh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÐhj�h²hubhí)�”}”(hŒ8L2TPv3 always requires the following additional options:”h]”hŒ8L2TPv3 always requires the following additional options:”…”�”}”(hjÙh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÔhj�h²hubhã)�”}”(hhh]”(hè)�”}”(hŒB``rx_session=int`` - l2tpv3 32-bit integer session for rx packets ”h]”hí)�”}”(hŒA``rx_session=int`` - l2tpv3 32-bit integer session for rx packets”h]”(j“ )�”}”(hŒ``rx_session=int``”h]”hŒrx_session=int”…”�”}”(hjòh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjîubhŒ/ - l2tpv3 32-bit integer session for rx packets”…”�”}”(hjîh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÖhjêubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjçh²hh³hÇh´Nubhè)�”}”(hŒB``tx_session=int`` - l2tpv3 32-bit integer session for tx packets ”h]”hí)�”}”(hŒA``tx_session=int`` - l2tpv3 32-bit integer session for tx packets”h]”(j“ )�”}”(hŒ``tx_session=int``”h]”hŒtx_session=int”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjubhŒ/ - l2tpv3 32-bit integer session for tx packets”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MØhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjçh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´MÖhj�h²hubhí)�”}”(hŒXAs the tunnel is fixed these are not negotiated and they are preconfigured on both ends.”h]”hŒXAs the tunnel is fixed these are not negotiated and they are preconfigured on both ends.”…”�”}”(hj<h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÚhj�h²hubhí)�”}”(hŒ@Additionally, L2TPv3 supports the following optional parameters.”h]”hŒ@Additionally, L2TPv3 supports the following optional parameters.”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÝhj�h²hubhã)�”}”(hhh]”(hè)�”}”(hŒŸ``rx_cookie=int`` - l2tpv3 32-bit integer cookie for rx packets - same functionality as GRE key, more to prevent misconfiguration than provide actual security ”h]”hí)�”}”(hŒž``rx_cookie=int`` - l2tpv3 32-bit integer cookie for rx packets - same functionality as GRE key, more to prevent misconfiguration than provide actual security”h]”(j“ )�”}”(hŒ``rx_cookie=int``”h]”hŒ rx_cookie=int”…”�”}”(hjch²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj_ubhŒ� - l2tpv3 32-bit integer cookie for rx packets - same functionality as GRE key, more to prevent misconfiguration than provide actual security”…”�”}”(hj_h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mßhj[ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubhè)�”}”(hŒ@``tx_cookie=int`` - l2tpv3 32-bit integer cookie for tx packets ”h]”hí)�”}”(hŒ?``tx_cookie=int`` - l2tpv3 32-bit integer cookie for tx packets”h]”(j“ )�”}”(hŒ``tx_cookie=int``”h]”hŒ tx_cookie=int”…”�”}”(hj‰h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj…ubhŒ. - l2tpv3 32-bit integer cookie for tx packets”…”�”}”(hj…h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mãhj�ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubhè)�”}”(hŒ;``cookie64=[0,1]`` - use 64-bit cookies instead of 32-bit. ”h]”hí)�”}”(hŒ:``cookie64=[0,1]`` - use 64-bit cookies instead of 32-bit.”h]”(j“ )�”}”(hŒ``cookie64=[0,1]``”h]”hŒcookie64=[0,1]”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj«ubhŒ( - use 64-bit cookies instead of 32-bit.”…”�”}”(hj«h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Måhj§ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubhè)�”}”(hŒ*``counter=[0,1]`` - enable l2tpv3 counter ”h]”hí)�”}”(hŒ)``counter=[0,1]`` - enable l2tpv3 counter”h]”(j“ )�”}”(hŒ``counter=[0,1]``”h]”hŒ counter=[0,1]”…”�”}”(hjÕh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjÑubhŒ - enable l2tpv3 counter”…”�”}”(hjÑh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MçhjÍubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubhè)�”}”(hŒ‘``pin_counter=[0,1]`` - pretend that the counter is always reset on each packet (needed to interoperate with some really broken implementations) ”h]”hí)�”}”(hŒ�``pin_counter=[0,1]`` - pretend that the counter is always reset on each packet (needed to interoperate with some really broken implementations)”h]”(j“ )�”}”(hŒ``pin_counter=[0,1]``”h]”hŒpin_counter=[0,1]”…”�”}”(hjûh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj÷ubhŒ{ - pretend that the counter is always reset on each packet (needed to interoperate with some really broken implementations)”…”�”}”(hj÷h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Méhjóubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubhè)�”}”(hŒ ``v6=[0,1]`` - force v6 sockets ”h]”hí)�”}”(hŒ``v6=[0,1]`` - force v6 sockets”h]”(j“ )�”}”(hŒ ``v6=[0,1]``”h]”hŒv6=[0,1]”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjubhŒ - force v6 sockets”…”�”}”(hjh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Míhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubhè)�”}”(hŒG``udp=[0,1]`` - use raw sockets (0) or UDP (1) version of the protocol ”h]”hí)�”}”(hŒF``udp=[0,1]`` - use raw sockets (0) or UDP (1) version of the protocol”h]”(j“ )�”}”(hŒ ``udp=[0,1]``”h]”hŒ udp=[0,1]”…”�”}”(hjGh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjCubhŒ9 - use raw sockets (0) or UDP (1) version of the protocol”…”�”}”(hjCh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mïhj?ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjXh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´Mßhj�h²hubhí)�”}”(hŒL2TPv3 has a number of caveats:”h]”hŒL2TPv3 has a number of caveats:”…”�”}”(hjkh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mñhj�h²hubhã)�”}”(hhh]”hè)�”}”(hŒÚyou can use only one connection per IP address in raw mode. There is no way to multiplex connections as each L2TPv3 tunnel is terminated directly on the UML instance. UDP mode can use different ports for this purpose. ”h]”hí)�”}”(hŒÙyou can use only one connection per IP address in raw mode. There is no way to multiplex connections as each L2TPv3 tunnel is terminated directly on the UML instance. UDP mode can use different ports for this purpose.”h]”hŒÙyou can use only one connection per IP address in raw mode. There is no way to multiplex connections as each L2TPv3 tunnel is terminated directly on the UML instance. UDP mode can use different ports for this purpose.”…”�”}”(hj€h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Móhj|ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjyh²hh³hÇh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´Móhj�h²hubhí)�”}”(hŒQHere is an example of how to configure a Linux host to connect to UML via L2TPv3:”h]”hŒQHere is an example of how to configure a Linux host to connect to UML via L2TPv3:”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Møhj�h²hubhí)�”}”(hŒ**/etc/network/interfaces**::”h]”(jã )�”}”(hŒ**/etc/network/interfaces**”h]”hŒ/etc/network/interfaces”…”�”}”(hj¬h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jâ hj¨ubhŒ:”…”�”}”(hj¨h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mûhj�h²hubj{ )�”}”(hXåauto l2tp1 iface l2tp1 inet static address 192.168.126.1 netmask 255.255.255.0 broadcast 192.168.126.255 mtu 1500 pre-up ip l2tp add tunnel remote 127.0.0.1 \ local 127.0.0.1 encap udp tunnel_id 2 \ peer_tunnel_id 2 udp_sport 1706 udp_dport 1707 && \ ip l2tp add session name l2tp1 tunnel_id 2 \ session_id 0xffffffff peer_session_id 0xffffffff down ip l2tp del session tunnel_id 2 session_id 0xffffffff && \ ip l2tp del tunnel tunnel_id 2”h]”hXåauto l2tp1 iface l2tp1 inet static address 192.168.126.1 netmask 255.255.255.0 broadcast 192.168.126.255 mtu 1500 pre-up ip l2tp add tunnel remote 127.0.0.1 \ local 127.0.0.1 encap udp tunnel_id 2 \ peer_tunnel_id 2 udp_sport 1706 udp_dport 1707 && \ ip l2tp add session name l2tp1 tunnel_id 2 \ session_id 0xffffffff peer_session_id 0xffffffff down ip l2tp del session tunnel_id 2 session_id 0xffffffff && \ ip l2tp del tunnel tunnel_id 2”…”�”}”hjÄsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Mýhj�h²hubhí)�”}”(hŒpPrivileges required: L2TPv3 requires ``CAP_NET_RAW`` for raw IP mode and no special privileges for the UDP mode.”h]”(hŒ%Privileges required: L2TPv3 requires ”…”�”}”(hjÒh²hh³Nh´Nubj“ )�”}”(hŒ``CAP_NET_RAW``”h]”hŒ CAP_NET_RAW”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjÒubhŒ< for raw IP mode and no special privileges for the UDP mode.”…”�”}”(hjÒh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M hj�h²hubeh}”(h]”j.ah ]”h"]”Œl2tpv3 socket transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´MÅubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒBESS socket transport”h]”hŒBESS socket transport”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jJuh1hÍhjùh²hh³hÇh´Mubhí)�”}”(hŒ2BESS is a high performance modular network switch.”h]”hŒ2BESS is a high performance modular network switch.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjùh²hubhí)�”}”(hŒhttps://github.com/NetSys/bess”h]”hò)�”}”(hjh]”hŒhttps://github.com/NetSys/bess”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”juh1hñhjubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjùh²hubhí)�”}”(hŒ„It has support for a simple sequential packet socket mode which in the more recent versions is using vector IO for high performance.”h]”hŒ„It has support for a simple sequential packet socket mode which in the more recent versions is using vector IO for high performance.”…”�”}”(hj0h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjùh²hubhí)�”}”(hŒ Example::”h]”hŒExample:”…”�”}”(hj>h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjùh²hubj{ )�”}”(hŒ/vecX:transport=bess,src=$unix_src,dst=$unix_dst”h]”hŒ/vecX:transport=bess,src=$unix_src,dst=$unix_dst”…”�”}”hjLsbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Mhjùh²hubhí)�”}”(hŒˆThis will configure a BESS transport using the unix_src Unix domain socket address as source and unix_dst socket address as destination.”h]”hŒˆThis will configure a BESS transport using the unix_src Unix domain socket address as source and unix_dst socket address as destination.”…”�”}”(hjZh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjùh²hubhí)�”}”(hŒlFor BESS configuration and how to allocate a BESS Unix domain socket port please see the BESS documentation.”h]”hŒlFor BESS configuration and how to allocate a BESS Unix domain socket port please see the BESS documentation.”…”�”}”(hjhh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M hjùh²hubhí)�”}”(hŒ>https://github.com/NetSys/bess/wiki/Built-In-Modules-and-Ports”h]”hò)�”}”(hjxh]”hŒ>https://github.com/NetSys/bess/wiki/Built-In-Modules-and-Ports”…”�”}”(hjzh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jxuh1hñhjvubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M#hjùh²hubhí)�”}”(hŒ7BESS transport does not require any special privileges.”h]”hŒ7BESS transport does not require any special privileges.”…”�”}”(hjŽh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M%hjùh²hubeh}”(h]”jPah ]”h"]”Œbess socket transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´MubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒVDE vector transport”h]”hŒVDE vector transport”…”�”}”(hj¦h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jluh1hÍhj£h²hh³hÇh´M(ubhí)�”}”(hŒVirtual Distributed Ethernet (VDE) is a project whose main goal is to provide a highly flexible support for virtual networking.”h]”hŒVirtual Distributed Ethernet (VDE) is a project whose main goal is to provide a highly flexible support for virtual networking.”…”�”}”(hj´h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M*hj£h²hubhí)�”}”(hŒ3http://wiki.virtualsquare.org/#/tutorials/vdebasics”h]”hò)�”}”(hjÄh]”hŒ3http://wiki.virtualsquare.org/#/tutorials/vdebasics”…”�”}”(hjÆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”jÄuh1hñhjÂubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M-hj£h²hubhí)�”}”(hŒ;Common usages of VDE include fast prototyping and teaching.”h]”hŒ;Common usages of VDE include fast prototyping and teaching.”…”�”}”(hjÚh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M/hj£h²hubhí)�”}”(hŒ Examples:”h]”hŒ Examples:”…”�”}”(hjèh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M1hj£h²hubhŒ block_quote”“”)�”}”(hŒ&``vecX:transport=vde,vnl=tap://tap0`` ”h]”hí)�”}”(hŒ%``vecX:transport=vde,vnl=tap://tap0``”h]”j“ )�”}”(hjþh]”hŒ!vecX:transport=vde,vnl=tap://tap0”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjüubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M3hjøubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´M3hj£h²hubhí)�”}”(hŒuse tap0”h]”hŒuse tap0”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M5hj£h²hubj÷)�”}”(hŒ$``vecX:transport=vde,vnl=slirp://`` ”h]”hí)�”}”(hŒ#``vecX:transport=vde,vnl=slirp://``”h]”j“ )�”}”(hj-h]”hŒvecX:transport=vde,vnl=slirp://”…”�”}”(hj/h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj+ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M7hj'ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´M7hj£h²hubhí)�”}”(hŒ use slirp”h]”hŒ use slirp”…”�”}”(hjHh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M9hj£h²hubj÷)�”}”(hŒ-``vec0:transport=vde,vnl=vde:///tmp/switch`` ”h]”hí)�”}”(hŒ,``vec0:transport=vde,vnl=vde:///tmp/switch``”h]”j“ )�”}”(hj\h]”hŒ(vec0:transport=vde,vnl=vde:///tmp/switch”…”�”}”(hj^h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M;hjVubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´M;hj£h²hubhí)�”}”(hŒconnect to a vde switch”h]”hŒconnect to a vde switch”…”�”}”(hjwh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M=hj£h²hubj÷)�”}”(hŒC``vecX:transport=\"vde,vnl=cmd://ssh remote.host //tmp/sshlirp\"`` ”h]”hí)�”}”(hŒB``vecX:transport=\"vde,vnl=cmd://ssh remote.host //tmp/sshlirp\"``”h]”j“ )�”}”(hŒB``vecX:transport=\"vde,vnl=cmd://ssh remote.host //tmp/sshlirp\"``”h]”hŒ>vecX:transport=\"vde,vnl=cmd://ssh remote.host //tmp/sshlirp\"”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj‰ubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M?hj…ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´M?hj£h²hubhí)�”}”(hŒuconnect to a remote slirp (instant VPN: convert ssh to VPN, it uses sshlirp) https://github.com/virtualsquare/sshlirp”h]”(hŒMconnect to a remote slirp (instant VPN: convert ssh to VPN, it uses sshlirp) ”…”�”}”(hj§h²hh³Nh´Nubhò)�”}”(hŒ(https://github.com/virtualsquare/sshlirp”h]”hŒ(https://github.com/virtualsquare/sshlirp”…”�”}”(hj¯h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œrefuri”j±uh1hñhj§ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MAhj£h²hubj÷)�”}”(hŒ-``vec0:transport=vde,vnl=vxvde://234.0.0.1`` ”h]”hí)�”}”(hŒ,``vec0:transport=vde,vnl=vxvde://234.0.0.1``”h]”j“ )�”}”(hjÊh]”hŒ(vec0:transport=vde,vnl=vxvde://234.0.0.1”…”�”}”(hjÌh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjÈubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MDhjÄubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´MDhj£h²hubhí)�”}”(hŒÀconnect to a local area cloud (all the UML nodes using the same multicast address running on hosts in the same multicast domain (LAN) will be automagically connected together to a virtual LAN.”h]”hŒÀconnect to a local area cloud (all the UML nodes using the same multicast address running on hosts in the same multicast domain (LAN) will be automagically connected together to a virtual LAN.”…”�”}”(hjåh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MFhj£h²hubeh}”(h]”jrah ]”h"]”Œvde vector transport”ah$]”h&]”uh1hÈhj h²hh³hÇh´M(ubeh}”(h]”jCah ]”h"]”Œconfiguring vector transports”ah$]”h&]”uh1hÈhj h²hh³hÇh´Kõubeh}”(h]”jah ]”h"]”Œsetting up uml networking”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´K»ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Running UML”h]”hŒ Running UML”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j¦uh1hÍhjh²hh³hÇh´MLubhí)�”}”(hŒ‹This section assumes that either the user-mode-linux package from the distribution or a custom built kernel has been installed on the host.”h]”hŒ‹This section assumes that either the user-mode-linux package from the distribution or a custom built kernel has been installed on the host.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MNhjh²hubhí)�”}”(hXThese add an executable called linux to the system. This is the UML kernel. It can be run just like any other executable. It will take most normal linux kernel arguments as command line arguments. Additionally, it will need some UML-specific arguments in order to do something useful.”h]”hXThese add an executable called linux to the system. This is the UML kernel. It can be run just like any other executable. It will take most normal linux kernel arguments as command line arguments. Additionally, it will need some UML-specific arguments in order to do something useful.”…”�”}”(hj'h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MQhjh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Arguments”h]”hŒ Arguments”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jÅuh1hÍhj5h²hh³hÇh´MXubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒMandatory Arguments:”h]”hŒMandatory Arguments:”…”�”}”(hjIh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jäuh1hÍhjFh²hh³hÇh´M[ubhã)�”}”(hhh]”(hè)�”}”(hŒf``mem=int[K,M,G]`` - amount of memory. By default in bytes. It will also accept K, M or G qualifiers. ”h]”hí)�”}”(hŒe``mem=int[K,M,G]`` - amount of memory. By default in bytes. It will also accept K, M or G qualifiers.”h]”(j“ )�”}”(hŒ``mem=int[K,M,G]``”h]”hŒmem=int[K,M,G]”…”�”}”(hjbh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj^ubhŒS - amount of memory. By default in bytes. It will also accept K, M or G qualifiers.”…”�”}”(hj^h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M]hjZubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjWh²hh³hÇh´Nubhè)�”}”(hX_``ubdX[s,d,c,t]=`` virtual disk specification. This is not really mandatory, but it is likely to be needed in nearly all cases so we can specify a root file system. The simplest possible image specification is the name of the image file for the filesystem (created using one of the methods described in `Creating an image`_). * UBD devices support copy on write (COW). The changes are kept in a separate file which can be discarded allowing a rollback to the original pristine image. If COW is desired, the UBD image is specified as: ``cow_file,master_image``. Example:``ubd0=Filesystem.cow,Filesystem.img`` * UBD devices can be set to use synchronous IO. Any writes are immediately flushed to disk. This is done by adding ``s`` after the ``ubdX`` specification. * UBD performs some heuristics on devices specified as a single filename to make sure that a COW file has not been specified as the image. To turn them off, use the ``d`` flag after ``ubdX``. * UBD supports TRIM - asking the Host OS to reclaim any unused blocks in the image. To turn it off, specify the ``t`` flag after ``ubdX``. ”h]”(hí)�”}”(hXE``ubdX[s,d,c,t]=`` virtual disk specification. This is not really mandatory, but it is likely to be needed in nearly all cases so we can specify a root file system. The simplest possible image specification is the name of the image file for the filesystem (created using one of the methods described in `Creating an image`_).”h]”(j“ )�”}”(hŒ``ubdX[s,d,c,t]=``”h]”hŒubdX[s,d,c,t]=”…”�”}”(hjˆh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj„ubhX virtual disk specification. This is not really mandatory, but it is likely to be needed in nearly all cases so we can specify a root file system. The simplest possible image specification is the name of the image file for the filesystem (created using one of the methods described in ”…”�”}”(hj„h²hh³Nh´Nubhò)�”}”(hŒ`Creating an image`_”h]”hŒCreating an image”…”�”}”(hjšh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”Œname”ŒCreating an image”j¦j²uh1hñhj„Œresolved”KubhŒ).”…”�”}”(hj„h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M`hj€ubhã)�”}”(hhh]”(hè)�”}”(hXUBD devices support copy on write (COW). The changes are kept in a separate file which can be discarded allowing a rollback to the original pristine image. If COW is desired, the UBD image is specified as: ``cow_file,master_image``. Example:``ubd0=Filesystem.cow,Filesystem.img`` ”h]”hí)�”}”(hXUBD devices support copy on write (COW). The changes are kept in a separate file which can be discarded allowing a rollback to the original pristine image. If COW is desired, the UBD image is specified as: ``cow_file,master_image``. Example:``ubd0=Filesystem.cow,Filesystem.img``”h]”(hŒÏUBD devices support copy on write (COW). The changes are kept in a separate file which can be discarded allowing a rollback to the original pristine image. If COW is desired, the UBD image is specified as: ”…”�”}”(hj¼h²hh³Nh´Nubj“ )�”}”(hŒ``cow_file,master_image``”h]”hŒcow_file,master_image”…”�”}”(hjÄh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¼ubhŒ . Example:”…”�”}”(hj¼h²hh³Nh´Nubj“ )�”}”(hŒ&``ubd0=Filesystem.cow,Filesystem.img``”h]”hŒ"ubd0=Filesystem.cow,Filesystem.img”…”�”}”(hjÖh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¼ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mghj¸ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjµubhè)�”}”(hŒ™UBD devices can be set to use synchronous IO. Any writes are immediately flushed to disk. This is done by adding ``s`` after the ``ubdX`` specification. ”h]”hí)�”}”(hŒ˜UBD devices can be set to use synchronous IO. Any writes are immediately flushed to disk. This is done by adding ``s`` after the ``ubdX`` specification.”h]”(hŒqUBD devices can be set to use synchronous IO. Any writes are immediately flushed to disk. This is done by adding ”…”�”}”(hjôh²hh³Nh´Nubj“ )�”}”(hŒ``s``”h]”hŒs”…”�”}”(hjüh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjôubhŒ after the ”…”�”}”(hjôh²hh³Nh´Nubj“ )�”}”(hŒ``ubdX``”h]”hŒubdX”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjôubhŒ specification.”…”�”}”(hjôh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mmhjðubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjµubhè)�”}”(hŒ¾UBD performs some heuristics on devices specified as a single filename to make sure that a COW file has not been specified as the image. To turn them off, use the ``d`` flag after ``ubdX``. ”h]”hí)�”}”(hŒ½UBD performs some heuristics on devices specified as a single filename to make sure that a COW file has not been specified as the image. To turn them off, use the ``d`` flag after ``ubdX``.”h]”(hŒ£UBD performs some heuristics on devices specified as a single filename to make sure that a COW file has not been specified as the image. To turn them off, use the ”…”�”}”(hj0h²hh³Nh´Nubj“ )�”}”(hŒ``d``”h]”hŒd”…”�”}”(hj8h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj0ubhŒ flag after ”…”�”}”(hj0h²hh³Nh´Nubj“ )�”}”(hŒ``ubdX``”h]”hŒubdX”…”�”}”(hjJh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj0ubhŒ.”…”�”}”(hj0h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mqhj,ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjµubhè)�”}”(hŒ‰UBD supports TRIM - asking the Host OS to reclaim any unused blocks in the image. To turn it off, specify the ``t`` flag after ``ubdX``. ”h]”hí)�”}”(hŒˆUBD supports TRIM - asking the Host OS to reclaim any unused blocks in the image. To turn it off, specify the ``t`` flag after ``ubdX``.”h]”(hŒnUBD supports TRIM - asking the Host OS to reclaim any unused blocks in the image. To turn it off, specify the ”…”�”}”(hjlh²hh³Nh´Nubj“ )�”}”(hŒ``t``”h]”hŒt”…”�”}”(hjth²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjlubhŒ flag after ”…”�”}”(hjlh²hh³Nh´Nubj“ )�”}”(hŒ``ubdX``”h]”hŒubdX”…”�”}”(hj†h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjlubhŒ.”…”�”}”(hjlh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Muhjhubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjµubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´Mghj€ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhjWh²hh³Nh´Nubhè)�”}”(hŒU``root=`` root device - most likely ``/dev/ubd0`` (this is a Linux filesystem image) ”h]”hí)�”}”(hŒT``root=`` root device - most likely ``/dev/ubd0`` (this is a Linux filesystem image)”h]”(j“ )�”}”(hŒ ``root=``”h]”hŒroot=”…”�”}”(hj¸h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj´ubhŒ root device - most likely ”…”�”}”(hj´h²hh³Nh´Nubj“ )�”}”(hŒ ``/dev/ubd0``”h]”hŒ /dev/ubd0”…”�”}”(hjÊh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj´ubhŒ# (this is a Linux filesystem image)”…”�”}”(hj´h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Myhj°ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjWh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´M]hjFh²hubeh}”(h]”jêah ]”h"]”Œmandatory arguments:”ah$]”h&]”uh1hÈhj5h²hh³hÇh´M[ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒImportant Optional Arguments”h]”hŒImportant Optional Arguments”…”�”}”(hjøh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦juh1hÍhjõh²hh³hÇh´M}ubhí)�”}”(hXzIf UML is run as "linux" with no extra arguments, it will try to start an xterm for every console configured inside the image (up to 6 in most Linux distributions). Each console is started inside an xterm. This makes it nice and easy to use UML on a host with a GUI. It is, however, the wrong approach if UML is to be used as a testing harness or run in a text-only environment.”h]”hX~If UML is run as “linuxâ€� with no extra arguments, it will try to start an xterm for every console configured inside the image (up to 6 in most Linux distributions). Each console is started inside an xterm. This makes it nice and easy to use UML on a host with a GUI. It is, however, the wrong approach if UML is to be used as a testing harness or run in a text-only environment.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjõh²hubhí)�”}”(hŒÕIn order to change this behaviour we need to specify an alternative console and wire it to one of the supported "line" channels. For this we need to map a console to use something different from the default xterm.”h]”hŒÙIn order to change this behaviour we need to specify an alternative console and wire it to one of the supported “lineâ€� channels. For this we need to map a console to use something different from the default xterm.”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M†hjõh²hubhí)�”}”(hŒh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MŽhjõh²hubj÷)�”}”(hŒ2conX=channel_type:options[,channel_type:options] ”h]”hí)�”}”(hŒ0conX=channel_type:options[,channel_type:options]”h]”hŒ0conX=channel_type:options[,channel_type:options]”…”�”}”(hjPh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M‘hjLubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´M‘hjõh²hubhí)�”}”(hŒrIf the channel specification contains two parts separated by comma, the first one is input, the second one output.”h]”hŒrIf the channel specification contains two parts separated by comma, the first one is input, the second one output.”…”�”}”(hjdh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M”hjõh²hubhã)�”}”(hhh]”(hè)�”}”(hŒoThe null channel - Discard all input or output. Example ``con=null`` will set all consoles to null by default. ”h]”hí)�”}”(hŒnThe null channel - Discard all input or output. Example ``con=null`` will set all consoles to null by default.”h]”(hŒ8The null channel - Discard all input or output. Example ”…”�”}”(hjyh²hh³Nh´Nubj“ )�”}”(hŒ ``con=null``”h]”hŒcon=null”…”�”}”(hj�h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjyubhŒ* will set all consoles to null by default.”…”�”}”(hjyh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M—hjuubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjrh²hh³hÇh´Nubhè)�”}”(hŒ\The fd channel - use file descriptor numbers for input/output. Example: ``con1=fd:0,fd:1.`` ”h]”hí)�”}”(hŒ[The fd channel - use file descriptor numbers for input/output. Example: ``con1=fd:0,fd:1.``”h]”(hŒHThe fd channel - use file descriptor numbers for input/output. Example: ”…”�”}”(hj£h²hh³Nh´Nubj“ )�”}”(hŒ``con1=fd:0,fd:1.``”h]”hŒcon1=fd:0,fd:1.”…”�”}”(hj«h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj£ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MšhjŸubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjrh²hh³hÇh´Nubhè)�”}”(hX1The port channel - start a telnet server on TCP port number. Example: ``con1=port:4321``. The host must have /usr/sbin/in.telnetd (usually part of a telnetd package) and the port-helper from the UML utilities (see the information for the xterm channel below). UML will not boot until a client connects. ”h]”hí)�”}”(hX0The port channel - start a telnet server on TCP port number. Example: ``con1=port:4321``. The host must have /usr/sbin/in.telnetd (usually part of a telnetd package) and the port-helper from the UML utilities (see the information for the xterm channel below). UML will not boot until a client connects.”h]”(hŒFThe port channel - start a telnet server on TCP port number. Example: ”…”�”}”(hjÉh²hh³Nh´Nubj“ )�”}”(hŒ``con1=port:4321``”h]”hŒcon1=port:4321”…”�”}”(hjÑh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjÉubhŒØ. The host must have /usr/sbin/in.telnetd (usually part of a telnetd package) and the port-helper from the UML utilities (see the information for the xterm channel below). UML will not boot until a client connects.”…”�”}”(hjÉh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M�hjÅubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjrh²hh³hÇh´Nubhè)�”}”(hŒ/The pty and pts channels - use system pty/pts. ”h]”hí)�”}”(hŒ.The pty and pts channels - use system pty/pts.”h]”hŒ.The pty and pts channels - use system pty/pts.”…”�”}”(hjóh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M£hjïubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjrh²hh³hÇh´Nubhè)�”}”(hŒ‡The tty channel - bind to an existing system tty. Example: ``con1=/dev/tty8`` will make UML use the host 8th console (usually unused). ”h]”hí)�”}”(hŒ†The tty channel - bind to an existing system tty. Example: ``con1=/dev/tty8`` will make UML use the host 8th console (usually unused).”h]”(hŒ;The tty channel - bind to an existing system tty. Example: ”…”�”}”(hj h²hh³Nh´Nubj“ )�”}”(hŒ``con1=/dev/tty8``”h]”hŒcon1=/dev/tty8”…”�”}”(hjh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj ubhŒ9 will make UML use the host 8th console (usually unused).”…”�”}”(hj h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M¥hjubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjrh²hh³hÇh´Nubhè)�”}”(hXØThe xterm channel - this is the default - bring up an xterm on this channel and direct IO to it. Note that in order for xterm to work, the host must have the UML distribution package installed. This usually contains the port-helper and other utilities needed for UML to communicate with the xterm. Alternatively, these need to be complied and installed from source. All options applicable to consoles also apply to UML serial lines which are presented as ttyS inside UML. ”h]”hí)�”}”(hX×The xterm channel - this is the default - bring up an xterm on this channel and direct IO to it. Note that in order for xterm to work, the host must have the UML distribution package installed. This usually contains the port-helper and other utilities needed for UML to communicate with the xterm. Alternatively, these need to be complied and installed from source. All options applicable to consoles also apply to UML serial lines which are presented as ttyS inside UML.”h]”hX×The xterm channel - this is the default - bring up an xterm on this channel and direct IO to it. Note that in order for xterm to work, the host must have the UML distribution package installed. This usually contains the port-helper and other utilities needed for UML to communicate with the xterm. Alternatively, these need to be complied and installed from source. All options applicable to consoles also apply to UML serial lines which are presented as ttyS inside UML.”…”�”}”(hj5h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M¨hj1ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhjrh²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´M—hjõh²hubeh}”(h]”j ah ]”h"]”Œimportant optional arguments”ah$]”h&]”uh1hÈhj5h²hh³hÇh´M}ubeh}”(h]”jËah ]”h"]”Œ arguments”ah$]”h&]”uh1hÈhjh²hh³hÇh´MXubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Starting UML”h]”hŒ Starting UML”…”�”}”(hj`h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j4uh1hÍhj]h²hh³hÇh´M±ubhí)�”}”(hŒWe can now run UML. ::”h]”hŒWe can now run UML.”…”�”}”(hjnh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M³hj]h²hubj{ )�”}”(hŒ�# linux mem=2048M umid=TEST \ ubd0=Filesystem.img \ vec0:transport=tap,ifname=tap0,depth=128,gro=1 \ root=/dev/ubda con=null con0=null,fd:2 con1=fd:0,fd:1”h]”hŒ�# linux mem=2048M umid=TEST \ ubd0=Filesystem.img \ vec0:transport=tap,ifname=tap0,depth=128,gro=1 \ root=/dev/ubda con=null con0=null,fd:2 con1=fd:0,fd:1”…”�”}”hj|sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M¶hj]h²hubhí)�”}”(hX&This will run an instance with ``2048M RAM`` and try to use the image file called ``Filesystem.img`` as root. It will connect to the host using tap0. All consoles except ``con1`` will be disabled and console 1 will use standard input/output making it appear in the same terminal it was started.”h]”(hŒThis will run an instance with ”…”�”}”(hjŠh²hh³Nh´Nubj“ )�”}”(hŒ ``2048M RAM``”h]”hŒ 2048M RAM”…”�”}”(hj’h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjŠubhŒ& and try to use the image file called ”…”�”}”(hjŠh²hh³Nh´Nubj“ )�”}”(hŒ``Filesystem.img``”h]”hŒFilesystem.img”…”�”}”(hj¤h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjŠubhŒF as root. It will connect to the host using tap0. All consoles except ”…”�”}”(hjŠh²hh³Nh´Nubj“ )�”}”(hŒ``con1``”h]”hŒcon1”…”�”}”(hj¶h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjŠubhŒt will be disabled and console 1 will use standard input/output making it appear in the same terminal it was started.”…”�”}”(hjŠh²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M»hj]h²hubeh}”(h]”j:ah ]”h"]”Œ starting uml”ah$]”h&]”uh1hÈhjh²hh³hÇh´M±ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Logging in”h]”hŒ Logging in”…”�”}”(hjØh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jVuh1hÍhjÕh²hh³hÇh´MÁubhí)�”}”(hŒýIf you have not set up a password when generating the image, you will have to shut down the UML instance, mount the image, chroot into it and set it - as described in the Generating an Image section. If the password is already set, you can just log in.”h]”hŒýIf you have not set up a password when generating the image, you will have to shut down the UML instance, mount the image, chroot into it and set it - as described in the Generating an Image section. If the password is already set, you can just log in.”…”�”}”(hjæh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÃhjÕh²hubeh}”(h]”j\ah ]”h"]”Œ logging in”ah$]”h&]”uh1hÈhjh²hh³hÇh´MÁubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒThe UML Management Console”h]”hŒThe UML Management Console”…”�”}”(hjþh²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jxuh1hÍhjûh²hh³hÇh´MÉubhí)�”}”(hX´In addition to managing the image from "the inside" using normal sysadmin tools, it is possible to perform a number of low-level operations using the UML management console. The UML management console is a low-level interface to the kernel on a running UML instance, somewhat like the i386 SysRq interface. Since there is a full-blown operating system under UML, there is much greater flexibility possible than with the SysRq mechanism.”h]”hX¸In addition to managing the image from “the insideâ€� using normal sysadmin tools, it is possible to perform a number of low-level operations using the UML management console. The UML management console is a low-level interface to the kernel on a running UML instance, somewhat like the i386 SysRq interface. Since there is a full-blown operating system under UML, there is much greater flexibility possible than with the SysRq mechanism.”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MËhjûh²hubhí)�”}”(hŒDThere are a number of things you can do with the mconsole interface:”h]”hŒDThere are a number of things you can do with the mconsole interface:”…”�”}”(hj h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÒhjûh²hubhã)�”}”(hhh]”(hè)�”}”(hŒget the kernel version”h]”hí)�”}”(hj- h]”hŒget the kernel version”…”�”}”(hj/ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÔhj+ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubhè)�”}”(hŒadd and remove devices”h]”hí)�”}”(hjD h]”hŒadd and remove devices”…”�”}”(hjF h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÕhjB ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubhè)�”}”(hŒhalt or reboot the machine”h]”hí)�”}”(hj[ h]”hŒhalt or reboot the machine”…”�”}”(hj] h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÖhjY ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubhè)�”}”(hŒSend SysRq commands”h]”hí)�”}”(hjr h]”hŒSend SysRq commands”…”�”}”(hjt h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M×hjp ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubhè)�”}”(hŒPause and resume the UML”h]”hí)�”}”(hj‰ h]”hŒPause and resume the UML”…”�”}”(hj‹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MØhj‡ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubhè)�”}”(hŒ$Inspect processes running inside UML”h]”hí)�”}”(hj  h]”hŒ$Inspect processes running inside UML”…”�”}”(hj¢ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÙhjž ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubhè)�”}”(hŒ!Inspect UML internal /proc state ”h]”hí)�”}”(hŒ Inspect UML internal /proc state”h]”hŒ Inspect UML internal /proc state”…”�”}”(hj¹ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÚhjµ ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj( h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´MÔhjûh²hubhí)�”}”(hŒzYou need the mconsole client (uml\_mconsole) which is a part of the UML tools package available in most Linux distritions.”h]”hŒzYou need the mconsole client (uml_mconsole) which is a part of the UML tools package available in most Linux distritions.”…”�”}”(hjÓ h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÜhjûh²hubhí)�”}”(hŒ�You also need ``CONFIG_MCONSOLE`` (under 'General Setup') enabled in the UML kernel. When you boot UML, you'll see a line like::”h]”(hŒYou also need ”…”�”}”(hjá h²hh³Nh´Nubj“ )�”}”(hŒ``CONFIG_MCONSOLE``”h]”hŒCONFIG_MCONSOLE”…”�”}”(hjé h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjá ubhŒe (under ‘General Setup’) enabled in the UML kernel. When you boot UML, you’ll see a line like:”…”�”}”(hjá h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mßhjûh²hubj{ )�”}”(hŒ;mconsole initialized on /home/jdike/.uml/umlNJ32yL/mconsole”h]”hŒ;mconsole initialized on /home/jdike/.uml/umlNJ32yL/mconsole”…”�”}”hj!sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Mâhjûh²hubhí)�”}”(hŒcIf you specify a unique machine id on the UML command line, i.e. ``umid=debian``, you'll see this::”h]”(hŒAIf you specify a unique machine id on the UML command line, i.e. ”…”�”}”(hj!h²hh³Nh´Nubj“ )�”}”(hŒ``umid=debian``”h]”hŒ umid=debian”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj!ubhŒ, you’ll see this:”…”�”}”(hj!h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mähjûh²hubj{ )�”}”(hŒ8mconsole initialized on /home/jdike/.uml/debian/mconsole”h]”hŒ8mconsole initialized on /home/jdike/.uml/debian/mconsole”…”�”}”hj/!sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Mçhjûh²hubhí)�”}”(hŒ‹That file is the socket that uml_mconsole will use to communicate with UML. Run it with either the umid or the full path as its argument::”h]”hŒŠThat file is the socket that uml_mconsole will use to communicate with UML. Run it with either the umid or the full path as its argument:”…”�”}”(hj=!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mêhjûh²hubj{ )�”}”(hŒ# uml_mconsole debian”h]”hŒ# uml_mconsole debian”…”�”}”hjK!sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´Míhjûh²hubhí)�”}”(hŒor”h]”hŒor”…”�”}”(hjY!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mïhjûh²hubj÷)�”}”(hŒ1# uml_mconsole /home/jdike/.uml/debian/mconsole ”h]”hí)�”}”(hŒ/# uml_mconsole /home/jdike/.uml/debian/mconsole”h]”hŒ/# uml_mconsole /home/jdike/.uml/debian/mconsole”…”�”}”(hjk!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mñhjg!ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´Mñhjûh²hubhí)�”}”(hŒ@You'll get a prompt, at which you can run one of these commands:”h]”hŒBYou’ll get a prompt, at which you can run one of these commands:”…”�”}”(hj!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Môhjûh²hubhã)�”}”(hhh]”(hè)�”}”(hŒversion”h]”hí)�”}”(hj’!h]”hŒversion”…”�”}”(hj”!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Möhj�!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒhelp”h]”hí)�”}”(hj©!h]”hŒhelp”…”�”}”(hj«!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M÷hj§!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒhalt”h]”hí)�”}”(hjÀ!h]”hŒhalt”…”�”}”(hjÂ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Møhj¾!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒreboot”h]”hí)�”}”(hj×!h]”hŒreboot”…”�”}”(hjÙ!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MùhjÕ!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒconfig”h]”hí)�”}”(hjî!h]”hŒconfig”…”�”}”(hjð!h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Múhjì!ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒremove”h]”hí)�”}”(hj"h]”hŒremove”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mûhj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒsysrq”h]”hí)�”}”(hj"h]”hŒsysrq”…”�”}”(hj"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mühj"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒhelp”h]”hí)�”}”(hj3"h]”hŒhelp”…”�”}”(hj5"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mýhj1"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒcad”h]”hí)�”}”(hjJ"h]”hŒcad”…”�”}”(hjL"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MþhjH"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒstop”h]”hí)�”}”(hja"h]”hŒstop”…”�”}”(hjc"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mÿhj_"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒgo”h]”hí)�”}”(hjx"h]”hŒgo”…”�”}”(hjz"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhjv"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒproc”h]”hí)�”}”(hj�"h]”hŒproc”…”�”}”(hj‘"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhj�"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubhè)�”}”(hŒstack ”h]”hí)�”}”(hŒstack”h]”hŒstack”…”�”}”(hj¨"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhj¤"ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj�!h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´Möhjûh²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒversion”h]”hŒversion”…”�”}”(hjÅ"h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j—uh1hÍhjÂ"h²hh³hÇh´Mubhí)�”}”(hŒ=This command takes no arguments. It prints the UML version::”h]”hŒah ]”h"]”Œhostfs as the root filesystem”ah$]”h&]”uh1hÈhj‹&h²hh³hÇh´MëubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒHostfs Caveats”h]”hŒHostfs Caveats”…”�”}”(hjX(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jZuh1hÍhjU(h²hh³hÇh´Mubhí)�”}”(hXDHostfs does not support keeping track of host filesystem changes on the host (outside UML). As a result, if a file is changed without UML's knowledge, UML will not know about it and its own in-memory cache of the file may be corrupt. While it is possible to fix this, it is not something which is being worked on at present.”h]”hXFHostfs does not support keeping track of host filesystem changes on the host (outside UML). As a result, if a file is changed without UML’s knowledge, UML will not know about it and its own in-memory cache of the file may be corrupt. While it is possible to fix this, it is not something which is being worked on at present.”…”�”}”(hjf(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M hjU(h²hubeh}”(h]”j`ah ]”h"]”Œhostfs caveats”ah$]”h&]”uh1hÈhj‹&h²hh³hÇh´Mubeh}”(h]”jýah ]”h"]”Œhost file access”ah$]”h&]”uh1hÈhjÊ$h²hh³hÇh´M¾ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Tuning UML”h]”hŒ Tuning UML”…”�”}”(hj…(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jˆuh1hÍhj‚(h²hh³hÇh´Mubhí)�”}”(hŒrUML at present is strictly uniprocessor. It will, however spin up a number of threads to handle various functions.”h]”hŒrUML at present is strictly uniprocessor. It will, however spin up a number of threads to handle various functions.”…”�”}”(hj“(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhj‚(h²hubhí)�”}”(hXÐThe UBD driver, SIGIO and the MMU emulation do that. If the system is idle, these threads will be migrated to other processors on a SMP host. This, unfortunately, will usually result in LOWER performance because of all of the cache/memory synchronization traffic between cores. As a result, UML will usually benefit from being pinned on a single CPU, especially on a large system. This can result in performance differences of 5 times or higher on some benchmarks.”h]”hXÐThe UBD driver, SIGIO and the MMU emulation do that. If the system is idle, these threads will be migrated to other processors on a SMP host. This, unfortunately, will usually result in LOWER performance because of all of the cache/memory synchronization traffic between cores. As a result, UML will usually benefit from being pinned on a single CPU, especially on a large system. This can result in performance differences of 5 times or higher on some benchmarks.”…”�”}”(hj¡(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhj‚(h²hubhí)�”}”(hXaSimilarly, on large multi-node NUMA systems UML will benefit if all of its memory is allocated from the same NUMA node it will run on. The OS will *NOT* do that by default. In order to do that, the sysadmin needs to create a suitable tmpfs ramdisk bound to a particular node and use that as the source for UML RAM allocation by specifying it in the TMP or TEMP environment variables. UML will look at the values of ``TMPDIR``, ``TMP`` or ``TEMP`` for that. If that fails, it will look for shmfs mounted under ``/dev/shm``. If everything else fails use ``/tmp/`` regardless of the filesystem type used for it::”h]”(hŒ“Similarly, on large multi-node NUMA systems UML will benefit if all of its memory is allocated from the same NUMA node it will run on. The OS will ”…”�”}”(hj¯(h²hh³Nh´NubjÜ%)�”}”(hŒ*NOT*”h]”hŒNOT”…”�”}”(hj·(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÛ%hj¯(ubhX do that by default. In order to do that, the sysadmin needs to create a suitable tmpfs ramdisk bound to a particular node and use that as the source for UML RAM allocation by specifying it in the TMP or TEMP environment variables. UML will look at the values of ”…”�”}”(hj¯(h²hh³Nh´Nubj“ )�”}”(hŒ ``TMPDIR``”h]”hŒTMPDIR”…”�”}”(hjÉ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¯(ubhŒ, ”…”�”}”(hj¯(h²hh³Nh´Nubj“ )�”}”(hŒ``TMP``”h]”hŒTMP”…”�”}”(hjÛ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¯(ubhŒ or ”…”�”}”(hj¯(h²hh³Nh´Nubj“ )�”}”(hŒ``TEMP``”h]”hŒTEMP”…”�”}”(hjí(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¯(ubhŒ? for that. If that fails, it will look for shmfs mounted under ”…”�”}”(hj¯(h²hh³Nh´Nubj“ )�”}”(hŒ ``/dev/shm``”h]”hŒ/dev/shm”…”�”}”(hjÿ(h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¯(ubhŒ. If everything else fails use ”…”�”}”(hj¯(h²hh³Nh´Nubj“ )�”}”(hŒ ``/tmp/``”h]”hŒ/tmp/”…”�”}”(hj)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¯(ubhŒ/ regardless of the filesystem type used for it:”…”�”}”(hj¯(h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mhj‚(h²hubj{ )�”}”(hŒtmount -t tmpfs -ompol=bind:X none /mnt/tmpfs-nodeX TEMP=/mnt/tmpfs-nodeX taskset -cX linux options options options..”h]”hŒtmount -t tmpfs -ompol=bind:X none /mnt/tmpfs-nodeX TEMP=/mnt/tmpfs-nodeX taskset -cX linux options options options..”…”�”}”hj))sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M'hj‚(h²hubeh}”(h]”jŽah ]”h"]”Œ tuning uml”ah$]”h&]”uh1hÈhjÊ$h²hh³hÇh´Mubeh}”(h]”j+ah ]”h"]”Œadvanced uml topics”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´MdubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ+Contributing to UML and Developing with UML”h]”hŒ+Contributing to UML and Developing with UML”…”�”}”(hjH)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j¶uh1hÍhjE)h²hh³hÇh´M,ubhí)�”}”(hŒåUML is an excellent platform to develop new Linux kernel concepts - filesystems, devices, virtualization, etc. It provides unrivalled opportunities to create and test them without being constrained to emulating specific hardware.”h]”hŒåUML is an excellent platform to develop new Linux kernel concepts - filesystems, devices, virtualization, etc. It provides unrivalled opportunities to create and test them without being constrained to emulating specific hardware.”…”�”}”(hjV)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M.hjE)h²hubhí)�”}”(hŒMExample - want to try how Linux will work with 4096 "proper" network devices?”h]”hŒQExample - want to try how Linux will work with 4096 “properâ€� network devices?”…”�”}”(hjd)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M3hjE)h²hubhí)�”}”(hŒþNot an issue with UML. At the same time, this is something which is difficult with other virtualization packages - they are constrained by the number of devices allowed on the hardware bus they are trying to emulate (for example 16 on a PCI bus in qemu).”h]”hŒþNot an issue with UML. At the same time, this is something which is difficult with other virtualization packages - they are constrained by the number of devices allowed on the hardware bus they are trying to emulate (for example 16 on a PCI bus in qemu).”…”�”}”(hjr)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M6hjE)h²hubhí)�”}”(hŒ�If you have something to contribute such as a patch, a bugfix, a new feature, please send it to ``linux-um@lists.infradead.org``.”h]”(hŒ`If you have something to contribute such as a patch, a bugfix, a new feature, please send it to ”…”�”}”(hj€)h²hh³Nh´Nubj“ )�”}”(hŒ ``linux-um@lists.infradead.org``”h]”hŒlinux-um@lists.infradead.org”…”�”}”(hjˆ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj€)ubhŒ.”…”�”}”(hj€)h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M;hjE)h²hubhí)�”}”(hŒÎPlease follow all standard Linux patch guidelines such as cc-ing relevant maintainers and run ``./scripts/checkpatch.pl`` on your patch. For more details see ``Documentation/process/submitting-patches.rst``”h]”(hŒ^Please follow all standard Linux patch guidelines such as cc-ing relevant maintainers and run ”…”�”}”(hj )h²hh³Nh´Nubj“ )�”}”(hŒ``./scripts/checkpatch.pl``”h]”hŒ./scripts/checkpatch.pl”…”�”}”(hj¨)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj )ubhŒ% on your patch. For more details see ”…”�”}”(hj )h²hh³Nh´Nubj“ )�”}”(hŒ0``Documentation/process/submitting-patches.rst``”h]”hŒ,Documentation/process/submitting-patches.rst”…”�”}”(hjº)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj )ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M>hjE)h²hubhí)�”}”(hŒ`Note - the list does not accept HTML or attachments, all emails must be formatted as plain text.”h]”hŒ`Note - the list does not accept HTML or attachments, all emails must be formatted as plain text.”…”�”}”(hjÎ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MBhjE)h²hubhí)�”}”(hXsDeveloping always goes hand in hand with debugging. First of all, you can always run UML under gdb and there will be a whole section later on on how to do that. That, however, is not the only way to debug a Linux kernel. Quite often adding tracing statements and/or using UML specific approaches such as ptracing the UML kernel process are significantly more informative.”h]”hXsDeveloping always goes hand in hand with debugging. First of all, you can always run UML under gdb and there will be a whole section later on on how to do that. That, however, is not the only way to debug a Linux kernel. Quite often adding tracing statements and/or using UML specific approaches such as ptracing the UML kernel process are significantly more informative.”…”�”}”(hjÜ)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MEhjE)h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒ Tracing UML”h]”hŒ Tracing UML”…”�”}”(hjí)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jÕuh1hÍhjê)h²hh³hÇh´MMubhí)�”}”(hŒÄWhen running, UML consists of a main kernel thread and a number of helper threads. The ones of interest for tracing are NOT the ones that are already ptraced by UML as a part of its MMU emulation.”h]”hŒÄWhen running, UML consists of a main kernel thread and a number of helper threads. The ones of interest for tracing are NOT the ones that are already ptraced by UML as a part of its MMU emulation.”…”�”}”(hjû)h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MOhjê)h²hubhí)�”}”(hX6These are usually the first three threads visible in a ps display. The one with the lowest PID number and using most CPU is usually the kernel thread. The other threads are the disk (ubd) device helper thread and the SIGIO helper thread. Running ptrace on this thread usually results in the following picture::”h]”hX5These are usually the first three threads visible in a ps display. The one with the lowest PID number and using most CPU is usually the kernel thread. The other threads are the disk (ubd) device helper thread and the SIGIO helper thread. Running ptrace on this thread usually results in the following picture:”…”�”}”(hj *h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MShjê)h²hubj{ )�”}”(hXEhost$ strace -p 16566 --- SIGIO {si_signo=SIGIO, si_code=POLL_IN, si_band=65} --- epoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1 epoll_wait(4, [], 64, 0) = 0 rt_sigreturn({mask=[PIPE]}) = 16967 ptrace(PTRACE_GETREGS, 16967, NULL, 0xd5f34f38) = 0 ptrace(PTRACE_GETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=832}]) = 0 ptrace(PTRACE_GETSIGINFO, 16967, NULL, {si_signo=SIGTRAP, si_code=0x85, si_pid=16967, si_uid=0}) = 0 ptrace(PTRACE_SETREGS, 16967, NULL, 0xd5f34f38) = 0 ptrace(PTRACE_SETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=2696}]) = 0 ptrace(PTRACE_SYSEMU, 16967, NULL, 0) = 0 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=16967, si_uid=0, si_status=SIGTRAP, si_utime=65, si_stime=89} --- wait4(16967, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGTRAP | 0x80}], WSTOPPED|__WALL, NULL) = 16967 ptrace(PTRACE_GETREGS, 16967, NULL, 0xd5f34f38) = 0 ptrace(PTRACE_GETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=832}]) = 0 ptrace(PTRACE_GETSIGINFO, 16967, NULL, {si_signo=SIGTRAP, si_code=0x85, si_pid=16967, si_uid=0}) = 0 timer_settime(0, 0, {it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=2830912}}, NULL) = 0 getpid() = 16566 clock_nanosleep(CLOCK_MONOTONIC, 0, {tv_sec=1, tv_nsec=0}, NULL) = ? ERESTART_RESTARTBLOCK (Interrupted by signal) --- SIGALRM {si_signo=SIGALRM, si_code=SI_TIMER, si_timerid=0, si_overrun=0, si_value={int=1631716592, ptr=0x614204f0}} --- rt_sigreturn({mask=[PIPE]}) = -1 EINTR (Interrupted system call)”h]”hXEhost$ strace -p 16566 --- SIGIO {si_signo=SIGIO, si_code=POLL_IN, si_band=65} --- epoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1 epoll_wait(4, [], 64, 0) = 0 rt_sigreturn({mask=[PIPE]}) = 16967 ptrace(PTRACE_GETREGS, 16967, NULL, 0xd5f34f38) = 0 ptrace(PTRACE_GETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=832}]) = 0 ptrace(PTRACE_GETSIGINFO, 16967, NULL, {si_signo=SIGTRAP, si_code=0x85, si_pid=16967, si_uid=0}) = 0 ptrace(PTRACE_SETREGS, 16967, NULL, 0xd5f34f38) = 0 ptrace(PTRACE_SETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=2696}]) = 0 ptrace(PTRACE_SYSEMU, 16967, NULL, 0) = 0 --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_TRAPPED, si_pid=16967, si_uid=0, si_status=SIGTRAP, si_utime=65, si_stime=89} --- wait4(16967, [{WIFSTOPPED(s) && WSTOPSIG(s) == SIGTRAP | 0x80}], WSTOPPED|__WALL, NULL) = 16967 ptrace(PTRACE_GETREGS, 16967, NULL, 0xd5f34f38) = 0 ptrace(PTRACE_GETREGSET, 16967, NT_X86_XSTATE, [{iov_base=0xd5f35010, iov_len=832}]) = 0 ptrace(PTRACE_GETSIGINFO, 16967, NULL, {si_signo=SIGTRAP, si_code=0x85, si_pid=16967, si_uid=0}) = 0 timer_settime(0, 0, {it_interval={tv_sec=0, tv_nsec=0}, it_value={tv_sec=0, tv_nsec=2830912}}, NULL) = 0 getpid() = 16566 clock_nanosleep(CLOCK_MONOTONIC, 0, {tv_sec=1, tv_nsec=0}, NULL) = ? ERESTART_RESTARTBLOCK (Interrupted by signal) --- SIGALRM {si_signo=SIGALRM, si_code=SI_TIMER, si_timerid=0, si_overrun=0, si_value={int=1631716592, ptr=0x614204f0}} --- rt_sigreturn({mask=[PIPE]}) = -1 EINTR (Interrupted system call)”…”�”}”hj*sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´MYhjê)h²hubhí)�”}”(hŒ:This is a typical picture from a mostly idle UML instance.”h]”hŒ:This is a typical picture from a mostly idle UML instance.”…”�”}”(hj%*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mohjê)h²hubhã)�”}”(hhh]”(hè)�”}”(hŒ—UML interrupt controller uses epoll - this is UML waiting for IO interrupts: epoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1 ”h]”(hí)�”}”(hŒLUML interrupt controller uses epoll - this is UML waiting for IO interrupts:”h]”hŒLUML interrupt controller uses epoll - this is UML waiting for IO interrupts:”…”�”}”(hj:*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mqhj6*ubj÷)�”}”(hŒHepoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1 ”h]”hí)�”}”(hŒGepoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1”h]”hŒGepoll_wait(4, [{EPOLLIN, {u32=3721159424, u64=3721159424}}], 64, 0) = 1”…”�”}”(hjL*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MthjH*ubah}”(h]”h ]”h"]”h$]”h&]”uh1jöh³hÇh´Mthj6*ubeh}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3*h²hh³hÇh´Nubhè)�”}”(hŒTThe sequence of ptrace calls is part of MMU emulation and running the UML userspace.”h]”hí)�”}”(hŒTThe sequence of ptrace calls is part of MMU emulation and running the UML userspace.”h]”hŒTThe sequence of ptrace calls is part of MMU emulation and running the UML userspace.”…”�”}”(hjj*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mvhjf*ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3*h²hh³hÇh´Nubhè)�”}”(hŒŠ``timer_settime`` is part of the UML high res timer subsystem mapping timer requests from inside UML onto the host high resolution timers.”h]”hí)�”}”(hŒŠ``timer_settime`` is part of the UML high res timer subsystem mapping timer requests from inside UML onto the host high resolution timers.”h]”(j“ )�”}”(hŒ``timer_settime``”h]”hŒ timer_settime”…”�”}”(hj†*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj‚*ubhŒy is part of the UML high res timer subsystem mapping timer requests from inside UML onto the host high resolution timers.”…”�”}”(hj‚*h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mxhj~*ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3*h²hh³hÇh´Nubhè)�”}”(hŒ```clock_nanosleep`` is UML going into idle (similar to the way a PC will execute an ACPI idle). ”h]”hí)�”}”(hŒ_``clock_nanosleep`` is UML going into idle (similar to the way a PC will execute an ACPI idle).”h]”(j“ )�”}”(hŒ``clock_nanosleep``”h]”hŒclock_nanosleep”…”�”}”(hj¬*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hj¨*ubhŒL is UML going into idle (similar to the way a PC will execute an ACPI idle).”…”�”}”(hj¨*h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mzhj¤*ubah}”(h]”h ]”h"]”h$]”h&]”uh1hçhj3*h²hh³hÇh´Nubeh}”(h]”h ]”h"]”h$]”h&]”j¹ jº uh1hâh³hÇh´Mqhjê)h²hubhí)�”}”(hŒ¼As you can see UML will generate quite a bit of output even in idle. The output can be very informative when observing IO. It shows the actual IO calls, their arguments and returns values.”h]”hŒ¼As you can see UML will generate quite a bit of output even in idle. The output can be very informative when observing IO. It shows the actual IO calls, their arguments and returns values.”…”�”}”(hjÐ*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M}hjê)h²hubeh}”(h]”jÛah ]”h"]”Œ tracing uml”ah$]”h&]”uh1hÈhjE)h²hh³hÇh´MMubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒKernel debugging”h]”hŒKernel debugging”…”�”}”(hjè*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j÷uh1hÍhjå*h²hh³hÇh´M‚ubhí)�”}”(hŒÐYou can run UML under gdb now, though it will not necessarily agree to be started under it. If you are trying to track a runtime bug, it is much better to attach gdb to a running UML instance and let UML run.”h]”hŒÐYou can run UML under gdb now, though it will not necessarily agree to be started under it. If you are trying to track a runtime bug, it is much better to attach gdb to a running UML instance and let UML run.”…”�”}”(hjö*h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M„hjå*h²hubhí)�”}”(hŒHAssuming the same PID number as in the previous example, this would be::”h]”hŒGAssuming the same PID number as in the previous example, this would be:”…”�”}”(hj+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´Mˆhjå*h²hubj{ )�”}”(hŒ# gdb -p 16566”h]”hŒ# gdb -p 16566”…”�”}”hj+sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´MŠhjå*h²hubhí)�”}”(hŒÄThis will STOP the UML instance, so you must enter `cont` at the GDB command line to request it to continue. It may be a good idea to make this into a gdb script and pass it to gdb as an argument.”h]”(hŒ3This will STOP the UML instance, so you must enter ”…”�”}”(hj +h²hh³Nh´Nubj()�”}”(hŒ`cont`”h]”hŒcont”…”�”}”(hj(+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j'hj +ubhŒ‹ at the GDB command line to request it to continue. It may be a good idea to make this into a gdb script and pass it to gdb as an argument.”…”�”}”(hj +h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MŒhjå*h²hubeh}”(h]”jýah ]”h"]”Œkernel debugging”ah$]”h&]”uh1hÈhjE)h²hh³hÇh´M‚ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒDeveloping Device Drivers”h]”hŒDeveloping Device Drivers”…”�”}”(hjJ+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦juh1hÍhjG+h²hh³hÇh´M‘ubhí)�”}”(hX\Nearly all UML drivers are monolithic. While it is possible to build a UML driver as a kernel module, that limits the possible functionality to in-kernel only and non-UML specific. The reason for this is that in order to really leverage UML, one needs to write a piece of userspace code which maps driver concepts onto actual userspace host calls.”h]”hX\Nearly all UML drivers are monolithic. While it is possible to build a UML driver as a kernel module, that limits the possible functionality to in-kernel only and non-UML specific. The reason for this is that in order to really leverage UML, one needs to write a piece of userspace code which maps driver concepts onto actual userspace host calls.”…”�”}”(hjX+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M“hjG+h²hubhí)�”}”(hXThis forms the so-called "user" portion of the driver. While it can reuse a lot of kernel concepts, it is generally just another piece of userspace code. This portion needs some matching "kernel" code which resides inside the UML image and which implements the Linux kernel part.”h]”hXThis forms the so-called “userâ€� portion of the driver. While it can reuse a lot of kernel concepts, it is generally just another piece of userspace code. This portion needs some matching “kernelâ€� code which resides inside the UML image and which implements the Linux kernel part.”…”�”}”(hjf+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MšhjG+h²hubhí)�”}”(hŒO*Note: There are very few limitations in the way "kernel" and "user" interact*.”h]”(jÜ%)�”}”(hŒN*Note: There are very few limitations in the way "kernel" and "user" interact*”h]”hŒTNote: There are very few limitations in the way “kernelâ€� and “userâ€� interact”…”�”}”(hjx+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1jÛ%hjt+ubhŒ.”…”�”}”(hjt+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MŸhjG+h²hubhí)�”}”(hXÀUML does not have a strictly defined kernel-to-host API. It does not try to emulate a specific architecture or bus. UML's "kernel" and "user" can share memory, code and interact as needed to implement whatever design the software developer has in mind. The only limitations are purely technical. Due to a lot of functions and variables having the same names, the developer should be careful which includes and libraries they are trying to refer to.”h]”hXÊUML does not have a strictly defined kernel-to-host API. It does not try to emulate a specific architecture or bus. UML’s “kernelâ€� and “userâ€� can share memory, code and interact as needed to implement whatever design the software developer has in mind. The only limitations are purely technical. Due to a lot of functions and variables having the same names, the developer should be careful which includes and libraries they are trying to refer to.”…”�”}”(hj�+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M¡hjG+h²hubhí)�”}”(hŒòAs a result a lot of userspace code consists of simple wrappers. E.g. ``os_close_file()`` is just a wrapper around ``close()`` which ensures that the userspace function close does not clash with similarly named function(s) in the kernel part.”h]”(hŒFAs a result a lot of userspace code consists of simple wrappers. E.g. ”…”�”}”(hjž+h²hh³Nh´Nubj“ )�”}”(hŒ``os_close_file()``”h]”hŒos_close_file()”…”�”}”(hj¦+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjž+ubhŒ is just a wrapper around ”…”�”}”(hjž+h²hh³Nh´Nubj“ )�”}”(hŒ ``close()``”h]”hŒclose()”…”�”}”(hj¸+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1j’ hjž+ubhŒt which ensures that the userspace function close does not clash with similarly named function(s) in the kernel part.”…”�”}”(hjž+h²hh³Nh´Nubeh}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M©hjG+h²hubeh}”(h]”jah ]”h"]”Œdeveloping device drivers”ah$]”h&]”uh1hÈhjE)h²hh³hÇh´M‘ubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒUsing UML as a Test Platform”h]”hŒUsing UML as a Test Platform”…”�”}”(hjÚ+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦j;uh1hÍhj×+h²hh³hÇh´M¯ubhí)�”}”(hŒòUML is an excellent test platform for device driver development. As with most things UML, "some user assembly may be required". It is up to the user to build their emulation environment. UML at present provides only the kernel infrastructure.”h]”hŒöUML is an excellent test platform for device driver development. As with most things UML, “some user assembly may be requiredâ€�. It is up to the user to build their emulation environment. UML at present provides only the kernel infrastructure.”…”�”}”(hjè+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M±hj×+h²hubhí)�”}”(hŒËPart of this infrastructure is the ability to load and parse fdt device tree blobs as used in Arm or Open Firmware platforms. These are supplied as an optional extra argument to the kernel command line::”h]”hŒÊPart of this infrastructure is the ability to load and parse fdt device tree blobs as used in Arm or Open Firmware platforms. These are supplied as an optional extra argument to the kernel command line:”…”�”}”(hjö+h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M¶hj×+h²hubj{ )�”}”(hŒ dtb=filename”h]”hŒ dtb=filename”…”�”}”hj,sbah}”(h]”h ]”h"]”h$]”h&]”hÅhÆuh1jz h³hÇh´M»hj×+h²hubhí)�”}”(hŒßThe device tree is loaded and parsed at boottime and is accessible by drivers which query it. At this moment in time this facility is intended solely for development purposes. UML's own devices do not query the device tree.”h]”hŒáThe device tree is loaded and parsed at boottime and is accessible by drivers which query it. At this moment in time this facility is intended solely for development purposes. UML’s own devices do not query the device tree.”…”�”}”(hj,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´M½hj×+h²hubhÉ)�”}”(hhh]”(hÎ)�”}”(hŒSecurity Considerations”h]”hŒSecurity Considerations”…”�”}”(hj#,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”j¦jZuh1hÍhj ,h²hh³hÇh´MÃubhí)�”}”(hXdDrivers or any new functionality should default to not accepting arbitrary filename, bpf code or other parameters which can affect the host from inside the UML instance. For example, specifying the socket used for IPC communication between a driver and the host at the UML command line is OK security-wise. Allowing it as a loadable module parameter isn't.”h]”hXfDrivers or any new functionality should default to not accepting arbitrary filename, bpf code or other parameters which can affect the host from inside the UML instance. For example, specifying the socket used for IPC communication between a driver and the host at the UML command line is OK security-wise. Allowing it as a loadable module parameter isn’t.”…”�”}”(hj1,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÅhj ,h²hubhí)�”}”(hŒçIf such functionality is desirable for a particular application (e.g. loading BPF "firmware" for raw socket network transports), it should be off by default and should be explicitly turned on as a command line parameter at startup.”h]”hŒëIf such functionality is desirable for a particular application (e.g. loading BPF “firmwareâ€� for raw socket network transports), it should be off by default and should be explicitly turned on as a command line parameter at startup.”…”�”}”(hj?,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÍhj ,h²hubhí)�”}”(hXeEven with this in mind, the level of isolation between UML and the host is relatively weak. If the UML userspace is allowed to load arbitrary kernel drivers, an attacker can use this to break out of UML. Thus, if UML is used in a production application, it is recommended that all modules are loaded at boot and kernel module loading is disabled afterwards.”h]”hXeEven with this in mind, the level of isolation between UML and the host is relatively weak. If the UML userspace is allowed to load arbitrary kernel drivers, an attacker can use this to break out of UML. Thus, if UML is used in a production application, it is recommended that all modules are loaded at boot and kernel module loading is disabled afterwards.”…”�”}”(hjM,h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìh³hÇh´MÒhj ,h²hubeh}”(h]”j`ah ]”h"]”Œsecurity considerations”ah$]”h&]”uh1hÈhj×+h²hh³hÇh´MÃubeh}”(h]”jAah ]”h"]”Œusing uml as a test platform”ah$]”h&]”uh1hÈhjE)h²hh³hÇh´M¯ubeh}”(h]”j¼ah ]”h"]”Œ+contributing to uml and developing with uml”ah$]”h&]”uh1hÈhhÊh²hh³hÇh´M,ubeh}”(h]”Œ uml-howto”ah ]”h"]”Œ uml howto”ah$]”h&]”uh1hÈhhh²hh³hÇh´Kubeh}”(h]”h ]”h"]”h$]”h&]”Œsource”hÇuh1hŒcurrent_source”NŒ current_line”NŒsettings”Œdocutils.frontend”ŒValues”“”)�”}”(hÍNŒ generator”NŒ datestamp”NŒ source_link”NŒ source_url”NŒ toc_backlinks”jv Œfootnote_backlinks”KŒ sectnum_xform”KŒstrip_comments”NŒstrip_elements_with_classes”NŒ strip_classes”NŒ report_level”KŒ halt_level”KŒexit_status_level”KŒdebug”NŒwarning_stream”NŒ traceback”ˆŒinput_encoding”Œ utf-8-sig”Œinput_encoding_error_handler”Œstrict”Œoutput_encoding”Œutf-8”Œoutput_encoding_error_handler”jš,Œerror_encoding”Œutf-8”Œerror_encoding_error_handler”Œbackslashreplace”Œ language_code”Œen”Œrecord_dependencies”NŒconfig”NŒ id_prefix”hŒauto_id_prefix”Œid”Œ dump_settings”NŒdump_internals”NŒdump_transforms”NŒdump_pseudo_xml”NŒexpose_internals”NŒstrict_visitor”NŒ_disable_config”NŒ_source”hÇŒ _destination”NŒ _config_files”]”Œ7/var/lib/git/docbuild/linux/Documentation/docutils.conf”aŒfile_insertion_enabled”ˆŒ raw_enabled”KŒline_length_limit”M'Œpep_references”NŒ pep_base_url”Œhttps://peps.python.org/”Œpep_file_url_template”Œpep-%04d”Œrfc_references”NŒ rfc_base_url”Œ&https://datatracker.ietf.org/doc/html/”Œ tab_width”KŒtrim_footnote_reference_space”‰Œsyntax_highlight”Œlong”Œ smart_quotes”ˆŒsmartquotes_locales”]”Œcharacter_level_inline_markup”‰Œdoctitle_xform”‰Œ docinfo_xform”KŒsectsubtitle_xform”‰Œ image_loading”Œlink”Œembed_stylesheet”‰Œcloak_email_addresses”ˆŒsection_self_link”‰Œenv”NubŒreporter”NŒindirect_targets”]”Œsubstitution_defs”}”Œsubstitution_names”}”Œrefnames”}”Œcreating an image”]”jšasŒrefids”}”Œnameids”}”(ju,jr,j’j�j+ jjôj!j¿ jCj$ jej j“j j²j jÔjjjj!jþjCjTjbjçj„j¬j¦jjÈjEjêj�j jöj.j jPj÷jrjÇ$j¬jZjËjòjêjSj jÒj:jøj\jÀ$j~j#j�j'#j¿j[#jáj�#jjÃ#j%jé#jGj!$jijG$j‹jm$j­j“$jÏj¹$jñjB)j+jˆ&jJj™%jij¿%j‹jù%j­j�&jÏj(jýj˜'jjR(j>jx(j`j;)jŽjm,j¼jâ*jÛjD+jýjÔ+jjf,jAj_,j`uŒ nametypes”}”(ju,‰j’‰j+ ‰jô‰j¿ ‰j$ ‰j ‰j ‰j ‰j‰j‰jþ‰jT‰jç‰j¬‰j‰jE‰j�‰jö‰j ‰j÷‰jÇ$‰jZ‰jò‰jS‰jÒ‰jø‰jÀ$‰j#‰j'#‰j[#‰j�#‰jÃ#‰jé#‰j!$‰jG$‰jm$‰j“$‰j¹$‰jB)‰jˆ&‰j™%‰j¿%‰jù%‰j�&‰j(‰j˜'‰jR(‰jx(‰j;)‰jm,‰jâ*‰jD+‰jÔ+‰jf,‰j_,‰uh}”(jr,hÊj�hßjj•j!jÃjCj÷jej j“j. j²j[ jÔj$ jj j!jqjCj jbjDj„jWj¦jêjÈj¯jêjj jHj.j�jPjùjrj£j¬jjËj5jêjFj jõj:j]j\jÕj~jûj�jÂ"j¿j#jáj*#jj^#j%j’#jGjÆ#jijì#j‹j$$j­jJ$jÏjp$jñj–$j+jÊ$jJjÛ$jijú$j‹jœ%j­jÂ%jÏjü%jýj‹&jjá&j>j›'j`jU(jŽj‚(j¼jE)jÛjê)jýjå*jjG+jAj×+j`j ,hühójjj=j4j_jVj�j„j¬j£jÎjÅjüjójjj=j4j\jSj~juj j—jÂj¹jäjÛjjýj(jjJjAjljcj¦j�jÅj¼jäjÛjjýj4j+jVjMjxjoj—jŽj¹j°jÛjÒjýjôjjjAj8jcjZj…j|j§jžjÉjÀjëjâj%jjDj;jcjZj…j|j§jžjÉjÀj÷jîjj j8j/jZjQjˆjj¶j­jÕjÌj÷jîjjj;j2jZjQuŒ footnote_refs”}”Œ citation_refs”}”Œ autofootnotes”]”Œautofootnote_refs”]”Œsymbol_footnotes”]”Œsymbol_footnote_refs”]”Œ footnotes”]”Œ citations”]”Œautofootnote_start”KŒsymbol_footnote_start”KŒ id_counter”Œ collections”ŒCounter”“”}”j¨,K6s…”R”Œparse_messages”]”hŒsystem_message”“”)�”}”(hhh]”hí)�”}”(hŒfPossible title underline, too short for the title. Treating it as ordinary text because it's so short.”h]”hŒhPossible title underline, too short for the title. Treating it as ordinary text because it’s so short.”…”�”}”(hj-h²hh³Nh´Nubah}”(h]”h ]”h"]”h$]”h&]”uh1hìhj-ubah}”(h]”h ]”h"]”h$]”h&]”Œlevel”KŒtype”ŒINFO”Œline”M´Œsource”hÇuh1jþ,hj]h²hh³hÇh´M´ubaŒtransform_messages”]”Œ transformer”NŒ include_log”]”Œ decoration”Nh²hub.