{"id":31333,"date":"2019-10-31T21:40:44","date_gmt":"2019-10-31T18:40:44","guid":{"rendered":"https:\/\/prohoster.info\/blog\/virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2\/"},"modified":"2019-10-31T21:40:44","modified_gmt":"2019-10-31T18:40:44","slug":"virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2","status":"publish","type":"post","link":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2","title":{"rendered":"Virtual file systems in Linux: why they are needed and how they work? Part 2","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p>Hello everyone, we are sharing with you the second part of the publication \"Virtual File Systems in Linux: Why They Are Needed and How They Work?\" The first part can be read <noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/446614\/\">here<\/a><\/noindex>. Let us remind you that this series of publications is dedicated to the launch of a new stream for the course <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/tjnD\/\">Linux Administrator<\/a><\/noindex>, which starts very soon.<\/p>\n<p><b>How to Observe VFS Using eBPF and bcc Tools<\/b><\/p>\n<p>The simplest way to understand how the kernel operates with files <code>sysfs<\/code> is to observe it in practice, and the easiest way to monitor ARM64 is to use eBPF. eBPF (short for Berkeley Packet Filter) consists of a virtual machine running in <noindex><a rel=\"nofollow\" href=\"https:\/\/events.linuxfoundation.org\/sites\/events\/files\/slides\/bpf_collabsummit_2015feb20.pdf\">the kernel<\/a><\/noindex>, which privileged users can request (<code>query<\/code>) from the command line. The kernel source informs the reader about what the kernel can do; running eBPF tools on a loaded system shows what the kernel actually does. <\/p>\n<p><img decoding=\"async\" alt=\"Virtual file systems in Linux: why they are needed and how they work? Part 2\" src=\"\/wp-content\/uploads\/2019\/04\/95443cd3b1562b03eb43bf5fd229c508.jpg\" style=\"display:block;margin: 0 auto;\" \/><noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<p>Fortunately, it is easy to start using eBPF with tools <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/iovisor\/bcc\">bcc<\/a><\/noindex>, which are available as packages from the general distribution <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/INSTALL.md\">Linux<\/a><\/noindex> and are well documented <noindex><a rel=\"nofollow\" href=\"http:\/\/brendangregg.com\/ebpf.html\">by Bernard Greg.<\/a><\/noindex>The tools <code>bcc<\/code> are Python scripts with small C code inserts, meaning anyone familiar with both languages can easily modify them. In <code>bcc\/tools<\/code> there are 80 Python scripts, so it is likely that a developer or system administrator will find something suitable for solving their task. <br \/>\nTo get at least a superficial understanding of what role VFS plays in a running system, try <code>vfscount<\/code> or <code>vfsstat.<\/code>This will show, for instance, that dozens of calls to <code>vfs_open()<\/code> and \"its friends\" occur literally every second.<\/p>\n<p><img decoding=\"async\" alt=\"Virtual file systems in Linux: why they are needed and how they work? Part 2\" src=\"\/wp-content\/uploads\/2019\/04\/3479caa65696a29831f00e48782e48b3.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<blockquote><p><code>vfsstat.py<\/code> is a Python script with C code inserts that simply counts VFS function calls.<\/p><\/blockquote>\n<p>Let's provide a more trivial example and see what happens when we insert a USB flash drive into a computer and the system detects it.<\/p>\n<p><img decoding=\"async\" alt=\"Virtual file systems in Linux: why they are needed and how they work? Part 2\" src=\"\/wp-content\/uploads\/2019\/04\/5c756fe1b6d4c5906631e5da24b59dca.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<\/p>\n<blockquote><p>With eBPF you can see what happens in <code>\/sys<\/code>, when a USB flash drive is inserted. Here is a simple and a complex example.<\/p><\/blockquote>\n<p>In the example shown above, <code>bcc<\/code> tool <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/iovisor\/bcc\/blob\/master\/tools\/trace_example.txt\">trace.py<\/a><\/noindex> outputs a message when the command <code>sysfs_create_files()<\/code>is executed. We can see that <code>sysfs_create_files()<\/code> it was triggered by <code>kworker<\/code> thread in response to the flash drive being inserted, but what file was created? The second example demonstrates the full power of eBPF. Here <code>trace.py<\/code> outputs a kernel backtrace (option -K) and the name of the created file <code>sysfs_create_files()<\/code>. The insertion in single quotes is C code that includes an easily recognizable format string, provided by a Python script that runs LLVM <i>just-in-time compiler<\/i>. This string is compiled and executed in a virtual machine within the kernel. The full signature of the function <code>sysfs_create_files ()<\/code> must be replicated in the second command so that the format string can reference one of the parameters. Errors in this C code fragment lead to recognizable C compiler errors. For example, if the -l parameter is missing, you will see \"Failed to compile BPF text.\" Developers who are well-acquainted with C and Python will find the tools <code>bcc<\/code> easy to extend and modify.<\/p>\n<p>When a USB drive is inserted, the kernel backtrace will show that PID 7711 is the thread <code>kworker<\/code>, which created the file <code>\"events\"<\/code> downward API support (simultaneously with this in <code>sysfs<\/code>. Accordingly, the call to <code>sysfs_remove_files()<\/code> will show that removing the drive resulted in the deletion of the file <code>events<\/code>, which corresponds to the general concept of reference counting. In this process, viewing <code>sysfs_create_link ()<\/code> with eBPF during USB drive insertion will indicate that at least 48 symbolic links were created.<\/p>\n<p>So what is the purpose of the events file? Using <noindex><a rel=\"nofollow\" href=\"http:\/\/northstar-www.dartmouth.edu\/doc\/solaris-forte\/manuals\/c\/user_guide\/cscope.html\">cscope<\/a><\/noindex> to search for <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git\/tree\/block\/genhd.c#n665\">__device_add_disk()<\/a><\/noindex>, shows that it calls <code>disk_add_events ()<\/code>, and either <code>\"media_change\"<\/code>, or <code>\"eject_request\"<\/code> may be written to the events file. Here, the kernel block layer informs userspace of the insertion and ejection of the 'disk'. Note how informative this method of investigation is when inserting a USB drive compared to trying to figure out how everything works solely from the sources.<\/p>\n<p><b>Read-only root file systems enable embedded devices<\/b><\/p>\n<p>Of course, no one turns off the server or their computer by pulling the plug out of the wall. But why? It's because mounted file systems on physical storage devices may have pending writes, and the data structures recording their state may not synchronize with the records in storage. When this happens, system owners must wait for the next boot to run the <code>fsck filesystem-recovery<\/code> utility and, in the worst case, lose data. <\/p>\n<p>However, we all know that many IoT devices, as well as routers, thermostats, and cars, now operate under Linux. Many of these devices have virtually no user interface, and there is no way to turn them off 'cleanly'. Imagine starting a car with a dead battery when the power to the control unit is constantly fluctuating. <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.automotivelinux.org\/_media\/eg-rhsa\/agl_referencehardwarespec_v0.1.0_20171018.pdf\">Linux<\/a><\/noindex> How does it happen that the system boots up without a long delay, <code>fsck<\/code>when the engine finally starts running? The answer is simple. Embedded devices rely on a root file system, <noindex><a rel=\"nofollow\" href=\"https:\/\/elinux.org\/images\/1\/1f\/Read-only_rootfs.pdf\">read-only<\/a><\/noindex> (shortened to <code>ro-rootfs<\/code> (read-only root filesystem). <\/p>\n<p><code>ro-rootfs<\/code> These offer numerous advantages that are less obvious than authenticity. One benefit is that malware cannot write to <code>\/usr<\/code> or <code>\/lib<\/code>, if no Linux process can write to it. Another is that a largely immutable file system is critical for field support of remote devices, as support staff use local systems that are nominally identical to the systems in the field. Perhaps the most important (but also the trickiest) advantage is that ro-rootfs forces developers to decide which system objects will be immutable early in the system design phase. Working with ro-rootfs can be inconvenient and painful, much like dealing with const variables in programming languages, but their benefits easily outweigh the additional overhead.<\/p>\n<p>Creating <code>rootfs<\/code> Read-only file systems require some additional effort from embedded systems developers, and this is where VFS comes into play. Linux requires that files in <code>\/var<\/code> be writable, and moreover, many popular applications that run embedded systems will try to create configuration <code>dot-files.<\/code> downward API support (simultaneously with this in <code>$HOME<\/code>One solution for configuration files in the home directory is usually their pre-generation and assembly into <code>rootfs<\/code>. For <code>\/var<\/code> One possible approach is to mount it in a separate writable partition, while <code>\/<\/code> itself is mounted read-only. Another popular alternative is to use bind or overlay mounts.<\/p>\n<p><b>Bind and overlay mounts, using them with containers<\/b> <\/p>\n<p>Executing the command <code>man mount<\/code> \u2013 is the best way to learn about bind and overlay mounts that allow developers and system administrators to create a file system at one path and then provide it to applications at another. For embedded systems, this means the ability to store files on <code>\/var<\/code> a read-only flash drive, but overlaying or binding a path from <code>tmpfs<\/code> downward API support (simultaneously with this in <code>\/var<\/code> at boot will allow applications to write there (scrawl). The next time it is powered on, changes in <code>\/var<\/code> will be lost. An overlay mount creates a union between <code>tmpfs<\/code> and the underlying file system and allows you to make apparent changes to existing files in <code>ro-tootf<\/code> whereas a bind mount can make new empty <code>tmpfs<\/code> directories visible as writable in <code>ro-rootfs<\/code> paths. While <code>overlayfs<\/code> is the correct (<code>proper<\/code>) type of file system, bind mounting is implemented in <noindex><a rel=\"nofollow\" href=\"https:\/\/git.kernel.org\/pub\/scm\/linux\/kernel\/git\/torvalds\/linux.git\/tree\/Documentation\/filesystems\/sharedsubtree.txt\">the VFS namespace<\/a><\/noindex>.<\/p>\n<p>Based on the description of overlay and bind mounting, it's no surprise that <noindex><a rel=\"nofollow\" href=\"https:\/\/coreos.com\/os\/docs\/latest\/kernel-modules.html\">Linux containers<\/a><\/noindex> actively use them. Let's observe what happens when we use <noindex><a rel=\"nofollow\" href=\"https:\/\/www.freedesktop.org\/software\/systemd\/man\/systemd-nspawn.html\">systemd-nspawn<\/a><\/noindex> to run a container, using the tool <code>mountsnoop<\/code> from <code>bcc<\/code>.<\/p>\n<p>Call <code>system-nspawn<\/code> starts the container during the operation <code>mountsnoop.py<\/code>.<\/p>\n<p>Let's see what we got:<\/p>\n<p>Start <code>mountsnoop<\/code> during the container's 'boot' shows that the container runtime environment heavily relies on bind mounting (Only the start of a long output is displayed).<\/p>\n<p>Here <code>systemd-nspawn<\/code> provides selected files from <code>Functions<\/code> and <code>sysfs<\/code> the host into the container as paths in its <code>rootfs<\/code>. In addition to <code>the MS_BIND<\/code> flag, which sets the bind mount, some other flags in the mounting system define the relationship between changes in the host's namespace and the container. For example, a bind mount can either pass changes into <code>\/proc<\/code> and <code>\/sys<\/code> the container, or hide them depending on the call. <\/p>\n<p><b>Conclusion<\/b><\/p>\n<p>Understanding the inner workings of Linux may seem like an impossible task, as the kernel itself contains a massive amount of code, not to mention the user space Linux applications and system call interfaces in C language libraries, such as <code>glibc<\/code>. One way to make progress is to read the source code of a kernel subsystem, focusing on understanding system calls and headers addressed to user space, as well as key internal kernel interfaces, for instance, the table <code>file_operations<\/code>. File operations adhere to the principle of \"everything is a file,\" making their management particularly enjoyable. The core source files written in C are located in the top-level directory <code>fs\/<\/code> and represent the implementation of virtual file systems, which act as a shell layer providing broad and relatively straightforward compatibility for popular file systems and storage devices. Mounting through binding and overlaying via Linux namespaces is the magic of VFS, enabling the creation of containers and read-only root file systems. Combined with studying the source code, the eBPF core tool and its interface <code>bcc<\/code><br \/>\n make exploring the kernel easier than ever.<\/p>\n<p>Friends, did you find this article useful? Perhaps you have some comments or suggestions? For those interested in the \"Linux Administrator\" course, we invite you to <noindex><a rel=\"nofollow\" href=\"https:\/\/otus.pw\/u5Jw\/\">open house<\/a><\/noindex>, which will take place on April 18.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/446614\/\">Part one.<\/a><\/noindex><br \/>\n<br \/>Source: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/company\/otus\/blog\/447748\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 Linux: \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?\u00bb \u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c \u0442\u0443\u0442. \u041d\u0430\u043f\u043e\u043c\u043d\u0438\u043c, \u0434\u0430\u043d\u043d\u0430\u044f \u0441\u0435\u0440\u0438\u044f \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0439 \u043f\u0440\u0438\u0443\u0440\u043e\u0447\u0435\u043d\u0430 \u043a \u0437\u0430\u043f\u0443\u0441\u043a\u0443 \u043d\u043e\u0432\u043e\u0433\u043e \u043f\u043e\u0442\u043e\u043a\u0430 \u043f\u043e \u043a\u0443\u0440\u0441\u0443 \u00ab\u0410\u0434\u043c\u0438\u043d\u0438\u0441\u0442\u0440\u0430\u0442\u043e\u0440 Linux\u00bb, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0441\u0442\u0430\u0440\u0442\u0443\u0435\u0442 \u0443\u0436\u0435 \u0441\u043e\u0432\u0441\u0435\u043c \u0441\u043a\u043e\u0440\u043e. \u041a\u0430\u043a \u043d\u0430\u0431\u043b\u044e\u0434\u0430\u0442\u044c \u0437\u0430 VFS \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0438\u043d\u0441\u0442\u0440\u0443\u043c\u0435\u043d\u0442\u043e\u0432 eBPF \u0438 bcc \u0421\u0430\u043c\u044b\u0439 \u043f\u0440\u043e\u0441\u0442\u043e\u0439 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":23299,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-31333","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.2 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 Linux: \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?\u00bb \u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.2\" \/>\n\t\t<meta property=\"og:locale\" content=\"en_US\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 Linux: \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442? \u0427\u0430\u0441\u0442\u044c 2 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 Linux: \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?\u00bb \u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:40:44+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:40:44+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Virtual File Systems in Linux: What Are They and How Do They Work? Part 2 | ProHoster","description":"Hello everyone, we are sharing with you the second part of the publication \"Virtual File Systems in Linux: Why They Are Needed and How They Work?\" The first part can be read","canonical_url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"en_US","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 Linux: \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442? \u0427\u0430\u0441\u0442\u044c 2 | ProHoster","og:description":"\u0412\u0441\u0435\u043c \u043f\u0440\u0438\u0432\u0435\u0442, \u0434\u0435\u043b\u0438\u043c\u0441\u044f \u0441 \u0432\u0430\u043c\u0438 \u0432\u0442\u043e\u0440\u043e\u0439 \u0447\u0430\u0441\u0442\u044c\u044e \u043f\u0443\u0431\u043b\u0438\u043a\u0430\u0446\u0438\u0438 \u00ab\u0412\u0438\u0440\u0442\u0443\u0430\u043b\u044c\u043d\u044b\u0435 \u0444\u0430\u0439\u043b\u043e\u0432\u044b\u0435 \u0441\u0438\u0441\u0442\u0435\u043c\u044b \u0432 Linux: \u0437\u0430\u0447\u0435\u043c \u043e\u043d\u0438 \u043d\u0443\u0436\u043d\u044b \u0438 \u043a\u0430\u043a \u043e\u043d\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442?\u00bb \u041f\u0435\u0440\u0432\u0443\u044e \u0447\u0430\u0441\u0442\u044c \u043c\u043e\u0436\u043d\u043e \u043f\u0440\u043e\u0447\u0438\u0442\u0430\u0442\u044c","og:url":"https:\/\/prohoster.info\/en\/blog\/administrirovanie\/virtualnye-fajlovye-sistemy-v-linux-zachem-oni-nuzhny-i-kak-oni-rabotayut-chast-2","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:40:44+00:00","article:modified_time":"2019-10-31T18:40:44+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"31333","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-21 05:41:23","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:18:40","updated":"2026-01-21 05:41:23","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/31333","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/comments?post=31333"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/posts\/31333\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media\/23299"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/media?parent=31333"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/categories?post=31333"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/en\/wp-json\/wp\/v2\/tags?post=31333"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}