专题篇

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.htmlsbin/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盘启动,光盘启动,到现在的无盘启动。

  1. U盘启动我们用的是syslinux实现的
  2. 光盘启动,我们的是isolinux来实现的
  3. 无盘启动,我们需要PXElinux来做了。

实现步骤

  1. 设置网卡支持网盘启动
  2. DHCP server上指定 tftp server 的地址,以及需要开机启动文件与配置
  3. 然后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

  1. 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 http

http://ipxe.org/appnote/xenserver 可以参考这个试一试

动态的启动脚本

这样还可以从自动的生成配置文件

http://192.168.0.1/boot.php?mac=${net0/mac}&asset=${asset:uristring}

无盘启动方案

  1. 安装网卡,并注册网卡信息
  2. 自举安装safeos
    1. 检查自己是否需要安装safeos
    2. 自safeos中添加自己demo 在GTL service之前,然后自动提交service中。
  3. safeos 启动之后
    1. 是否刷机
    2. reserve 机器
    3. 刷机
    4. unreserve 机器
    5. 自动更新 E:windows OS自动配置
    6. 自动设置 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一些事件了。可以进行屏幕录制了。考虑把这个做出来。 整个显示分为几层

  1. 物理屏幕 一块或者多块
  2. 逻辑屏幕
  3. 窗口
  4. 控件,widget
  5. 画布
  6. 图层
  7. 前景与后景
  8. 作图
  9. 各种种图形组
  10. 各个图元

消息传递本质就是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 安装窗口管理器

Qt

QT 类图 Glade GUI设计工具。

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.

http://www.fvwm.org/screenshots/desktops/Tavis_Ormandy-desk-1152x864/screenshot.jpg try this one  
http://www.fvwm.org/screenshots/desktops/An_Thi_Nguyen_Le-desk2-1152x864/screenshot.gif    
http://www.fvwm.org/screenshots/desktops/An_Thi_Nguyen_Le-desk3-1152x864/screenshot.gif    
http://www.fvwm.org/screenshots/desktops/Remko_Troncon-desk-1024x768/screenshot.gif    
http://www.fvwm.org/screenshots/desktops/Paul_Johnson-desk-1280x1024/screenshot.jpg    
http://www.fvwm.org/screenshots/desktops/Nuno_Alexandre-1600x1200/screenshot.jpg    
http://www.fvwm.org/screenshots/desktops/Michael-desk-1152x900/screenshot.gif    
http://www.fvwm.org/screenshots/desktops/Lee_Willis-desk-1024x768/screenshot.gif    

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

  1. 试一试这种远程的显示。把amyl的p4 显示到我的机器上来。
  2. Xauth 简单的使用文档,xhost权限颗粒太大,Xauth小一些。
  3. where-does-xhost-store-the-allowed-network-addresses 最终还是记录的网络地址,所以当client的IP换了之后,就要删除以前重新加一次,从新获得新的IP。
  4. X windows for android 现在android就可以很方便远程控制我的电脑了。 一个最简单的方法那就是利用ssh forwarding, 在linux下
ssh -X 加主机名了

当然,ssh本身也是可共享的,主要你把设置共享的(-M),ssh本身还有很多好玩的参数可以去看一下其manul. 并且它可以后台运行。

  1. 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

  1. UbuntuHelp:FVWM
  2. gentoo FVWM 现在看到gentoo正是自己想要的东东
  3. fluxbox 提供了各种灵活的布局
  4. xmonad 用haskell 编写的窗口管理器,可以不用鼠标
  5. FLTK
  6. SynergyHowto configuration on ubuntu
  7. fvwm tutorial
  8. understand X Windows
  9. FVWM simple tutorial
  10. fvwm style manual page
  11. Xmonad (简体中文)
  12. fvwm buttons introduction
  13. 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.
  14. ffmeg 屏幕录制
  15. 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 中。

x window配置

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/

基本流程

  1. 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
    
  2. 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.htmlsbin/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盘启动,光盘启动,到现在的无盘启动。

  1. U盘启动我们用的是syslinux实现的
  2. 光盘启动,我们的是isolinux来实现的
  3. 无盘启动,我们需要PXElinux来做了。

实现步骤

  1. 设置网卡支持网盘启动
  2. DHCP server上指定 tftp server 的地址,以及需要开机启动文件与配置
  3. 然后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

  1. 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 http

http://ipxe.org/appnote/xenserver 可以参考这个试一试

动态的启动脚本

这样还可以从自动的生成配置文件

http://192.168.0.1/boot.php?mac=${net0/mac}&asset=${asset:uristring}

无盘启动方案

  1. 安装网卡,并注册网卡信息
  2. 自举安装safeos
    1. 检查自己是否需要安装safeos
    2. 自safeos中添加自己demo 在GTL service之前,然后自动提交service中。
  3. safeos 启动之后
    1. 是否刷机
    2. reserve 机器
    3. 刷机
    4. unreserve 机器
    5. 自动更新 E:windows OS自动配置
    6. 自动设置 Stage to 1

Input设备

核心问题,如何实现硬件输入与逻辑对象之间的映射。

http://www.emyard.com/wp-content/uploads/2018/05/clip_image002.jpg http://www.emyard.com/wp-content/uploads/2018/05/clip_image003.jpg

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设备的通信

  1. 信号流程

    • 硬件中断-> input subsystem->
  2. udev的关系

    • /lib/udev/hwdb.d/60-keyboard.hwdb,键盘的mapping也都在这个文件里。
  3. linux 各个位置文件的位置

  4. 触摸屏的检测, 可以driver检测然后上报 input-subsystem. 只是前端不同。对于后端可以保持不变。 * 触摸屏的虚拟键,只要driver能识别上报就行。

  5. 如何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 是一样的。

操作模型

  1. open /dev/ptmx 得到 master fd_master
  2. grantpt(fd_master)
  3. unlockpt(fdm)
  4. slavename = ptsname(fd_master)
  5. 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

权限分两部分,文件本身的权限。 用户的权限。 两者相匹配才能工作。

权限分配的最小粒度是每条命令,还是基于进程的。

Linux的SElinux用法

/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

https://wiki.ubuntu.com/AppArmor 使用说明。

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可以用。

  1. 常用命令的查询 Docker
  2. 中文版不错的书 Docker 从入门到实践
  3. 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

  1. vGPU profile 决定你的vGPU type. 每一块物理卡可以虚拟出多块vGPU,但是必须是同一类型 分配策略,深度优先,把一个块物理卡用完再用第二块卡,第二种广度优先,尽可能用新卡。
  2. http://www.nvidia.com/object/nvidia-grid-buy.html
  3. NVIDIA GRID vGPU explained
  4. Windows server 2016 版本对比 https://docs.microsoft.com/zh-cn/windows-server/get-started/2016-edition-comparison
  5. 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/

  1. Latest GRID 5.0 https://thevirtualhorizon.com/2017/08/17/grid-5-0-pascal-support-and-more/

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  
  1. 对于输出的控制 %BR%
颜色与光标的移动 tput入门使用 IBM tput user manual 想要对屏幕显示进行个性化设置,可以利用这个命令,例如在屏幕上实现语法高亮等等。    
^ 通过转义字符来实现 ESC [ 使用echo -e “ESC [ XX ” 来使用 使用ncurses来操作或者开发  
  1. 对于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.

Thinking