• PC端安装Linux相关记录

    2016-02-23 11:47:13
    一、计算机的硬盘接口 1 ....  IDE接口的装置(硬盘或光盘设备)比较老,可以连接到IDE接口的装置都可称为IDE装置,不管是硬盘设备还是光盘设备。  一般计算机都会提供两根IDE扁平电缆,每根电缆可以连接2个IDE装置...

    一、计算机的硬盘接口

    1 . IDE接口

          IDE接口的装置(硬盘或光盘设备)比较老,可以连接到IDE接口的装置都可称为IDE装置,不管是硬盘设备还是光盘设备。

          一般计算机都会提供两根IDE扁平电缆,每根电缆可以连接2个IDE装置,所以一台计算机最多可以连接四个IDE装置,如果已经有一个光盘设备,那么计算机就只能连接3个IDE硬盘。

          计算机上的两根IDE扁平电缆对应的接口被称为IDE1(primary)及 IDE2(secondary),而每条扁平电缆上面连接的IDE装置分为 Master 与 Slave。可以连接的四个IDE装置在Linux下设备名为/dev/hd[a-d],假如在计算机上接了两个IDE硬盘,设备名是hda还是hdb就与接到了哪个相应口有关;

    2. SCSI/SATA/USB接口

          对于SCSI/SATA/USB接口的硬盘,Linux下设备名为/dev/sd[a-p],如果也接了两个硬盘和一个U盘,设备名是根据Linux操作系统侦测到硬盘的顺序决定。比如主板上有6个SATA插槽SATA[1-5],上述的两个硬盘分别接到了SATA1和SATA5,那么在Linux下这两个硬盘设备名分别为/dev/sda和/dev/sdb,U盘为/dev/sdc(U盘都是在系统启动后才会被捕捉到)。

    3. SSD接口

          比如使用的开发板使用的存储装置都是nand flash,在Linux下的设备名。

    二、IDE硬盘分区表

          以IDE硬盘为例,机械硬盘盘面以磁柱和扇区为单位,每个扇区512个字节,整颗硬盘第一个扇区分为446字节的主要启动记录区(MBR)和64字节的分区表,MBR是安装开机管理程序的地方(如果在一颗硬盘上安装多个系统,那么MBR的管理非常重要),分区表记录了硬盘分区状态。

          分区表只有64字节,所以只有4个记录区,每组记录区记录了该区段的启始与结束的磁柱号码,分区就是对64字节的分区表进行设定且只能设定4组分区信息。这四个分区的记录被称为主要(Primary)或扩展(Extended)分区,逻辑分区的分区信息又记录在扩展分区里,这些分区信息中的磁柱范围一定在扩展分区的所在的磁柱范围。

          逻辑分区在Linux系统下的设备文件名一定是从5号开始,即/dev/hda5开始,因为前面四个号码都是保留给Primary或Extended用的。总之,硬盘的分区总结如下:

    l  主要分割与延伸分割最多可以有四笔(硬盘的限制)

    l  延伸分割最多只能有一个(操作系统的限制)

    l  逻辑分割是由延伸分割持续切割出来的分割槽;

    l  能够被格式化后,作为数据存取的分割槽为主要分割与逻辑分割。延伸分割无法格式化;

    l  逻辑分割的数量依操作系统而不同,在 Linux 系统中, IDE 硬盘最多有 59个逻辑分割(5号到 63号),SATA硬盘则有11个逻辑分割(5号到15号)。

    l  P(primary)+E(extended)最多只能有四个,其中 E 最多只能有一个。

    l  如果要把一颗SATA硬盘分为6个区,应该好好体会下图的分法:


    三、操作系统启动流程

    1 . 启动流程

          首先介绍BIOS和CMOS的概念,CMOS 是记录各项硬件参数且嵌入在主板上面的储存器,BIOS 则是一个写入到主板上的一个固件(也可叫韧体,韧体就是写入到硬件上的一个软件程序)。

          计算机系统一上电,执行的第一个程序就是BIOS,BIOS 会依据使用者的设定去取得能够开机的硬盘,并且到该硬盘里面去读取第一个扇区的MBR位置。

          MBR 这个仅有 446bytes 的硬盘容量里面会放置最基本的开机管理程序,此时 BIOS 就功成圆满,而接下来就是 MBR 内的开机管理程序的工作了。开机管理程序的任务就是加载操作系统,并且也是安装操作系统时提供,所以他会认识硬盘内的文件系统格式,因此就能够读取操作系统核心,然后接下来就是核心档案的工作,开机管理程序也功成圆满,之后就是操作系统的任务。

         在嵌入式开发中的bootloader就是这里提到的MBR中的开机管理程序,它的任务如下:

    l  提供选单:用户可以选择不同的开机项目,这也是多重引导的重要功能。

    l  载入核心档案:直接指向可开机的程序区段来开始操作系统。

    转交其他loader:将开机管理功能转交给其他 loader 负责。

    2 . 多重引导

          在上面介绍开机管理程序功能的时候,提到开机管理程序可以把开机管理功能转交给其他loader负责,这就说明开机管理程序除了可以安装在 MBR 里之外,还可以安装在每

    个分区的启动扇区(boot sector),也正是因为每个分区都有自己的启动扇区才能够实现多重引导。

          比如一个硬盘有四个分区,第1、2分区分别安安装了Windows和Linux,计算机系统上电后,最先开始读取MBR里面的开机管理程序,而这个程序就会提供两个选项,第1个选项是直接加载Windows来开机,第2个选项是将开机管理工作交给第二个分割槽的启动扇区(boot sector)。如果选择第二个选项,那么整个开机管理工作就会交给第二分割槽的开机管理程序了。当第二个开机管理程序启动后,该开机管理程序内仅有一个开机选单,因此就能够使用Linux 的核心档案来开机。

    多重引导总结如下:

    l  每个分割槽都拥有自己的启动扇区(boot sector)

    l  实际可开机的核心档案是放置到各分割槽内的

    l  loader 只会认识自己的系统槽内的可开机核心档案,以及其他 loader

    l  Windows安装的时候,其开机管理程序只能安装在MBR里,这也是为什么装Windows和Linux系统时必须先装Windows的原因。

    四、Linux系统的安装

    1 . Linux系统安装时的磁盘分区

    (1)Linux系统的目录树

          Linux操作系统内的所有数据都是以文件的方式呈现,所以Linux系统最重要的地方就是目录树架构,而整个目录树最重要的就是根目录(用/表示,因为目录树架构以根目录为主,所有文件都是以根目录衍生而来)。

    (2)磁盘与目录树的关系

          Linux系统最重要的就是根目录,所以根目录一定需要挂载到某个分割槽,至于其他的目录则可依用户自己的需求来给予挂载到不同的分割槽。比如home目录,比如把根目录挂载到硬盘的A分区中,把home挂载到B分区中,如果把数据存放在home目录里,那么这些数据一定是存放在硬盘的B分区中,否则就是存放在A分区中。

          平常在嵌入式ARM开发中,插入U盘后,使用mdev机制自动把U盘挂载到了mnt目录下。所以在Linux系统端进入mnt目录就可以访问U盘的内容了。

          总之,在安装Linux系统时,至少要分/和swap交换分区。当然也可根据用途给/home或/usr分区。

    2 . 操作系统的文件系统

          不同的操作系统所使用的文件系统架构(filesystem)并不相同,有些甚至是不兼容的,如windows一般使用NTFS和FAT32格式,而Linux使用ext1-4格式,这两类格式完全不相同,在 Linux 底下还可以藉由编辑核心来支持 Windows 的 FAT 文件格式,但是 Windows 则完全无法读取 Linux 的文件格式(可以使用一些软件来读写)。

    3 . 在windows 7存在的情况下安装Linux

          在windows7存在的情况下安装Fedora时,系统一上电,首先运行BIOS,BIOS会去找识别到硬盘的第一个扇区里面的MBR里面的开机管理程序,开机管理程序成为主角,开始给用户提供启动选项(到底启动哪个系统),如果用户选择windows,那么开机管理程序就会直接加载windows到内存,如果用户选择其他操作系统,那么开机管理程序就会把控制权交给其他开机管理程序(boot loader),其他开机管理程序一般被安装在另外分区中的启动扇区,其他开机程序就会加载它认识的操作系统。

         由于硬盘现在,分区时只能采用P+P+P+E/P+P+E/P+E的方式,第一种不浪费硬盘,所以如果在windows下如果已经有两个主分区,在windows有的情况下安装Linux时分区时有可能出错,因为安装Linux时至少需要/和swap分区,他们都要为主分区,而前面已经占用了两个,而最多只能是三个主分区,这个时候只有在windows下删除多余的主分区或把/或swap挂在逻辑分区上。

         在有windows7的情况下用U盘安装时,注意live和DVD版的区别,主要是映像名要和isolinux文件夹里面的配置文件对上号。

         注意选择分区类型一定要选标准分区。

    4. 安装单Linux系统

         如果以前安装过Fedora,由于启动不了系统而重新使用U盘安装时一般需要删除原来的分区和文件系统后再使用U盘安装。分区时可以自动让它分区也可以自己分区,自己分区时一定至少要/和SWAP分区,由于出现无法引导fedora问题,即安装完后进入grub>界面无法引导fedora,所以我还分了个/home分区。

         当然不一定就是分了/home分区好了的,有可能是我这次安装完后没有急着把u盘取走,一直插着的原因(通过后面的实验,可能是提前拔U盘的原因)。

         注意:在Bios设置启动时,有USB-HDD启动(把U盘当做硬盘)、USB-ZIP等(还可以把U盘当作光盘启动,如果把U盘当光盘启动,那么u盘里面只需要有ISO文件即可,就不需要制作U盘启动盘了)

         一般情况下,在分区的时候需要/和swap分区,但是只要有/也行(但为测试)。

    5. fedora-20安装后一般会做的事情(全在根用户下进行)

    (1)终端软件的安装,如Guake比较好用

    (2)禁止防火墙

          如果你的电脑处于局域网内,那么防火墙是不需要的的,停止它!

    sudo systemctlstop firewalld.service

    sudo systemctldisable firewalld.service

          如果你的电脑处于局域网内,那么防火墙是不需要的的,停止它!

    sudo systemctlstop firewalld.service
    sudo systemctldisable firewalld.service
    # SELINUXTYPE= type of policy in use. Possible values are:
    # targeted - Only targeted network daemons are protected.
    # strict - Full SELinux protection.
    SELINUXTYPE=targeted

    4)安装fedora20的源

          fedora的软件源信息文件(*.repo)都是放在 /etc/yum.repos.d 目录下的。可以通过# ls -l/etc/yum.repos.d 查看,因为默认的软件源都是国外的,可能网速不是很快,我们可以自己添加国内软件源和本地软件源。

          添加国内软件源:(先安装wget命令)

    #cd /etc/yum.repos.d
    # wget http://mirrors.163.com/.help/fedora-163.repo
    # wget http://mirrors.163.com/.help/fedora-updates-163.repo
    # wget http://mirrors.sohu.com/help/fedora-sohu.repo
    # wget http://mirrors.sohu.com/help/fedora-updates-sohu.repo
    # wget http://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/fedora?codeblock=0
    # wget http://lug.ustc.edu.cn/wiki/_export/code/mirrors/help/fedora?codeblock=1
    # yum makecache //(更新缓存)

    #yum localinstall --nogpgcheckhttp://download1.rpmfusion.org/free/fedora/rpmfusion-free-release-20.noarch.rpm http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-20.noarch.rpm

    (5)升级系统

         yum -y update

         如果网络环境差,将耗费较多时间。

    (6)配置ssh服务

         详细查看csdn博客。

    (7)配置samba、nfs服务

          在配置之前先要检测安装否,一般都没有安装,保险的方法是分别执行如下命令进行安装(如samba服务关键要有samba-4.1.15-1.fc20.i686):

          Yum –y install samb*  和    Yum –y install  nfs*  安装

          在nfs配置的时候,不知到为什么挂载其他目录X86-Linux平台下的/mnt/nfs目录时,必须把X86-Linux平台的ip设置为静态Ip

    其他事情查看:http://blog.csdn.net/liubag/article/details/22990595

    安装好用的终端软件:http://os.51cto.com/art/201402/428965.htm

    (8)搭建QT开发环境
         1)为了开发基于开发板上的qt程序,需要为目标机和主机提供要开发的QT版本所需的库或可执行二进制示例(注意目标机如ARM开发板需要的库,主要用于运行QT程序时需要,而不需要其他文件,在制作时可删除。主机上要进行交叉编译,必须要库和其他工具)。可以到http://mirrors.ustc.edu.cn/qtproject/official_releases/下在qt源码,下面列出不同平台的版本:
    qt-everywhere-opensource-src-4.8.6.tar.gz        

    qt-everywhere-opensource-src-4.8.6.zip            

    qt-opensource-mac-4.8.6-1-debug-libs.dmg          

    qt-opensource-mac-4.8.6-1.dmg                     

    qt-opensource-windows-x86-mingw482-4.8.6-1.exe    

    qt-opensource-windows-x86-vs2008-4.8.6.exe        

    qt-opensource-windows-x86-vs2010-4.8.6.exe         
          如果是Linux平台,选用前两个中的一个都可以,然后可以参照Tiny4412用户手册中4.9.1总用到的build.sh和mktarget 脚本制作。注意在主机上安装时,是安装到/usr/local目录下,并设置了环境变量。注意用target-qte-4.8.5-to-hostpc-x86.tgz版为32位系统版本,target-qte-4.8.5-to-hostpc.tgz为64位系统版本。设置环境便要要设置到bin目录。
        2)在PC机上的Linux系统上安装QT Creator集成开发环境
    yum  -y  install  qt-creator*  (自动安装qt4  版本为3.2)
          使用QT  Creator创建项目时,项目保存目录权限一定要可读写。否则会出现无法创建目录的错误。这里的IDE与上述提到的主机所需库和工具不一样,这个IDE开发程序运行与桌面系统,而上述的是在交叉编译时用到。
    (9)安装交叉编译器

          以Tiny4412开发板为例,将光盘 Linux 目录中的 arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz 复制到fedora的某个目录,然后进入目录执行如下命令:tar xvzf arm-linux-gcc-4.5.1-v6-vfp-20101103.tgz –C /
    注意: C 后面有个空格,并且 C 是大写的,它是英文单词“ Change”的第一个字母,在此是改变目录的意思。执行该命令,将把 arm-linux-gcc 安装到/opt/FriendlyARM/toolschain/4.5.1 目录。
          把编译器路径加入系统环境变量,运行命令如下命令:
    # gedit  /samba/.bashrc
          编辑 /samba/.bashrc文件, 注意“ bashrc ”前面有一个“ . ”,修改最后一行为
    export PATH=$PATH:/opt/FriendlyARM/toolschain/4.5.1/bin, 注意路径一定要写对,否则将不会有效。保存退出。
          重新登录系统 (不必重启机器, 开始 ->logout 即可),使以上设置生效,在命令行输入 arm-linux-gcc –v,会出现如下信息,这说明交叉编译环境已经成功安装。

    五、Linux系统使用注意

    1. 不是特殊情况下,不要使用根用户登录,根用户权限很大,责任也很大。

    2. 有人说过,linux系统没安装过10遍以上,不算会安装Linux或用linux。其原因在于在使用linux的过程中,总会因为一些自己的不当操作,导致不能进入系统,需要重新安装。

    比如忘记root密码,删除或修改了/etc目录的一些文件导致系统不能启动(当然这些也可以在救援模式下解决)。

    3. 如果出现下图方式错误而不能进入用户登录系统:



           我遇到的情况是操作了根目录下的lib目录,第一次是设置了什么库的环境变量导致系统只停留在开机logo,而不能进入用户登录系统。

           第二次是因为覆盖了/lib目录下的libsqlite3.so.O和libsqlite3.so.O.8.6等文件造成如上图的输出,而不能进入用户登录系统。

           两次解决方案都是重新安装,因为没有时间解决这样的问题,还有工作上的其他事要做。

    4. 设置系统默认启动顺序

          在MBR中装的开机管理程序提供的开机选单中,通过配置选择启动顺序(只有fedora的情况下)

    # cat /boot/grub2/grub.cfg |grep Fedora

    结果:

    menuentry 'Fedora Linux, with Linux 3.1.2-1.fc16.i686.PAE' --class fedora  --class os { 

    menuentry 'Fedora Linux, with Linux 3.1.1-1.fc16.i686.PAE' --class fedora  --class os { 

    menuentry 'Fedora Linux, with Linux 3.1.0-7.fc16.i686.PAE' --class fedora  --class os { 

    # grub2-set-default "Fedora Linux, with Linux 3.1.2-1.fc16.i686.PAE" 

    # grub2-editenv list 

    # grub2-mkconfig -o /boot/grub2/grub.cfg

    5. Linux系统下的救援模式

         如果使用root用户修改了某些配置文件而启动不了系统或登录不了界面,需要修改在开机的时候按e,修改grup里面,在linux  /boot/vmlinuz-3.16….rhgbquiet后增加linux  single ,然后按F10启动(下次这里有恢复原样),在字符界面中把改动修改回来,在正常启动。这个相当于windows的安全模式。
































    展开全文
  • 今天突发奇想,想找一种在手机上运行Python的工具,于是发现了这个安卓端的linux终端--Termux,可以在手机上实现一个微型的linux终端。网上已经有不少教程了,我在这里做一下汇总: 1. 安装Python以及常用的package...

    今天突发奇想,想找一种在手机上运行Python的工具,于是发现了这个安卓端的linux终端--Termux,可以在手机上实现一个微型的linux终端。网上已经有不少教程了,我在这里做一下汇总:

    1. 安装Python以及常用的package(numpy, matplotlib, pandas...),以及在手机上运行jupyter notebook的方法:

    Termux超级终端折腾记

    2. 实现ssh,可以在电脑端控制:

    安卓利用termux开发python

    大家感兴趣的可以尝试一下,当然由于是手机运行,安装、运行什么的常常会比较慢。手机打代码我推荐下google的Gboard输入法,有个非常贴近PC键盘的模式。

    展开全文
  • 这篇文章的动机有两个,上周同事问我关于Linux终端的问题,我简要解答后发现有些概念确实自己也说不清楚,然而这些概念我曾经是弄清楚了的,但也只是曾经。  大概六七年前,我是懂这些东西的,当时做了一些记录: ...

    这篇文章的动机有两个,上周同事问我关于Linux终端的问题,我简要解答后发现有些概念确实自己也说不清楚,然而这些概念我曾经是弄清楚了的,但也只是曾经。

      大概六七年前,我是懂这些东西的,当时做了一些记录:
    linux终端闲谈:http://blog.csdn.net/dog250/article/details/5692603
    王然的烦恼–她很精通linux啦:http://blog.csdn.net/dog250/article/details/5692612
    再谈UNIX流机制和tty驱动:http://blog.csdn.net/dog250/article/details/5711036
    printf的归宿-数据打印到哪儿了:http://blog.csdn.net/dog250/article/details/23000909
    尘封的那个记忆有点久远,看了这些文章,我自己觉得有点不知所云,除了最后一篇之外都很垃圾了…怎么着?还是重新整理一下吧。如果一件事情自己都说不清楚,原因只有一个,那就是这个人自己都没有彻底理解它。

      重新写这篇文章吧!感谢这位同事,有了本文!


    每天使用Linux每天都要接触到Bash,使用Bash时似乎永远都让人摸不着头脑的概念就是终端,坐在这台运行着Linux的机器的显示器前面,这个显示器就是终端的输出,而插在机器上的USB键盘或者PS/2键盘就是终端的输入,看来这是一种最直白意义上关于终端的解释。

      但是有的时候,机器上并没有看到显示器或者键盘接口,但是却有一个串口,想操作这台机器想必只能通过这个串口来进行了,这个时候,串口另一端的那台电脑的显示器键盘也叫做终端。除了上述两种意义的终端之外,我们使用的类似SecureCRT这种软件上运行的SSH,Telnet等也算是一种终端程序,只是说它是通过TCP/IP网络而不是通过串口与主机连接的。

      现在可以给终端下一个非严格意义上的定义了,什么是终端?终端就是处理计算机主机输入输出的一套设备,它用来显示主机运算的输出,并且接受主机要求的输入,典型的终端包括显示器键盘套件打印机打字机套件等。但想要彻底理解终端的概念,还是要从计算机发展历史的角度去寻根溯源。



      最开始的时候,计算机有三间房屋那么大,确切地讲应该叫三间车间。如此的庞然大物有一个专门的操作台,就好像机床厂车间的操作台一样,或者说它像飞机驾驶舱的操作台更加合适,各种仪器仪表,操作员只需要在这里对这部机器发出指令,整部机器就开始为他的指令而运算,然后机器运算后的结果也会反馈到这里而不是其它地方,这里这个操作台就是最原始的终端。这里曾经是整部机器的控制中枢。

    这里写图片描述

    后来有了多用户多任务分时系统,不同的程序竟然可以“同时运行”了,为了让不同的程序分别独立地接受输入和处理输出,就需要多个不同的上述的操作台,当然了,坐在或者站在操作台前面的最好始终是同一个人,这样不同的人拥有不同的操作台处理不同的程序,这就进入了多终端时代,从这时起一直到现在,每一个终端都是和一个用户绑定的。为了保证这种绑定,于是就出现了登录,即通过一种叫做登录的动作,去唤起一个终端起来工作。为了支持多用户,终端从硬件分离了出来,终端成了一个软件概念,在一个硬件终端上成功登录后,便获得了一个软件终端

      可见,这个时代已经和三车间的时代不同了,终端不再只有一个,而是变成了多个,每一个登录成功的用户拥有一个可工作的软件终端来处理输入输出。

    这里写图片描述

    分久必合。

      到了个人计算机时代,计算机和终端又成了一对一的关系。毕竟嘛,这时的计算机叫做个人计算机,并不是随便谁都能用的,计算机本身就是归属个人,所以根本没必要去支持什么多用户,或者至少是淡化了多用户和多终端的概念。我们都曾记得,当时买电脑的时候,都是一个主机配一个显示器和一套键盘鼠标,这种情况从上世纪80年代初一直持续到今天。不过近些年来当人们逐渐全面认识到计算机和终端的一对一关系后,一体机的市场就来了,既然你几乎不会(我当然知道有人会,但这里我说的是大多数人,程序员占比寥寥,程序员为了装X,是不会用一体机的,就连品牌机套装有时也不屑的)在同一主机上接多个显示器多套键盘,何必再那么麻烦,干脆把主机和显示器合在一起不就好了嘛。嗯,这个点子不错,循着这个路子,最终有了触屏一体机,连键盘都内置了。对比一下下图和三车间里的计算机时代,是不是很像呢?

    这里写图片描述

    但是好景不长。

      合久必分。

      一切似乎又回到了大型机时代。在大型机时代,一台机器是拥有多个终端的,那是五十年以前。今天,我们拥有了各种各样的小型设备,智能手机,平板电脑,智能手表….然而这些东西,其实仅仅只是一系列的终端而已!那么既然这些东西都成了终端,真正的计算机在哪儿?当然在各大机房(也是类似车间大小的那种房间)里了,只是现在不叫大型机了,而叫做云端,这种技术叫做云计算(似乎有点炒作概念的意思)。如果你不信你花了几千上万块的钱买来的设备仅仅是一个完成输入输出功能的终端,那么请断网试试,看看你的iPhone是不是变砖头了。可见,昂贵的是云提供的计算服务,而不是终端设备本身,我们把所谓的云看作是一台计算机,这幅图景是不是跟五十年前的非常像呢?

    这里写图片描述

    你有多久没有打开过家里的PC了,是不是很久了,但是日子也还过得去。但是你能忍受哪怕几个小时不登录微信吗?某种意义上,成为新的终端的不是这些个硬件设备,而是基于云计算技术的现代互联网服务的各类APP。

      是不是又要分久必合了呢?早就有迹象了,从用QQ号可以登录微信,微博,内推网的时候就有迹象了。


    好了,扯了这么多关于终端的发展,其实根本上也就一句话,能接受输入,能显示输出,就这就够了,不管到了什么时代,终端始终扮演着人机接口的角色,所谓Terminal,即机器的边缘!

      只要能提供给计算机输入和输出功能,它就是终端,而与其所在的位置无关。我可以用ls命令列举五千公里以外的一台计算机上某个目录下的文件并且显示在我眼前的屏幕上,至于我的输入如何到达五千公里以外,这并不是我要关注的,也不是计算机要关注的,这显然只是一个通信方式问题。那么使用TCP/IP网络进行这类通信传输就是再显然不过的了。

      这就是SSH使用的方法。我们知道,SSH是一个TCP/IP协议族的协议,而其上跑的却是一个远程登录后的终端流,这显然只是用TCP/IP构建了一条隧道,然后终端流通行于该隧道。除此之外,更简单的Telnet也不例外,也是通过一个TCP/IP隧道来封装承载远程登录的终端流。除却TCP/IP,如果我们执意使用卡车来运载我们的输入和输出,也完全是合适的,TCP/IP也好,卡车也好,它们只是通信手段,它们并非终端本身。


    我们现在可以想象一下终端存在的形式都会有哪些。

    • 本地终端
      用VGA连接主机和显示器,用PS/2或者USB连接主机和键盘,这样的一个显示器/键盘组合就是一个本地终端。
    • 用串口连接的远程终端
      通过串口线把主机接到另外一个有显示器和键盘的主机,通过运行一个终端模拟程序,比如“Windows超级终端”来将这台主机的显示器和键盘借给串口对端的主机。
    • 用TCP/IP承载的远程终端
      类似Telnet,SSH这般。

    大致就先说这几类吧。可见上述的三类中,前两类都是在本地就直接关联了物理设备的,比如VGA口啊,PS/2口啊,串口啊之类的,这种终端叫做物理终端,而第三类在本地则没有关联任何物理设备,注意,不要把物理网卡当成终端关联的物理设备,它只是隧道关联的物理设备,这里的物理网卡完全可以换成卡车,它们与终端并不直接相关,所以这类不直接关联物理设备的终端叫做伪终端

      既然知道了这些终端到底是怎么回事,理解余下来的那些术语就不在话下了。这些术语的存在并非是为了故意增加复杂性,而是因为工程上的东西必须要有可操作性,要可操作就必须至少有个名字来称呼,仅此而已。这跟我们中国的传统道,可道非常道;名,可名非常名是完全不同的。可谓现代数学,既要有名又要有道,而现代工程,则必须舍道而取名。

      先看下Linux系统中管终端都叫做什么。


    tty是最令人熟悉的了,在Linux中,/dev/ttyX代表的都是上述的物理终端,其中,/dev/tty1~/dev/tty63代表的是本地终端,也就是接到本机的键盘显示器可以操作的终端。换句话说,你往/dev/tty3里写个东西,它就会显示在显示器对应的终端。

      为什么会有63个终端这么多呢?毕竟显示器只是一个单独的显示设备,键盘往往也只有一个,但Linux内核有能力知道现在该干什么,所以事实上Linux内核在初始化时会生成63个本地终端,通过键盘上的Fn-Alt-FX(X为1,2,3…)可以在这些终端之间切换,每切换到一个终端,该终端就是当前的焦点终端,比如说,你按下了Fn-Alt-F4组合键,那么此时第4个终端就是焦点终端,即/dev/tty4就是焦点终端设备。

    这里写图片描述

    谁是焦点终端会被内核记录为全局变量,这样只要有键盘输入,就会把输入的字符交给焦点终端。这里顺便提一下,对于串口而言,不存在焦点终端的概念,谁连了串口就是谁,而对于伪终端来讲,一般情况下client都是运行在GUI环境,对于Windows那是微软的事,对于Linux,则有X系统完成同样的事,在此略过,继续我们正在说的话题。

      系统中有没有什么变量可以表示焦点终端呢?当然有了,那就是/dev/console,不管你在哪里往/dev/console里写东西,这些东西总会出现在系统当前的焦点终端上!

      按照以他人为中心,我们解释了/dev/console其实就是一个全局变量,指代当前的焦点终端,如果当前的焦点是/dev/tty4,那么/dev/console指的就是/dev/tty4,当然这一切都是由内核来维护的。

      那么系统中有没有一个叫做自己的全局变量呢?当然有,那就是/dev/tty,也就是说,无论你在哪个终端下工作,当你往/dev/tty里写东西的时候,它总是会马上出现在你的眼前。

      /dev/tty1~/dev/tty63我们知道了它们是什么,/dev/tty表示自己,/dev/console表示焦点终端这些我们也知道了,那么串口终端如何表示呢?很简单,以ttyS
    开头的就是串口连接的终端,比如ttyS1,ttyS2

      最后,解释一下伪终端。其实也很好解释,只要你理解TUN/TAP虚拟网卡的原理就行,它们如出一辙!类似Telnet,SSH不是没有实际的物理设备吗?简单,给它模拟一个不就得了?系统是分层的,执行流只管调用接口,并不管具体实现。

      模拟一个虚拟的终端设备,实现它的write,read等回调即可。对于VGA连接的显示器而言,write其实就是将显存刷新,而对于伪终端而言,write其实是想将数据导入到一个用户态的程序中(不然又能去哪里呢?它下面又没有任何物理的东西),这简直跟很多VPN的原理非常类似。为此,Linux设计出一对虚拟终端设备,即/dev/ptmx/dev/pts/X,这就跟TUN/TAP网卡的网卡与字符设备之前的对应关系一致。

      简单来讲,当有ssh客户端连接后,sshd会fork一个进程,然后在子进程中打开一个叫做/dev/pts/1(或者2,3,4,5…)的设备,然后和sshd进程的/dev/ptmx配对,这样在ptmxpts之间就构成了一条管道,数据可以顺利被导入到sshd,然后通过TCP/IP封装发往ssh client所在的机器。

      为了帮助理解上述的文字,我特意作图一张,希望能解释清楚这些终端之间的关系以及弄明白它们的工作流程。为了让图画的更加紧凑,避免横向网络吧图拉的过长而不好看,我这里采用了环形解释法,类似Intel早先的Ring1,Ring2,Ring3,我把最内层视作硬件(比它更里面的还有叫做人的东西),中间层视作内核,最外层视作软件。

    这里写图片描述

    理解了图例,我上我的图,这是我昨晚画到很晚才完成的,希望能有宝贵的意见提出(图有点大,请单独查看):

    这里写图片描述

    /dev目录下的各种ttyptmxpts/Xconsole等等这些是令人混淆的根源,其实理解这些是有窍门的,记住它们只是操作某种终端设备的设备文件而已,这是UNIX风格的延续,这些设备文件对应的真实设备也就那么几种,比如显示器键盘套件,串口对面的超级终端,伪终端对面的SSH,Telnet等等。然后试着画出一个上面的图,基本就理清楚了。


    本文的最后,我来简单说下关于gettylogin相关的东西。

      前面在讲终端发展历史的时候说到过,到了多终端时代,每一个终端必须绑定一个用户,只有登录成功的用户方可获得一个终端。因此当一个人站到一个终端面前并不意味着它就能在这个终端上操作计算机,他首先要做的就是登录。所谓的登录呢,就是输入用户名和密码,如果输入正确,则会给你一个Bash(或者别的Shell)让你操作计算机,如果输入不正确,则让你继续输入…

      getty给了让你登录并且继续输入的机会!init进程不断调用getty,然后getty会发起login让你登录,当你输入正确的用户名和密码后,ttyXYZ就是你的了,如果你是用SSH进行的login,那么你将得到一个叫做/dev/pts/X,如果你是在显示器键盘登录,你将得到/dev/tttX(X取决于当前的焦点终端)

      所有这一切其实都是多终端以及多用户的产物,但归根结底其根源都在分时系统。在计算机最初被放在车间大小的屋子里的年代,可能把屋子的门禁做好以及将屋子外的鉴权系统做好显得比后来的多用户login更为重要,只有在后来,终端不再属于计算机了,终端与计算机分离了,用户也和终端分离了的时候,设计一套登录机制就显得尤为必要了,因为首先即便你把计算机锁在铁屋子里,只要终端在外面,那么计算机就毫无安全感可言,其次,你也不可能把终端全部锁在完全属于你控制的铁屋子里,特别是在TCP/IP出现以后,几乎所有的计算机都是互联互通的,这意味着任何一台计算机都可以作为其它任何一台另外的计算机的操作终端,任何外部的鉴权系统和物理保护在TCP/IP网络面前都堪比马其诺防线,看似固若金汤,实则百无一用。


    写完了,最后说一点题外话。

      如果想检验一下自己是否多一件事情有足够深刻的理解,那么试着给别人讲一讲,试着回答别人不断深入的问题,迎接挑战,这是正道。

      这就是一直以来我总喜欢强行给别人扯希腊罗马文化的原因,意在反驳大多数人认为的东方文化更优秀的现实。我并不意味着我不是爱国主义者,这只是一种思维游戏。但久而久之,随着理解不断深刻,我自己竟然也成了一个欧洲中心主义者。

      我的本意是想解释中国的传统文化和欧洲的文化有什么本质上的不同,最终肯定不是陷入欧洲中心主义,就是陷入中华中心主义的华夷秩序。然而我上当了,我发现这种刻意把两种文化区分开来做PK状的论调本身就是陷入了彻头彻尾的欧洲中心主义,这难道不是源自于一神教的排他性在作怪吗?

      然而反过来,我既然认识到了这一点,说明我内心深处还是有自省机制的,这种自省机制难道不是来自中华的传统吗?我们知道,欧洲猛在外取诸物,中华则强在内省其身。

      最近在看梁漱溟的书,虽然很多人批判他,但我还是能从他的书里学到了很多的东西。也算是读后感吧,就着和同事讨论关于终端的遗留问题的解答以及对梁漱溟学问的感想,写下了最后这几段文字。

    —————-关于行规程的补遗—————–
    说了这么多,竟然没有详细写关于行规程的内容,也算遗憾,于是准备另起一篇文章来单独讨论。

    展开全文
  • 其实自已一直比较排斥java语言,但发现好像真的有很多人在使用java,也发现很多java的项目,可能除了C语言外,java真的是最流行的语言吧。一般Mac系统下的C++出身的人都喜欢用python...从 Linux 终端编译运行 Eclipse
    其实自已一直比较排斥java语言,但发现好像真的有很多人在使用java,也发现很多java的项目,可能除了C语言外,java真的是最流行的语言吧。一般Mac系统下的C++出身的人都喜欢用python作为脚本语言,而java出身的人喜欢js脚本语言。
    windows下的C++开发人员最喜欢用的脚本语言是C#.linux系统下的管理员或许用ruby的会多一些。
    假如你在linux系统下使用Eclipse开发一个Java项目,你可能会有从其他地方远程连接这个项目的需求。或许 你可以使用teamviewer远程连接linux桌面,但那经常会非常龟速。你也可以从常规的ssh终端修改、编译并运行你的Java项目。使用终端修 改、编译并运行远程eclipse项目则会快很多。本文就是告诉你如何在终端中编译运行eclipse项目。 用到的命令行 
    基本上只需要下面两个命令。-cp参数项用于配置类路径,它指向用到的class文件和jar文件。如果使用多个库,那么每一个都应该被包含在其中,以“.”分隔。
    javac -cp “all jar file’s path” package/target.java 
    java -cp “all jar file’s path” package.target 
    一个Eclipse项目例子 
    下文中,我在eclipse中新建一个Java项目。该项目包含一个package1中的类Test。Test使用了/lib/下的第三方库。
    从 Linux 终端编译运行 Eclipse Java 项目 - ♂苹果 - 眼睛想旅行

    首先,cd到/src/directory文件夹下,然后使用以下命令编译项目。

    javac -cp "/home/pc/workspace/TerminalEclipse/lib/commons-io-2.4.jar:
    /home/pc/workspace/TerminalEclipse/lib/commons-lang-2.5.jar"
    package1/Test.java

    第二,使用以下命令运行项目。

    java -cp ".:/home/xiaoran/workspace/TerminalEclipse/lib/commons-io-2.4.jar:
    /home/xiaoran/workspace/TerminalEclipse/lib/commons-lang-2.5.jar"

     package1.Test

    注意:路径的第一部分是 .,它指向当前路径。

    编译过程会在/src/directory文件夹下产生.class文件。当你再次使用eclipse的时候可能会想把它们删除了。

    潜在问题

    如果你正在开发一个规模很大的项目,你就可能会使用很多的第三方库。你可以使用下面的代码生成路径字符串。

    StringBuilder sb =new StringBuilder();

    File[] arr = file.listFiles();
        for(File f: arr){
            if(f.getName().endsWith(".jar")){
                sb.append(f.getAbsolutePath()+":");
            }
        }

    String s = sb.toString();
        s = s.substring(0, s.length()-1);

    System.out.println(s);
    }

    展开全文
  • Linux终端设备解析

    2014-11-17 14:36:19
    虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0。对于Linux内核的终端、tty、控制台等概念的认识很模糊。由于在学习的时候碰到了重定向console的...

    虽然一直做嵌入式Linux,宿主机和开发板通信天天都在用tty设备通信,但是其实自己对TTY设备及终端的概念认识几乎是0。对于Linux内核的终端、tty、控制台等概念的认识很模糊。由于在学习的时候碰到了重定向console的问题,所以借机学习下tty的知识。以下是我对tty的认识总结,信息来源于网络和内核文档。参考资料见文章末尾。

    tty一词源于Teletypes,或Teletypewriters,它是最早出现的一种终端设备,类似电传打字机,由Teletype公司生产。最初tty是指连接到Unix系统上的物理或者虚拟终端。终端是一种字符型设备,通常使用tty来统称各种类型的终端设备。随着时间的推移,当通过串行口能够建立起终端连接后,这个名字也用来指任何的串口设备。它还有多种类,例如串口(ttySn、ttySACn、ttyOn)、USB到串口的转换器(ttyUSBn),还有需要特殊处理才能正常工作的调制解调器(比如传统的WinModem类设备)等。tty虚拟设备支持虚拟控制台,它能通过键盘及网络连接或者通过xterm会话登录到计算机上。

    1.     其实起初终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念。
    2.    终端为主机提供了人机接口,每个人都通过终端使用主机的资源。终端有字符终端和图形终端两种。一台主机可以连很多终端。
    3.    控制台是一种特殊的人机接口, 是人控制主机的第一人机接口。而主机对于控制台的信任度高于其他终端。

         对此还可以结合内核启动代码中init进程打开/dev/console和执行两次sys_dup(0),以及标准输入、标准输出、标准出错,还有就是进程fork后的标准输入输出的复制情况来一起理解。

    1.     而个人计算机只有控制台,没有终端。当然愿意的话,可以在串口上连一两台字符哑终端。但是linux按POSIX标准把个人计算机当成小型机来用,在控制台上通过getty软件虚拟了六个字符哑终端(或者叫虚拟控制台终端tty1-tty6)(数量可以在/etc/inittab里自己调整)和一个图型终端, 在虚拟图形终端中又可以通过软件(如rxvt)再虚拟无限多个伪终端(pts/0等)。但这全是虚拟的,虽然用起来一样,但实际上没有物理实体。所以在个人计算机上,只有一个实际的控制台,没有终端,所有终端都是在控制台上用软件模拟的。要把个人计算机当主机再通过串口或网卡外连真正的物理终端也可以,论成本,谁会怎么做呢。

    终端按照其自身能力分类,可以分为:

    1、哑终端(瘦客户端)

    早期的计算机终端是通过串行RS-232通信的,它只能解释有限数量的控制码(CR,LF等),但没有能力处理执行特殊的转义序列功能(如清行、清屏或控制光标的位置)。简单来说就是处理能力有限的终端机,他们一般基本上只具有和机械电传打字机类似的有限功能。这种类型的终端称为哑终端。现在仍然在现代类Unix系统上得到支持,通过设置环境变量TERM=dumb。哑终端有时用来指任何类型的通过RS-232连接的传统计算机终端,不对数据进行本地处理或本地执行用户程序的串行通信终端。哑终端有时也指功能有限,只有单色文本处理能力或直接传输每一个键入的字符而不等待主机轮询的公共计算机终端。

    2、智能终端(胖客户端)

    智能终端就是有能力处理转义序列,也就是说处理能力较强的终端机。


    Linux系统的终端设备一般有以下几种:

    • 1、 控制台
    • 系统控制台/dev/console

    /dev/console是系统控制台,是与操作系统交互的设备。系统所产生的信息会发送到该设备上。平时我们看到的PC只有一个屏幕和键盘,它其实就是控制台。目前只有在单用户模式下,才允许用户登录控制台/dev/console。(可以在单用户模式下输入tty命令进行确认)。

    console有缓冲的概念,为内核提供打印输出。内核把要打印的内容装入缓冲区__log_buff,然后由console来决定打印到哪里(比如是tty0还是ttySn等)。console指向激活的终端。历史上,console指主机本身的屏幕和键盘,而tty指用电缆链接的其它位置的控制台。

    某些情况下console和tty0是一致的,就是当前所使用的是虚拟终端,也是激活虚拟终端。所以有些资料中称/dev/console是到/dev/tty0的符号链接,但是这样说现在看来是不对的:根据内核文档,在2.1.71之前,/dev/console根据不同系统设定,符号链接到/dev/tty0或者其他tty*上,在2.1.71版本之后则完全由内核代码内部控制它的映射。 

    如果一个终端设备要实现console功能,必须向内核注册一个struct console结构,一般的串口驱动中都会有。如果设备要实现tty功能,必须要内核的tty子系统注册一个struct tty_driver结构,注册函数在drivers/tty/tty_io.c中。一个设备可以同时实现console和tty_driver,一般串口都这么做。


    • 当前控制台: /dev/tty

    这是应用程序中的概念,如果当前进程有控制终端(Controlling Terminal),那么/dev/tty就是当前进程控制台的设备文件。对于你登录的shell,/dev/tty就是你使用的控制台,设备号是(5,0)。不过它并不指任何物理意义上的控制台,/dev/tty会映射到当前设备(使用命令“tty”可以查看它具体对应哪个实际物理控制台设备)。输出到/dev/tty的内容只会显示在当前工作终端上(无论是登录在ttyn中还是pty中)。你如果在控制台界面下(即字符界面下)那么dev/tty就是映射到dev/tty1-6之间的一个(取决于你当前的控制台号),但是如果你现在是在图形界面(Xwindows),那么你会发现现在的/dev/tty映射到的是/dev/pts的伪终端上。/dev/tty有些类似于到实际所使用终端设备的一个联接。

    你可以输入命令 “tty",将显示当前映射终端如:/dev/tty1或者/dev/pts/0等。也可以使用命令“ps -ax”来查看其他进程与哪个控制终端相连。

    在当前终端中输入 echo “tekkaman” > /dev/tty ,都会直接显示在当前的终端中。

     

      • 虚拟控制台 /dev/ttyn

    /dev/ttyn是进程虚拟控制台,他们共享同一个真实的物理控制台。

    如果在进程里打开一个这样的文件且该文件不是其他进程的控制台时,那该文件就是这个进程的控制台。进程printf数据会输出到这里。在PC上,用户可以使用alt+Fn切换控制台,看起来感觉存在多个屏幕,这种虚拟控制台对应tty1~n,其中 :

    /dev/tty1等代表第一个虚拟控制

    例如当使用ALT+F2进行切换时,系统的虚拟控制台为/dev/tty2 ,当前控制台(/dev/tty)则指向/dev/tty2

    在UNIX系统中,计算机显示器通常被称为控制台(Console)。它仿真了类型为Linux的一种终端,并且有一些设备特殊文件与之相关联:tty0、tty1、tty2等。当你在控制台上登录时,使用的是tty1。使用Alt+[F1—F6]组合键时,我们就可以切换到tty2、tty3等上面去。

    你可以登录到不同的虚拟控制台上去,因而可以让系统同时有几个不同的会话存在。

    而比较特殊的是/dev/tty0他代表当前虚拟控制台是当前所使用虚拟控制台的一个别名。因此不管当前正在使用哪个虚拟控制台(注意:这里是虚拟控制台,不包括伪终端),系统信息都会发送到/dev/tty0上。只有系统或超级用户root可以向/dev/tty0进行写操作。tty0是系统自动打开的,但不用于用户登录。在Framebuffer设备没有启用的系统中,可以使用/dev/tty0访问显卡。


    • 2、 伪终端pty(pseudo-tty)

            伪终端(Pseudo Terminal)是终端的发展,为满足现在需求(比如网络登陆、xwindow窗口的管理)。它是成对出现的逻辑终端设备(即master和slave设备, 对master的操作会反映到slave上)。它多用于模拟终端程序,是远程登陆(telnet、ssh、xterm等)后创建的控制台设备。

    历史上,有两套伪终端软件接口:
    BSD接口:较简单,master为/dev/pty[p-za-e][0-9a-f] ;slave为 /dev/tty[p-za-e][0-9a-f] ,它们都是配对的出现的。例如/dev/ptyp3和/dev/ttyp3。但由于在编程时要找到一个合适的终端需要逐个尝试,所以逐渐被放弃。

    Unix 98接口:使用一个/dev/ptmx作为master设备,在每次打开操作时会得到一个master设备fd,并在/dev/pts/目录下得到一个slave设备(如 /dev/pts/3和/dev/ptmx),这样就避免了逐个尝试的麻烦。由于可能有好几千个用户登陆,所以/dev/pts/*是动态生成的,不象其他设备文件是构建系统时就已经产生的硬盘节点(如果未使用devfs、udev、mdev等) 。第一个用户登陆,设备文件为/dev/pts/0,第二个为/dev/pts/1,以此类推。它们并不与实际物理设备直接相关。现在大多数系统是通过此接口实现pty。

           我们在X Window下打开的终端或使用telnet 或ssh等方式登录Linux主机,此时均通过pty设备。例如,如果某人在网上使用telnet程序连接到你的计算机上,则telnet程序就可能会打开/dev/ptmx设备获取一个fd。此时一个getty程序就应该运行在对应的/dev/pts/*上。当telnet从远端获取了一个字符时,该字符就会通过ptmxpts/*传递给 getty程序,而getty程序就会通过pts/*ptmx和telnet程序往网络上返回“login:”字符串信息。这样,登录程序与telnet程序就通过“伪终端”进行通信。

    1. telnet<--->/dev/ptmx(master)<--->pts/*(slave)<--->getty

            如果一个程序把 pts/*看作是一个串行端口设备,则它对该端口的读/写操作会反映在该逻辑终端设备对的另一个/dev/ptmx上,/dev/ptmx则是另一个程序用于读写操作的逻辑设备。这样,两个程序就可以通过这种逻辑设备进行互相交流,这很象是逻辑设备对之间的管道操作。对于pts/*,任何设计成使用一个串行端口设备的程序都可以使用该逻辑设备。但对于使用/dev/ptmx的程序,则需要专门设计来使用/dev/ptmx逻辑设备。

           通过使用适当的软件,就可以把两个甚至多个伪终端设备连接到同一个物理串行端口上。

    • 实验:
    • 1、在X下打开一个或N个终端窗口
    • 2、#ls /dev/pts/*
    • 3、关闭这个X下的终端窗口,再次运行;比较两次输出信息就明白了。
    • 输出为/dev/ptmx /dev/pts/1存在一(master)对多(slave)的情况

    • 3、 串口终端(/dev/ttySn)

            串行端口终端(Serial Port Terminal)是使用计算机串行端口连接的终端设备。计算机把每个串行端口都看作是一个字符设备。有段时间串行端口设备通常被称为终端设备,那时它的最大用途就是用来连接终端,所以这些串行端口所对应的设备名称是/dev/tts/0(或/dev/ttyS0)、/dev/tts/1(或/dev /ttyS1)等,设备号分别是(4,0)、(4,1)等(对应于win系统下的COM1、COM2等)。若要向一个端口发送数据,可以在命令行上把标准输出重定向到这些特殊文件名上即可。

           例如,在命令行提示符下键入:echo tekkaman> /dev/ttyS1会把“tekkaman”发送到连接在ttyS1(COM2)端口的设备上。

           在2.6以后的内核中,部分三星芯片(例如S3C24x0等)将串口终端设备节点命名为ttySACn。TI的Omap系列芯片从2.6.37开始芯片自带的UART设备开始使用专有的的omap-uart驱动,故设备节点命名为ttyOn,以区别于使用8250驱动时的设备名“ttySn”。


    • 4、 其它类型终端

    还针对很多不同的字符设备存在有很多其它种类的终端设备特殊文件,例如针对ISDN设备的/dev/ttyIn终端设备等。

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~


          其实在理解以上概念的时候,如果了解终端的发展历程,就可以比较容易理解tty、终端的概念。所以请大家阅读最后推荐的wiki英文网页,有助于理解上面的概念。当然,内核文档也是必不可少的参考资料,我顺手翻译了一下。

    内核文档/Documentation/devices.txt翻译节选:

    1. **** 终端设备

    2. Terminal, or TTY devices are a special class of character devices. A
    3. terminal device is any device that could act as a controlling terminal
    4. for a session; this includes virtual consoles, serial ports, and
    5. pseudoterminals .
    6. 终端或这TTY设备是一类特殊的字符设备
    7. 一个终端设备是任何对于一个会话可以作为控制终端的设备。
    8. 这包括虚拟控制台、串口和伪终端(PTYs)。

    9. All terminal devices share a common set of capabilities known as line
    10. disciplines; these include the common terminal line discipline as well
    11. as SLIP and PPP modes.
    12. 所有终端设备共享一系列常规能力-线路规程。
    13. 这包含常见的终端线路规程,例如SLIP和PPP模式。

    14. All terminal devices are named similarly; this section explains the
    15. naming and use of the various types of TTYs. Note that the naming
    16. conventions include several historical warts; some of these are
    17. Linux-specific, some were inherited from other systems, and some
    18. reflect Linux outgrowing a borrowed convention.
    19. 所有终端设备的命名都比较简单。本节介绍不同类型TTY的命名和用途。
    20. 注意命名的约定包含了一些历史需求:
    21. 某些是Linux特定的,
    22. 某些是从其他的系统中继承下来的,
    23. 还有一些则反映了Linux从借鉴来的约定中发展而来的。

    24. A hash mark (#) in a device name is used here to indicate a decimal
    25. number without leading zeroes.
    26. 设备名中的(#)标志用于标识一个不以0开头的10进制数。

    • Virtual consoles and the console device
    • 虚拟控制台和控制台设备

    1. Virtual consoles are full-screen terminal displays on the system video
    2. monitor. Virtual consoles are named /dev/tty#, with numbering
    3. starting at /dev/tty1; /dev/tty0 is the current virtual console.
    4. /dev/tty0 is the device that should be used to access the system video
    5. card on those architectures for which the frame buffer devices
    6. (/dev/fb*) are not applicable. Do not use /dev/console
    7. for this purpose.
    8. 虚拟控制台是在系统视频监视器全屏的显示终端。
    9. 虚拟控制台设备名为/dev/tty#,编号开始于/dev/tty1。
    10. /dev/tty0是当前虚拟控制台。
    11. /dev/tty0在那些帧缓冲设备(/dev/fb*)不适用的构架下可以被用来访问系统显卡。
    12. 而/dev/console并不用于此目的。

    13. The console device, /dev/console, is the device to which system
    14. messages should be sent, and on which logins should be permitted in
    15. single-user mode. Starting with Linux 2.1.71, /dev/console is managed
    16. by the kernel; for previous versions it should be a symbolic link to
    17. either /dev/tty0, a specific virtual console such as /dev/tty1, or to
    18. a serial port primary (tty*, not cu*) device, depending on the
    19. configuration of the system.
    20. 控制台设备/dev/console是一个接受系统信息并在单用户模式下允许登录的设备。
    21. 从Linux 2.1.71开始,/dev/console由内核管理
    22. 而以前的版本是一个到/dev/tty0、一个特定的虚拟控制台(如/dev/tty1)或者一个串口主(tty*,非cu*)设备动态链接,这些依赖系统配置。

    • Serial ports
    • 串行端口

    1. Serial ports are RS-232 serial ports and any device which simulates
    2. one, either in hardware (such as internal modems) or in software (such
    3. as the ISDN driver.) Under Linux, each serial ports has two device
    4. names, the primary or callin device and the alternate or callout one.
    5. Each kind of device is indicated by a different letter. For any
    6. letter X, the names of the devices are /dev/ttyX# and /dev/cux#,
    7. respectively; for historical reasons, /dev/ttyS# and /dev/ttyC#
    8. correspond to /dev/cua# and /dev/cub#. In the future, it should be
    9. expected that multiple letters will be used; all letters will be upper
    10. case for the "tty" device (e.g. /dev/ttyDP#) and lower case for the
    11. "cu" device (e.g. /dev/cudp#).
    12. 串行端口是RS-232串口和任何类似的设备,无论是硬件的(如内部调制解调器)或者软件(如ISDN驱动)。
    13. 在Linux下,每个串口有两个设备名,主要的(callin设备)和备用的(callout设备),每类设备都通过不同的字母标识。对于任何字母X,设备名分别是/dev/ttyX# 和/dev/cux#;由于历史原因,/dev/ttyS#和/dev/ttyC#对应于/dev/cua#和/dev/cub#。未来,对于“tty”多字母的名字将会被使用,所有的字母都将是大写(如/dev/ttyDP#),对于"cu"设备则使用小写字母(如/dev/cudp#)。

    14. The names /dev/ttyQ# and /dev/cuq# are reserved for local use.
    15. 名字(/dev/ttyQ#和/dev/cuq#)保留,用于本地使用。

    16. The alternate devices provide for kernel-based exclusion and somewhat
    17. different defaults than the primary devices. Their main purpose is to
    18. allow the use of serial ports with programs with no inherent or broken
    19. support for serial ports. Their use is deprecated, and they may be
    20. removed from a future version of Linux.
    21. 备用设备提供基于内核的exclusion和某些与主要设备不同的默认配置。他们的主要目的是允许那些对于串口并非内部支持或是有一定问题的程序使用串口。他们的使用已经过时,他们可能会从未来的Linux版本中删除。

    22. Arbitration of serial ports is provided by the use of lock files with
    23. the names /var/lock/LCK..ttyX#. The contents of the lock file should
    24. be the PID of the locking process as an ASCII number.
    25. 串口的仲裁是通过锁文件(/var/lock/LCK..ttyX#)来提供的。
    26. 锁文件的内容应该是锁定进程PID的ASCII码。

    27. It is common practice to install links such as /dev/modem
    28. which point to serial ports. In order to ensure proper locking in the
    29. presence of these links, it is recommended that software chase
    30. symlinks and lock all possible names; additionally, it is recommended
    31. that a lock file be installed with the corresponding alternate
    32. device. In order to avoid deadlocks, it is recommended that the locks
    33. are acquired in the following order, and released in the reverse:
    34. 安装一个例如/dev/modem的链接来指向串口是常见的做法。
    35. 为了确保适当锁定在这些环节的存在,建议软件追踪符号并锁定所有可能的名字;
    36. 此外,建议为相应的备用设备安装一个锁文件。
    37. 为了避免死锁,建议按以下顺序获取锁,并按反向的顺序释放:

    38. 1. The symbolic link name, if any (/var/lock/LCK..modem)
    39. 2. The "tty" name (/var/lock/LCK..ttyS2)
    40. 3. The alternate device name (/var/lock/LCK..cua2)
    41. 1、符号链接名,如果有(/var/lock/LCK..modem)
    42. 2、“tty”名(/var/lock/LCK..ttyS2)
    43. 3、备用设备名(/var/lock/LCK..cua2)

    44. In the case of nested symbolic links, the lock files should be
    45. installed in the order the symlinks are resolved.
    46. 在符号链接嵌套的情况下,锁定文件应按照符号链接的顺序来安装以解决问题。

    47. Under no circumstances should an application hold a lock while waiting
    48. for another to be released. In addition, applications which attempt
    49. to create lock files for the corresponding alternate device names
    50. should take into account the possibility of being used on a non-serial
    51. port TTY, for which no alternate device would exist.
    52. 在任何情况下,应用程序应该等待另一个程序释放锁后,持有这个锁。
    53. 此外,试图为相应的备用设备名创建锁文件的应用程序应考虑被用于非串口的TTY端口的可能性,此时没有备用设备存在。

    • Pseudoterminals (PTYs)
    • 伪终端(PTYs)

    1. Pseudoterminals, or PTYs, are used to create login sessions or provide
    2. other capabilities requiring a TTY line discipline (including SLIP or
    3. PPP capability) to arbitrary data-generation processes. Each PTY has
    4. a master side, named /dev/pty[p-za-e][0-9a-f], and a slave side, named
    5. /dev/tty[p-za-e][0-9a-f]. The kernel arbitrates the use of PTYs by
    6. allowing each master side to be opened only once.
    7. 伪终端(或PTYs)用于创建登录会话或提供给其他需要tty线路规程(包括SLIP或PPP能力)能力以生成数据的进程。
    8. 每个PTY有一个主端(/dev/pty[p-za-e][0-9a-f])和一个从端(/dev/tty[p-za-e][0-9a-f])。
    9. 内核通过只允许每个主端仅允许打开一次来仲裁PTY的使用。

    10. Once the master side has been opened, the corresponding slave device
    11. can be used in the same manner as any TTY device. The master and
    12. slave devices are connected by the kernel, generating the equivalent
    13. of a bidirectional pipe with TTY capabilities.
    14. 一旦主端被打开,相应的从设备可以像任何TTY设备一样的方式被使用。
    15. 主从设备都和内核连接,产生相当于一个带TTY功能的双向管道。

    16. Recent versions of the Linux kernels and GNU libc contain support for
    17. the System V/Unix98 naming scheme for PTYs, which assigns a common
    18. device, /dev/ptmx, to all the masters (opening it will automatically
    19. give you a previously unassigned PTY) and a subdirectory, /dev/pts,
    20. for the slaves; the slaves are named with decimal integers (/dev/pts/#
    21. in our notation). This removes the problem of exhausting the
    22. namespace and enables the kernel to automatically create the device
    23. nodes for the slaves on demand using the "devpts" filesystem.
    24. Linux内核的最近版本和GNU库包含了对于System V和Unix98对PTY命名方式的支持。
    25. 它分配一个共用的设备(/dev/ptmx)给所有的主端(打开它会自动给你一个以前未分配的PTY)和一个子目录(/dev/pts)用于从端;从端通过十进制整数(/dev/pts/#)命名。
    26. 这消除了命名空间枯竭的问题,并使内核通过“devpts”文件系统按需自动为从端动创建设备节点。

    对于TTY系统的理解(图解):

    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    推荐阅读:《Linux C编程一站式学习》----第 34 章 终端、作业控制与守护进程---1. 终端

    wiki百科关于终端的网页:Computer terminal | System console | Linux console


    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    以上是我参考了网上的资料后对tty的认识整理,参考资料如下:

    linux tty pty pts 概念 区别

    终端 /dev/console /dev/tty tty

    终端tty、虚拟控制台、FrameBuffer的切换过程详解

    LINUX下的tty,console与串口分析

    linux下tty,控制台,虚拟终端,串口,console(控制台终端)详解

    LINXU下的TTY、CONSOLE、串口

    Linux下的console和terminal

    展开全文
  • 在学习一些高级语言时,看很多视频老师都是用Linux命令操作命令框,感觉很方便,自己在cmd窗口试了一下,window不能使用这些linux的命令,所有这些命令都提示不是内部或外部命令,又不想用单独一台电脑装Linux系统...
  • 11个炫酷的Linux终端命令大全,通过今天这篇文章我将向大家展示一系列的Linux命令、工具和技巧。 作者:gm来源:pc6.com|2016-07-21 14:36  收藏  分享 今天给大家分享用了十年的Linux总结
  • Linux 能够在我们常用的PC上实现UXIN的全部特性,具有多用户,多任务的能力。CTRL-ALT-F1至CTRL-ALT-F6 是6个终端。可以以不同的用户来进行不同的操作,CTRL-ALT-F1 至CTRL-ALT-F6 只是6个终端,并没有什么不同,...
  • 今天在学习NodeJS,在Node.JS实战书上提到了一个运行在JavaScript环境中的PC模拟器。读者你没有听错,是用JavaScript模拟的一个Linux服务器,而且上面还可以执行命令。支持从本地拷贝资料到服务器上,同时也支持从...
  • linux虚拟终端

    2019-03-04 09:48:33
    1)tty命令 查看当前进程使用哪个终端 2)/dev/console是系统控制终端,console指向激活的...4)当你运行一个程序的时候,此进程一定会对应一个终端(当前的虚拟机控制台),printf打印信息会在终端出现,而当程序...
  • 谷歌在很早之前提出了archon的方案,能够直接在PC运行安卓app,但是并不是很完善,所以不保证所有app可运行,请自测。后来deepin对其进行了加强,在此感谢深度团队。部分为转载内容,再次感谢原作者。理论基于...
  • Linux系统中,用户通过终端登录系统后得到一个Shell进程,这个终端成为Shell进程的控制终端。控制终端是保存在PCB中的信息,而我们知道fork会复制PCB中的信息,因此由Shell进程启动的其它进程的控制终端也是这个...
  • 鼠标,显示器等设备的情况下,就可正常运行,而这一切将归功于linux对计算机串口的利用,如果linux的串口被配置为支持终端,就可以通过一台终端或装有虚拟终端软件的PC机,就可以轻松完成对系统的配置及管理。...
  • linux下的终端及串口的相关概念有: tty,控制台,虚拟终端,串口,console(控制台终端)详解 部分内容整理于网络。 终端/控制台 终端和控制台都不是个人电脑的概念,而是多人共用的小型中型大型计算机上的概念. 1....
  • 厌倦了工作?...-- Sk本文导航◈ piano-rs:使用 PC 键盘在终端弹钢琴08%◈ 安装10%◈ 用法64%编译自 | https://www.ostechnix.com/let-us-play-piano-terminal-using-pc-keyboard/ 作者 | Sk 译者
  • 通常,它们与同一作业相关联,可以接收来自同一终端的各种信号。每个进程组有一个唯一的进程组ID。每个进程组都可以有一个组长进程(该组进程的第一个,组成员ID等于组长ID)。组长进程的标识是,其进程组ID等于其...
  • Linux终端(二)

    2008-07-19 08:32:00
    Linux提供了一个可以允许我们控制终端驱动器的接口集合,从而可以使得我们更好的控制终端的输入与输出处理过程。概览正如下图所示,我们可以通过一个与用来进行读写操作相分离的函数调用集合来控制终端。这使得数据...
  • 对于很多开发人员来说,Linux可能是他们的主要工作环境,然而与其相矛盾的是,QQ又是他们的主要通讯工具。然而,类似于腾讯消极维护Win10 UWP版本QQ的原因,Linux版本的QQ早在2008年就夭折在了beta版本。于是,互联
  • 一个叫Fabrice Bellard的程序员写了一段Javascript在Web浏览器中启动Linux(原网页,我把这个网页iframe在了下面),目前,你只能使用Firefox 4和Chrome 11运行这个Linux。这不是什么假的模仿Linux的东西,这是实实...
1 2 3 4 5 ... 20
收藏数 35,920
精华内容 14,368