summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHolger Dengler <dengler@linutronix.de>2019-01-13 15:03:55 +0100
committerJohn Ogness <john.ogness@linutronix.de>2019-01-18 15:27:09 +0100
commit9282eadbc3b7cfe5a34e8a5a20fdac878d44b009 (patch)
tree6e8128ec9484fdef8b68b4b7e874ea51c31951c7
parent07d65b50c4156453099a3a2083804e00451e2041 (diff)
linux-basics: Add Filesystem-Org slides
Add slides about Filesystem Organization and Structural Elements. Signed-off-by: Holger Dengler <dengler@linutronix.de>
-rw-r--r--images/filesystem-organization.odgbin0 -> 11865 bytes
-rw-r--r--images/filesystem-organization.pngbin0 -> 50229 bytes
-rw-r--r--linux-basics/filesystems/Kconfig9
-rw-r--r--linux-basics/filesystems/Makefile1
-rw-r--r--linux-basics/filesystems/frm_filesystem_org.tex243
-rw-r--r--linux-basics/filesystems/pres_filesystem_org.tex20
6 files changed, 273 insertions, 0 deletions
diff --git a/images/filesystem-organization.odg b/images/filesystem-organization.odg
new file mode 100644
index 0000000..c150a27
--- /dev/null
+++ b/images/filesystem-organization.odg
Binary files differ
diff --git a/images/filesystem-organization.png b/images/filesystem-organization.png
new file mode 100644
index 0000000..1cbe4f5
--- /dev/null
+++ b/images/filesystem-organization.png
Binary files differ
diff --git a/linux-basics/filesystems/Kconfig b/linux-basics/filesystems/Kconfig
index 69a9fd6..5ecd034 100644
--- a/linux-basics/filesystems/Kconfig
+++ b/linux-basics/filesystems/Kconfig
@@ -3,3 +3,12 @@ config LINUX_FILESYSTEMS
default y
help
Papers about Linux filesystems
+
+config LINUX_FILESYSTEM_ORG
+ bool "Linux Filesystem Organization/Structural Elements"
+ default y
+ help
+ Papers about Linux Filesystem Organization and the structural
+ elements of filesystems.
+ - inodes/data-blocks
+ - file types
diff --git a/linux-basics/filesystems/Makefile b/linux-basics/filesystems/Makefile
index a5135f6..a20185c 100644
--- a/linux-basics/filesystems/Makefile
+++ b/linux-basics/filesystems/Makefile
@@ -1,2 +1,3 @@
obj-$(CONFIG_LINUX_FILESYSTEMS) += pres_filesystems_en.pdf
obj-handout-$(CONFIG_LINUX_FILESYSTEMS) += handout_filesystems_en.pdf
+obj-$(CONFIG_LINUX_FILESYSTEM_ORG) += pres_filesystem_org.pdf
diff --git a/linux-basics/filesystems/frm_filesystem_org.tex b/linux-basics/filesystems/frm_filesystem_org.tex
new file mode 100644
index 0000000..9694766
--- /dev/null
+++ b/linux-basics/filesystems/frm_filesystem_org.tex
@@ -0,0 +1,243 @@
+\subsubsection{Filesystem Elements}
+% ----------------------------
+\begin{frame}
+\frametitle{Filesystem: Basics Elements}
+\begin{itemize}
+\item Filesystem
+ \begin{itemize}
+ \item structured data organization for block-devices
+ \item super-block, inodes, data-blocks
+ \end{itemize}
+\item super-block
+ \begin{itemize}
+ \item information about the filesystem itself
+ \end{itemize}
+\item inode
+ \begin{itemize}
+ \item organizational data structure
+ \item unique inode number
+ \item meta-data
+ \item list of data-block addresses
+ \end{itemize}
+\item data-block
+ \begin{itemize}
+ \item payload storage
+ \end{itemize}
+\end{itemize}
+\end{frame}
+% Any data on a block-device is stored and accessed in blocks. This is an
+% efficient way to deal with large data-sets. Because it is not easy, to
+% find the right information in large, unsorted data-sets (especially for
+% humans), Linux provides filesystems to organize the data in a
+% block-device.
+% Filesystems use some blocks of a block-device to store organizational
+% information about the payload data on the device. The organizational
+% structures are called "inodes".
+% The "super-block" of a filesystem stores information about the filesystem
+% itself, like block-size, number of blocks, number of inodes, and so on.
+
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{Filesystem: INodes and Data-Blocks}
+\begin{figure}[h]
+\centering
+\includegraphics[width=5cm]{images/filesystem-organization.png}
+\end{figure}
+\end{frame}
+% The Diagram shows the organization of inodes and blocks. The inode is the
+% informational part of a file or directory, it contains the meta-data (like
+% owner, group, access-permissions) and the addresses of the data-blocks
+% (where the data of a file or directory is stored).
+% The payload of directories are name/inode-number tuples of their elements.
+
+\subsubsection{File Types}
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{File Types}
+\begin{itemize}
+\item \textbf{-}: normal file
+\item \textbf{d}: directory
+\item \textbf{l}: symbolic link
+\item \textbf{c}: character device
+\item \textbf{b}: block device
+\item \textbf{s}: socket
+\item \textbf{p}: named pipe (FIFO)
+\end{itemize}
+\bigskip
+\begin{beamerboxesrounded}[shadow=true]{Listing: all file-types}
+\begin{scriptsize}
+\begin{verbatim}
+-rw-r--r-- 1 6 file
+drwxr-xr-x 2 4096 directory
+lrwxrwxrwx 1 4 symlink -> file
+crw-r--r-- 1 4, 65 devicenode_character
+brw-r--r-- 1 8, 0 devicenode_block
+srwxr-xr-x 1 0 socket
+prw-r--r-- 1 0 pipe
+\end{verbatim}
+\end{scriptsize}
+\end{beamerboxesrounded}
+\end{frame}
+% Linux has several file types. The behaviour varies depending on the file
+% type, but for the access to all type of files, the same syscalls are used
+% (open, read, write, ioctl, mmap, ...).
+% The file-types in Linux are:
+% Normal file (-), directory (d), symbolic link (l), character and block
+% devicenode, socket and pipe.
+
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{Directory}
+\begin{itemize}
+\item hierarchical structure
+\item references: name -> inode tuples
+\item access permissions: create/delete entries
+\item create directory: \textbf{mkdir <name>}
+\end{itemize}
+\bigskip
+\begin{beamerboxesrounded}[shadow=true]{Listing: Directories}
+\begin{scriptsize}
+\begin{verbatim}
+drwxr-xr-x 2 4096 directory1
+dr-xr-x--- 2 4096 directory2
+\end{verbatim}
+\end{scriptsize}
+\end{beamerboxesrounded}
+\end{frame}
+% Directories provides a hierarchical organization for all file-types. In
+% its payload, a directory contains name-inode tuples (file-names). The
+% access-permissions of a directory manages the access of the directory
+% itself, directory entries can be created or removed. E.g. if a directory
+% is read-only, it is not possible to create new files in, or delete
+% existing files from this directory.
+
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{Symlinks}
+\begin{itemize}
+\item reference by pathname (relative and absolute)
+\item broken, if destination doesn't exist
+\item cross-filesystem: yes
+\item access permissions: -
+\item size: length of referenced pathname
+\item create symlink: \textbf{ln -s <src> <dst>}
+\end{itemize}
+\bigskip
+\begin{beamerboxesrounded}[shadow=true]{Listing: Symbolic Links}
+\begin{scriptsize}
+\begin{verbatim}
+-rw-r--r-- 1 6 file
+lrwxrwxrwx 1 4 symlink_rel -> file
+lrwxrwxrwx 1 15 symlink_abs -> /home/user/file
+\end{verbatim}
+\end{scriptsize}
+\end{beamerboxesrounded}
+\end{frame}
+% Symlinks (or symbolic-links) are references to another entity in the
+% filesystem-tree, based on its pathname. The path of a symlink can be
+% either relative (to the link) or absolute (path starts with a /). Symlinks
+% can be created to entities in another filesystem, where hard-links are
+% filesystem-local. A link is broken, if the destination entity doesn't
+% exist. The length of a symlink depends of the length of the path-name.
+% The access-permissions of a symlink has no meaning in Linux.
+
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{Hard Links}
+\begin{itemize}
+\item additional name entry to same inode-number
+\item increase reference-count
+\item cross-filesystem: no
+\item access permissions: same as destination
+\item size: same as destination
+\item create hard-link: \textbf{ln <src> <dst>}
+\item delete: remove only name-entry
+ \begin{itemize}
+ \item remove name-inode tuple (directory)
+ \item decrease reference-count (inode)
+ \end{itemize}
+\end{itemize}
+\bigskip
+\begin{beamerboxesrounded}[shadow=true]{Listing: Hard Links}
+\begin{scriptsize}
+\begin{verbatim}
+3165779 -rw-r--r-- 2 6 Jan 11 14:16 file
+3165779 -rw-r--r-- 2 6 Jan 11 14:16 hard_link
+3165785 lrwxrwxrwx 1 4 Jan 11 14:22 symlink -> file
+\end{verbatim}
+\end{scriptsize}
+\end{beamerboxesrounded}
+\end{frame}
+% Hardlinks are (additional) named references to an inode. Normal files are
+% hard-links with a reference-count of 1. Had-links can only exist
+% filesystem-local, because its just a name-inode reference.
+% The meta-data (size, timestamp, access-permissions) of a hard-link are
+% identical with the destination, because they are stored in the inode, the
+% hard-links references to. Deleteing a hard-link does not affect the file
+% content, it just removes the name-entry in the directory. Only if the last
+% hard-link is removed (reference.count==0), the content is freed.
+% Note: The filename is not part of the meta-data, its an entry in the
+% directory.
+
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{Character/Block Devices}
+\begin{itemize}
+\item inode-only
+\item device handle/reference for Userspace
+\item meta-data: major and minor number
+\item more details: see \textbf{Linux Userspace-to-Kernel API}
+\end{itemize}
+\bigskip
+\begin{beamerboxesrounded}[shadow=true]{Listing: Hard Links}
+\begin{scriptsize}
+\begin{verbatim}
+crw-r--r-- 1 4, 65 devicenode_character
+brw-r--r-- 1 8, 0 devicenode_block
+\end{verbatim}
+\end{scriptsize}
+\end{beamerboxesrounded}
+\end{frame}
+
+% ----------------------------
+\begin{frame}[fragile]
+\frametitle{Pipe and Socket}
+\begin{itemize}
+\item inode-only
+\item named handle to IPC machanism (provided by Kernel)
+\item pipe: FIFO (like anonymous pipes)
+\item socket: UNIX domain socket
+\end{itemize}
+\bigskip
+\begin{beamerboxesrounded}[shadow=true]{Listing: Hard Links}
+\begin{scriptsize}
+\begin{verbatim}
+srwxr-xr-x 1 0 socket
+prw-r--r-- 1 0 pipe
+\end{verbatim}
+\end{scriptsize}
+\end{beamerboxesrounded}
+\end{frame}
+
+% ----------------------------
+\subsubsection*{}
+\begin{frame}
+\frametitle{Resources}
+\begin{itemize}
+\item linfo.org
+ \begin{itemize}
+ \item \href {http://www.linfo.org/inode.html}{Inode Definition}
+ \item \href {http://www.linfo.org/file.html}{Files: A Brief Introduction}
+ \end{itemize}
+\item man-Pages
+ \begin{itemize}
+ \item \href {http://man7.org/linux/man-pages/man1/ls.1.html}{man 1 ls}
+ \item \href {http://man7.org/linux/man-pages/man1/rm.1.html}{man 1 rm}
+ \item \href {http://man7.org/linux/man-pages/man1/ln.1.html}{man 1 ln}
+ \item \href {http://man7.org/linux/man-pages/man1/mkdir.1.html}{man 1 mkdir}
+ \item \href {http://man7.org/linux/man-pages/man1/mkfifo.1.html}{man 1 mkfifo}
+ \item \href {http://man7.org/linux/man-pages/man7/symlink.7.html}{man 7 symlinks}
+ \item \href {http://man7.org/linux/man-pages/man7/pipe.7.html}{man 7 pipe}
+ \end{itemize}
+\end{itemize}
+\end{frame}
diff --git a/linux-basics/filesystems/pres_filesystem_org.tex b/linux-basics/filesystems/pres_filesystem_org.tex
new file mode 100644
index 0000000..f571b8e
--- /dev/null
+++ b/linux-basics/filesystems/pres_filesystem_org.tex
@@ -0,0 +1,20 @@
+\input{configpres}
+
+\subsection{Linux Filesystem}
+\title{Linux Filesystem}
+\subtitle{Organization and Structural Elements}
+
+% ----------------------------
+\maketitle
+
+% ----------------------------
+\begin{frame}
+\frametitle{Overview}
+\tableofcontents
+\end{frame}
+
+% ----------------------------
+\input{linux-basics/filesystems/frm_filesystem_org.tex}
+
+\subsection*{}
+\input{tailpres}