Welcome to My Linux’s documentation!¶
Contents:
基础篇¶
Linux 的目录结构¶

Linux 树状目录结构表
简单类比 windows¶
Linux | Windows |
---|---|
/usr | C:\Programe files |
/lib | C:\windows\system32 |
/etc | Windows Registery |
最基本目录¶
/bin,/dev,/etc,/lib,/proc,/sbin,/usr,/home,/root,/mnt
常用目录¶
/home: 存放各用户的主目录。
- /home/<username>/.config
- /home/test/.config/autostart/xxxx.desktop
- 各种各样的配置文件 例如 .bashrc
/etc: 系统设置文件
- /etc/init.d/ 开机启动的服务
- /etc/apt/ apt-get 配置
/var/log : 系统的log
- dmesg /var/log/dmesg
- boot.log /var/log/boot.log
- XWindow log /var/log/Xorg.0.log
- system log /var/log/syslog
/usr: 安装主要的系统文件和软件
- /usr/include/: 头文件的位置;
- /usr/src: 内核和软件的源代码的位置;
- /usr/local: 安装外来软件的地方;
/lib: 库文件以及driver;
- 网卡的driver目录 lib/modules/`uname -r`/kernel/drivers/net/ethernet
/dev: 设备文件,主要是各种驱动;
/dev/sda* 硬盘
/dev/tty* Terminal
/dev/null
/dev/urandrom 随机数生成器
/dev/stdin,/dev/stdout,/dev/stderr
echo "hello world" > /dev/stdout
/proc: Linux 内核的接口,可以通过它在运行时获取、改变系统内核的许多参数;但是逐渐 /sys 取待
- 各个进程的内核信息 /proc/<pid>
- 系统所有mount信息 /proc/mount
- 系统的上线时间 /proc/uptime
- 开机启动参数 /proc/cmdline
- 内核的sysbol表 /proc/kallsysms
/boot 系统启动用的文件 : grub config, initrd,vmlinuz;
/tmp: 用于创建临时文件或目录;系统重启就会清空
/bin: 用来存储用户命令和可执行程序
/sbin: 包含一些主要供超级用户用的可执行程序;
/mnt: 外挂设备的挂接点;
/root: 超级用户的目录;
Linux Shell Effecitive Skills¶
What’s is shell¶


sh,csh/Tcsh,ksh,bash,zsh
Csh 1978 Ksh 1983 Bash 1988 zsh 1990
系统可交互接口,简练,接近自己语言。
- Unix小而美的哲学的典范。
- 所有的UNIX 命令,系统调用,公共程序,工具,和编译过的二进制程序,对于shell 脚本来说,都是可调用的.
- 所有shell feature 成熟,并且能够在新的shell上完成兼容。
Bash¶
通用性强, 大部分linux发行版本的默认shell
各种shell发展成熟,也成为后续的shell的事实标准
灵活的IO重定向,命令替换,管道组合可以 大大提高效率。
find | grep, ()& < > $()
- 高效交互方式
- Shell history and choose one
- Shell expansion
- Command execution
- Command line editing
- Text process
Bash 的原理框图¶

shell expansions¶
- brace expansion
- tilde expansion
- parameter and variable expansion
- arithmetic expansion
- command substitution
- word splitting; and
- filename expansion.
{} 直积(笛卡尔积)¶
\((a,b)* (x,y,z) => (a,x),(a,y),(a,z),(b,x),(b,y),(b,z)\)
$ echo {1..10} 1 2 3 4 5 6 7 8 9 10 $ echo {a..e} a b c d e $ echo {1..10..3} 1 4 7 10 $ echo {a..j..3} a d g jBash$ mkdir -p Top/{a,b}/{i,k}/{o,p,q} Bash$ tree Top Top ├── a │ ├── i │ │ ├── o │ │ ├── p │ │ └── q │ ├── j │ │ ├── o │ │ ├── p │ │ └── q │ └── k │ ├── o │ ├── p │ └── q └── b ├── i │ ├── o │ ├── p │ └── q ├── j │ ├── o │ ├── p │ └── q └── k ├── o ├── p └── q scp -p xxx/{a,c,d,e} user@host:dest/ #备份命令,就是利用一个空参数来实现。 cp filename{,.bak} bash$ ls grub.cfg bash$ cp grub.cfg{,.bak} bash$ ls grub.cfg grub.cfg.bak ls *.{jpg,jpeg,png} # expands to *.jpg *.jpeg *.png - after which, # the wildcards are processed echo *.{png,jp{e,}g} # echo just show the expansions - # and braces in braces are possible.
~扩展¶
~ The value of $HOME
~/foo #$HOME/foo
~fred/foo #The subdirectory foo of the home directory of the user fred
~+/foo $PWD/foo
变量与参数扩展¶
=`前后没有空格 `varname=”value” $varname ${varable}
speical variable 替换 扩展
"$0","The filename of the current script."
"$n","These variables correspond to the arguments with which a script was invoked. Here n is a positive decimal number corresponding to the position of an argument (the first argument is $1, the second argument is $2, and so on)."
"$$","The process ID of the current shell. For shell scripts, this is the process ID under which they are executing."
"$#",The number of arguments supplied to a script.
"$@","All the arguments are individually double quoted. If a script receives two arguments, $@ is equivalent to $1 $2."
"$*","All the arguments are double quoted. If a script receives two arguments, $* is equivalent to $1 $2."
"$?","The exit status of the last command executed."
"$!","The process ID of the last background command."
"$_", "The last argument of the previous command."
* 利用$* 来实现命令的封装,在你需要定制你的命令的时候
ll.sh
ls -l $*
*$@*
exec /usr/bin/flex -l "$@" 以前不知道为什么要有这些用法。现在明白了主要为了方便二次的转接。尤其在做接口函数的,这样可以无缝传给那些函数。正是通过些符号,我们很方便定制各种各样的命令,就样android中build 中envsetup,sh 中那些cgrep,regrep, 等等这些命令。进行二次封装可以大大加快的自己的速度。
参数替换
default value
${parameter:-word} ${parameter:=word} ${parameter:?word} ${parameter:+word}
string slice
${parameter:offset} ${parameter:offset:length} #左匹配删除 ${parameter#word} ${parameter##word} # 右侧删除 ${parameter%word} ${parameter%%word} # 替换 ${parameter/pattern/string} # 小写 ${parameter^pattern} ${parameter,pattern} #小写 ${parameter^^pattern} ${parameter,,pattern}
数学计算替换 仅支持整数 $(( expression ))
$(( 1+2 +3 ))
命令替换
$(command)
`command`
bash~$ date +%Y%m%d%H%M%S
20190330203926
bash~$ mkdir log_$(date +%Y%m%d%H%M%S)
bash~$ ls
log_20190330204008
bash~$
- 进程替换 <(list) or >(list)
可以实现比管道复杂的功能
diff <(ls $first_directory | sort) <(ls $second_directory | sort)` 直接来对比两条命令的输出。
Filename expansion (pattern matching)¶
* any
** rcursive match
? 0,1
[...] charter range
?(pattern-list) 0,1
*(pattern-list) any
+(pattern-list) 1+
@(pattern-list) 1+
!(pattern-list) not match
- example1
bash$ ls /etc/pam.d/
atd gdm-autologin login postlogin-ac smtp system-auth
chfn gdm-fingerprint other ppp smtp.postfix system-auth-ac
chsh gdm-launch-environment passwd remote sshd systemd-user
config-util gdm-password password-auth runuser sssd-shadowutils vlock
crond gdm-pin password-auth-ac runuser-l su vmtoolsd
cups gdm-smartcard pluto setup sudo xserver
fingerprint-auth ksu polkit-1 smartcard-auth sudo-i
fingerprint-auth-ac liveinst postlogin smartcard-auth-ac su-l
bash$ cp /etc/pam.d/gdm-+(auto|pass)* .
bash$ ls
gdm-autologin gdm-password
bash$
善用通配符,减少输入
vim **/*READ* #open the README at any subfolder vim /etc/pa*ac
$IFS <space>,<tab>,<newline>
Shell Command execution¶
命令,管道,IO重定向
commands¶
简单命令
list of Commands
&& || ; &
https://www.gnu.org/software/bash/manual/html_node/index.html#SEC_Contents
command1;comand2
command1 && command2
command1 || command2
- component Commands
if test-commands; then
consequent-commands;
[elif more-test-commands; then
more-consequents;]
[else alternate-consequents;]
fi
case word in
[ [(] pattern [| pattern]…) command-list ;;]…
esac
until test-commands; do consequent-commands; done
while test-commands; do consequent-commands; done
for name [ [in [words …] ] ; ] do commands; done
- 在大部分情况下避免使用if,通过 find,grep等filter来实现过滤。
- loop 大部分情况只用for就够了,少部分使用while
Grouping commands as a unit¶
( list ) #/executed in a subshell
{ list; } #at current shell context
- redirection and pipeline is applied to the entire command list.
- parellel
bash$ cat test.sh
for i in 10.19.189.{1..255};
do
(ping -c 1 $i &)
done 2>&1 | grep "ttl"
64 bytes from 10.19.189.1: icmp_seq=1 ttl=249 time=99.9 ms
64 bytes from 10.19.189.2: icmp_seq=1 ttl=249 time=107 ms
64 bytes from 10.19.189.3: icmp_seq=1 ttl=248 time=102 ms
64 bytes from 10.19.189.59: icmp_seq=1 ttl=57 time=92.2 ms
64 bytes from 10.19.189.69: icmp_seq=1 ttl=121 time=86.8 ms
64 bytes from 10.19.189.74: icmp_seq=1 ttl=56 time=86.6 ms
64 bytes from 10.19.189.177: icmp_seq=1 ttl=56 time=99.5 ms
64 bytes from 10.19.189.179: icmp_seq=1 ttl=57 time=95.5 ms
64 bytes from 10.19.189.207: icmp_seq=1 ttl=56 time=188 ms
64 bytes from 10.19.239.1: icmp_seq=1 ttl=249 time=94.5 ms
pipelines¶

在Unix设计哲学中,有一个重要设计原则–KISS(Keep it Simple, Stupid),大概意思就是只关注如何做好一件事,并把它做到极致。每个程序都有各自的功能,那么有没有一样东西将不同功能的程序互相连通,自由组合成更为强大的宏工具呢?此时,管道出现了,它能够让程序实现了高内聚,低耦合 管道的发名者叫,Malcolm Douglas McIlroy,他也是Unix的创建者,是Unix文化的缔造者之一。他归纳的Unix哲学如下:

Pipes
command1 | command2 command1 |& command2
find -iname ".c"| xargs grep "open"
ls -l |sed -e 's/[aeio]/u/g'
bash$ ldd /usr/autodesk/maya2019/bin/maya.bin
linux-vdso.so.1 => (0x00007ffdbb5d8000)
libMaya.so => /usr/autodesk/maya2019/bin/../lib/libMaya.so (0x00007f52e43ad000)
libIMFbase.so => /usr/autodesk/maya2019/bin/../lib/libIMFbase.so (0x00007f52e40db000)
libAG.so => /usr/autodesk/maya2019/bin/../lib/libAG.so (0x00007f52e3a74000)
libiff.so => /usr/autodesk/maya2019/bin/../lib/libiff.so (0x00007f52e383f000)
libawGR.so => /usr/autodesk/maya2019/bin/../lib/libawGR.so (0x00007f52e3632000)
libglew.so => /usr/autodesk/maya2019/bin/../lib/libglew.so (0x00007f52e33b3000)
libclew.so => /usr/autodesk/maya2019/bin/../lib/libclew.so (0x00007f52e31ad000)
libOpenCLUtilities.so => /usr/autodesk/maya2019/bin/../lib/libOpenCLUtilities.so (0x00007f52e2f89000)
... skip 30 lines ....
libXp.so.6 => not found
libXmu.so.6 => /lib64/libXmu.so.6 (0x00007f52c4131000)
libXpm.so.4 => /lib64/libXpm.so.4 (0x00007f52c3f1f000)
libXt.so.6 => /lib64/libXt.so.6 (0x00007f52c3cb8000)
libXi.so.6 => /lib64/libXi.so.6 (0x00007f52c3aa8000)
libXext.so.6 => /lib64/libXext.so.6 (0x00007f52c3896000)
libxcb.so.1 => /lib64/libxcb.so.1 (0x00007f52b32c8000)
.... skip 89 lines ....
libjbig.so.2.0 => /lib64/libjbig.so.2.0 (0x00007f52b30bb000)
libexpat.so.1 => /lib64/libexpat.so.1 (0x00007f52b2e91000)
libbz2.so.1 => /lib64/libbz2.so.1 (0x00007f52b2c81000)
libtbbmalloc_proxy.so.2 => not found
libtbb_preview.so.2 => not found
libtbbmalloc_proxy.so.2 => not found
libtbb_preview.so.2 => not found
libpcre.so.1 => /lib64/libpcre.so.1 (0x00007f52b2a1b000)
libffi.so.6 => /lib64/libffi.so.6 (0x00007f52b2812000)
libidn.so.11 => /lib64/libidn.so.11 (0x00007f52b25df000)
libssh2.so.1 => /lib64/libssh2.so.1 (0x00007f52b23b5000)
libssl3.so => /lib64/libssl3.so (0x00007f52b2162000)
libplds4.so => /lib64/libplds4.so (0x00007f52b1f5e000)
libplc4.so => /lib64/libplc4.so (0x00007f52b1d59000)
libgssapi_krb5.so.2 => /lib64/libgssapi_krb5.so.2 (0x00007f52b1b0b000)
libkrb5.so.3 => /lib64/libkrb5.so.3 (0x00007f52b1822000)
libk5crypto.so.3 => /lib64/libk5crypto.so.3 (0x00007f52b1607000)
libcom_err.so.2 => /lib64/libcom_err.so.2 (0x00007f52b1402000)
liblber-2.4.so.2 => /lib64/liblber-2.4.so.2 (0x00007f52b11f3000)
libldap-2.4.so.2 => /lib64/libldap-2.4.so.2 (0x00007f52b0f9e000)
libgmodule-2.0.so.0 => /lib64/libgmodule-2.0.so.0 (0x00007f52b0d99000)
libselinux.so.1 => /lib64/libselinux.so.1 (0x00007f52b0b72000)
libresolv.so.2 => /lib64/libresolv.so.2 (0x00007f52b0958000)
libmount.so.1 => /lib64/libmount.so.1 (0x00007f52b0715000)
libgsttag-1.0.so.0 => /lib64/libgsttag-1.0.so.0 (0x00007f52b04d9000)
liborc-0.4.so.0 => /lib64/liborc-0.4.so.0 (0x00007f52b0255000)
libsystemd.so.0 => /lib64/libsystemd.so.0 (0x00007f52b0023000)
libXau.so.6 => /lib64/libXau.so.6 (0x00007f52afe1f000)
libkrb5support.so.0 => /lib64/libkrb5support.so.0 (0x00007f52afc0f000)
libkeyutils.so.1 => /lib64/libkeyutils.so.1 (0x00007f52afa0b000)
libsasl2.so.3 => /lib64/libsasl2.so.3 (0x00007f52af7ed000)
libblkid.so.1 => /lib64/libblkid.so.1 (0x00007f52af5ad000)
libcap.so.2 => /lib64/libcap.so.2 (0x00007f52af3a7000)
liblz4.so.1 => /lib64/liblz4.so.1 (0x00007f52af192000)
libgcrypt.so.11 => /lib64/libgcrypt.so.11 (0x00007f52aef11000)
libgpg-error.so.0 => /lib64/libgpg-error.so.0 (0x00007f52aed0b000)
libdw.so.1 => /lib64/libdw.so.1 (0x00007f52aeabc000)
libcrypt.so.1 => /lib64/libcrypt.so.1 (0x00007f52ae884000)
libattr.so.1 => /lib64/libattr.so.1 (0x00007f52ae67f000)
libelf.so.1 => /lib64/libelf.so.1 (0x00007f52ae466000)
libfreebl3.so => /lib64/libfreebl3.so (0x00007f52ae263000)
bash$ ldd /usr/autodesk/maya2019/bin/maya.bin | grep "not"
libXp.so.6 => not found
libfam.so.0 => not found
libXp.so.6 => not found
libXp.so.6 => not found
libtbbmalloc_proxy.so.2 => not found
libtbb_preview.so.2 => not found
libtbbmalloc_proxy.so.2 => not found
libtbb_preview.so.2 => not found
IO redirection¶

exec &> >(tee -a "$log_file")
echo This will be logged to the file and to the screen
$log_file will contain the output of the script and any subprocesses, and the output will also be printed to the screen.
>(...) starts the process ... and returns a file representing its standard input. exec &> ... redirects both standard output and standard error into ... for the remainder of the script (use just exec > ... for stdout only). tee -a appends its standard input to the file, and also prints it to the screen.
https://unix.stackexchange.com/questions/145651/using-exec-and-tee-to-redirect-logs-to-stdout-and-a-log-file-in-the-same-time
basic concept
- stdin 0,stdout 1,stderr 2, exec
- `` $()
- fork {},() &
simple one
ls -l > ls-l.txt grep da * 2> grep-errors.txt xxxx 2>&1 | tee log.txt stdout/stderr > stdin/exec <
rm -f $(find / -iname core) &> /dev/null
- {
action one action two
}> 1>out.out 2>error.log
对于文件的读写 例如读入前三行
{ read line1
read line2
read line3
} < /etc/fstab
{ code-block} >> output.log
例如下边的例子,生成 /etc/udev/rules.d/70-persistent-net.rules
的
/lib/udev/write_net_rules
生成函数。
write_rule() {
local match="$1"
local name="$2"
local comment="$3"
{
if [ "$PRINT_HEADER" ]; then
PRINT_HEADER=
echo "# This file was automatically generated by the $0"
echo "# program, run by the persistent-net-generator.rules rules file."
echo "#"
echo "# You can modify it, as long as you keep each rule on a single"
echo "# line, and change only the value of the NAME= key."
fi
echo ""
[ "$comment" ] && echo "# $comment"
echo "SUBSYSTEM==\"net\", ACTION==\"add\"$match, NAME=\"$name\""
} >> $RULES_FILE
}
重定向代码块的输出 {} >log.txt 直接一段代码所有输出都重定向到文件中。这样可以分以直接compile的log分开保存起来,在其内部直接重定向。
exec https://askubuntu.com/questions/525767/what-does-an-exec-command-do
exec 3</dev/null; ls -l /proc/self/fd
exec 3<&- ; ls -l /proc/&&/fd
exec <&-
https://www.tldp.org/LDP/abs/html/io-redirection.html
M>N
# "M" is a file descriptor, which defaults to 1, if not explicitly set.
# "N" is a filename.
# File descriptor "M" is redirect to file "N."
M>&N
# "M" is a file descriptor, which defaults to 1, if not set.
# "N" is another file descriptor.
0< FILENAME
< FILENAME
# Accept input from a file.
# Companion command to ">", and often used in combination with it.
#
# grep search-word <filename
[j]<>filename
# Open file "filename" for reading and writing,
#+ and assign file descriptor "j" to it.
# If "filename" does not exist, create it.
# If file descriptor "j" is not specified, default to fd 0, stdin.
#
# An application of this is writing at a specified place in a file.
echo 1234567890 > File # Write string to "File".
exec 3<> File # Open "File" and assign fd 3 to it.
read -n 4 <&3 # Read only 4 characters.
echo -n . >&3 # Write a decimal point there.
exec 3>&- # Close fd 3.
cat File # ==> 1234.67890
# Random access, by golly.
更好完的重定向要属端口应用功能 了。¶
mknod /dev/tcp c 30 36 就可以STDIN/STDOUT/STDERR一样重定向了。
特别是/dev/tcp /dev/upd这些伪设备也是很好完的。
cat </dev/tcp/time.nist.gov/13
就得到的实现。
command line editing¶

- 路径补全,
- 命令补全,
- 命令参数补全,
- 智能拼写纠正
- 插件内容补全
command complete¶
apt-get install bash-completion
并且随着 bash的升级,4.3之后已经可以 自动补全 参数了。看来是越来越强了。如果是想自定义可以使用 http://kodango.com/bash-competion-programming
这一点zsh 做更灵活,各种补全,尽可能tab. 并且支持** 来递归。 如果这个做好,可以大大加快工作效率。例如 #. More on Using the Bash Complete Command 可以利用来自定义命令补全,是可以加上过滤条件的 #. Programmable-Completion bash 中有专门的文档来说明,据说zsh的补全做的最好。 #. 目前在对于android,已经有现在与补全功能了,在sdk/bash_compeletion/adb 加载了它之后,android下就可以自动补全了。 #. zsh adb completion
编辑模式 vi/emcas¶
set -o vi
man builtins 可以看许多有用东东,例如bind就可以进行键盘绑定的。就像vi 的map一样。
对于编辑模式的改变 bindkey -v vi vi模式。 https://www.ibm.com/developerworks/cn/linux/shell/z/ http://wdxtub.com/2016/02/18/oh-my-zsh/
history skill¶
这个是从 Tcsh 里学来的,https://www.wikiwand.com/en/Tcsh
! Start a history substitution, except when followed by a space, tab, the end of
the line, `=' or `('.
!n Refer to command line n.
!-n Refer to the command n lines back.
!! Refer to the previous command. This is a synonym for `!-1'.
!string Refer to the most recent command starting with string.
!?string[?]
Refer to the most recent command containing string. The trailing `?' may be
omitted if the string is followed immediately by a newline.
^string1^string2^
Quick Substitution. Repeat the last command, replacing string1 with string2.
Equivalent to !!:s/string1/string2/.
!# The entire command line typed so far.
troubleshoot debug¶
set -eux, strace
cmd1 && cmd2 && cm3 = set -e ;cmd1;cmd2;cmd3
- set -u The shell prints a message to stderr when it tries to expand a variable that’s is not set.Also it immediately exits.
- set -x print each command in sript to stderr before running it.
- set -o pipefail Pipelines failed on the first command which failes instead of dying later on down the pipepline.
- has options to control output format and support and OR
- “Exit Traps” Can Make Your Bash Scripts Way More Robust And Reliable
- http://redsymbol.net/articles/bash-exit-traps/
并且bash 命令回显机制是做的最好的,-verbose以及打印命令回显呢。 对于linux 下大部分的命令输出都是可以参数可控控制,并且大部分命令都支持 与或非 同时直接支持把结果当命令进一步执行这个不正是自己之前到 tcl 用到 subst 功能吗。
同时也就具备了m4 的部分功能。
shell function¶
如何在shell环境中添加自己的命令 之前自己干过,直接添加变量,或者直接在命令行赋值,直接添加全局变量,其实也很简单,那就是直接source 一个sh文件,它会当前的进程下执行。其本质那就是你是eval,exec,system,等等之间不同了。现在真正明白了这些操作区别,取决于如何得到这些操作以及结果。在python中脚本,那就execfile, 就像tcl的中source一样的。就像bash一样,我把可以把tcl,python直接当做脚本,但是perl是不行的,perl本身是没有交互环境。 并且在bash 中 “. ” 点+ 空格就相当于source.
# perl style
#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo
# C style
function e () {
echo $1
}
- include other bash scripts into current context. source and “.”
text Process¶
Regular Expression
. * [] ? {} () ^,$
tools collections
交并补
- diff,sort/tsort,uniq,join,paste,join,wc,
- expand,cut,head,tail,look,sed,awk,tr,grep
- fold,fmt,col,column,nl,pr
sort/tsort
-b, --ignore-leading-blanks ignore leading blanks -d, --dictionary-order consider only blanks and alphanumeric characters -f, --ignore-case fold lower case to upper case characters -g, --general-numeric-sort compare according to general numerical value -i, --ignore-nonprinting consider only printable characters -M, --month-sort compare (unknown) < 'JAN' < ... < 'DEC' -h, --human-numeric-sort compare human readable numbers (e.g., 2K 1G) -n, --numeric-sort compare according to string numerical value -r, --reverse reverse the result of comparisons -k, --key=KEYDEF sort via a key; KEYDEF gives location and type -m, --merge merge already sorted files; do not sort -t, --field-separator=SEP use SEP instead of non-blank to blank transition -u, --unique with -c, check for strict ordering; without -c, output only the first of an equal run $ cat employee.txt manager 5000 clerk 4000 employee 6000 peon 4500 director 9000 guard 3000 $ sort -k 2n employee.txt guard 3000 clerk 4000 peon 4500 manager 5000 employee 6000 director 9000
$ cat call-graph
main parse_options
main tail_file
main tail_forever
tail_file pretty_name
tail_file write_header
tail_file tail
tail_forever recheck
tail_forever pretty_name
tail_forever write_header
tail_forever dump_remainder
tail tail_lines
tail tail_bytes
tail_lines start_lines
tail_lines dump_remainder
tail_lines file_lines
tail_lines pipe_lines
tail_bytes xlseek
tail_bytes start_bytes
tail_bytes dump_remainder
tail_bytes pipe_bytes
file_lines dump_remainder
recheck pretty_name
$ # note: 'tac' reverses the order
$ tsort call-graph | tac
dump_remainder
start_lines
file_lines
pipe_lines
xlseek
start_bytes
pipe_bytes
tail_lines
tail_bytes
pretty_name
write_header
tail
recheck
parse_options
tail_file
tail_forever
main
https://www.wikiwand.com/en/Tsort https://github.com/Idnan/bash-guide,有大量的例子可以用直接用
uniq -c
sed -e 's/lamb/goat/'
cut -d ' ' -f1,2 /etc/mtab
- paste
精确的文档生成
$>
-> for cl in 19156448 19064514 19006994; do p4 shelve -r -c $cl && echo -e "-------------\n"; done
Shelving files for change 19156448.
add //sw/README.mkd#none
add //sw/TestPlan.pm#none
add //sw/build_checker.pl#none
add //sw/build_installer.pl#none
add //sw/builds/aardvark/nightly/20141218_aardvark_nightly_debug/data/hello.txt#none
add //sw/builds/aardvark/nightly/20141218_aardvark_nightly_debug/data/world.txt#none
add //sw/builds/aardvark/nightly/20141219_aardvark_nightly_debug/data/hello.txt#none
add //sw/builds/aardvark/nightly/20141219_aardvark_nightly_debug/data/world.txt#none
add //sw/builds/aardvark/nightly/20141219_aardvark_nightly_debug/installer/installer.pl#none
add //sw/test_project/data/taskEntry.pl#none
Change 19156448 files shelved.
-------------
Shelving files for change 19064514.
edit //sw/devtools/QA/Tools/Farm/exec/Nexus/Submit_ToT.pl#4
Change 19064514 files shelved.
-------------
Shelving files for change 19006994.
edit //sw/doc/code-notes.mkd#1
edit //sw/FarmEntry.pm#33
add //sw/BuildCheckerV2.pl#none
add //sw/d/TestPlan.pm#none
add //sw/AppConfigValidator.pm#none
add //sw/Machine.pm#none
Change 19006994 files shelved.
-------------
参考¶
Linux 基本命令¶
命令补全¶
bash 的命令补全功能,不只是简单的字符串补全,而是根据上下文来补全。这些都的实现都在 /usr/share/bash=complete 中。 如果没有可以安装 apt=get install bash=complete

<a href=”https://asciinema.org/a/LUcAqGRm2vJc8sQYUlhO4fIef?autoplay=1” target=”_blank”><img src=”https://asciinema.org/a/LUcAqGRm2vJc8sQYUlhO4fIef.png” width=”835”/></a>
service 命令,它列出系统中有 services .
IO redirection¶
On Linux, /dev/stdin, /dev/stdout, /dev/stderr are symbolic links to /proc/self/fd/0, /proc/self/fd/1, /proc/self/fd/2
关机操作¶
关机:
/sbin/halt #杀掉所有进程,只是关掉CPU /sbin/poweroff #除了halt,关掉主板的各种设备,最后关电 shutdown =h now #可以执行额外的脚本 init 0
重启: /sbin/reboot
修改密码:password
目录操作¶
- 查看当前目录:pwd
- 返回目录:cd
- 返回上一层目录: cd ..
- 当前目录:cd .
文件操作¶
- 创建目录: mkdir
- 删除目录: rmdir
- 打开文件(读写文件): vim
- 关闭文件:wq
- 移动文件: mv
- 删除文件: rm
- 复制文件或目录: cp
- 在文件间建立连接: ln =s(软连接)
- 查找文件: find
- 基于内容查找: grep
https://github.com/lujun9972/lujun9972.github.com/issues/25#sec-1-18 : 操作符
命名管道¶
mkfifo in_data out_data
command <in_data >out_data &
exec 3> in_data 4< out_data
echo <some thing here> >&3
read <some variables here> <&4
其它¶
- 查看网络设备: ifconfig
- 安装程序包: sudo apt=get
- 查看任务管理器进程: ps
- 查看命令历史: history
- 产看帮助: man,help
解压¶
ext | cmd | |
---|---|---|
tar.gz | tar =xzvf abc.tar.gz | |
tar.bz2 | tar =xjvf abc.tar.bz2 | |
.zip | unzip abc.zip | |
.rar | unrar x abc.rar | apt=get install unrar |
tar 到指定的目录¶
tar =xzvf abc.tgz =C Dest
python tarfile
以及 python zipfile
当然也可以用tar 来代替 cp,在大量小文件的时候,可以加快速度。相当于先打包再传输。 tar =cvf = /etc |tar =xvf = 就是这样的目的。
ar¶
同tar是一类东东,现在只剩下用来打包库了,现在ld 好像只认这种ar这种格式。 如果你想重新打包。 只要 ar =x xxx.a && ar =c libaz.a XX.o 就可以了。 https://www.quora.com/Whats=the=difference=between=ar=and=tar
grep¶
正则表达式,是不需要转义的, :command:` grep =E` 或者 egrep. 对于输出的控制很灵活,可以计数,可以高亮,以及只显文件名,以及支持与或非。 对于或的支持 可以用 grep =F 或者 fgrep 后接一个文件列表 只要直接pattern列表,每一行一个,这些pattern的关系是 any(patterns)的关系。 同时正则表达式也是支持的
grep =lincrE "localhost|127.0.0.1" ./* |grep =vE "tutorial|machine"
screenshot¶
imagemaic import 命令。
nohup¶
http://www.cnblogs.com/allenblogs/archive/2011/05/19/2051136.html
这条命令用在,你退出session,命令继续。 并且自动的重定向输出。
du and df¶
检查是否有文件分区使用率(Use%)过高(比如超过90%)
df =h |grep =vE "tmpfs|udev"
如发现某个分区空间接近用尽,用以下命令找出占用空间最多的文件或目录:
du =csh /var/lib/state/* 或者排序 du =cks * |sort =rn| head =n 10
当发现硬件有空间,但是系统却报已经满了。 df =i 可以来看系统的inode是不是满了。
下载工具¶
主要有两个wget与curl, 类似curl功能更强,支持功能更多,wget 强的主要一点,那就是 recursively download. 并且都支持管道,但是curl支持更多一些。 例如 下载下来直接执行 wget =O = |sh 。 如何编程使用的话,用curl可能更加方便一些,毕竟后面一个跨平台的库在那里支持着。
如何查看linux的版本¶
/etc/issue
/etc/debian_version
/etc/readhat=release
/etc/os=release
/etc/lsb=release
利用特征文件 /etc/issue
或者 /etc/redhat=release
或者 /etc/debian_version
或者直接 cat /etc/*=release 就可以看到了。
如何判断linux是否运行在虚拟机上¶
http://www.vpsee.com/2011/01/how=to=detect=if=a=linux=system=running=on=a=virtual=machine/
主要是通过 /proc/vz /proc/xen/
等文件来做的,一般这些地址会体现系统环境的。
文件批量重命名¶
linux专门一条:command:rename 指令。例如 我要把 .txt 变成 .rst rename 's/.txt/.rst/ XX.txt
取文件的部分内容¶
在文件添加一行,一个方法那就是用vim就可以了。 如果只是简单的行尾,那就是>>就搞定了。
date¶
格式化字符串 +% 例如 date +%Y/%m/%d , 另外相得到 上周一是几号 date =d 'last monday .
cronjob¶
crontab =l 列出当前所有的。 crontab =e 编辑当前cronjob。
http://stackoverflow.com/questions/18919151/crontab=day=of=the=week=syntax
minicom¶
minicom =D /dev/ttyUSB0 minicom =C log.txt =D /dev/ttypUSB0 保存log
ctrl+A 来进入控制台
Text=Terminal=HOWTO=11.html 为什么需要flow control,就是为解决速度不匹配的原因,并且解释了原理。
Development Tools¶
不同平台下,会有不同的名字, 在ubuntu 下那就是 build=essential 在centos 下 那就是 Development Tools
pkg=config 用来查看这个系统所安装库的,编译选项,以及所在的位置。而不需要人为去记住每一个库的编译选项。 在make 文件中常见的那就是
centos 的development tools¶
indent, C语言的格式美化工具。
https://www.kernel.org/doc/Documentation/CodingStyle kernel=devel 包
resize2fs 分区¶
resize2fs =F =f =p /dev/sda1 =M 最小化。
sync¶
有各种同步, sync是直接把cache中内容写回到硬盘,isync,dsync则是mail box同步,而zsync 则提供的是部分下载,文件下载到了一半,只需要同步一部分,相当于patch的功能,而rsync则是文件的同步。
ssh=keygen
ssh=copy=id user@remote_host
rsync user@remote_host:~/XXXX Local_path/XXXX
如何添加sudoer¶
这里有好几种做法,一种就是直接加入sudo. sudo adduser <username> sudo
或者直接在 /etc/sudoers.
%sudo ALL=(ALL:ALL) ALL
usermod =a =G sudo <username>
useradd =G admin =a <username>
删除0字节文件 find =type f =size 0 =xec rm =fr {} ;
查看进程,按内存从大到小排列 ps =e =o "%C :%p :%z :%a" |sort =k5 =nr
按CPU利用率从大到小排列 ps =e =o "%C :%p :%z :%a" |sort =nr
打印出cache里的url grep =r =a jpg /data/cache/* |string |grep "http:" |awk =F'http:' '{print "http:"$2;}
查看http的并发请求及其TCP连接状态 netstat =n|awk '/tcp/{++$[$NF]} END {for( a in S) print a,S[a]}'
这个文里Root的一行,匹配Root一行,把no,yes. sed =i '/Root/s/no/yes' /etc/ssh/sshd_config
如何杀掉mysql进程 ps aux |grep mysql |grep =v grep |awk `{print $2}' |xargs kill =9,
kill =TERM mysqld kill =9 `cat /usr/local/apache2/logs/httpd.pid`
linux下的习惯把pid存入 xxx.pid文件。
利用 HEREdoc
cat <<EOF +=========================+ | === Welcome to `whoami` | +=========================+ EOF
for 来建立连接
cd /usr/local/mysql/bin for i in * do ln /usr/locla/myql/bin/$i /usr/bin/$i done
内存的大小 :command;`free =m | grep “Mem” | awk ‘{print $2}’`
20 swap 空间# free
检查swap used 值是否过高如果swap used 值过高,进一步检查swap 动作是否频繁:
# vmstat 1 5
观察si 和so 值是否较大
21 磁盘空间# df =h
检查是否有分区使用率(Use%)过高(比如超过90%) 如发现某个分区空间接近用尽,可以进入该分区的挂载
点,用以下命令找出占用空间最多的文件或目录:
# du =cks * | sort =rn | head =n 10
22 磁盘I/O 负载# iostat =x 1 2
检查I/O 使用率(%util)是否超过100%
23 网络负载# sar =n DEV
检查网络流量(rxbyt/s, txbyt/s)是否过高
24 网络错误# netstat =i
检查是否有网络错误(drop fifo colls carrier) 也可以用命令:# cat /proc/net/dev
25 网络连接数目# netstat =an | grep =E “(tcp)” | cut =c 68= | sort | uniq =c | sort =n
26 进程总数# ps aux | wc =l
检查进程个数是否正常(比如超过250)
27 可运行进程数目# vmwtat 1 5
列给出的是可运行进程的数目,检查其是否超过系统逻辑CPU 的4 倍
28 进程# top =id 1
观察是否有异常进程出现
29 网络状态检查DNS, 网关等是否可以正常连通
30 用户# who | wc =l
检查登录用户是否过多(比如超过50 个) 也可以用命令:# uptime
31 系统日志# cat /var/log/rf logview/*errors
检查是否有异常错误记录也可以搜寻一些异常关键字,例如:
# grep =i error /var/log/messages
# grep =i fail /var/log/messages
32 核心日志# dmesg
检查是否有异常错误记录
33 系统时间# date
检查系统时间是否正确
34 打开文件数目# lsof | wc =l
检查打开文件总数是否过多
35 日志# logwatch –print 配置/etc/log.d/logwatch.conf ,将Mailto 设置为自己的email 地址,
启动mail 服务(sendmail 或者postfix),这样就可以每天收到日志报告了。
缺省logwatch 只报告昨天的日志,可以用# logwatch –print –range all 获得所有的日志分析结果。
可以用# logwatch –print –detail high 获得更具体的日志分析结果(而不仅仅是出错日志)。
36.杀掉80 端口相关的进程
lsof =i :80|grep =v "PID"|awk '{print "kill =9",$2}'|sh
37.清除僵死进程。
ps =eal | awk '{ if ($2 == "Z") {print $4}}' | kill =9
38.tcpdump 抓包,用来防止80 端口被人攻击时可以分析数据
# tcpdump =c 10000 =i eth0 =n dst port 80 > /root/pkts
39.然后检查IP 的重复数并从小到大排序注意"=t\ +0" 中间是两个空格
# less pkts | awk {'printf $3"\n"'} | cut =d. =f 1=4 | sort | uniq =c | awk {'printf $1" "$2"\n"'} | sort =
n =t\ +0
40.查看有多少个活动的php=cgi 进程
netstat =anp | grep php=cgi | grep tcp | wc =l
chkconfig ==list | awk '{if ($5=="3:on") print $1}'
41.kudzu 查看网卡型号
kudzu ==probe ==class=network
常用的正则表式¶
- 匹配中文字符的正则表达式: [u4e00=u9fa5]
- 评注:匹配中文还真是个头疼的事,有了这个表达式就好办了
- 匹配双字节字符(包括汉字在内):[x00=xff]
- 评注:可以用来计算字符串的长度(一个双字节字符长度计2,ASCII 字符计1)
- 匹配空白行的正则表达式: ns*r
- 评注:可以用来删除空白行
- 匹配HTML 标记的正则表达式:<(S*?)[>]*>.*?</1>|<.*? />
- 评注:网上流传的版本太糟糕,上面这个也仅仅能匹配部分,对于复杂的嵌套标记依旧无能为力
- 匹配首尾空白字符的正则表达式: s*|s*$
- 评注:可以用来删除行首行尾的空白字符(包括空格、制表符、换页符等等),非常有用的表达式
- 匹配Email 地址的正则表达式:w+([=+.]w+)*@w+([=.]w+)*.w+([=.]w+)*
- 评注:表单验证时很实用
- 匹配网址URL 的正则表达式:[a=zA=z]+:/ /[s]*
- 评注:网上流传的版本功能很有限,上面这个基本可以满足需求
- 匹配帐号是否合法(字母开头,允许5=16 字节,允许字母数字下划线):[a=zA=Z][a=zA=Z0=9_]{4,15}$
- 评注:表单验证时很实用
- 匹配国内电话号码: d{3}=d{8}|d{4}=d{7}
- 评注:匹配形式如0511=4405222 或021=87888822
- 匹配腾讯QQ 号:[1=9][0=9]{4,}
- 评注:腾讯QQ 号从10000 开始
- 匹配中国邮政编码: [1=9]d{5}(?!d)
- 评注:中国邮政编码为6 位数字
- 匹配身份证: d{15}|d{18}
- 评注:中国的身份证为15 位或18 位
- 匹配ip 地址:d+.d+.d+.d+
- 评注:提取ip 地址时有用
- 匹配特定数字:
- [1=9]d*$ 匹配正整数
- =[1=9]d*$ 匹配负整数
- =?[1=9]d*$ 匹配整数
- [1=9]d*|0$ 匹配非负整数(正整数+ 0)
- =[1=9]d*|0$ 匹配非正整数(负整数+ 0)
- [1=9]d*.d*|0.d*[1=9]d*$ 匹配正浮点数
- =([1=9]d*.d*|0.d*[1=9]d*)$ 匹配负浮点数
- =?([1=9]d*.d*|0.d*[1=9]d*|0?.0+|0)$ 匹配浮点数
- [1=9]d*.d*|0.d*[1=9]d*|0?.0+|0$ 匹配非负浮点数(正浮点数+ 0)
- (=([1=9]d*.d*|0.d*[1=9]d*))|0?.0+|0$ 匹配非正浮点数(负浮点数+ 0)
- 评注:处理大量数据时有用,具体应用时注意修正
- 匹配特定字符串:
- [A=Za=z]+$ 匹配由26 个英文字母组成的字符串
- [A=Z]+$ 匹配由26 个英文字母的大写组成的字符串
- [a=z]+$ 匹配由26 个英文字母的小写组成的字符串
- [A=Za=z0=9]+$ 匹配由数字和26 个英文字母组成的字符串
- w+$ 匹配由数字、26 个英文字母或者下划线组成的字符串
- 评注:最基本也是最常用的一些表达式
notification¶
当执行一个长时间的事情的时候,能不能自动通知,有几种方式,
- 声音, beep,aplay,pacmd,espeaker.
- email, 可以通过邮件,自动发邮件
- 动画, 例如利用xlock,xeve,xbotton等直接在屏幕上显示动画。
- 可以用 watchdog 来添加一些监控
fortune¶
可以随机产生诗句。
udevadm¶
查看硬件的变动 udevadm monitor.
pdfgrep¶
googler¶
命令行google工具。
How2¶
命令行的stackoverflow工具。 https://github.com/gwli/how2
ndiff¶
nmap 输出的diff工具。 我们可能需要各种对象的diff工具。可以对比xml文本输出。
如何制作 rootfs¶
use ssh in pip line¶
- Remote backup
- run script on remote machine
- file transfer
chroot¶
特别来修复坏的系统,用chroot特别有用。
当然还有schroot, dchroot,pivot_root 具体见 此 pivot_root和chroot的主要区别是,pivot_root主要是把整个系统切换到一个新的root目录,而移除对之前root文件系统的依赖,这样你就能够umount原先的root文件系统。而chroot是针对某个进程,而系统的其它部分依旧运行于老的root目录。
mount 的时候,会把mount的所有信息都放在 /etc/mtab
但是当 /etc 只读的情况下,就会mount失改,这时候就会用到 mount =n 不写 /etc/mtab
gtop¶
基于console的可视化例如windows resmonitor
例如xargs列表也会有妙用¶
man xargs 作用就是把字节流变换成list, 可以用-d 来指定界符,同时每几个元为一组 -n 3,同时这个参数参入到哪里 -I %,同时也可以指字最多多少命令并行 -P 0 就是尽可能多。
find -iname "lib*.so" |xargs -I % mv % ./backdir/
find -iname "lib*.so"|xargs -d '\n' -I % mv % ./backdir/
如何得到精确的CPU时间¶
一种是采用 getconf CLK_TCK 再加/proc/pid/stat 来实现。 另一个那就是top -bn 1 就行了。 https://straypixels.net/getting-the-cpu-time-of-a-process-in-bash-is-difficult/
- bash中trap的用法 bash 可以接收64个中断
zenity GUI¶
zenity 一个小巧方便的用户交互的GUI. ,`zenity for windows <http://www.placella.com/software/zenity/>`_
zenity --entry --text="Please enter your_name"
linux 和选择¶
其实只要看到每一个事情起源就自然明白其源由了,例如这么多linux,到底各有什么区别,只要再一下其各个发展史,以及先后顺序就知道了。例如 apt-get dpkg这种方式是debian首创的。 后面系统都会吸取前面系统的优点。 gentoo是出现最迟的,当然也就是优点更多一些了。
linux服务器系统CentOS、uBuntu、Gentoo、FreeBSD、Debian的比较 redhat由于追求稳定性,而发展太慢。而ubuntu 则是通过快速的迭代用的新的技术也保证稳定性。那也就是敏捷也追求吧。这也是 为什么ubuntu server在逐步蚕食CentOS的市场份额? 由于技术本质就是求新求快。例如redhat 中自带的python现在还是2.6。 这些采用自己安装。当然他有一些自己特定的优势。但是长期是谬论, python 2.7 肯定比2.6要更强,更稳定。不管的你的内核更稳定,你的用python不行,还是不行的。当然还得瓶颈是在哪里。
usb 启动盘制作¶
要想让其可启动,就要让BIOS能够认出来,也就是BIOS本身具有相应的驱动,或者中间的转接,然后是在其引导有引导代码类似于grub的代码能执行,并加载相应的kernel.
用AT&T 汇编实现 第一个bootloader BIOS 通电-将磁盘第一个扇区512字节copy到内存的0x0000:0x7c0处,并将CS寄存器设置为0x0000,IP设置为0x07c0, 因为现在CPU处于实模式下,所以CPU下一条将要执行的指令就是CS:IP 将是 0x:0000:0x7c0, 这样就能挂靠 到我们写的bootloader了。
所以只要把USB变成可引导盘,并且分区格式化并不会影响MBR,因为这个是分区之外的事情。 然后就可以像里面copy kernel了。这也就是为什么,今天直接往U盘copy 光盘内容就可以用了的原因。
software install apt-get¶
- linux package management build and compile
One of the key function is process the package denpendencies. this is a troubleness on linux. but the apt-get help to handle them.
as long as,you use share resource with each other, there must be an issue of dependencies. kernel module has this issue. system package has this issue. dependency is anywhere of linux system.
so there are so many managetools. for ubuntu and debian there is apt-get, dpkg, for SUSE there are zypper and yaST. for Centos and Redhat , there is yup.
gentoo also has its own package system and configuration management system.
sourcelist support three source
- deb
- deb-src
- ppa
- add-apt-repository ,`PPA <How do I use software from a PPA?]] [[https://launchpad.net/ubuntu/+ppas>`_ is Personal Package Archives (PPA) allow you to upload Ubuntu source packages to be built and published as an apt repository by Launchpad.
apt-get --yes install $something
is that it will ask for a manual confirmation if the package signature owner's public-key is not in the keyring, or some other conditions. to be sure it does not ask a confirmation just do this:
apt-get --yes --force-yes install $something
If you want to have these settings permanent, create a file in /etc/apt/apt.conf.d/, like /etc/apt/apt.conf.d/90forceyes with the following content:
APT::Get::Assume-Yes "true";
APT::Get::force-yes "true";
apt-cache search 库。
// get the lib url
apt-cache policy "xxxlib"
在17.10之后,就可以直接使用 apturl 来直接从网址安装了,https://help.ubuntu.com/community/AptURL
如果出现 出现PGP key error 缺 key¶
sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys 437D05B5 3E5C1192
sudo apt-get update
多版本安装¶
就像python 可以有自己的virtualenv, 对于系统级的其他应用可以用alternatives 命令的相关方式。来管进行管理 配置。
alternatives -install XX
update-alternatives
如果想添加不同架构的deb¶
可以用 APT::Architectures http://stackoverflow.com/questions/6331109/how-to-setup-multiple-architecture-development-environment-under-ubuntu-11-04 或者使用 dpkg –add-architecture arm64 这样来实现。或者安装某一个包时直接使用 xxx:<arch> 例如 libglog4cxx10-dev:i386
同时还可以下载代码 apt-get source package-name 就可以直接下载当前目录了。
如何安装新版本上的package¶
直接使用 Pin的方法,本质就是添加新版本的源,以及修改 /etc/apt/preferences https://help.ubuntu.com/community/PinningHowto
自己从源码编译
apt-add-repository "deb-src ....." apt-get update apt-get build-dep firefox-3.0 apt-get -b source -t "release branch" firefox-3.0 make && make install
直接使用 UbuntuBackports
如何保持一个包不更新¶
sudo apt-mark hold <packagename>
#check
apt-cache policy <packagename>
# unhold
echo xxxxx install |dpkg --set-selections
如何查看所有可用更新¶
aptitude search '~U'
可用命令
apt list apt search apt full-upgrade apt install apt remove
aptdcon, 这个可以把安装放在队列里,以及不需要root,而不需要人为等另一个install 完成。
同时采用 apt-extracttemplate 把当前系统安装包生成template. 然后在其他机器上安装。
源列表格式¶
http://manpages.ubuntu.com/manpages/wily/man5/sources.list.5.html
apt-get upgrade 只是升级到当前的软件到最新版本, apt-get dist-upgrade,升级到大版本。 或者用 sudo do-release-upgrade
安装列表¶
apt-get install $(grep -vE "^s*#"|tr "n" '') http://askubuntu.com/questions/252734/apt-get-mass-install-packages-from-a-file
dpkg¶
- 查询包 dpkg -l |grep vnc
- 删除 dpkg -r vnc
- 查看依赖 apt-cache depends packagename
- 查看安装了哪些文件 dpkg -L packagename
安装位置的选择¶
usr is stand for unix system resource, http://askubuntu.com/questions/1148/what-is-the-best-place-to-install-user-apps 如果只是zip包 standalone App,可以直接使用就放在/opt下面。
下一代包管理器¶
如何快速的制作一个linux系统¶
在一个现在系统上直接把系统文件打包
$tar cvzf suse11_sp3.tgz bin boot etc lib lib64 opt root sbin selinux srv usr var tar -czpf --one-file-system / | ssh name@hostname "(cat >ssh_systemrootfs.tgz)"
在目标机上直接硬盘分区格式化,然后解压
$ tar xvf suse11_sp3.tgz
并创建那些动态的目录
@mkdir dev media mnt proc tmp
然后启动盘来修复起动项
$restore grub, mount /dev/sda1 /mnt/sda1 grub-install --boot-directory=/mnt/sda1/boot /dev/sda1 --force grub-mkconfig -o /mnt/sda1/boot/grub.cfg
install¶
所有安装最终操作就是copy文件,并且配制正确的权限与属性,以及根据系统的环境,向系统注册一些信息,或者添加环境变量。 所以纯手工的操作那就是cp+chown,chmod+strip 等等。 而在 install 一条命令就把这些全度搞定了。 http://unix.stackexchange.com/questions/94679/what-is-the-purpose-of-the-install-command
ubuntu 发行光盘的制作¶
现在对于linux的整个框架熟悉了之后,再怎么操作,就容易了,也就是那些stage3 tarball就看你怎么安装了。 用什么介质就要使用对应的格式。 例如光盘格式 sqfs 就是为方面其把从光盘放进内存里。 或者其他的.img格式。直接放在哪里,然后直接chroot启动,或者chroot之后再更新。或者可以在 android 的源码中可以找到各种工具 /build/tools/XXX。 例如img 解压,对比工具等等。
至于采用什么格式,还得看启动kernel支持哪种类型,一般都会支持sqfs格式的。
由于ISO文件中只读,于是不能写入。 于是就有casper-rw 的功能,实际就是在系统里默认mount这个目录,利用autofs,unionfs的功能http://unionfs.filesystems.org/ 就实现了这个功能。也就是在USB生成一个casper-rw的文件。 并利用mkfs -f 把这个文件当做系统格式化。 dd 来生成这样一个文件。
- http://www.syslinux.org/wiki/index.php/ISOLINUX
- http://unix.stackexchange.com/questions/122832/how-to-use-casper-rw-file-for-persistance
- https://help.ubuntu.com/community/LiveCDCustomization
- http://lifehacker.com/5085405/make-any-linux-directory-into-an-iso-file
而casper,ubuntu 等这些用户都是动态创建的。主要过程那就是/casper/filesystem.squashfs 的制作与修改。 而起动时需要initrd.lz 以及其修改。当然也可以利用ubuntu Customization Kit. https://help.ubuntu.com/community/LiveCD/Persistence 原来创建一个Casper-rw 文件来进行存储,这个大小 还是可以重定义的。
preseed 目录是用来存放预配置文件。
实现也是采用grub来起动的。
Creat bootable usb¶
- Download syslinux on windows
http://www.kernel.org/pub/linux/utils/boot/syslinux/syslinux-4.04.zip
Format USB stick in fat32
Copy syslinux.exe to <usb>/boot/syslinux
boot
cd <usb>\boot\syslinux syslinux.exe -ma -d /boot/syslinux <usb driver letter:>
find these files and copy to <usb>bootsyslinux
memdisk 引导IMG镜像的文件 vesamenu.c32 二种窗口模块之一 menu.c32 二种窗口模块之一 chain.c32 指定分区启动 如:chain.c32 hd0,1 (或chain.c32 hd1,1) reboot.c32 重新启动计算机 Create an empty file named livecd in usb root
cat ***ISO >/dev/sdb ;sync
network install¶
Install NFS on Ubuntu¶
sudo apt-get install nfs-kernel-server
Edit /etc/exports, add line at the end of file:
/home/tss3st *(rw,sync,no_root_squash)
Restart NFS service
sudo service portmap restart sudo service nfs-kernel-server restart showmount -e
### Mount A:/home/A/ on Solaris
- Login to B as user “root”
- Create directory:
mkdir -p /mnt/svlinux01/home/A/ |
- Mount:
mount -F nfs -o rw A:/home/A/ /mnt/A/home/A | |
fs-nts3 <IP>:/remotepathin_etc_exports <localPath> |
- Chmod:
chmod 777 /mnt/A/home/A/automation/mail/ |
- Create soft link:
ln -s /mnt/svlinux01/home/A/automation/mail/ /home/A/WWW/automation/mail/ |
Mount and chmod on each Solaris For all Solaris which we run NEAT, we need to mount this directory to local /mnt directory and chmod for it:
双系统看不到起动菜单 自己来搞grub,或者把linux先装一下,再然后再重装一下就Ok了。再次重装的时候,它会识别出两个系统就会自动去做。
– Main.GangweiLi - 15 Jan 2013
vmware share folder linux 下的目录是 /mnt/hgfs
– Main.GangweiLi - 15 Jan 2013
如何快速部署linux 1. 使用dd, 或者类似于ghost东西,把一个硬件快速复制另一个硬件,然后拿去直接启动使用,但是windows7要把设置成初始安装模式,这样才能启动,因为它的启动会去读硬盘信息。
– Main.GangweiLi - 15 Jan 2013
使用户具有sudo功能¶
addsuer “victor” sudo usermod -G adm -a victor vim /etc/sudoers copy root to a new line change root to victor
backup and restore
when backup and restore, there is three things to know: %BROWN% #. size of data #. start address, in another way where is it? #. what type of the data. do we need now the internal structure, due to some manipulation on the data is base on its internal structure ,that’s the type. %ENDCOLOR% there is some way: dd directly copy sectors to the harddisk. but how the dd know the how many the space is used. partclone can do the backup and restore base on the partition. and it know many space is used.
– Main.GangweiLi - 28 Mar 2013
Configuration structure Now, most of the big application use configuration. and these configuration mechanism should have include, so that there is structure:
- /etc/ld.so.conf
- include /etc/ld.so.conf.d/XX.conf
- /etc/ld.so.conf.d/
- XXXXXXXXX.conf AAAAAAA.conf
– Main.GangweiLi - 14 Apr 2013
file operation each one type of archive file, would support XXgrep,XXcat,xxxfind,xxxless.
???BLOCK MISSING
如何修复系统¶
https://help.ubuntu.com/community/LiveCdRecovery
livecd 起动
chroot to harddisk
mount /sda2 /mnt/sda2 mount -t proc /proc /mnt/sda2/proc mount --rbind /sys /mnt/sda2/sys mount --make-rslave /mnt/sda2/sys mount --rbind /dev /mnt/sda2/dev mount --make-rslave /mnt/sda2/dev chroot /mnt/sda2 /bin/bash #open 2nd terminal cat /etc/resolve.conf /mnt/sda2/etc/resolve.conf apt remove <bad package> apt autoremove apt update apt install <right packages> #apt install linux-generic apt upgrade
网络¶
如何检查网速¶
自己直接ifconfig ; sleep 1;ifconfig 查看结果相减就可以了。当然也有一些其他的命令 nload,iftop,iptraf,nethogs,bmon http://os.51cto.com/art/201404/435279.htm
dns lookup¶
nslookup 可以查询IP,或者域名。
/etc/resolve.conf
来配置DNS
nameserver 10.19.189.252
search xxx.com
但是其他域名管理,以及LDAP等等以及NIS都是通过NSS来管理的,配置文件在 /etc/nsswitch.conf
.
IP 冲突¶
在windows下会有直接提示IP冲突。 在linux下则没有。
如何检则¶
在其中冲突的一台用 arping .
localhost:~ # arping -I eth1 10.19.189.113 ARPING 10.19.189.113 from 10.19.189.122 eth1 Unicast reply from 10.19.189.113 [AC:22:0B:4B:98:6F] 0.735ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.787ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.866ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.861ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.863ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.930ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.861ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.863ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.861ms Unicast reply from 10.19.189.113 [78:24:AF:C0:B7:48] 0.863ms
查看本地的arp cache
$ arp -a <IP>
如何更新DHCP获得IP地址¶
用ifconfig
ifconfig set eth0 DPCP
用dhclient
dhclient -r && sleep 20 && dhclient
dhcp 的配置文件在 /etc/sysconfig/network/dhcp
# If it happens during booting it won't be a problem and you can
# safely say "yes" here. For a roaming notebook with X kept running, "no"
# makes more sense.
#
DHCLIENT_SET_HOSTNAME="no"
## Type: string
## Default: AUTO
如何配置双机共享网络¶
https://askubuntu.com/questions/169473/sharing-connection-to-other-pcs-via-wired-ethernet
选择编辑网络
建立一个新连接
ipv4 setting 选择 “share to other computers”
ifconfig 就能看到这个端口上起了一个DHCPserver. 也可以用以下命令
ifconfig eth0 [-]pointtopoint [addre]
gentoo 的网卡启动过程¶
- 上电启动,内核的加载驱动并注册相应的中断,内核可以识别硬件了。
- udev 识别硬件信息,并建立相应的逻辑设备,例如网卡哪一个eth0,哪一个是eth1,以及USB
等等。所以要改设备的逻辑名,就是在这个时候时候改的
/etc/udev/rules.d/
- init 根据runlevel决定起哪些服务。 各个启动过程,几家linux的实现,大体上一致,而事实是各个不相同。
- gentoo 是在
/etc/runlevel
下的,并且采用 rc-config 来查看的。 - 直接在对应的level下建立一个link 就可以了。
- gentoo 是在
- SUSE 的启动是并行的,是用.before, .after等来实现的。
SSH¶
#.forward X
ssh -X user@hostname
#no password login
#. ssh-keygen
#. ssh-copy-id user@remotehost
#. vim ~/.ssh/config (file owner 600)
Host devbox
HostName <IP>
Port 22
User test
PreferredAuthentications publickey
IdentityFile ~/.ssh/id_rsa
- 对于
如何扫描机器IP¶
nmap -p 22 --open -sV 10.19.189.0/24 >sshservers
grep -B 4 'OpenSSH 5.8p1' sshservers
电源管理¶
各家笔记本除了功能,一个很重要的能力那就是续航能力,如何定制优化来延长续航能力。 内核管理模块 acpi,apm, [1] 详细讲了ubuntu笔记本电源管理优化 [2] 是ubuntu 官方的电源管理指南 [3] acpid 电源相关事件的守护进程
gentoo¶
vebegin,veend, ebegin,eend. ewarning¶
这些是gentoo为了美化console的输出,而实现的一些格式化命令. ewaring 给你前面加个* 并且还绿色.
对于rc.local的输出,没有有产生,是在于被 重定向到/dev/null中了.
只需要这个改掉了就行了.https://forums.gentoo.org/viewtopic-t-1009110.html?sid=ab27cf116dba07711a215b9a7ae8f3bb
echo "rc_verbose=yes" > /etc/conf.d/local
可以参考https://devmanual.gentoo.org/ebuild-writing/messages/index.html message的格式化.
对于从stage1,开始,无非要从buildchain的准备开始.然后根据依赖,逐个库的编译. https://forums.gentoo.org/viewtopic-t-420117-highlight-fiordland.html http://www.linuxforums.org/forum/gentoo-linux/191522-gentoo-stage-1-installation-info.html
编译,主要 也就是编译选项与链接选项.
对于kernel的生成,也有现成工具来一步生成kernel,initramfs https://wiki.gentoo.org/wiki/Genkernel https://wiki.gentoo.org/wiki/Initramfs/Guide https://gitweb.gentoo.org/proj/genkernel.git
对于ntfs-3g 找不到2.8的库¶
经过对比好的机器上的库的依赖,发现只是ln 不对,在出错的机器上的,libfuse.so.2 -> libfuse.so.2.7,而机器 上是有 libfuse.so.2.9 ntfs-3g 要求 2.8. 所以2.9肯定可以用。 所以只用修改一下软链就行了。
直接使用livecd的编译¶
cp /proc/config.gz .
gunzip config.gz
cat config >/usr/src/linux/.config
you find bzImage from /usr/src/linux/arch/x86/boot/bzImage
升级¶
- 下载minimal-livecd
- configureation for STAGE3
- cp config for livecd (x86)
- create bzImage
- create initramfs(应该与bzImage的arch一致).
- 更新fdisk
- install perl lib.
- install grub
- create mpcd, and tarball.
genkernel¶
sys-kernel/genkernel /usr/share/genkernel 有各种现成的脚本
Ubuntu¶
- vim
- sshd
- root login
- https://help.ubuntu.com/community/AutoLogin
- lightdm.conf
- gtl
How to build Your own Kernel¶
SUSE¶
安装要求¶
- install build toolchain
- auto login as root
- config vnc yast/vnc administrator
- install nvidia driver
- disable fireware
- setup ssh
- startup application
- config /etc/fstab
- disable screen lock
Note
gnome-control-center 控制面板
如何安装 nvidia driver¶
# install kernel source
# insert 2nd DVD
zypper install kernel-source
rcxdm start
./NVIDIA-linux-x86_64.run
rcxdm stop
chkconfig 启动service http://superuser.com/questions/752448/how-to-make-a-service-start-in-suse-enterprise-linux
How to run my script after SuSE finished booting up http://unix.stackexchange.com/questions/43230/how-to-run-my-script-after-suse-finished-booting-up
disable firewall
/sbin/SuSEfirewall2 off /sbin/SuSEfirewall2 on /etc/init.d/SuSEfirewall2_setup stop
Root autologin: https://gist.github.com/gwli/c94fec782aab125d6a0c
vi /etc/sysconfig/displaymanager
DISPLAYMANAGER_AUTOLOGIN=”root”
add repo source yast2>software repository
Centos¶
how to config¶
sshd run on startup chkconfig sshd on
install python 2.7 on centos 6.5
http://bicofino.io/blog/2014/01/16/installing-python-2-dot-7-6-on-centos-6-dot-5/
hostname
hostname computername vim /etc/hostname
build-essential
yum groupinstall "Development Tools"
bootup options
/etc/rc.local /etc/rc.d/rc.local
vncserver
rpm -qa |grep vnc yum install tigervnc yum install tigervnc-server vncserver
disable firewall
/sbin/service iptables stop
change xstartup file
unset SESSION_MANAGER exec /etc/X11/xinit/xinitrc [ -x /etc/vnc/xstartup ] && exec /etc/vnc/xstartup [ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources xsetroot -solid grey vncconfig -iconic & xterm -geometry 80x24+10+10 -ls -title "$VNCDESKTOP Desktop" & gnome-session & #set starting GNOME desktop #startkde & #kde desktop #twm & #Text interface #/usr/bin/startxfce4 #exec /usr/bin/fluxbox
- bootup chkconfig vncserver on chkconfig iptables off
this new method is working vnc-server-installation-on-centos-7
autologin
vim /etc/gdm/custom.conf [daemon] AutomaticEnable=true AutomaticLogic=root
Note
this just work VM.
[4] | http://blog.csdn.net/kpshare/article/details/7523546 |
https://www.centos.org/forums/viewtopic.php?f=47&t=48288
- usb install
- http://wiki.centos.org/zh/HowTos/InstallFromUSBkey
- dd if=CenOS-6.5.iso of=/dev/sdb ## method 2 cat XX.iso >/dev/sdb sync
install nvidia driver¶
init bootup¶
grub¶
- change device.map
- /etc/default/grub
- /etc/grub.d/RAME
- /etc/fstab or /etc/init/fstab
mountall¶
the bootmenu just like an txt control. as you use the raw_input.
enter text interface¶
ctrl+alt+F1~F6
no lock screen¶
change power management.
config boot¶
config /etc/fstab
#. /etc/fstab # # /etc/fstab # Created by anaconda on Tue Mar 17 01:42:54 2015 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # /dev/sda1 / ext4 defaults 1 1
change /boot/grub2/grub.cfg
if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 35bf2afd-b8f4-4a7e-ab82-12adba3e8cbc else search --no-floppy --fs-uuid --set=root 35bf2afd-b8f4-4a7e-ab82-12adba3e8cbc fi ####### change from above to the below if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --file --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' /boot/vmlinuz-3.10.0-123.20.1.el7.x86_64 else search --no-floppy --file --set=root /boot/vmlinuz-3.10.0-123.20.1.el7.x86_64 fi
内核篇¶
LinuxKernel¶
与main函数的区别就在需要链接的地方不一样,至少开头是静态链接的,对用initrd 之类的都采用两次load法,起动之前一次,起动后更新。 为了解决鸡生蛋,蛋生鸡的问题。同时对模块的热加载功能,insmode,rmmode,其实本质就是dllexport的功能。只是内核支持动态加载,而一般的应用程序做不到,只能通过gdb来这样么做。但是unreal 是能够做到一点。做到热加载的,编译之后直接可以用,不需要重起。
https://onedrive.live.com/edit.aspx/%e6%96%87%e6%a1%a3/GW%20%e7%9a%84%e7%ac%94%e8%ae%b0%e6%9c%ac?cid=0620a0b4441149e5&id=documents&wd=target%28%E5%BF%AB%E9%80%9F%E7%AC%94%E8%AE%B0.one%7C38E3E883-E41F-4858-BFB1-0BD8ED9EC575%2F%E4%B8%89%E8%A8%80%E4%B8%A4%E8%AF%AD%E8%81%8AKernel%EF%BC%9A%E4%BB%8ELinux%E5%88%B0FreeBSD%20-%20One%20Man%27s%20Yammer%7C80CCE1E5-1CD0-4CFE-979A-1832E55AAA29%2F%29 onenote:https://d.docs.live.net/0620a0b4441149e5/文档/GW%20的笔记本/快速笔记.one#三言两语聊Kernel:从Linux到FreeBSD%20-%20One%20Man’s%20Yammer§ion-id={38E3E883-E41F-4858-BFB1-0BD8ED9EC575}&page-id={80CCE1E5-1CD0-4CFE-979A-1832E55AAA29}&end
对于linux 整体的理解在上面写的很到位。 内容启动顺序是何定义的,根据优先级,同一优先级是根据链接顺序来的。而FreeBSD 则是SYSINIT固定的。
IO
每一种外设都是通过读写设备上的寄存器来进行的,寄存器又分为:控制寄存器,状态寄存器,数据寄存器。
从Linux2.4以后,全部进程使用同一个TSS,2.4以后不再使用硬切换,而是使用软切换,寄存器不再保存在TSS中了,而是保存在task->thread中 <http://blog.csdn.net/shinesi/article/details/1933851>`_ 一个线程就对应一个LDT的一项,内核是对物理硬件所做的一层抽象。而进程则是对CPU+内存+硬盘一种抽象。而线程则是对CPU的一种抽象。 linux 采用二级页表机制,页表目录和页表+页内基址。 Page=4K.
其实一个本质问题在于,如何这样的解读内存结构,这个与包的结构是一样的,是采用TLK的模式还是表头然后内容的方式。首先是分配大小。然后要根据自定义的结构来读写内存。类的内存结构与包的结构是一样的道理。
进程与程序的关系¶
<img src=”%ATTACHURLPATH%/C_memory.jpg” alt=”C_memory.jpg” width=‘600’ height=‘450’ align=right />
- C语言到汇编到机器语言到进程转换
- 从内存中加载并启动一个exe
- 可执行程序加载到内存的过程 第一步就是把文件用`mmap <http://blog.chinaunix.net/uid-26669729-id-3077015.html>`_ 映射到内存中。哪些库是放在共享区,可以供所有程序去调用,或者还是用到的时候才去加载。 Linux下程序的加载、运行和终止流程
- 程序的内存分配 只要看到thread_struct结构,它的那些寄存器值的大小限制。
- linux内核堆栈 是全局数据构使用的
- GDT与LDT的关系
进程数取决于GDT数据组的大小,线程的最大数取决于该系统的可用虚拟内存的大小。默认每个线程最多可拥有至多1MB大小的栈的空间。所以至多可创建2028个线程。如果减少默认堆栈的大小则可以创建更多的线程。
自己学习单片机的时候,就存在一个迷惑,那些操作单片机的小片子如何来支持一个操作系统一样的东西。现在逐渐明白了,其实如何让更多的程序能在计算机跑起来。所谓的空闲,其实CPU一直没有闲着,CPU采用的心忙状态。除非CPU的所有调度都采用中断实现。单片机的存储机制只有两层,那就是寄存器与内存。CPU的操作是不能直接操作内存地址进行运行的,而是要把内容加载到自己的寄存器然后再进行计算,然后再把数据写给回去。现在CPU架构采用是统一地址,这样的话,地址就要分段了,哪些地址是可读的,哪些地址可写的。CPU执行原来就是依赖其那些寄存器。` 在此 <http://os.51cto.com/art/201005/199799.htm>`_ linux采用了内核地址与用户空间地址的做法,例如内核地址3G-4G这一段地址留取了内核来用,0-3G这段刘给了用户,用户之间隔离的,内核地址空间是共享的,这里有一个偏移量的问题,更好是3G,把内核地址减3G正好是从头开始,而用户空间从+3G就变成真实空间了。其实一个进程都是对CPU的运算结构进行了抽象,并且对CPU做了两级的抽象,那就是线程。然后由内核把每个程序相关的资源都放在一个进程结构里,一个每个进程就是GDT里的一项。即是哪一段内存给它用。记录与它相关于文件等等,然后按照CPU的结构把寄存器初始化,执行,保存结果然后再换出。每一个进程头是放在GDT中,所以去查看GDT表就以操作当前有多少进行在运行。LDT对应的是线程。一般线程只有代码执行区与寄存器的运行状态记录,而所有资源都是放在进程里。
进程的内存功能分块
- 代码区,主要用来存储二制代码
- 数据区 用于存放全局变量
- 堆区,动态的进行内存的分配与回收。
- 栈区,主要存储函数的参数以及返回地址等目的被 调用函数执行完毕后能够准确的返回到冷饮函数继续执行。
所以一个进程如右图那分了,3G-4G的那部分地址给内核的,自己的代码区还要占据一定的空间,另外一些全局的数据空间,以及堆栈的地址空间,最后还是自由的地址空间。所以在同一个框架下,一般程序的入口地址都是相同的。然后就把程序初始地址分给CP寄存器。到底指令要占多少呢,也就是我可执行程序有多大呢,这个就要你的`指令的长度 <http://www.mouseos.com/x64/puzzle01.html>`_ 再乘以指令数就是所要占的内存大小了. 当然只要这些计算机就能识别了。但是对于我们人来说有点难懂了。那好吧,再把符号表给加上。这里的`符号表 <http://zh.wikipedia.org/wiki/%E7%AC%A6%E5%8F%B7%E8%A1%A8>`_ 来记录各种人为可读的标记。然而如何把C语言与汇编语言关联起的。是翻译的过程中如何会记录这些值的呢。
地址的长度其中之一的功能,那就是寻扯空间变大了,这样的代码就可以更长了。例如8位机,如何顺序代码超过了其寻址能力的话,就无法实施了。就限制了其功能。
现在回头把操作系统又看了一遍,原来进程是为了并行计算而产生的。解决了原来的只能顺序执行的问题。这样就有了数据段,程序段,进程控制块。这样进程其实就是对CPU结构以及计算机的存储单元的一种抽象。同时操作系统系统与进程的接口,就是这些信号。所在在链接时,所谓的链接器,是由内核来调用加载进程。信号是一种软中断。每一个进程对每一个信号都有一个默认的处理方式。操作系统也占用了几个。同时我们可以进程进行各种操作。通过信号。
对于内存地址的真实分配可以从 dmesg里看到 VirtualKernel memory layout,也可以从 /proc/ http://unix.stackexchange.com/questions/5124/what-does-the-virtual-kernel-memory-layout-in-dmesg-imply
一个kernel的内核也没有多大,也就几M大小,可以 ll -h /boot 就可以看到它的大小。 只是添加内存的分配与dll的扩展功能。一供也才不超过6M大小。一个指令4个字节。也就不超过 6M/4=1572864 条指令,最多需要1.5M地址就够了。 而8位的只能256条指令,16位也只64K的地址长度,32位 就有了4G的地址。 所以在32位上我们停留很长时间,因为我们32位对于我们来说,已经远远大于逻辑指令了。只所以要让上升64位,主要是数据空间的不足。而到了64位地址长度基本上就目前需求就相当于无穷大了,也很巧的周易也只推演到了64卦就停止了。
- 代码混淆器 也提供了一种代码互相翻译的功能。
安全策略¶
linux 的内核支持 security module的支持,你可以加添加各种安全模块,以及定义安全策略,例如selinux,
进程管理¶
以前是单核分时复用机制,只用考虑时间的分配,而现在出现了真正的多核与多线程机制。实时性的问题也就解决了很多。同时对于调度也有很大的区别。例如如果让进程在多个核上切换,而上车与下车都是要overhead,如何使减少。这个很重要。
出现这个sched_yield, 这个API是为了提高效率,当发现自己被blocking了,就CPU的运行权交出去。以前的进程比较难控制自己的执行。 http://blog.csdn.net/magod/article/details/7265555
multi-process and multiple thread until now, I find how to use the fork, why we need the fork? when the fork the children copy the code,data from parent process. and then do their own things. the questions of article is good, help me think. you can reference here why need multiple process.
可以用chrt 来控制进程的调度,或者合用sysctl来进行控制。sysctl -A|grep "sched" | grep -v "domain"
cputopology
多核CPU拓扑, https://www.kernel.org/doc/Documentation/cputopology.txt
http://www.ibm.com/developerworks/cn/linux/l-cn-sysfs/ /sys 是sysfs的挂载点,取代了/proc的大部分功能,并且经过了很好的设计。
当然也可以用 man /proc 与man sysfs来得到更多信息。
print "Started with the heartbeat host $HeartbeatHost:$HeartbeatPort\n";
if($ForkFlag)
{
if(fork())
{
exit(0);
}
close(STDIN);
close(STDOUT);
close(STDERR);
}
SetupSocket();
while(1)
{
SendHeartbeat();
sleep($SleepTime);
}
%ENDCOLOR%
system call¶
- Adding A System Call CUDA 应该就是这么干的,添加调用,这样它才知道东东传给GPU去做。
- Implement-Sys-Call-Linux-2.6-i386
brk,sbrk,getrlimit,setrlimit,prlimit查看系统资源的systemcall.
libc的库有一个gensyscalls.py 生成 syscall 例表。 /ndk/toolchains/X/prebuild/<platofrm>/share/lib/syscalls 可以看到各个系统的system call 个数,现在linux 325个API。
这些systemcall与大部分 shell 命令是对应的,例如mkdir等,其实本质就让shell 过程
while(1) {
switch {syscall} {
case ...: {do something};
}
}
其实内核就是一个数据结构,我们只是在不断的改其设备,就像 game Engine是一样的。
Signal¶
before, I always feel msterious about the signal. but now I know that the signal is always with us. for example, when shutdown, the OS should close all the process, how to do this, send the signal. the basic module of process with glibc should be able to the common signal. for example we use the kill -9 process to let the process close.
essentially, the Signal is relevent logic/soft interrupt with CPU and Hardware. 在ring 0改变watchpoint的值 continus received SIGTRAP.
for Debug, there are three way you can control.
- state register, this can control CPU behavoier.
- CPU event
- interrupt.
对于中断的处理,原则是要保存当前的所状态,中断处理之后,再恢复回来。 但是为了性能,而是根据需要来保存一些必要的register,而非全部。 而这些于profiling就会影响很大,因为它要用大量的信息,例如unwind callstack.
SystemLog 机制¶
多进程同写一个文件,就是会同步与原子操作问题。正常情况下,每一个系统调用都是原子操作。原子操作水平是什么样的。例子函数级的,还是指令级,还是API级的,中断CPU指令级,所以所有的单指令操作都是原子操作。同时原子操作都需要下一层的支持,在同一步不可有做到真正有效原子操作。就像第三方的中立性一样。这个就需要系统构构了,例如ARM的结构,并且内核的原子操作都是直接用汇编来锁定总线来搞定的,这个是C语言做不到的。
- Linux系统环境下关于多进程并发写同一个文件的讨论
- 多个进程把日志记录在同一个文件的问题 利用消息队列+单进程读写文件 会大大改善IO,但是多机并行的机制呢。
debug¶
内核中开发调试是最难的,简单是直接使用log,你如dmesg,以及在内核中打开更多的debug 选项,以及klogd,以及 在内核中打开远程调试来进行debug. http://www.embeddedlinux.org.cn/html/yingjianqudong/201303/12-2480.html 也可以采用类似于pdb的做法,动态调试直接在加入汇编指令来做。 http://blog.chinaunix.net/uid-20746260-id-3044842.html
module 本身也是 debug选项可以用的。 可以参看manual.
See also
- 浅析动态内存分配栈与堆 当数据量非常大时,使用什么策略来用内存。例如我们能同时对多少个数进行排序。
- linux sourcecode search
- /sysfs 文件系统类似于/proc 但是优于/proc
Thinking¶
你对linux哪一个熟 我是当linux当作一个仓库,遇到一些问题,是里面看看他都是如何实现的。然后结合自己的需求来实现。
– Main.GangweiLi - 02 Dec 2012
sysctl modifies kernel parameter at runtime
– Main.GangweiLi - 15 Apr 2013
现在对于linux的文件系统有了更加深切的认识: /usr/{include/src/lib) 这个里面放开发环境库 /usr/share/ 放了一些共享的信息例如man 等。 /lib/ 下面放的runtime lib
– Main.GangweiLi - 04 Nov 2013
对于环境变量 在操作系统内部进程之间的交互,很大一部分那就是还环境变量与配置文件,例如os.system如何知道系统有哪些环境变量呢,就是通过Path来知道的,所以如何才能加一条命令呢,那需要加入相应的path就可以,就可以让其os.system得到这条命令了。
– Main.GangweiLi - 17 Apr 2014
内存结构¶
内存模型 由最初的点线面关系问题,自己理解了内存是如何转化的过程。也就是知道一个矩阵如何在内存的问题。至于类与结构体,都是我们人对被处理对象进行的建模,其实就是向量。但是向量的里面的每个成员是不一样。例如哪些是变量,哪些函数。然后哪里数据区存放的地方,以及代码存放的地方。在C与C++中结构体与类都是从前往后按照先后顺序的。只要知道首地址,以及数据的长度,其实也就是TLV格式。数据的类型就是代表数据长度。起始地址是可以推算出来的。
内存地址的长度是根据CPU的地址线来决定的。 不同CPU的构架,内存框架结构也不一样的,一种UMA模式所有内存地址都一样,另一种那就是分类内存,其实本质两者都是一样的,如果把他们看成内存地址的话。[[http://wenku.baidu.com/view/0364850b763231126edb11a8.html][内存的分类笔记]] 并且现在明白内核映像只有512KB的原因,并且压缩格式的原因,是始于硬件本身初以状态下能够读入程序块有多大。不同的硬件,限制不一样。最小是512kb.例如硬盘的0磁道0磁头0扇区。只有512KB.
以前看龙书,有点看不动,现在再回头看龙书是那么一目了然。把内存管理那一张给看了之后,就全明白了,段页式管理是要解决两个问题。page swapping是为了解决内存不足的问题。而segment是为了解决了灵活性的问题。例如把代码改了,然后大小变了,所有地址都要重定向了。有了段之后,就把把影响变到最小,只用改段基址就可以了。就不用所有段重排了。进程结构是与CPU的物理结构相对应的。 并且现在CPU大部分都已经支持段了吧。这个就要看CPU的性能了。首先要了解需求。在解决什么问题。那个在面试的问的问题,就已经解决了,是因为它们没有段的结构,所以不能解决灵活性的问题,它们只是简单的页式吧。page是基于硬件的,segment是基于逻辑需求的。理解这些如何快速来得到使用这些就可以根据新需求与以及硬件功能来实现新的算法了。其实就是各个层面的排序与查找了。数组的高效以及链表的灵活。现在也明白了malloc的实现原理了,其实就是在改进程的data的首尾了。 page 的base为重定向,而limit是为了防止越界。
![digraph memoryStucture {
rankdir = LR;
node [shape = box ];
ZONE_DMA [ shape = record label = "<f0> 0-16MB | <f1> INIT address 0XFFFF0 BIOS |<IDT> Interrupt Table |<GDT> Global Descriptor Table |<LDT> Local Descriptor Table "];
ZONE_NORMAL [label = "16MB-896MB"];
ZONE_HIGHMEM [label = "896- END of Physical memory"];
MainLayout [ shape = "record" label = "<f0> ZONE_DMA |<f1> ZONE_NORML | <f2> ZONE_HIGHMEM "];
MainLayout:f0 -> ZONE_DMA:f0;
MainLayout:f1 -> ZONE_NORMAL;
MainLayout:f2 -> ZONE_HIGHMEM;
//IDT
IDT [shape =record label ="<f0> 256 Items 8bytes/item |{selector | keyword | offset }" ];
ZONE_DMA:IDT -> IDT:f0;
//GDT
GDT [shape = record label = "<des> 256 items |<f0> NULL | <f1> CODE Segment Descriptor| <f2> DATA Segment Descriptor |<f3> SYS Segment Descriptor | <f4> 252 for LDT and TSS for each TSS"];
ZONE_DMA:GDT -> GDT:f0;
//LDT
LDT [shape = record label ="<fes> 5 items | <f0> CODE segment | <f1> Data segment |<f2> BSS | <f3> Heap | <f4> stack"];
ZONE_DMA:LDT -> LDT:f0;
}](_images/graphviz-09780819088db2131774dc5fee3b72cf1a6580ce.png)
#. [[http://guaniuzhijia.blog.163.com/blog/static/16547206920109914658702/][linux下进程的堆栈大小设置 ]] %IF{” ‘ulimit -a 可以查看所有’ = ‘’ ” then=”” else=”- “}%ulimit -a 可以查看所有 进程可以修改栈的大小,如果没有指定那么编译就是用默认的大小限制,linux 默认8M。
而如何查看这些东东呢。 linux采用的策略那就是能用我就尽量用,你需要用我就让给你。所以你会发现linux的buffer与cache会非常的大。
command/file | content | remark |
---|---|---|
free | 查看系统的剩余内存 | |
/proc/meminfo/ | 系统占用的内存 | |
/proc/pid/maps | 进程占用的虚拟地址 | |
/proc/pid/stam | 进程所占用的内存 | |
/proc/kcore | kernel的大小 | |
/etc/sysctl.conf | 来控制各种内存资源分配情况 | http://blog.csdn.net/leshami/article/details/8766256 |
/etc/sysctl | 直接动态的去改内核的参数 | 并取代ulimit的接口 |
进程的内存分配¶
前1G之前是给内核用的,在gdb中通过info file 就可以看一个进程文件占用多大的空间。 在android, 它一般是从 0x400d0134=1G的地方开始的。 然后就是逐section,逐文件地进行加加载。 基本上都是 .interp->.dynsym->.dynstr->.hash->.rel.dyn->.rel.plt->.plt->.text->XXX->.rodata->.preinit_array->.init_array->fini_array->.data.rel.ro->.dynamic->.got>.bass
文件系统¶
介绍¶
文件系统是随着硬件的发展,以及数据存储发展的业务需要而不断向前发展的,并且两者之间的桥梁。
为充分利用内存空间,我们建立一系列的内存文件系统。随着数据量越来越大,我们也就需要分布式的文件系统。以及种备份的容灾的需求。
文件系统 ,任何时候不明白的都先回来看看最原始的教材。文件系统基本的功能,就是文件管理与目录管理。以及磁盘空间分配使用。 为什么要有这么多种文件系统。原因在于一定是不同的硬件实现。底层的实现是不样的。例如磁片硬件,与flash,以及固态硬盘,以及 人们对数据操作要求的不同。这种逻辑的需求与硬件结合的接口就是文件系统。对于不同的存储读写需求以及硬件实现,就会不同的实现实现算法机制。而这些就是文件系统。
对于硬件来说,对于磁盘片来说,那就是CHS。三级了。而对于flash也就又不一样了。 还是拿CHS模型来说,CHS最终还是定位到扇区上,每一个磁道的扇区数是不同的,最外圈的最大,最内圈的最小。每一个硬盘的参数表会有这些值的。 但是对CHS这种分区表方式会8G限制的问题,就有了后来的LBA模式,但是LBA模式最大支持2T限制。 CHS的MBR都是早期老掉牙方案了,虽然大部分讲分区原理都还在讲,但是拿这些理论已经不能解释现在的硬盘分区原理了,例如为什么现在分区是可以用GUID的。不过现在方案兼容老式的MBR。现在你看到的磁盘参数AAAA cylinders, BBBB Headers, CCCC sectors. 主要是为了让你换算LBA值来用的。LBA是绝对扇区号。换算方法是在这里`这里 <http://wenku.baidu.com/view/30e874c789eb172ded63b7c6.html>`_ . 而AAAA,BBBB,CCCC会做为硬盘参数的。 在往后会更大。这个主要是由于MBR机制造成的,因为MBR只留了64个字节给分区表。现在又出了一种新机制EFI方案中GPT表。这里 有详细的说明。
对应的逻辑设备分为族/块,卷/分区。对应的逻辑存储单位,如何把逻辑单位与物理单位对应起来,就是格式化的过程,在Windows里就是format, 在linux里就是mkfs这条命令的过程之一。系统之上操作都是基于逻辑单位操作的。例如现在是利用的位图来表示,一个位表示一个逻辑单位的空闲与否。同样大小的位图可以多少空间,取决于这个逻辑单位的大小。这个颗粒度的大小匹配你的存储对象的特点。而这些管理都是基于分区的,每一个分区内部肯定首先这些控制模块,还是这些控制模块是放在全局的。每一个最小单位chunk只能在一个文件里,两个文件不能共享同一个chunk.就是为什么你经常看到的,文件的大小与实际占用空间大小是不一样的原因,因为文件本身的大小不可能每次都正好是最小单位的整数倍。
对于管理还说还inode. 对于文件数据本身是可读可写,以及是否支持加密压缩等等。实现起来都是不一样的。每是每一个文件系统都能够提供的。并且还有。例如日志文件系统。对于文件的操作都是如何记录存储的。并且如何进行数据恢复。 常见的存储需求:本身是可读可写,以及是否支持加密压缩,数据恢复功能,读多还是写多,是大数据多还是小数据多等等。以及`性能的要求 <http://wenku.baidu.com/view/a8608606cc175527072208a7.html>`_ 。
为什么要分区呢,是为了管理上的方便,使之具有隔离性,例如装操作系统,就要在独立的分区上。等等。另外也取与操作系统有关心,硬盘的结构MBR. 启动信息与分区表都在这里放着,但是分区表只有64节节,第一个分区占16字节,这样一个分区可如果大于2*312*512=2TB时,这个分区表就不行了。这种物理结构决定了如何进行分区。GPT分区。EFI、UEFI、MBR、GPT技术 但是GPT模式在Windows上有很大的限制,那就是目录不能当启动盘。
而在抽象层上,就各种各样的文件系统。linux 文件系统设计的很好,在linux里一切的资源,要么是file,要么是进程。 debugfs,Pipefs,sockFS,securityfs 这些都是虚拟的文件系统。你可以在 /proc/filessystems 里看到这些。
而在linux中每一个进程空间只有一个根文件系统。 并且一个device都根据自身的结构形成自己文件系统结构。在异构系统之间,我们通过mount,来建立之间的不同系统之间通信桥梁。相当于在我的系统里,/xxx/XXX 就是你的入口点,往下的目录都是你的。即然是一个通信机制。就会信息通信协议,通信的方向是双方的,还是单方的。这也就有了四种
private | shared | slave | unbindable |
具体可以说明见 kernel doc 应用挂载名称空间 来讲这些,空间的隔离,linux中使用各种各样的命名空间。
Pipe文件系统¶
linux 里大部分进程通信靠是Pipe,同步则是由Pipe 自己实现的,由于速度不的同,各种传输之间都会buffer来缓冲。 并且缓冲模式有
- buffered(默认4K), (STDin)
- unbuffred( 1byte)(STDERR)
- line buffered (1K) STDOUT
如果想控制这个buffer的大小,可以用stdbuf来调整。 可以查看man stdbuf.
http://blog.csdn.net/morphad/article/details/9219843 Pipe 文件系统的实现原理,pipefs 是虚拟的文件系统,使用用户空间的内存,挂载在内容中,并没有在根文件系统中。 用 kern_mount 来实现。
![digraph hardisk {
HardDisk [shape=MRecord, label =<
<table>
<tr>
<td>
<table><tr><td>MBR</td> <td>Partition Table</td> </tr></table>
</td>
<td>DBR </td>
<td>FAT </td>
<td>DIR </td>
<td>DATA </td>
</tr>
</table>
>];
}](_images/graphviz-6ff6ced067fca20ac34af663d5fad0cf50698679.png)
fdisk | Partition Table | |
format/mkfs | DBR | |
filesystem (inode ) | FAT | 这个是基于文件系统的 ,是不同的,主要inode的结构。 |
^ | DIR | |
real data | DATA |
每一个分区的超级块放在这个分区的头,如果有就在第二个逻辑块里,一般情况下,第一块是引导块,第二块为super block并且大小固定。并且格式,大小固定。 超级块,采用的是相互链表,并且vfs做了很好的抽象,并且还支持cache,定期与硬盘同步数据。 http://guojing.me/linux-kernel-architecture/posts/super-block-object/
每一个分区的超级块是有备分的,你可以用mke2fs -n 或者dumpe2fs 来查看,然后再e2fsk -b 来进行修复。 http://www.cyberciti.biz/tips/understanding-unixlinux-filesystem-superblock.html
supperblock 中存储 文件系统的格式,inode/block的总数,以及使用量,剩余量等信息。 .block与 inode的大小(block 一般为1,2,4K,这些存储真实的数据,大文件可以用block,小文件可以的block, inode一般为124/256 byte). inode 存储的文件信息,例如文件属性,文件的权限,修改日期等等,文件名的链接,最后是文件数据block的地址。 http://www.voidcn.com/article/p-mttgftgp-gn.html
每一个分区四大块:
![digraph filesystem {
partition [ shape=Record, label="boot block|super block | inode index block | data block"]
}](_images/graphviz-cd461dc83b8480a478b039de8ec5166ab453c47e.png)
并且这个根文件系统是在内存里。 可以通过chroot 来修系统 的根在哪里。这在很多地方都能用到,例如安装机制,例如 apache中,当然不能一般用户得以/etc/目录了,所以要把 apache中根目录要改掉才行。并且还可以其他目录拼接成一个新的目录。
例一个用法,那就是修复系统时可以用到,例如 https://wiki.gentoo.org/wiki/Handbook:AMD64/Installation/Base 把proc 从加载一下,
每一个进程的都会记录自己的根目录在哪里,这样才能解析绝对目录与相对路径。
- 硬盘知识,硬盘逻辑结构,硬盘MBR详解 64 字节的分区表
- ` Partition Tables <http://thestarman.pcministry.com/asm/mbr/PartTables.htm>`_
- INIX文件系统中,第一个块为引导块,第二个块为超块,之后的N个块是inode位图块(表示哪几个inode被使用了,总的inode个数由超块给出),紧接着是数据块位图,表示哪些数据块被使用了,紧接着就是inode块和数据块
- ext3 启动过程
- 硬盘及通用分区结构
使用sfdisk实现多操作系统引导 既然说到文件系统,就会主分区以及如何引导启动的问题。无非是在主引导区放了一个自己的引导管理器,来设置起动。而GTL的实现原理在于,用sfdisk来分区,把linux放在这个上面,并且如何保证始终在这个系统。目前看来,默认到都是先到这个操作系统,然后再由这个操作来用sdisk来改分区先项。但是如何来保证每一次都要改了启动选项呢。 其原理 是的windows 里使用LBOOT的原理就是利用GDisk 先改分区表,然后再起动。sfdisk 有一堆分区表,而MBR的分区表只表示当前活动的系统可见的分区。 一共有四个启动分区,其中一个常住了linux,并且在这个linux系统里放着sfdisk里的放着一堆分区表,然后系统活动的几个放在系统分区表。并且这个linux始终是第三个分区,所改变的前两项分区表。而Windows能够看到,就是把始动分区切到这个linux分区如果不需要切系统的就不需要了。然后linux再根据自己的分区表来更新系统的分区表。 所以sfdisk 需要一个第三方的东西来保存其分区表,在这里GTL用了第三个分区自身,并且在sfdisk里的一个参数 -o file 就是那个分区表的位置。
分区表除了要表示,分区的大小(通过起点,终点/长度来表示). 还需要分区的状态(活动与否),分区的类型也主要是用操作系统的类型。同一个值可能在不能操作系统下的识别是不一样的。MBR、分区表、CHS等概念 在DOS或Windows系统下,基本分区必须以柱面为单位划分(Sectors*Heads个扇区),如对于CHS为764/256/63的硬盘,分区的最小尺寸为256*63*512/1048576=7.875MB. 深入浅出硬盘分区表 分区表实际上一个单向的链表。
由于硬盘的第一个扇区已经被引导扇区占用,所以一般来说,硬盘的第一个磁道(0头0道)的其余62个扇区是不会被分区占用的。某些分区软件甚至将第一个柱面全部空出来。并且分区中就有一项,那就是第一个分区前面有多少个隐藏扇区。其实每个分区都会有一个引导扇区,也就是`VBR <http://en.wikipedia.org/wiki/Volume_boot_record>`_ ,整个硬盘的Boot record就是MBR。
现在明白了,老大的要讲故事,也就是要问为什么需要。同时也就是事情的前因后果,以及历史。自己如何早些问,那些文件系统有什么区别,现在也就早明白。直到现在才问。所以现在才明白。
ext2 | http://learn.akae.cn/media/ch29s02.html | |||
ntfs | http://bbs.intohard.com/thread-66957-1-1.html | http://blog.csdn.net/daidodo/article/details/2702648 | mount utfs as rw use fuse and ntfs-3g | |
FAT | http://www.sjhf.net/document/fat/#4.3%20%20FAT%E8%A1%A8%E5%92%8C%E6%95%B0%E6%8D%AE%E7%9A%84%E5%AD%98%E5%82%A8%E5%8E%9F%E5%88%99 | |||
rootfs | http://blog.21ic.com/user1/2216/archives/2006/25028.html | |||
ramfs | rootfs | initrd and initramfs | http://hi.baidu.com/nuvtgbuqntbfgpq/item/537f1638797a88c01b9696f4 | |
loop device /dev/loopXXX | http://www.groad.net/bbs/read.php?tid-2352.html | 把文件以及镜象挂载 | 是不是可以利用它来做系统血备份 |
看到现在终于把文件系统看懂一些吧,文件系统分为三层,文件本身内部结构一层,文件系统一层,分区与硬盘之间是一样。当然最初的概念都是结合物理模型的,随着后期的演化,最初的概念已经不是最初了的概念了。例如文件,最初都是就是一段扇区。但是到后期文件的已经完全脱离了,那个物理模型,就是变成了长度,并且这个常度就代表一个字节,并且字节也是一个抽象概念。不同的硬件,扇区的等等的分布是不一样的,不同的文件系统,block,inode之间对扇区对应关系都是不一样的。并且在文件系统上,文件不是顺序存储的。所以也就没有办法智能恢复了,也就只能整个硬盘做一个镜象,虽然你只用了一部分空间。 并且PBR的信息是放在分区里的,如果两个分区参数不一样,也是不行,相当于把分区的信息也复制过来了。而dd只能按块来读,在块之间来做转换。所以dd是在操作系统之下进行的,如果想用dd来做,要么两个分区一模一样,包括同样的位置有同样的坏道。要么要自己去解析文件系统的文件分配自己去读写分配每一个扇区。
文件系统格式¶

不同的文件系统格式,添加了不同的功能,特别是日志文件系统,添加一些数据恢复的功能,就像数据库可以根据日志rollback最佳状态。
https://zh.wikipedia.org/wiki/Ext4 增加了在线整理磁盘碎片的功能, ext3 是没有的https://zh.wikipedia.org/wiki/Ext3。 例如ext3grep,ext4magic, 大部分都是基于ext2fs_library.
http://extundelete.sourceforge.net/ 可以恢复数据ext2/3/4的数据。
下一代的文件系统 Btrfs 将是采用类似数据库的底层方式的B+ tree的文件系统。 进一步把文件系统与数据库融合在一起。
Btrfs 的简介 https://www.ibm.com/developerworks/cn/linux/l-cn-btrfs/index.htmloo 不同文件系统的性能分析 https://www.cnblogs.com/tommyli/p/3201047.html
android 主要是小文件,所以android系统默认是 ext4 格式。
调整分区的大小¶
http://blog.csdn.net/hongweigg/article/details/7197203
首先要自己记住分区的起始地址,然后修改分区表,然后再用 resize2fs,tune2fs 来更新文件系统的 meta data. 注意柱面号是按照unit 来计算的。 所以要学会计算这样。
如果想用dd来做, 先做一个OS,并且在硬盘上连续存放的,并且要知道这个区域的大小,或者说估计大约的值。并且硬盘状态一样。 这样可以像Copy文件一样,那样去做了。
另一个问题,分区的结构是否一样呢,如果分区的结构不样,例如索引节点的个数是不一样,这可能是按照分区的大小的百分比来进行的,如果新的分区足够大,就会出现浪费的问题,如果不够大就会可能出现错误。所以partitionclone最好的方式是能够认识文件系统。建立在文件系统上。就样可以解决这个问题了,这也就是为什么partclone要有那么多的,文件系统类型的支持。 可以直接使用 dd if=/dev/sda of=XXX.ISO 或者cat 直接做光盘镜象,然后直接使用mount来进行挂载。
dd if=XXX.iso of=/dev/<usbpartition> bs=4k cat XXX.iso > /dev/<usbpartition>
分区是对硬盘的一个抽象,对于OS来说,分区基本硬盘是一样的,并且分区上面还可以逻辑分区。block是对 扇区的一种抽象。文件相当于heads, 而目录相当于cylinders.
可以用 dumpe2fs 来查看文件系统,并且可以用 tune2fs 来调整参数。
由于物理磁盘受限于空间的大小,扩展起来不是很方便,这就有了逻辑磁盘的概念。lvm. 先在物理磁盘上建立phiycal Volume, 多个PV 可以组成一个VG,然后在每一个VG上可以建立LV,当然LV可也可以扩VG。而LV就当做一个分区来用。并且随时能够调整大小。 pv,vg,lv.

partclone¶
partclone.ext3 -c -d -s /dev/hda1 -o hda1.img
cat sda1.ext3-ptcl-img.gz.a* | gunzip -c | partclone.ext3 -d -r -s - -o /dev/sda1
http://partclone.org/usage/partclone.php
ticons-1.0 --restore --filename:/mnt/work/safeos_work_dir/imgcache/A15690B1-70F2-4FA5-ADAF-D774FCB10336 --partition:1-1 --target_partition:1-1 --progress:on
partclone 对于ntfs 的支持比较有限,所以基本上还都是使用 ticons.
tree¶
用来查看filesystem的树型结构,并且通过用pattern过滤,以及控制输出各种格式XML,HTML以及–du 的功能。
Raid¶
- https://help.ubuntu.com/community/Installation/SoftwareRAID
- http://askubuntu.com/questions/526747/setting-up-raid-1-on-14-04-with-an-existing-drive
- https://raid.wiki.kernel.org/index.php/RAID_setup
- 七种raid配置通俗说明
原理是采用编码的冗余原理。但是数据量越来越大,传统的raid的对于数据恢复的需要的时候间也越来越长,因为也需要进一步raid上分片/分簇来局部化坏道与修复。
linux 采用 mdadm 来实现 /etc/mdadm.conf
.
# mdadm -C /dev/md0 -a yes -l 5 -n 3 /dev/sd{b,c,d}1
mdadm: array /dev/md0 started.
-C :创建一个阵列,后跟阵列名称
-l :指定阵列的级别;
-n :指定阵列中活动devices的数目
[root@bogon ~]# mdadm --detail /dev/md0
/dev/md0:
Version : 0.90
Creation Time : Tue Mar 15 08:17:52 2011
Raid Level : raid5
Array Size : 9783296 (9.33 GiB 10.02 GB)
Used Dev Size : 4891648 (4.67 GiB 5.01 GB)
Raid Devices : 3
Total Devices : 3
Preferred Minor : 0
Persistence : Superblock is persistent
Update Time : Tue Mar 15 08:20:25 2011
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0
Layout : left-symmetric 校验规则
Chunk Size : 64K
UUID : e0d929d1:69d7aacd:5ffcdf9b:c1aaf02d
Events : 0.2
Number Major Minor RaidDevice State
0 8 17 0 active sync /dev/sdb1
1 8 33 1 active sync /dev/sdc1
2 8 49 2 active sync /dev/sdd1
如何制作文件系统¶
mount 各种各样的文件系统,loop 表示把本地文件当做文件系统来进行挂载。同时也还可以重新mount –bind 挂载点。对于物理分区有的时候会用完,添加就需要重起机器。所以也就产生了LVM. 逻辑分区。随着云计算到来,一切的虚拟化。原来的系统都是建立物理设备上的,现在都直接在逻辑设备上了。这样就具有更大的移值性,就像我们的CAS就是把逻辑拓扑与物理拓扑的隔离。LVM就在物理分区与文件系统之间又加了一层。文件系统直接建在LVM。 loop device 就是伪设备当做块设备。http://unix.stackexchange.com/questions/4535/what-is-a-loop-device-when-mounting 数据的存储系统是任何一个现代系统必不可少的一部分。它关系着系统是否高效与稳定。使用数据库要求太多,而文件系统而是最灵活的,但是效率可能没有数据高。为了结合自己的数据存储需求,产生定制的文件系统,而非通过的OS文件系统。例如版本控制的文件存储系统,以及现在云计算系统都有自己存储系统。例如Google的GFS。fuse 文件系统是在用户空间的文件系统。如何使用 。并且通过它可以把一些服务当做文件系统来使用。例如google的mail空间。以及ftp等等。
通过对gentoo对于各种概念有了更深的认识。
不同的文件系统就是硬件磁盘与逻辑存储之间的映射关系。 所谓的超级块就是与文件系统有关的。 并且存储的效率以及备份与压缩的机制。
还有在备份的时候,先碎片整理最小化,然后再copy数据,这样会加块的速度。 e4defrag ,可以用碎片的整理,同时利用 gparted可以还直接对硬盘进行拉大与拉小,关键是存放的文件不要被覆盖。
分区与格式化挂载¶
sfdisk 是分区为了逻辑设备,就像人们有了多个硬盘一样。这个是由硬盘前面的分区表来决定的。而分区表的大小决定了,你可以有多少个分区,并且在分区表建立文件系统,在linux 下有各种各样的mkfs工具来供你使用。然后加载在OS上,这里就要mount了。 对于mount 由于这个概念泛化了。你可以mount 本地硬盘,也可以远程(NFS,autofs,samba) 还以把本地文件本身当做文件系统进行访问。同时也可以用bind 来把一个目录绑到另一个目录里,来避免ln的不足.`mount –bind挂载功能,避免ln -s链接的不足 <http://blog.csdn.net/islandstar/article/details/7774121>`_ ,`mount –bind 的妙用 <http://www.cnitblog.com/gouzhuang/archive/2012/07/15/65503.html>`_
windows自带磁盘分区工具Diskpart使用介绍 分区与`格式化 <http://baike.baidu.com/view/902.htm>`_ 是两步不同的操作.格式化又分为低级,与高级,低级格式化是物理级的格式化,主要是用于划分硬盘的磁柱面、建立扇区数和选择扇区间隔比。硬盘要先低级格式化才能高级格式化,而刚出厂的硬盘已经经过了低级格式化,无须用户再进行低级格式化了。高级格式化主要是对硬盘的各个分区进行磁道的格式化,在逻辑上划分磁道。对于高级格式化,不同的操作系统有不同的格式化程序、不同的格式化结果、不同的磁道划分方法。
同时为了支持热mount,还有 https://en.wikipedia.org/wiki/GVfs, gvfs 可以在用户态加载空间,例如把ftp,smb等等把网络mount到本地。例如 gvfs-mount ‘ftp://user@www.your-server.com/folder’ 目录都在 .gvfs/ 下面。 并且其下有一堆的gvfs-ls/cat, 等等一堆的命令。
例如 curlftpfs 支持把http,ftp等mount到本地。
各个系统的共享,这样就可以减少大量的配置工作,例如的所有的工作机都直接mount同一个存储目录,这样就可以大量的login以及editor的配置,可以直接使用自己本机的编辑器配置,而运行在其他机器上。 这样的并行度就会大大很多。
mount.cifs 可以持 samba等等,使用fuse为基础的gvfs 可以挂载 ftp,http等。而sshfs可以直接mount ssh 帐号。 只需要两条命令: apt-get install sshfs, 然后把自己加入sshfs这个用户组就行了。 http://www.fwolf.com/blog/post/329
共享目录¶
- 两种办法做这个,一种用autofs, 一次用可以使用cifs-utils. 直接mount就行。
mount -t cifs -o user=xxxx,password=xxx //192.168.0.1/xxx /mnt/
- linux 访问windows 共享目录 也可以直接使用`smbclient <http://wenku.baidu.com/view/ab3e7ffc910ef12d2af9e7bb.html>`_
- autofs our builds use it on farm
#. 如果自己想用FUSE系统直接支持和种http,ftp等等在线系统。可以用 https://www.stavros.io/posts/python-fuse-filesystem/ 来实现。
apt-get install autofs
mkdir /network
auto.master
/network /etc/auto.mymounts --timeout=35 --ghost
auto.mymounts
prerelease -fstype=cifs,rw,noperm,user=devtools_tester1,pass=nvidia3d,dom=nvidia.com ://builds/prerelease
硬盘检查与修复¶
extfs | e2fsck -y /dev/sda1 |
HFSP | fsck.htfsplus -f -y /dev/sda1 |
NTFS | ntfsfix -d /dev/sda1 |
Reiserfs | reiserfsck -a -y /dev/sda1 |
- e2fsck 还有一个配置文件
etc/e2fsck.conf
修复的原理,那就是各种文件系统的,格式
Ext3日志原理 whats-the-difference-between-e2fsck-and-fsck-and-which-one-i-should-use
man¶
H 可以打开man的命令帮助文档。
HardLink and softlink¶
我们知道文件包括文件名和数据,在Linux上被分为两个部分:用户数据(user data)和元数据(metadata),用户数据主要记录文件真实内容的地方,元数据是记录文件的附加信息,比如文件大小、创建信息、所有者等信息。在Linux中的innode才是文件的唯一标示而非文件名。文件名是方便人们的记忆。
为了解决文件共享的问题,Linux 引入两种链接:硬链接和软连接。
- 若一个innode号对应于多个文件名,则成为硬链接
- 若文件用户数据块中存放的内容是另一个的路径名的指向,则该文件就是软链接。
what-is-the-difference-between-a-hard-link-and-a-symbolic-link
http://www.ibm.com/developerworks/cn/linux/l-cn-hardandsymb-links/ hardlink 一个用途那就是做备份,要比copy更加快速方便。
Easy Automated Snapshot-Style Backups with Linux and Rsync 可以快速建立一个 hourly,daily,and weekly.snapshots. 并且一个快速 rotate 机制,就是一个重命名。
rm back.3
mv back.2 back.3
mv back.1 back.2
mv back.0 back.1
rsync -a --delete source_directory/ backup.0/
对于文件系统的监控¶
文件系统的消息的类型与数量也是固定的,可以用api来得到,mount –make-rslave 等等就是控制的消息的传递。 同时也可以用 gardgem 以及系统默认的watch 的命令一样。这样的工具也特别需要例如node.js开发的时候就提供这的工具。实时更新重起 service.
分区表的格式¶
硬盘的分区格式是用signature 来区分的,如果是总是识别的不对,应该原来signature没有清除掉,或者不同的软件的默认的读写位置不对。 如何用dd来查询硬盘的头部信息直接来得到或者直接修改。
parted -l #查看分区格式
dd if=/dev/sdb skip=1 count=1 |hexdump -C #查看内容
dd if=/dev/zero count=1 seek=1 of=/dev/sdb #把内容清除为零
See also¶
- TFS taobao 分布式文件系统,TFS集群文件系统 把原数据放在文件名与路径上,采用对象存储,
- 存储领域面临六大趋势
- 什么是对象存储?OSD架构及原理 核心是将数据通路(数据读或写)和控制通路(元数据)分离,并且基于对象存储设备
- OpenStack对象存储——Swift
- 图片存储系统设计
- 学会理解并编辑fstab
Paper¶
Thinking¶
CHS 记住硬盘这一物理存储结构就知道来理解一切就都会明白了,物理结构本身三级目录。柱面 磁头,扇区。第一个磁道的扇区数一样吗。柱面与磁头决定一个磁道。 grub 的原理与硬盘的结构是相关的。并且始终记住一点那就是对于处理器来说,它能做的那就是程序在哪儿,程序指针指哪从哪开始执行。开始执行前要把需要的程序加载在内存。grub其实就是做了这样的事,BIOS把MBR放在内存中,并且处理器的跳转那里。MBR放的就是grub引导程序。然后呢,grub做了三件事,要确定系统放在哪。然后从那里把去把内核镜像加载在内存中,并设置相关的环境变量,例如root目录,以及内核在哪里。 然后把执行权交给内核。
– Main.GangweiLi - 15 Jan 2013
长路径与文件夹的作用 长路径来保证文件名的唯一性,能过长路径来保正。其实也就是字符串长与短一种映射,这一个就是能够解决集体操作。一次对多个文件进行同样的操作。也就是有一种方法可以直接对压缩文件来进行操作。如果解决了这个问题,其实也要不要这么文件夹。也就不是大的问题。更多的逻辑分块的需要。
– Main.GangweiLi - 12 Mar 2013
数据库与文件系统 本质上数据库本身也是一种文件系统。对于不同的存储对象,采用不同的机制。例如一些锁碎的类似于ERP这样数据适合于数据库这种存储系统。而大的块数据例如视频则任何于直接存储于文件系统上。例如不同的文件系统对于备份以及权限的管理是不一样的。 并且还有一个分布式文件系统的问题。还有版本控制库的文件系统。并且各种文件系统有融合之意。例如mongo,TFS,GFS等等。
– Main.GangweiLi - 12 Mar 2013
内存文件系统 为了使启动更加方便,把内核更不断不分层模块化。来使其更加通用,与复用。因为内核变化速度要比文件系统要快。
– Main.GangweiLi - 19 Apr 2013
文件属性 在查找的,排序的时候,利用文件属性会具有很大的优势,另外一个文件的属性是存储在哪里的。例如我想基于文件属性的查找排序是会很有用,在win7上是可以随时调整的,但是linux上却没有发现,如何大规模对象存储。对于图象。更是如此。例如利用find可以查找有限的文件属性。 IBM filesystem 系列 现在才对文件系统的认识有了更深的认识。需要文件系统具有什么样的能力。
文件系统中节点的类型¶
- directory
- file
- symlink
- block device
- charactor device
- FIFO
- unix domain socket
References¶
[1] | http://www.jianshu.com/p/c6a530365bea |
Module与driver¶
linux下driver的安装还是很有挑战的,会遇到各种的不兼合,并且会无法适从。但是明白其加载原理之后,自然一切都了然于心了。
driver起的就是逻辑设备,要想到一个linux中使用一个设备,就为其建立一个逻辑设备也就是driver,正是因为这一层逻辑设备,我们才可以各种虚拟设备。以及实现虚拟化的。
这个映射关心是由udev来做实现的,而driver本身的管理是由modeprobe.conf来管理的。 module的依赖,以及alias,以及blacklist机制,还可以配制module的参数。并且还可以不用加载直接执行就可以直接执行的。每一个module,driver的管理配置都可以放在 etc/moduleprobe.d/ 下面。
例如 http://askubuntu.com/questions/112302/how-do-i-disable-the-nouveau-kernel-driver 就是利用了blacklist
并且一般情况下换了硬件之后,OS不工作了,或者工作不正常了,例如桌面进不去了换了显卡之后,只要重装一下,所有状态reset为正常值应该就好了。 例如 sudo apt-get install nvidia-331 然后 reboot .
device Management¶
这个事情起因是在这里http://www.kroah.com/linux/talks/ols_2003_udev_paper/Reprint-Kroah-Hartman-OLS2003.pdf 原因硬件命名规则太死板了,例如硬盘太多,原来那种major/minor号又不够。 因为每位都8位,并且还有很预留的,另外 是热插拔的硬件很多,总不能都事先留着吧,那样/dev的目录太大了。另外也能保证每一次都在同一个地方。这样内核就头疼了。
后边就有udev这种方法,由kernel只告诉用户有硬件来了,它叫什么名字,由你告诉我,然后再用对应的driver来读取他。 也就是为什么多个硬件可以共用一个driver,或者你可以靠一个假的硬件原因。现在有了逻辑设备。 driver与逻辑设备对应。 我可以指这个mapping,也可以系统自己生成。系统采用第一次生成后保存下来。以后延用。
mdev,udev两者实现的基理不同,udev采用 netlink的机制,自己造一个Dameo来检测 uevent,而mdev 则是注册一个回调函数来实现。 /sys/kernel/hotplug 。http://blog.csdn.net/lifengxun20121019/article/details/17403527
http://git.busybox.net/busybox/plain/docs/mdev.txt http://wiki.gentoo.org/wiki/Mdev
when you plug in a new device such as USB. which label “sdb…” will be used for it. here you can use udev. 1. db store the user device information 1. rule how to recognize the device. 当你发现你的OS在新的硬件上,不识别,例如网卡不能用了,第一步那就是先把这个rule给删除了。* rm -fr /etc/udev/rules.d/* 1. udev的实现原理 1. 使用udevadm修改usb优盘在/dev下的名字 1. Linux┊详解udev
如果你想定义硬件的命名等都是可以用 udev.rules 来解决的。 writing udev rules .
如何写查询属性可以用 udevinfo 或者 udevadm info -qury=property -path=/sys/block/sda
driver 之间的依赖关系是由LKM来管理,如何自动加载与实现逻辑设备与物理设备的mapping 主要是对应的pci数据结构,每一个硬件都会用vender,device ID,以及相对应的subID,是通过udev来实现的与管理的,这个就像windows,pnpUtils是一样的。
每一个设备成功后都会占用一个端口号或者内存地址段。应该是每一个硬件都会ID之类的东东,内核来做了这个mapping,例如eth0 对应哪 一个网口。 就像我们在NEAT所做的,逻辑设备与物理设备之间的mapping. 并这个关系更规范与通用化一些。
kernel module driver install and debug¶
kernel module usually end with xxx.ko. from linux kernel 2.6, the kernel use dynamic mechanism. you dynamically insmod,rmmod . use the depmod to generate /lib/modules/2.6.xx/modules.dep and then modprob would automatically insert the module according the modules.dep. the driver is one of module. the module could have alias name.
Item | Content | Remark | |
---|---|---|---|
module location | /lib/modules/kernel version /kernel/drivers | ethernet card driver /lib/modules/2.6.4-gentoo-r4/kernel/drivers/net/r8168.ko | |
configuration file | etc/modules.autoload.d/XX | you just need to add the module name here. etc/modules.autoload.d/kernel-2.6 | |
modprobe | modprobe r8168.ko | the module could have alias name. etc/modprobe.d/XXXX | |
depmod | depmod -a r8168 | ||
dmesg | kernel会将开机信息存储在ring buffer中。您若是开机时来不及查看信息,可利用dmesg来查看。开机信息亦保存在/var/log目录中,名称为dmesg的文件里。 | dmesg用来显示内核环缓冲区(kernel-ring buffer)内容,内核将各种消息存放在这里。在系统引导时,内核将与硬件和模块初始化相关的信息填到这个缓冲区中。内核环缓冲区中的消息对于诊断系统问题 通常非常有用。在运行dmesg时,它显示大量信息。通常通过less或grep使用管道查看dmesg的输出,这样可以更容易找到待查信息。例如,如果发现硬盘性能低下,可以使用dmesg来检查它们是否运行在DMA模式: |
See also
- 解析 Linux 内核可装载模块的版本检查机制 以及 如何突破其CRC验证 简单直接把crc值,直接在elf里改成符合规定的值,说白了就是凑答案 .
- module common command 以及其`实现机制 <http://read.pudn.com/downloads37/sourcecode/unix_linux/124135/Linux%E5%86%85%E6%A0%B8%E6%A8%A1%E5%9D%97%E7%9A%84%E5%AE%9E%E7%8E%B0%E6%9C%BA%E5%88%B6.PDF>`_ .
$dmesg | grep DMA
内核检测到硬件,然后去加载mapping的driver,在加载的过程中要经过modeprobe.conf这样的过虑,并且解决其依赖关系。没有对应关系就要手工加载了。
一般是要把module放在 /lib/modules/<kernel version>/kernel/driver/net
以及去修改 /etc/modules.d/<kernel version
2.4 的版本 用的是module.conf,而2.6的版本用是modeprobe.conf
所以多个硬件可以共用一个driver,只需要用alias 把硬件本身映射到一个别名。
硬件一般用中断传递信息,而内核如何来传递这些信息用uevent, 不管你的底层是什么中断。并且uevent 通过netlink来进传送。
底层的中断又有很多¶
PCI总线的中断,例MSI与MSI-X中断机制。中断的级联扩展。
内核的调试
Linux 系统内核的调试 主要有三种kgdb,SkyEye,UML三种技术。
intel ethernet 153a 网卡不稳定¶
查看问题的,第一个要收集信息,不要轻易破坏了环境。尽可能多的收集信息 #. 保存error 信息 #. save /var/log/dmesg 与 /var/log/syslog #. 查看 是否内核加载了 cat /proc/modules |view - #. 根据error message进行初步的推理并验证 #. 提炼你的问题,一句话,几个词 #. ehtools 查看并且修改硬件。 #. insmod -m 查看插入时信息 #. 看看没有新版本可以用,看看CL. http://sourceforge.net/projects/e1000/ #. 去官网查看相关的FAQ 以及bugs. http://sourceforge.net/p/e1000/bugs/430/ #. 还有那是 READE #. 最后看一个 开发framework,去找一个init, close函数,只需要看看其做了什么,就知道了。
driver 的开发¶
一般都是register, init, shutdown, close等等几个函数接口。 http://10.19.226.116:8800/trac/ticket/2705 就是标准 .so 只是链接的库不同,以及编译的选项要与主机匹配。 http://www.tldp.org/LDP/lkmpg/2.6/html/x181.html 有详细的教程
内核的编译都需要内核的头文件,以及symbols表,以及依赖与加载的先后关系。 以及内核的版本号,如果开启了版本的匹配功能,则需要对应,不然不能加载。
内核用uevent与用户态通信。
insmod/lsmod的原理。 http://elinux.org/images/8/89/Managing_Kernel_Modules_With_kmod.pdf
专题篇¶
linux bootup¶
linux 的生与死¶
先由BIOS上电之后,由BIOS决定你从哪一个分区起,然后BIOS把对应分区的上bootloader 加载。然后bootloader把kernel的代码,以及所需要东东,都加载到内存里放一个地方。然后再kernel开始初始内存,建立内存表,以及中断表等等之后,然后才是种driver的加载。然后各个东东才开始各自的执行。builtin与module进去,采用都是相同的结构。module的内存结构。 内存结构可以用http://code.metager.de/source/xref/linux/utils/kmod/libkmod/libkmod-module.c#63 这里看到,采用的struct然后里边就是指针了。形成一个列表。insmod,rmmod插入,列表,查询列表的过程。
linux 启动模式是由 linux的运行模式:Runlevel详细解析 决定的,它是由 /etc/inittab 来控制的,telinit 是用来发送信号进行init. shutdown reboot都是跟 runlevel相关,默认的level,都在rc.XX.d下软链接,并且也是00-99的数字,并且SK表示特殊的意义来开始。原来的GTL的方式是在学习RC 机制。
对于系统的控制,很大部分那就是各种service的起动的控制,系统基本起来了,就是各种服务进程,这个主要就在init.d这个阶段进行,如何开机自己等都是在此做的,同时自己需要一些定制的也主要集中此的。
对于ubuntu简单直接,/ect/rc.local就可以了。并且可以查看rc.d 这个目录下东东。 这个每个系统也是不一样的。同时有些系统已经支持并行启动了,例如SUSE中已经支持了。具休可查看/ect/rc.d/README,并且在/etc/rc.d/boot中控制。 一旦并行就会有步同步依赖的问题,也这也是各种before,after 机制的原因,这些就是用来控制顺序的吧。
实践上 init 现在已经支持并行了,并且之间也是有依赖关系与event的话,起动依赖配置放在 /etc/init/XX.conf中, 所以当然也可以对此的应用如此的定制。
gentoo用OPENRC来实现一套并行机制,
# show dependency
rc-udpate show
# add
rc-update add root boot
# get all service list
rc-service -l
如何把添加卡到默认启动¶
cd /etc/init.d/
cp net.eth0 net.<newid>
rc-update delete net.eth0 default
rc-update add net.<newid> default
gentoo os 有时候发现开机启动后根目录是只读,可能的原因就是 /etc/init.d/root
没有加到启动项中。
https://wiki.gentoo.org/wiki/OpenRC
centos则采用的队列来实现机制。http://man7.org/linux/man-pages/man7/dracut.modules.7.html 主要的功能那就是rc本身也支持语法输法,这样就可以很方便的进行定制。 init 是一个event-based daemon,1号进程. 给出更宽泛的地义,那是context, exec 等等。 只管输入输出,与环境变量。 http://linuxmafia.com/faq/Admin/init.html, sbin/init 是第一进程。 rc-.>(run control). http://leaf.sourceforge.net/doc/bootproc.html,linuxrc->init->RC.
各家系统的对比。 https://wiki.gentoo.org/wiki/Comparison_of_init_systems
以及现在XIP, execute in place技术,直接起动,而不需要加载,例如使用ROM等等。这样可以大大加快启动的速度。这种一般是直接从 flash来读kernel,主要是一些嵌入式的设备。 直接启动。而不需要向PC这样的复杂。而这一块做的最好当属于现在的手机系统。 How to config XIP
对于SUSE 是有一些麻烦,要用到http://unix.stackexchange.com/questions/43230/how-to-run-my-script-after-suse-finished-booting-up, 写标准init 脚本并注册了。当然也简单的做法例如直接/etc/rc.d/after.local 等来进行hook, http://www.linuxidc.com/Linux/2012-09/71020.htm. 对于windows 来说,也就是注册表了开机启动了。 不同的系统对于这部分都有不同的优化。
ubuntu 中bootup https://help.ubuntu.com/community/UbuntuBootupHowto, 并且这里有一个service 的模板可以用。
内核的启动与一般函数调用¶
是一样的,或者一个复杂的命令行而己,就像gcc一样,哪些自身的参数,哪些是传给你init,哪些是传给module中。 都可以在这里查到的。 http://man7.org/linux/man-pages/man7/bootparam.7.html https://www.kernel.org/doc/Documentation/kernel-parameters.txt
启动三步grub
grub> set root=(hd0,1)
grub> linux /boot/vmlinuz-4.4.xxx-generic xxxxoptions
grub> initrd /boot/initrd.img-xxxxx-generic
grub> boot
例如要不要使用 initrd,可以直接使用 noinitrd,就可以了。具体其他的起动参数都是可以从上面的文档中查到。如果使用initrd,内核启动就会为两个阶段 #. 内核启动前, grub会把initrd 先加载到内存中 #. 内核启动后,先利用 initird中一些文件,来完成加载驱动模块, #. 执行 /sbin/init
为什么会用initrd,因为所有的驱动加载内核是不现实的,内核中只包含基本驱动,initrd则根据硬件来定制。 另外利用USB启动时,使用initrd文件是可以加速的。 具体原因见 https//www.ibm.com/developerworks/cn/linux/l-k26initrd/
对于启动的时候,initramfs 都是initrd的压缩版,只是把当前文件系统的一些东东直接cpio,gzip打包成.img而己。并且也都有现成工具可以来做。 http://www.stlinux.com/howto/initramfs http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html https://wiki.ubuntu.com/Initramfs http://lugatgt.org/content/booting.inittools/downloads/presentation.pdf
解压 initrd¶
cp /boot/initrd.img-`uname-r` .
file XXX.img
mv XXX.gz
gunzip XXXX.gz
file XXXX
cpio -idmv < XXXX
对于initramfs 的制作,每一个平台都有专门的工具来做。 例如, redhat 有 dracut 什么需要呢,例如些module没有编译在内核里,但是启动又需要的。这些就需要的。这样可以启动内核做的很少,然后灵活的定制。 这里就有一个问题,操作系统是什么加载driver的。 并且由bootloader 利用 initrd 建立一个 / root system. 并在这里起动 kernel. http://www.mjmwired.net/kernel/Documentation/initrd.txt read the init code of linux kernel. to understand the shell and interpreter programming. Linux系统下init进程的前世今生 init/main.c sourcecode
当你更改了系统的启动配置,就需要更新一个initramfs,这样才能保证起动不不加载。经常遇到现象,那就 /etc/modprubes.d/nvidia-installer-disable-nouveau.conf中 blacklist nouevu 但是起动时还是加载了。
一个终极办法,那直接发在 /lib/modules/xxxxkernel_version/kernel/drivers/gpu/drm/nouveau/nouveau.ko
的改名。
然后 update-inittramfs -u 更新一下。 而 /etc/initramfs-tools
是其配置文件。
Linux系统启动过程分析详解 module 加载在 /etc/init.d/kmod 里实现的加载哪一个driver,并且加载的顺序。而这些应该在init之前。
http://leaf.sourceforge.net/doc/bootproc.html 这里说细的linux启动流程。
并且启动过程是可以打断的加入参数 break=init就可以了,或者在起动的时候按快捷键,例如按 I for gentoo os. BootProcess
init 开始并行化,event_base化。 https://en.wikipedia.org/wiki/Init,有各种各样的 init.
mdev是用来创建 /dev的目录, 使用方法 https://git.busybox.net/busybox/tree/docs/mdev.txt?h=1_18_stable
所以当你发现硬件没有发现的时候,直接使用 mdev -s, 就可以了。
或者
mount -t sysfs sysfs /sys
sysctl -w kernel.hotplug=/sbin/mdev
mdev -s
在GUI login运行的用startup Applications Preferences. 用命令行, gnome-session-properties来管理,同时也可以~/.config/autostart下面能看到。 http://askubuntu.com/questions/303694/where-is-startup-applications-user-config-file-for-disabled-and-enabled-applic
并且启动的log都放在dmesg中,如果log不全,可以把dmesg改大。 dmesg是内核缓冲区的内容,printk就是打印到这里。 所以遇到起动问题,直接看/var/log/dmesg 中。直接通用搜索关键字来得到。 内存的log的级别是可调,哪些级别打印console上也都是受此控制的。在起动的时候,
所谓的sesssion 也就是context另一个叫法,同时session <==>context<==>environment. 三种基本上是等价的一个概念只在不同level上。 另一个编程语言的也有类似的概念。
with open(xxx) as f:
f.read()
#do something
f.write()
无盘启动¶
到现在为止,我们已经用过U盘启动,光盘启动,到现在的无盘启动。
- U盘启动我们用的是syslinux实现的
- 光盘启动,我们的是isolinux来实现的
- 无盘启动,我们需要PXElinux来做了。
实现步骤
- 设置网卡支持网盘启动
- DHCP server上指定 tftp server 的地址,以及需要开机启动文件与配置
- 然后PXE client 下载并执行
启动的核心,从哪里下载启动镜象,并且启动。并且在一个现有的网络中,DHCP server是由IP控制的,并不能随意的改变,一个更加灵活的方案,那就是替换网卡的PXE固件,然后可以任意指定地址来进行 现在网卡中默认的都是 http://ipxe.org/ 客户端
#Press Ctrl-B at this point, and you should reach the iPXE command line:
iPXE>
#You can list the network devices that iPXE has detected using the ifstat command:
iPXE> ifstat
net0: 52:54:00:12:34:56 using rtl8139 on PCI00:03.0 (closed)
[Link:up, TX:0 TXE:0 RX:0 RXE:0]
#and acquire an IP address using the dhcp command:
iPXE> dhcp
DHCP (net0 52:54:00:12:34:56).... ok
#You can examine the IP configuration and other DHCP options:
iPXE> route
net0: 10.0.0.155/255.255.255.0 gw 10.0.0.1
iPXE> show dns
net0.dhcp/dns:ipv4 = 10.0.0.6
#You can boot something over the network. Unlike a traditional PXE ROM, iPXE is able to boot over a wide area network such as the Internet. If the machine you are testing is connected to the Internet, you can boot the iPXE demonstration script:
iPXE> chain http://boot.ipxe.org/demo/boot.php
boot.php 的内容
#!ipxe
kernel vmlinuz-3.16.0-rc4 bootfile=http://boot.ipxe.org/demo/boot.php fastboot initrd=initrd.img
initrd initrd.img
boot
how to config PXE server¶
http://blog.csdn.net/robertkun/article/details/16851109
copy the form ISO cd
cp /mnt/iso/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default cp /mnt/iso/images/pxeboot/initrd.img /tftpboot/ cp /mnt/iso/images/pxeboot/vmlinuz /tftpboot/
boot from nfs¶
boot from http¶
http://ipxe.org/appnote/xenserver 可以参考这个试一试
Booting from PXE of Realtek of agent¶
http://www.ipcop.org/1.4.0/en/install/html/installing-from-pxe-boot.html
无盘启动方案¶
- 安装网卡,并注册网卡信息
- 自举安装safeos
- 检查自己是否需要安装safeos
- 自safeos中添加自己demo 在GTL service之前,然后自动提交service中。
- safeos 启动之后
- 是否刷机
- reserve 机器
- 刷机
- unreserve 机器
- 自动更新 E:windows OS自动配置
- 自动设置 Stage to 1
tty console¶
现在终于明白了tty的设计原理了。简单的理解,就是一个socket通信。并且把两端通用化。例如一些编辑的功能,例如具备一些editor的初步功能。 一个最简单功能,那就是直接for循环,就可以搞定。拿浏览器来做对比,就会一目了然,那就是终端也需要一定的rendering功能。 而这些不是应用程序本身需要 考虑的功能。
未来的terminal 趋向于全终端editor+ browser + session management 的功能。例如QTconsole能够支持图表与公式的功能。
例如tmux 来实现多session的管理。以及asciinema 的录制。 以及各个session之间的共享,其实就是socket的组播功能。
pts的原理,http://www.baike.com/ipadwiki/PTS
ssh,telnet这些与在本地的xterm都同相同地方,那就是其输入输出连接一个终端。并且都是双工通信或者三工通信,in,out,error. 而对于终端来说,那就是一个master,slave,一个读一个写。要正好与进程之间反过来才行。 而这些都是要终端打交道。
/dev/console 总是指向系统的TTY,它决定了系统的信息往哪里输出,/dev/tty0总是指向当前的tty, tty[1-x] 则是独立逻辑tty设备。
terminal 中显示符号¶
这个关键是编码与字体的支持,只要有两者的支持就能显示,例如 在terminal中显示数学符号
远程网络shell之间¶
ssh 的过程。 远程网络终端和本机shell之间建立了一条双向通道–“远程网络终端-(套接字)–本机协议处理进程–主终端–从终端–shell”
serial IO 的原理¶
CPU -> driver ->bus ->I/O pin http://www.tldp.org/HOWTO/Serial-HOWTO-4.html
XWindows 与窗口管理¶
introduction¶
所有的 GUI框架 主要有两大块,消息处理的机制与窗口布局。消息的路由。经常被隐藏在类的继承里面。
Xwindows 后面的:a.b是a指的是你的机器起的第几个Xwindows,直接起X 时,是可以指定硬件ID来显示在哪一个显示上。alt+F7~F8来进行切换。可以起多个X server,就像vncserver一样, X :1 &就是一个,1就是偏移量, X window 默认是6000端口,而VNC用了5800,而vnc的http用的是5900端口,这也是为什么VNC最多只能一个百个原因,因为6000以后就被Xwindows占用了。 ubuntu永启动X时是用 unix socket这个只适用于本地进程通信,而不能远程。这也就是为什么无法远程连接的原因。Xdefault 样式表默认配置,xdm是管理器,这样我就可以用telnet直接 Xserver来进行绘制窗口。同时我也可以hook一些事件了。可以进行屏幕录制了。考虑把这个做出来。 整个显示分为几层
- 物理屏幕 一块或者多块
- 逻辑屏幕
- 窗口
- 控件,widget
- 画布
- 图层
- 前景与后景
- 作图
- 各种种图形组
- 各个图元
消息传递本质就是if,else判断,MFC是利用宏生成这个if,else的。另一种那就是利用OO的继承机制。或者采用观察者等设计模式来做。
表面上看起来很灵活的东西,发现在最后本质都是一样的,不过在上层利用编译器与宏来做了各种替换优化工作。就像那些模板一样。 各种各样的窗口管理器,处理了平台的相关性。就像OPENGL只处理画布内的内容。
如果想用VNC的客户端进行自动化可以用vncdotool来实现。 https://github.com/gwli/vncdotool
如果开发一个定制的客户端,可以用 https://wiki.gnome.org/Projects/gtk-vnc
现在已经一个python的版本的客户端了。 https://github.com/techtonik/python-vnc-viewer
https://code.google.com/archive/p/vnc2flv/ 把VNC desktop session保存成Flash Video file.
XWindow 的启动分析¶
SUSE下的启动¶
/etc/init.d/xdm
没有显示连接的话,x server 会起不来。如果还想起就要用 XVFB(virtual framebuffer X server) . 或者添加 AllowEmptyInitialConfiguration to xorg.conf
并且添加 ~/.xinitrc
.
配制文件里配置分配率¶
http://openmind.iteye.com/blog/1319868 或者http://forum.ubuntu.org.cn/viewtopic.php?f=48&t=346103
#. 计算 cvt, 然后把 ModeLine 写入 /etc/x11/xorg.conf 也可以调整显示方向可以在 xrander --rotate 也可以用 xrotate
xrandr --setprovideroutputsource 0x46 0x2b4
xrandr --output LVDS-0 --off
xrandr --auto
exec startxfce4
https://devtalk.nvidia.com/default/topic/585014/how-to-configure-x-server-to-work-headless-as-well-with-any-monitor-connected-/ https://devtalk.nvidia.com/default/topic/567784/nvidia-325-08-optimus-no-screens-found-ee-/
或者 nvidia-xconfig --allow-empty-initial-configuration
X windows 采用的 properites and components模式,相当于screen一组,对应实体的inputs,mouse, monitor.
如何把VNC 跑在real X display上¶
ubuntu 默认的 vino-server直接跑在 real display上的 http://superuser.com/questions/136785/how-do-i-run-vino-server-without-a-monitor-attached-in-ubuntu-10-04
或者使用 X11vnc 并与 –display :0 这样就行了。 http://www.karlrunge.com/x11vnc/
并且VNC是在X11与windows manager之间的层,你可以为VNC选择不同的窗口管理器。这个配置可以在:file:~/.vnc/xstartup
VNC 的类库开发。 http://blog.csdn.net/wuyutiancai/article/details/1497775 配置 http://3492zhang.itpub.net/345618/viewspace-1020431/
命令行配置 vino-server http://ubuntuforums.org/showthread.php?t=266981 vncconfig 可以对正在运行的vncserver进行配置。 https://www.realvnc.com/products/vnc/documentation/4.2/unix/unixconfig.html
V3L 14.04 下的启动¶
X windows 消息机制¶
xev -id WINDOW_ID | will print X11 “window events” | ||||
xwininfo | |||||
xtrace | |||||
xeyes | 可以用来监控你的各种动作 ,通过修改xeyes 就会很容易做到 | ||||
xdg | xdg-utils 这个下面有很多很好玩的xdg-icon-resource | xdg-desktop-icon/menu xdm-mime | dxm-open | xdg-user-dir,xdg-emial这都是非常实现的Xwindows命令行程序,xdg-email是可以发副件的。xdg-settings 管理各种设置,并且这个是x desktop management. | |
xgc | you can test various command and feature for xwindows GUI | you do experiment on it with GUI | |||
Event Structures | Xlib Functions and Protocol Requests | ||||
xcutsel | xcursorgen | ||||
xlock | xss | lock and screen saver | |||
xv | http://www.trilon.com/xv/whatisxv.html | ||||
运用xlib进行事件响应(X11 API)的小例子 | XSelectInput | event_mask | 所以在linux你可以hack所有的GUI | ||
orca | The GNOME Desktop Accessibility Guide is for users | system administrators | and anyone else who is interested in how the GNOME Desktop supports people with disabilities from an end user point of view. If you are new to GNOME | you may wish to read this documentation first. |
xkill 非常好用的的一个kill 工具。 http://blog.csdn.net/xiajian2010/article/details/9796365
ubuntu 16.04 的恢复¶
apt upgrade
dpkg -l |grep "xserver-xorg"
xserver-xorg
xserver-input-all 键鼠不能用,安装就是这些出了问题。
xserver-video-all 管理显示。
ubuntu-desktop 安装窗口管理器
FVWM¶
the window manager has three parts, window, menu,button, mouse and keyboard. window,menu and button has style/menustyle/buttonstyle to control outline. for the module, there is module config. these configfile could be substitue two times, so you can Exec to trigger the scripts and also, you could use the m4 to do these.
FVWM 的主要设置,FVWM内部的环境变量。 #. 屏幕工作区域的划分 #. 窗体各种属性,默认大小,开始位置,边框的大小,以及标准button的位置。 #. mouse 的工作模式,click,hold,move的定义 #. focus 的方式,主要是mouse相关。 #. button,与menu的生成。这个都有menustyle与buttonstyle来指定其格式。button 可以关联函数动作,menu也是,mouse与key也是一样的。对于键盘的如何分配可以按照vim的模式还是按照emacs的查式去试一试。 #. 与外部接口。Exec,PipeRead,可以执行各种各样的命令,还有现成的perl接口。python接口 haskell. 对于样式表还是可以分组的,这样就构成了theme,利用desc来使用一组样式表。 对于函数一上来,那就是一个switch对于键盘与mouse操作,过滤,对于哪些操作reaction,哪些nop.
对于分屏的操作,PvwmPaper 来控制显示多个 virtual Desktop.
lockscreen¶
锁屏一个套独立机制,例如强制占领桌面最前端,其他功能切换不能工作,只有收入密码才能解屏。
X windows 下有不少锁屏工具,例如xlock, 也有gnome-screensaver 来进行设置,而用:command:gnome-screensaver-command -l 来进行锁屏。
VNC¶
gnome-session 用来开始窗口管理器的。 一般需要在 .xstartup中启动它,不然的话,就会出现只有一个灰色的窗口。
ubuntu 14.04 发现有版本不匹配时可以用。gsettings set org.gnome.Vino require-encryption false https://bugs.launchpad.net/ubuntu/+source/vino/+bug/1290666
XWindows 恢复¶
dconf 可以用来调整配置
例如XWindow墨屏没有显示可以用. sudo dconf reset -f /org/compiz 进行恢复。 对于 Gnome 定制可以参考 http://askubuntu.com/questions/22313/what-is-dconf-what-is-its-function-and-how-do-i-use-it
另外那就是通过看log来解决问题,如何看log,例如,login fail. 可以直接查看。 /var/log/lightdm/xxx.log 它会保存至少两次的log. 看log时,查error message查出来,并找到error依赖找出来,最简单的方法那就是第一个error为root cause. 一般情况都是由于系统的变动引起的,某些资源找到不了,重新加载,例如重装,手动修改配置文件就能搞定。
常见还有权限问题: ls -lA ~/.XAuto* ls -lA ~/.ICE*
还可以重装nvidia driver,
sudo ubuntu-driver autoinstall
#
sudo service lightdm stop
sudo dpkg-reconfigure lightdm
Remote Display¶
- 试一试这种远程的显示。把amyl的p4 显示到我的机器上来。
- Xauth 简单的使用文档,xhost权限颗粒太大,Xauth小一些。
- where-does-xhost-store-the-allowed-network-addresses 最终还是记录的网络地址,所以当client的IP换了之后,就要删除以前重新加一次,从新获得新的IP。
- X windows for android 现在android就可以很方便远程控制我的电脑了。 一个最简单的方法那就是利用ssh forwarding, 在linux下
ssh -X 加主机名了
当然,ssh本身也是可共享的,主要你把设置共享的(-M),ssh本身还有很多好玩的参数可以去看一下其manul. 并且它可以后台运行。
- how-to-make-x-org-listen-to-remote-connections-on-port-6000 修改lightdm的配置文件,原来gdm已经被lightdm给换掉了,同时改掉.xserverrc中的那一行。
PAM¶
Pluggable Authentication Modules, 就是为模块化验证密码,方便系统的各个组件来用。配置文件在 /etc/pam.d/
remoteAPP¶
这个对于XWindows天然的功能,而对于windows也有了相应的工具,建立在RDP的之上, http://www.kimknight.net/remoteapptool。 只运行APP本身。
See also¶
- UbuntuHelp:FVWM
- gentoo FVWM 现在看到gentoo正是自己想要的东东
- fluxbox 提供了各种灵活的布局
- xmonad 用haskell 编写的窗口管理器,可以不用鼠标
- FLTK
- SynergyHowto configuration on ubuntu
- fvwm tutorial
- understand X Windows
- FVWM simple tutorial
- fvwm style manual page
- Xmonad (简体中文)
- fvwm buttons introduction
- aterm-xterm-eterm-rxvt-konsole-oh-my aterm -tr -trsb -cr red +sb -fg gray -fn fixed -fb fixed the difference, aterm, would be tranparent, and fixed font such so on.
- ffmeg 屏幕录制
- x xwindows 常用命令列表
Thinking¶
看来自己当年在TWiki写的东西,要想办法恢复出来,这样的话,把这些给完完全全的给整理出来了。同时把 Work.XVirtualFramebuffer的应用也加载进来。
xterm bg
Sandy Brown | Brown | Tan |
系统的颜色表可以在/etc/X11/rgb.txt 中找到。
– Main.GangweiLi - 12 Dec 2013
今天的实践,只需要简单的调整,就得到自己想要背景了。不过离人家那种界面还差的老远了。一是直接修改了button的执行的参数,来改变了aterm,另外一个那就是利用style把程序xterm 的背景给改掉了。 并且FVWM可以动态的重起,并且还可以直接在console来做一些测试。看来要慢慢形成自己的风格。我会从实际出发,一点点添加功能,现在窗体除了xterm看起来,还是有些丑的,下一步就是要优化这些窗体,但重要的一个事情,那就是把手势语给先加上。另外一个那就是配制管理,网上它们都是利用github上的直接来做的,考虑一下,自己是不是也要这样做一下。实现自己的配制管理。要么就用自己的svn.这个要做起来。
并且X windows中样式表,对于应用程序,与窗体是如何区分,什么时候样式指定的应用程序,什么时候是窗体。
– Main.GangweiLi - 12 Dec 2013
DRI Direct Rendering Infrastructure. RM & DRI DRI 全称 Direct Rendering Infrastructure。X11 是采用 C/S 架构的,客户端的任何操作都需要和服务器进行通讯,在实时的 3D 渲染上性能无法接受。DRI 在 X11 上能够允许直接访问硬件渲染器(显卡),从而直接将 3D 图形渲染到屏幕上,绕过 X11 ,提升性能,这种叫作直接渲染(direct render)。DRI 为上层 3D 库提供访问底层硬件的接口。DRM 全称 Direct Rendering Manager,直接渲染管理器,是真正操作硬件的层次。各个硬件厂商负责提供各自硬件的 drm 模块(开源的提供源码、不开源的提供二进制文件)。DRI 通过调用 DRM 的接口来实现上层 3D 图形库的接口。DRI 的源码则在 Mesa 中。
InputClass 会改把 /dev/input/event中映射过来。
XWindows 设置屏保¶
Section "ServerFlags"
# Set the basic blanking screen saver timeout in minutes. 0 to disable.
Option "blank time" "0"
# Set the DPMS timeouts. 0 to disable.
Option "standby time" "0"
Option "suspend time" "0"
Option "off time" "0"
EndSection
添加开始菜单¶
在ubuntu 中是可以 ~/.local/share/application 下添加 XXX.desktop来实现。 全局的放在 /usr/share/applications 下面。
哪一类的文件用什么软件打开,这个关联在windows下叫 class,而在ubuntu 中可在 /usr/share/application-registry中实现。
如果没有安装desktop,也可以手动安装,apt-get install Ubuntu-desktop
Session的管理¶
- Multiuser
- Enable / Disable multiuser mode.
- Acladd
- Enable a specific user.
- Aclchg
- Change a users permissions.
- Acldel
- Disable a specific user.
- Aclgrp
- Grant a user permissions to other users.
- Displays
- List all active users at their displays.
- Umask
- Predefine access to new windows.
- Wall
- Write a message to all users.
- Writelock
- Grant exclusive window access.
- Su
- Substitute user.
IO¶
对于linux 中每一个程序都会有三个默认的IO,0 标准输入,1标准输出,2标准error输。 其实它们于正常的文件打开是一样的。 只是他们打开的是设备文件,而这个是filesystem 已经帮我们进行屏蔽了。 并且里程的继承关系,默认情况下,每起一个进程都会默认继承复进程的东东。所以你看到大部分程序输入与输出都在同一个地方,键盘与屏幕。
而真实的过程就是可以是任意的文件。你可以起动一个进程的时候就指定 0,1,2的变化。 用代码控制就是dup2 直接 link 一个系统里打开的文件,包括其读写的位置。相当于共享一个文件。 (而不是真实的复制,只是复制的两者就没有关系了,这个从man dup2 的说明就可以看,这就是文件系统的一个link ). 所以两个指针写,一个读。 并且把这个文件属于写不完就行, 只是需要建立一个buffer,然后在此基础上实现一个循环队列就搞定了,头尾两个指针,用于读,一个用写就行了。
文件同时会读写两个指针,但是为了避免冲突,程序使用一个文件不会同时即读又写的。
Pipefs文件系统不需要太大,只是需要循环的链表,并且基于字节的两个指针而己。这个是个文件不是独占,共享指针。
从文件中读取的方式,可以按行读,也可以按字切读,当然也可以是扫描式的读,那就是scanf. 以前读这种读法,不理解,现在终于理解了。
所以我们读写对应是一个FD,把可以这个FD任意的变换,现在对于M4 的对于输出那么灵活重定向明白了其实现原理。
http://blog.csdn.net/dog250/article/details/7484102 http://www.cnblogs.com/weidagang2046/p/io-redirection.html http://bbs.chinaunix.net/thread-2079678-1-1.html
http://my.oschina.net/u/158589/blog/69047 这一篇讲的就不太对了
对于IO的读写,是各个系统很重要的一部分。 也就是 read,write后面的原理。是如何内存读写过来的。 select,poll都是能够针对FD是事件进行检测。 linux 把IO都当做一个文件,所有与相关的事件是不是都应该用可以select,poll来读写呢。 硬件的变化,可以硬件的线路反馈给CPU,然后CPU现在都已经可以达700-1000个引角。能实现 的功能大大复杂了。 http://www.cnblogs.com/xkfz007/archive/2012/10/08/2715163.html
像文件读写也是一样的,需要一定的结构,把各个引脚的状态放在内存里。那些管脚有一半为供电的。
exec 用法,也就加载segment,以及data段的过程,并且几种不同接口都是针对具体的细节的应用。例如要不要不环境变量等等。
例如现在想看到一个进程的输出怎么办法,可直接可用 tail -f /proc/fd/1。 或者debugger attach上去就可查看输出了。或者直接用ptrace来修改其输出。 strace -ewrite -p $pid
使用linux watch 命令。
或者像https://etbe.coker.com.au/2008/02/27/redirecting-output-from-a-running-process/这样 用gdb来实现
gdb -p pid execfile
p close(1)
p creat("/tmp/newlog",0600) or dup2
ls -l /proc/pid/fd
ls
同样如何连接http://unix.stackexchange.com/questions/31824/how-to-attach-terminal-to-detached-process
mkifo /tmp/fifo
gdb -p PID
p close(0)
p open('tmp/fifo',0600)
echo balahs>fifo
当然也会些相关的小工具http://pasky.or.cz//dev/retty/, http://pasky.or.cz//dev/retty/,http://pasky.or.cz//dev/retty/
USBOverIP¶
现在这个是linux已经支持的protocal, USBoverIP. 你可以 apt-install usbip 但是在 14.04是 linux-tools-genric-lts–utopic.
命令行工具在 /usr/lib/linux-lts-uptoic-tools-xxx.xx/
基本流程¶
server
./usbipd -D #check what device on local ./usbip list -l # bind the device to the server ./usbip bind -b 3-3 #or ./usbip bind -b 3-3:1.0
client
./usbip list -r <remotehostip> ./usbip attach
但在ubuntu14.04 跑不起来。
../usbipd -D -d
libuspip: error: udev_device_get_sysattr_value failed
https://github.com/torvalds/linux/tree/master/tools/usb/usbip https://github.com/solarkennedy/wiki.xkyle.com/wiki/USB-over-IP-On-Ubuntu https://github.com/forensix/libusbip
linux bootup¶
linux 的生与死¶
先由BIOS上电之后,由BIOS决定你从哪一个分区起,然后BIOS把对应分区的上bootloader 加载。然后bootloader把kernel的代码,以及所需要东东,都加载到内存里放一个地方。然后再kernel开始初始内存,建立内存表,以及中断表等等之后,然后才是种driver的加载。然后各个东东才开始各自的执行。builtin与module进去,采用都是相同的结构。module的内存结构。 内存结构可以用http://code.metager.de/source/xref/linux/utils/kmod/libkmod/libkmod-module.c#63 这里看到,采用的struct然后里边就是指针了。形成一个列表。insmod,rmmod插入,列表,查询列表的过程。
linux 启动模式是由 linux的运行模式:Runlevel详细解析 决定的,它是由 /etc/inittab 来控制的,telinit 是用来发送信号进行init. shutdown reboot都是跟 runlevel相关,默认的level,都在rc.XX.d下软链接,并且也是00-99的数字,并且SK表示特殊的意义来开始。原来的GTL的方式是在学习RC 机制。
对于系统的控制,很大部分那就是各种service的起动的控制,系统基本起来了,就是各种服务进程,这个主要就在init.d这个阶段进行,如何开机自己等都是在此做的,同时自己需要一些定制的也主要集中此的。
对于ubuntu简单直接,/ect/rc.local就可以了。并且可以查看rc.d 这个目录下东东。 这个每个系统也是不一样的。同时有些系统已经支持并行启动了,例如SUSE中已经支持了。具休可查看/ect/rc.d/README,并且在/etc/rc.d/boot中控制。 一旦并行就会有步同步依赖的问题,也这也是各种before,after 机制的原因,这些就是用来控制顺序的吧。
实践上 init 现在已经支持并行了,并且之间也是有依赖关系与event的话,起动依赖配置放在 /etc/init/XX.conf中, 所以当然也可以对此的应用如此的定制。
gentoo用OPENRC来实现一套并行机制,
# show dependency
rc-udpate show
# add
rc-update add root boot
# get all service list
rc-service -l
如何把添加卡到默认启动¶
cd /etc/init.d/
cp net.eth0 net.<newid>
rc-update delete net.eth0 default
rc-update add net.<newid> default
gentoo os 有时候发现开机启动后根目录是只读,可能的原因就是 /etc/init.d/root
没有加到启动项中。
https://wiki.gentoo.org/wiki/OpenRC
centos则采用的队列来实现机制。http://man7.org/linux/man-pages/man7/dracut.modules.7.html 主要的功能那就是rc本身也支持语法输法,这样就可以很方便的进行定制。 init 是一个event-based daemon,1号进程. 给出更宽泛的地义,那是context, exec 等等。 只管输入输出,与环境变量。 http://linuxmafia.com/faq/Admin/init.html, sbin/init 是第一进程。 rc-.>(run control). http://leaf.sourceforge.net/doc/bootproc.html,linuxrc->init->RC.
各家系统的对比。 https://wiki.gentoo.org/wiki/Comparison_of_init_systems
以及现在XIP, execute in place技术,直接起动,而不需要加载,例如使用ROM等等。这样可以大大加快启动的速度。这种一般是直接从 flash来读kernel,主要是一些嵌入式的设备。 直接启动。而不需要向PC这样的复杂。而这一块做的最好当属于现在的手机系统。 How to config XIP
对于SUSE 是有一些麻烦,要用到http://unix.stackexchange.com/questions/43230/how-to-run-my-script-after-suse-finished-booting-up, 写标准init 脚本并注册了。当然也简单的做法例如直接/etc/rc.d/after.local 等来进行hook, http://www.linuxidc.com/Linux/2012-09/71020.htm. 对于windows 来说,也就是注册表了开机启动了。 不同的系统对于这部分都有不同的优化。
ubuntu 中bootup https://help.ubuntu.com/community/UbuntuBootupHowto, 并且这里有一个service 的模板可以用。
内核的启动与一般函数调用¶
是一样的,或者一个复杂的命令行而己,就像gcc一样,哪些自身的参数,哪些是传给你init,哪些是传给module中。 都可以在这里查到的。 http://man7.org/linux/man-pages/man7/bootparam.7.html https://www.kernel.org/doc/Documentation/kernel-parameters.txt
启动三步grub
grub> set root=(hd0,1)
grub> linux /boot/vmlinuz-4.4.xxx-generic xxxxoptions
grub> initrd /boot/initrd.img-xxxxx-generic
grub> boot
例如要不要使用 initrd,可以直接使用 noinitrd,就可以了。具体其他的起动参数都是可以从上面的文档中查到。如果使用initrd,内核启动就会为两个阶段 #. 内核启动前, grub会把initrd 先加载到内存中 #. 内核启动后,先利用 initird中一些文件,来完成加载驱动模块, #. 执行 /sbin/init
为什么会用initrd,因为所有的驱动加载内核是不现实的,内核中只包含基本驱动,initrd则根据硬件来定制。 另外利用USB启动时,使用initrd文件是可以加速的。 具体原因见 https//www.ibm.com/developerworks/cn/linux/l-k26initrd/
对于启动的时候,initramfs 都是initrd的压缩版,只是把当前文件系统的一些东东直接cpio,gzip打包成.img而己。并且也都有现成工具可以来做。 http://www.stlinux.com/howto/initramfs http://www.ibm.com/developerworks/cn/linux/l-k26initrd/index.html https://wiki.ubuntu.com/Initramfs http://lugatgt.org/content/booting.inittools/downloads/presentation.pdf
解压 initrd¶
cp /boot/initrd.img-`uname-r` .
file XXX.img
mv XXX.gz
gunzip XXXX.gz
file XXXX
cpio -idmv < XXXX
对于initramfs 的制作,每一个平台都有专门的工具来做。 例如, redhat 有 dracut 什么需要呢,例如些module没有编译在内核里,但是启动又需要的。这些就需要的。这样可以启动内核做的很少,然后灵活的定制。 这里就有一个问题,操作系统是什么加载driver的。 并且由bootloader 利用 initrd 建立一个 / root system. 并在这里起动 kernel. http://www.mjmwired.net/kernel/Documentation/initrd.txt read the init code of linux kernel. to understand the shell and interpreter programming. Linux系统下init进程的前世今生 init/main.c sourcecode
当你更改了系统的启动配置,就需要更新一个initramfs,这样才能保证起动不不加载。经常遇到现象,那就 /etc/modprubes.d/nvidia-installer-disable-nouveau.conf中 blacklist nouevu 但是起动时还是加载了。
一个终极办法,那直接发在 /lib/modules/xxxxkernel_version/kernel/drivers/gpu/drm/nouveau/nouveau.ko
的改名。
然后 update-inittramfs -u 更新一下。 而 /etc/initramfs-tools
是其配置文件。
Linux系统启动过程分析详解 module 加载在 /etc/init.d/kmod 里实现的加载哪一个driver,并且加载的顺序。而这些应该在init之前。
http://leaf.sourceforge.net/doc/bootproc.html 这里说细的linux启动流程。
并且启动过程是可以打断的加入参数 break=init就可以了,或者在起动的时候按快捷键,例如按 I for gentoo os. BootProcess
init 开始并行化,event_base化。 https://en.wikipedia.org/wiki/Init,有各种各样的 init.
mdev是用来创建 /dev的目录, 使用方法 https://git.busybox.net/busybox/tree/docs/mdev.txt?h=1_18_stable
所以当你发现硬件没有发现的时候,直接使用 mdev -s, 就可以了。
或者
mount -t sysfs sysfs /sys
sysctl -w kernel.hotplug=/sbin/mdev
mdev -s
在GUI login运行的用startup Applications Preferences. 用命令行, gnome-session-properties来管理,同时也可以~/.config/autostart下面能看到。 http://askubuntu.com/questions/303694/where-is-startup-applications-user-config-file-for-disabled-and-enabled-applic
并且启动的log都放在dmesg中,如果log不全,可以把dmesg改大。 dmesg是内核缓冲区的内容,printk就是打印到这里。 所以遇到起动问题,直接看/var/log/dmesg 中。直接通用搜索关键字来得到。 内存的log的级别是可调,哪些级别打印console上也都是受此控制的。在起动的时候,
所谓的sesssion 也就是context另一个叫法,同时session <==>context<==>environment. 三种基本上是等价的一个概念只在不同level上。 另一个编程语言的也有类似的概念。
with open(xxx) as f:
f.read()
#do something
f.write()
无盘启动¶
到现在为止,我们已经用过U盘启动,光盘启动,到现在的无盘启动。
- U盘启动我们用的是syslinux实现的
- 光盘启动,我们的是isolinux来实现的
- 无盘启动,我们需要PXElinux来做了。
实现步骤
- 设置网卡支持网盘启动
- DHCP server上指定 tftp server 的地址,以及需要开机启动文件与配置
- 然后PXE client 下载并执行
启动的核心,从哪里下载启动镜象,并且启动。并且在一个现有的网络中,DHCP server是由IP控制的,并不能随意的改变,一个更加灵活的方案,那就是替换网卡的PXE固件,然后可以任意指定地址来进行 现在网卡中默认的都是 http://ipxe.org/ 客户端
#Press Ctrl-B at this point, and you should reach the iPXE command line:
iPXE>
#You can list the network devices that iPXE has detected using the ifstat command:
iPXE> ifstat
net0: 52:54:00:12:34:56 using rtl8139 on PCI00:03.0 (closed)
[Link:up, TX:0 TXE:0 RX:0 RXE:0]
#and acquire an IP address using the dhcp command:
iPXE> dhcp
DHCP (net0 52:54:00:12:34:56).... ok
#You can examine the IP configuration and other DHCP options:
iPXE> route
net0: 10.0.0.155/255.255.255.0 gw 10.0.0.1
iPXE> show dns
net0.dhcp/dns:ipv4 = 10.0.0.6
#You can boot something over the network. Unlike a traditional PXE ROM, iPXE is able to boot over a wide area network such as the Internet. If the machine you are testing is connected to the Internet, you can boot the iPXE demonstration script:
iPXE> chain http://boot.ipxe.org/demo/boot.php
boot.php 的内容
#!ipxe
kernel vmlinuz-3.16.0-rc4 bootfile=http://boot.ipxe.org/demo/boot.php fastboot initrd=initrd.img
initrd initrd.img
boot
how to config PXE server¶
http://blog.csdn.net/robertkun/article/details/16851109
copy the form ISO cd
cp /mnt/iso/isolinux/isolinux.cfg /tftpboot/pxelinux.cfg/default cp /mnt/iso/images/pxeboot/initrd.img /tftpboot/ cp /mnt/iso/images/pxeboot/vmlinuz /tftpboot/
boot from nfs¶
boot from http¶
http://ipxe.org/appnote/xenserver 可以参考这个试一试
Booting from PXE of Realtek of agent¶
http://www.ipcop.org/1.4.0/en/install/html/installing-from-pxe-boot.html
无盘启动方案¶
- 安装网卡,并注册网卡信息
- 自举安装safeos
- 检查自己是否需要安装safeos
- 自safeos中添加自己demo 在GTL service之前,然后自动提交service中。
- safeos 启动之后
- 是否刷机
- reserve 机器
- 刷机
- unreserve 机器
- 自动更新 E:windows OS自动配置
- 自动设置 Stage to 1
Input设备¶
核心问题,如何实现硬件输入与逻辑对象之间的映射。


Document/input/input-programming.txt 键盘模式: 键盘模式有4种, 在Linux 下可以用vc_kbd_mode(老版本中是kbd_mode)参数来设置和显示模式:
1) Scancode mode (raw )raw模式:将键盘端口上读出的扫描码放入缓冲区 2) Keycode mode (mediumraw) mediumraw模式:将扫描码过滤为键盘码放入缓冲区 3) ASCII mode (XLATE ) XLATE模式:识别各种键盘码的组合,转换为TTY终端代码放入缓冲区 4) UTF-8 MODE (UNICODE) Unicode 模式:UNICODE模式基本上与XLATE相同,只不过可以通过数字小键盘间接输入UNICODE代码。 在keyboard.c中,不涉及底层操作,也不涉及到任何体系结构,他主要负责:键盘初始化、键盘tasklet的挂入、按键盘后的处理、keymap的装入、scancode的转化、与TTY设备的通信
信号流程
- 硬件中断-> input subsystem->
udev的关系
- /lib/udev/hwdb.d/60-keyboard.hwdb,键盘的mapping也都在这个文件里。
linux 各个位置文件的位置
触摸屏的检测, 可以driver检测然后上报 input-subsystem. 只是前端不同。对于后端可以保持不变。 * 触摸屏的虚拟键,只要driver能识别上报就行。
如何troubleshoot * evtest :* apt install evtest* * xev
udevadm hwdb --update udevadm trigger /dev/input/eventXX
从这个 bug 1597415 分析开始。
硬件与driver 的关联是在
- /proc/bus/input/devices 这里对应的, handlers + devices.
- In /lib/udev/hwdb.d/60-keyboard.hwdb
最终真实硬件,都会变成文件对象,其实大部分的硬件都是基于寄存器的,无非提供了硬件复用机制,就像CPU一样,同样的道理适用于其他硬件,首先每一个硬件抽象化,然后映射到真实硬件的部分。而每一个抽象硬件,都有其独立寄存器,就像所谓的context,正所谓的open,close其实本质就是实现一个小的context,并且实现环境切换以得到复用,这也是 with context manager的实现的原理。
ioctl 大部分硬件都是基于寄存器,而一段时间内得到具体控制可以用ioctl来对I/O 通道进行管理。
对于xterm 更是如此,同一套硬件,还要多欠mapping,输入的多次,输出的多次。
所谓的无非就是查看共同一块数据而己,同时具有读写功能。本质那就是对同一个文件进行同时打开两次,并且都具有读写功能。这个也就是os.openpty,的功能,先得到pty,然后再打开一次,相当于一个主,一个slave. 可以用 os.open打开同一个文件即可。并且不用缓冲区即可。
thinking¶
sendEvent linux内核是支持事件,与输入设备的操作,你可以加入伪信号来实现,例如发送一个事件,就像windows下面的那sendMessage一样。直接像设备发送十六进制数据来模拟各种操作。就相当于直接写寄存器了。
– Main.GangweiLi - 27 Oct 2012
/dev/full /dev/zero /dev/null /dev/random /dev 下面有各种各样的特殊设备,例如些都可以模枋一些低层需求。
– Main.GangweiLi - 03 Apr 2013
wall sends a message to everybody logged in with their mesg permission.
linux实现了对物理设备与逻辑设备的映射关系。当然了映射关系,再加上context机制的分时,就可以分时复用了。同时我们还可以做一些伪设备来发送数据。来达到虚拟化的效果,并且这个mapping规范化就是虚拟机了。 原来进程模型,stdin指就是键盘,而stdout就是文本显示器。同时出错也是显示器。 进程再输入与输出以出错信息。在linux都是以文件方式来进行。
最原来的字符终端设备已经没有了,所以理解起来比较困难。本身就是一个显示与输出,有类似于键盘+屏幕一样的。 但是伪终端,从设备这一端与进程相联系的,而主役备是由窗口管理系统控制,与真正的终端的mapping是内核与窗口管理系统控制。 就是缓冲区,采用类似于进程一样的结构,来达到复用的效果。
linux 分三大块,CPU,内存,I/O. 最复杂的也就是IO设备,也就需要各种各样的驱动了。 对于终端的各种key的翻译可以用 stty 来进行设备,例如backspace是删除等等都保存在termio中。
pty 是采用的动态分配的机制,每一次需要的时候去 打开 ptmx 会自动得到主设备,然后去打开一个从设备,然后主从之间就可以通信了。就像pipe 是一样的。
操作模型¶
- open /dev/ptmx 得到 master fd_master
- grantpt(fd_master)
- unlockpt(fdm)
- slavename = ptsname(fd_master)
- fd_slave=open(slavename)
http://wenku.baidu.com/view/53d0daf8aef8941ea76e05d2.html
其实也简单,只要共享同一个文件就行了,并且实时更新,相当于共享了session. 也就是我们要共享shession. 例如ssh 共享session. 在python 中有直接pty模块,也可以spawn pty.
log system¶
如想快速的了解一个系统,并且得到真实的运行时数据,并想避免代码的细节,那么查看log是经常重要事情。
严格意义上 linux中 /proc ,/system 等等都算是log系统吧。
如何在命令行直接使用logger呢,logger 直接使用。 用法 http://blog.longwin.com.tw/2011/11/linux-data-syslog-logger-2011/。
loginctl 可以在命令行对其进行配置
logsave 有点类似于 tee 的功能, 经常时时查看log的功能时,我经常使用 tail -f .
logresolve 把apache log中IP地址换成hostname. 这个用一个替换就很容易的实现了。
而logcat 也是采用这样的机制。
另一个重要的机制logrotate 自动保存最近几次的机制。
logrotate 并且再 /etc/logrotate.conf
这里配制每一份log的大小,多少次,并且压缩格式等等。 每一个 app 都可以添加一个自己的log conf 放在 /etc/logrotate.d/
下面。
系统log记录了,所有用户登陆的信息,wtmp,utmp,等等,同时也记录login 失 linux 的loglevel也是可以调的,起动的时候调整添加参数 loglevel=level,或者直接用 dmesg -n level,或者用 echo $level>/proc/sys/kernel/printk 或者用syslog系统调用来实现。 http://smilejay.com/2011/12/linux_loglevel/
SETLINUX¶
最初权限管理的度太大,owner,group,public等。 为了实现更细粒度的保证。selinux采用了标签加权限的机制。
采用 client/Server, policy code 与 descision-make, 计算放在服务器端,当然本地会有一个cache,以及 context SSID为索引。
API接口,execve_secure,open_secure,stat_secure.
proc/self/attr/exec
, /proc/self/attr/fscreate
.
实现原理https://www.nsa.gov/research/_files/selinux/papers/module/t1.shtml
权限分两部分,文件本身的权限。 用户的权限。 两者相匹配才能工作。
权限分配的最小粒度是每条命令,还是基于进程的。
/proc/pid/attr 就是linux selinux组成部分。 SELINUX的基本用法
可以用 ls -Z 来查看selinux context,同是可以用chcon来改变权限。 https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Security-Enhanced_Linux/sect-Security-Enhanced_Linux-Working_with_SELinux-SELinux_Contexts_Labeling_Files.html 以及windows的组策略也是同样的机制。
linux 一切权限都是UID为基础的。
https://en.wikipedia.org/wiki/Linux_Security_Modules
现在的linux权限管理LSM管理即有task,文件本身,以及user自身的。要所以要想突破这种限制就必须其原子操作内部实现。 LSM 是集成在内核里。
task_struct, Task(Proces)
linux_binprm Program
supper_block Filesystem
inode Pipe,File, or Socket
file Open File
sk_buff Network Buffer(Packet)
net_device NetworkDevice
kem_ipc_Perm Semaphore,Shared Memory Segment or Message Queue
msg_msg Individual Message
AppArmor¶
基于文件路径的,防护,简单容易维护。与selinux的对比见https://www.suse.com/support/security/apparmor/features/selinux_comparison.html
PAM¶
主要是对用户的验证。 采用分离的模块,把验证与正常的程序使用分离开来。更利于扩展开发,而不是每一个应用程序里包含自己的验证。 https://www.ibm.com/developerworks/cn/linux/l-pam/ https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Managing_Smart_Cards/PAM_Configuration_Files.html 其实这三种都是验证与应用要本身是分离的。使用说明见 http://www.linux-pam.org/, 在 linux能看到那就是 /etc/pam.conf 有点类似于把权限管理给外包出去,这样有助于集中管理。同时也不需要应用程序开发者来考虑安全问题。
tty console¶
现在终于明白了tty的设计原理了。简单的理解,就是一个socket通信。并且把两端通用化。例如一些编辑的功能,例如具备一些editor的初步功能。 一个最简单功能,那就是直接for循环,就可以搞定。拿浏览器来做对比,就会一目了然,那就是终端也需要一定的rendering功能。 而这些不是应用程序本身需要 考虑的功能。
未来的terminal 趋向于全终端editor+ browser + session management 的功能。例如QTconsole能够支持图表与公式的功能。
例如tmux 来实现多session的管理。以及asciinema 的录制。 以及各个session之间的共享,其实就是socket的组播功能。
pts的原理,http://www.baike.com/ipadwiki/PTS
ssh,telnet这些与在本地的xterm都同相同地方,那就是其输入输出连接一个终端。并且都是双工通信或者三工通信,in,out,error. 而对于终端来说,那就是一个master,slave,一个读一个写。要正好与进程之间反过来才行。 而这些都是要终端打交道。
/dev/console 总是指向系统的TTY,它决定了系统的信息往哪里输出,/dev/tty0总是指向当前的tty, tty[1-x] 则是独立逻辑tty设备。
terminal 中显示符号¶
这个关键是编码与字体的支持,只要有两者的支持就能显示,例如 在terminal中显示数学符号
远程网络shell之间¶
ssh 的过程。 远程网络终端和本机shell之间建立了一条双向通道–“远程网络终端-(套接字)–本机协议处理进程–主终端–从终端–shell”
serial IO 的原理¶
CPU -> driver ->bus ->I/O pin http://www.tldp.org/HOWTO/Serial-HOWTO-4.html
虚拟化¶
虚拟化本质就是松耦合,接口化。 加一个中间层。最简单的虚拟化就是 输入输出的重定向。 因为正常的情况下程序没有打开多余的输入输出的。只有0,1,2.程序只认0,1,2.不管他们绑在谁身上。
再复杂一些虚拟化chroot,这样上升到context的切换。 但还不够。程序最初的设计是代码与数据分离的。 但是代码与执行本身强耦合的。这也是为什么大部分情况下,一般人讲进程与代码的关系的讲不清的原因。
更进一步的虚拟就是代码,数据,执行三者都是分离的。因为当初的设计,代码的执行context要求比较大那就是 OS级的context. 也就是你看到虚拟机。有两种一种是 JVM这种。另一种那就是 virtual box以及更一层的Xen 这种。
从实现上只是执行与代码的分离,而在linux 中还出现多细分的。 LXC: Linux 容器工具 这个实现正是基于chroot 实现的进程级别的虚拟化。 http://blog.csdn.net/cbmsft/article/details/7214371
Docker 是一种更轻质化的容器,就为了实现大一统,达到资源与效率的平衡. Docker 可以做什么 http://blog.2baxb.me/archives/1136
Docker¶
最快的安装方式,curl -sSL https://get.docker.com/ |sh - 并且Docker现在发展的很成熟,可以实现各种level的虚拟化。
一个进程的,直接使用 docker run 或者多进程service级别的docker-composer. 以及多host的docker-machine(自动安装docker),以及集群水平的swarms,`Kubernetes <https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/>`_ (google开发的自动部署的docker工具),能够实现load labance. 同时能够提供虚拟的网络的,overlay.
同时也提供自动配置,Dockerfile ,Compose.yaml 等等。
对于数据存储资源可以 volume绑定.
对于docker image的存储可以有自建registery. 同时还有各家的docker cloud可以用。
- 常用命令的查询 Docker
- 中文版不错的书 Docker 从入门到实践
- Docker 的存储实现原理 https://segmentfault.com/a/1190000007168476,不同文件系统支持的水平与性能也都不一样。
dokcer 对于集群的支持 有Docker service,以及swarm等模式的支持。 http://liubin.org/blog/2016/06/17/whats-new-in-docker-1-dot-12-dot-0/
how to upload to hub.docker.com¶
docker images
docker tag bb38976d03cf yourhubusername/verse_gapminder:firsttry
docker push yourhubusername/verse_gapminder:firsttry
how to automate-build from with Github¶
共享GUI与host¶
主要是采用的方式,那就是共享socket 的模式。
permission¶
docker: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Post http://%2Fvar%2Frun%2Fdocker.sock/v1.26/containers/create: dial unix /var/run/docker.sock: connect: permission denied.
See 'docker run --help'.
sudo usermod -a -G docker $USER
logout/login
network and service¶
docker –run –it –net=bridge 在Docker的container里起一个sshi serivice
apt update && apt install openssh-server
/usr/sbin/sshd
#. config the sshd alow the root
docker run -p 8022:22
Grid¶
- vGPU profile 决定你的vGPU type. 每一块物理卡可以虚拟出多块vGPU,但是必须是同一类型 分配策略,深度优先,把一个块物理卡用完再用第二块卡,第二种广度优先,尽可能用新卡。
- http://www.nvidia.com/object/nvidia-grid-buy.html
- NVIDIA GRID vGPU explained
- Windows server 2016 版本对比 https://docs.microsoft.com/zh-cn/windows-server/get-started/2016-edition-comparison
- type 2 与type 1 的区别 https://blogs.technet.microsoft.com/jhoward/2013/10/24/hyper-v-generation-2-virtual-machines-part-1/
#. NVIDIA GRID 对Hyper-V 的支持 https://virtuallyvisual.wordpress.com/2017/01/18/nvidia-grid-and-microsoft-windows-server-oss-and-hyper-v/
steps
wayland¶
相当于是简化了,XWindowServer的流程,尽可能让App直接与kernel通信,自己来管理显示。 https://wayland.freedesktop.org/architecture.html https://zh.wikipedia.org/wiki/Wayland
主要是为解决效率问题。
Introduction¶
在linux中接处最多就是终端,所以熟悉各种的使用技巧与用法,可以大大的提高效率。同时也可以打开多终端实现多用户的并行操作。或者使用expect来实现多用户交互。或者直接使用socket 来进行模似。
windows manager¶
fvwm a good introduction | amiwm | icewm | windowmaker | afterstep | sawfish | kwm |
FVWM 它的采用与Xwindows 通过语法格式。设置一些全局变量,对于是ImagePath,Button,Menu等控制。以及键盘消息的映射。窗口布局的管理。对它的使用也像VIM的配置文件一样。先找来一个模板,然后根据自己的需求来改。 FVWM另外强大的一点那就是可以SHELL 进行交互。也就是配置文件是可以动态的生成的。这样就极大提搞了其灵活性。
Toolkit¶
motif | XForms | FLTK | Gtk | Qt | LessTif |
Desktop Environments¶
CDE Common Desktop Environment | KDE | GNOME | GUNStep | ROX | GTK+XFce | UDE | Xview/OpenLook |
FIle manager¶
gmc | Nautilus |
#StandIOTerminal terminal ========
首先要搞明白的这个定义,终端就是可以主机进行输入输出通信的设备。对于终端的分类与介绍在OS Design and Implementation有详细的介绍。基本上分三类:%BR%<img src=”%ATTACHURLPATH%/TerminalType.jpg” alt=”TerminalType.jpg” />
xterm | 功能强大,最初版本 | ||
dtterm | |||
rvxt | 支持更好的画面,同时支持perl脚本扩展 | ||
xterm tty pts pty 的区别 | 概念区分一 概念区分之一 |
所以对于终端的控制主要是两大类,一个是对其输入的控制,一个就是对其输出控制。 在linux中使用`termInfo <http://billtym.blog.51cto.com/1745172/418510>`_ 来配置终端。其实所有的操作最终都是通过它来起作用。其实是UNIX哲学中,所有算法都是围绕数据结构转的。 #. 对输入的控制 对于输入模式主要有常见两种那就是RAW模式与cooked 模式。另外一个那就是echo 与否。例外就是一些特殊字符的输入,以及编辑习惯都是都可以设置的,一个重要的话题,对其进行配置,这个可以通过profile 与.shellrc这些文件来进行配置。%BR%
setty | 来进行对于输入进行各种设置 | setty -echo | set -o | settty |
- 对于输出的控制 %BR%
颜色与光标的移动 | tput入门使用 IBM tput user manual | 想要对屏幕显示进行个性化设置,可以利用这个命令,例如在屏幕上实现语法高亮等等。 | ||
^ | 通过转义字符来实现 ESC [ | 使用echo -e “ESC [ XX ” 来使用 | 使用ncurses来操作或者开发 |
- 对于TTY的管理控制 TTY也也是C/S模式,分主端,与从端。一般情况下,主端都是系统建好的。%BR%
如何查看TTY端口的服务状态 , pmadm,ttyadm,contty ,
如何连接,与配置, linux 设备驱动,TTY驱动 , getty
连接tty, 清除被占用的tty端口的方法,rmdev ,stty-cxms fuser, pdisalble,strreset ,` mkdev <http://study.chyangwa.com/IT/AIX/aixcmds3/mkdev.htm>`_ ,
Introduction¶
http://en.wikipedia.org/wiki/Xvfb virtual is reality. it come to true. due the hardware, we could have logic device for it.