Why I can’t live without Linux

 

From: http://www.unixmen.com/cant-live-without-linux/

This is written targeting users who might want to try Linux. But also with some facts that Linux users should be aware and feel proud of.

Bored to read long stories? Navigate to the final part “To compile it all”.

Why I can’t live without Linux?

Well I am biased and I have my own reasons. When I turn on my Linux machine after days/months, it just boots like a charm. You will be surprised to know that most OS doesn’t boot this way.

Consider few scenarios:

1. Your machine crashes more often.

2. It’s too damn slow.

3. Files/folders getting created/deleted without your intervention.

4. Machine shuts down for no reason.

What’s the catch? Your machine is infected by a virus. Now, it hardly happens in Linux. Hardly implies “never at all” here 🙂

So why/how?

Consider 100 people coding/reviewing something or even 1000s doing it. Still Linux is much bigger with the visibility that almost any developer in the world can see “what is being coded?” and point out if there is a flaw.

On 14 March 1994, Linux 1.0.0 was released, with 176,250 lines of code.

As of 2013, the Linux 3.10 release had 15,803,499 lines of code.

 

And another thing, is the way Linux has been designed. Unlike few other OS, In Linux, almost all complex tasks requires root permission. Say, in windows, you’re navigating to some random system folder and deleting something (so, why would you do that? Say, some virus did that. Well, it can. Also I have seen people who do it to get more memory ). Nothing happens, but at the time of next reboot.. (I am scared to say more). Whereas in Linux, it prompts for root password whenever you try to do something with the system. What if I am root and I messed up the system? This is worst case scenario, but still there are lot of people out there to guide you how to fix it.

How would you feel when some random guys in the street come running to help you, when you fell down? Love and support is priceless. You gotta feel it.

clip_image002The stability – There are Linux machines running eternally. A simple “uptime” command would let you know how long the machine has been running. You never need to turn it off at all. Pretty much hot swappable. Of course there are other OS machines that reports equally high uptime, but again, Linux machines are less prone to crashes, blue screen of death (:D) and as such, unless and until you mess it up.

As the old saying goes “Linux is user friendly, but not idiot friendly

There must be lot of things you might be doing to protect your machine from viruses/trojans. As a study says, the average time before a windows get affected after connecting to internet is 40 minutes, whereas Linux – Like a boss. That too, you don’t need to install anything apart from the base OS itself.

Enhanced security – Iptables, an awesome command line utility to setup firewall. Also, there are lot of other innovations like port knocking, chroot jail and as such.

SELinux – Say you gave full access permission to a file, still other won’t be able to access it, if SELinux is enforcing and set.

Other OS source codes are accessible to only people who work on that, whereas, Linux, everyone can access the source code, which means mistakes are less likely and even if somethings wrong, fixes are made in no time. Say that you have suffered a security attack, then the corresponding company of that OS might release a patch in a month’s time or week’s time, which means your system continues to be vulnerable for time being. But Linux, with countless people’s contribution & active participation, it’s far better, not better, just the best.

Also, say, if the OS company doesn’t fix the bug, then what? Well, you just got to live with that. Whereas in linux, there are lot of people of fix it, or if you’re a better programmer, maybe you shall fix it and thus contribute it to the open source community. The joy of giving!

Why would you buy an OS, when there is a lot better OS (Linux), which is a freeware and opensource. Note that the opportunity to learn is much when you decide to go with opensource. If you’re a good programmer, you shall take the source code, build it /design it & use it your way.

People all around the world put their time and brain in bringing you an OS, which would compete every other OS, that exists in market and that is Linux.

No crapware – Alright, the OS is open source. What about other utilities? Well, there are lot of open source utilities out there which can be used, whereas in case of other OS, where almost all software might ask you to subscribe for the service, upgrade/buy.  And the worst part is, after few days of using a software, you might come to know that it’s just a 30 days trial. And these softwares comes installed along with your OS. On the other hand, In Linux, you will never experience such frustrations.

Also, Linux comes with pre-installed applications and hence you’re good to get started just after installation.

In linux, most of the drivers comes along with the kernel, so you need not go search for a driver whenever you need to use some hardware component.

If you’re just a normal desktop user, with nothing much to do with the CLI – well, Linux comes with various desktops like Gnome, KDE and yep, you can call it “next generation of desktops

Have you ever experienced your OS getting sluggish as days passes, and re-install resolves the problem. Well, try Linux and you will be surprised. It runs fast and responsive for years since day one and hence allow you to concentrate on work, rather on handling OS frustrations.

No backdoors – When you don’t have any idea about source code of an OS, how can you be sure that there are no backdoors. What if the manufacturer company did integrated a backdoor, which would kill your privacy by sharing your data whenever you connect to internet? In Linux, everything is open. And hence no backdoors can be introduced into the OS.

Here comes another interesting fact: Almost every one using windows might have got frustrated for the fact that you need to reboot your machine, whenever you update some software, or the OS itself. Linux doesn’t demand such reboots. Linux is stable and runs perfectly for years without rebooting.

Let the old boxes taste life again – Linux runs perfectly well on even old hardware, unlike other OS which demands you a new hardware, just for the sake of using it.

To compile it all..

why to use illegally, when you’re getting something for free

– Give life to old boxes

– Get started in no time

– update in a go

– No crapware

– No backdoors

– No virus

– Stability

– Compatibility

– Enhanced security

– Fast and responsive

– Linux doesn’t need defragmentation

– Well, choosing linux did have an influence on the environment.  (Google it)

– Free and unlimited support -forums, mailing lists, IRC channels

– Workspaces feature – Next generation of desktops

– No big mess

– Report bugs and get it fixed

– You don’t have to feel alone.

– Contribute something back and feel contended. The joy of giving.

– Other OS are being owned by a company. Microsoft owns windows, Apple owns Mac-OS.

– And Linux? Well, we own it.

Above all, the sense of freedom that you taste – priceless. You gotta experience it, rather just reading.

For me, Linuxing is meditating. How about, for you? 🙂

Well, if you agree with me, cheers! Time to pour linux into your hardware and enjoy the drink.

Well, if you don’t agree with me, cheers, again. For that, to prove me wrong, you need to try it anyway.

Google “Linuxing urban dictionary” and have a laugh 😀

Thanks for reading. Cheers !

– See more at: http://www.unixmen.com/cant-live-without-linux/#sthash.jCINcgyG.dpuf

shortcut key in Linux console

Linux 命令行快捷键

clip_image001

     其实也只是知道其中几个,比如ctrl+a可以跳转到开头,ctrl+e可以跳转到开头,ctrl+r可以快速搜索使用过的命令。

     刚好有人问这个问题,就总结了一下。

搜索操作快捷键

clip_image002

  搜索历史命令的快捷键:Ctrl + r

  它是通过关键字去匹配历史记录,执行后会提示:(reverse-i-search)`’:

  输入你记得的关键字去匹配,如果出现你需要的命令,按Enter就可以选择命令;如果不是请输入更精确的关键字去匹配。

移动操作快捷键

clip_image003

Ctrl + f– 向右移动一个字符,当然多数人用
Ctrl + b–
向左移动一个字符, 多数人用
ESC + f–
向右移动一个单词,MAC下建议用ALT +
ESC + b–
向左移动一个单词,MAC下建议用ALT +
Ctrl + a–
跳到行首
Ctrl + e–
跳到行尾

删除操作快捷键

clip_image004

Ctrl + d– 向右删除一个字符
Ctrl + h–
向左删除一个字符
Ctrl + u–
删除当前位置字符至行首(输入密码错误的时候多用下这个)
Ctrl + k–
删除当前位置字符至行尾
Ctrl + w–
删除从光标到当前单词开头

命令切换操作快捷键

clip_image005

Ctrl + p– 上一个命令,也可以用
Ctrl + n–
下一个命令,也可以用

其他操作快捷键

clip_image006

Ctrl + y– 插入最近删除的单词
Ctrl + c–
终止操作
Ctrl + d–
当前操作转到后台
Ctrl + l–
清屏
(有时候为了好看)

the start sequence of Linux

2013-08-21Linux 的启动流程

Refer from :

http://www.ruanyifeng.com/blog/2013/08/linux_boot_process.html

作者: 阮一峰

日期: 2013817

半年前,我写了《计算机是如何启动的?》,探讨BIOS和主引导记录的作用。

那篇文章不涉及操作系统,只与主板的板载程序有关。今天,我想接着往下写,探讨操作系统接管硬件以后发生的事情,也就是操作系统的启动流程。

clip_image001

这个部分比较有意思。因为在BIOS阶段,计算机的行为基本上被写死了,程序员可以做的事情并不多;但是,一旦进入操作系统,程序员几乎可以定制所有方面。所以,这个部分与程序员的关系更密切。

我主要关心的是Linux操作系统,它是目前服务器端的主流操作系统。下面的内容针对的是Debian发行版,因为我对其他发行版不够熟悉。

第一步、加载内核

操作系统接管硬件以后,首先读入 /boot 目录下的内核文件。

clip_image002

以我的电脑为例,/boot 目录下面大概是这样一些文件:

 

  $ ls /boot

  

  config-3.2.03amd64

  config-3.2.04amd64

  grub

  initrd.img-3.2.03amd64

  initrd.img-3.2.04amd64

  System.map-3.2.03amd64

  System.map-3.2.04amd64

  vmlinuz-3.2.03amd64

  vmlinuz-3.2.04amd64

  

第二步、启动初始化进程

内核文件加载以后,就开始运行第一个程序 /sbin/init,它的作用是初始化系统环境。

clip_image003

由于init是第一个运行的程序,它的进程编号(pid)就是1。其他所有进程都从它衍生,都是它的子进程。

第三步、确定运行级别

许多程序需要开机启动。它们在Windows叫做服务service),在Linux就叫做守护进程daemon)。

init进程的一大任务,就是去运行这些开机启动的程序。但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。Linux允许为不同的场合,分配不同的开机启动程序,这就叫做运行级别runlevel)。也就是说,启动时根据运行级别,确定要运行哪些程序。

clip_image004

Linux预置七种运行级别(0-6)。一般来说,0是关机,1是单用户模式(也就是维护模式),6是重启。运行级别2-5,各个发行版不太一样,对于Debian来说,都是同样的多用户模式(也就是正常模式)。

init进程首先读取文件 /etc/inittab,它是运行级别的设置文件。如果你打开它,可以看到第一行是这样的:

 

  id:2:initdefault:

  

initdefault的值是2,表明系统启动时的运行级别为2。如果需要指定其他级别,可以手动修改这个值。

那么,运行级别2有些什么程序呢,系统怎么知道每个级别应该加载哪些程序呢?……回答是每个运行级别在/etc目录下面,都有一个对应的子目录,指定要加载的程序。

 

  /etc/rc0.d

  /etc/rc1.d

  /etc/rc2.d

  /etc/rc3.d

  /etc/rc4.d

  /etc/rc5.d

  /etc/rc6.d

  

上面目录名中的“rc”,表示run command(运行程序),最后的d表示directory(目录)。下面让我们看看 /etc/rc2.d 目录中到底指定了哪些程序。

 

  $ ls  /etc/rc2.d

  

  README

  S01motd

  S13rpcbind

  S14nfscommon

  S16binfmtsupport

  S16rsyslog

  S16sudo

  S17apache2

  S18acpid

  

  

可以看到,除了第一个文件README以外,其他文件名都是字母S+两位数字+程序名的形式。字母S表示Start,也就是启动的意思(启动脚本的运行参数为start),如果这个位置是字母K,就代表Kill(关闭),即如果从其他运行级别切换过来,需要关闭的程序(启动脚本的运行参数为stop)。后面的两位数字表示处理顺序,数字越小越早处理,所以第一个启动的程序是motd,然后是rpcbingnfs……数字相同时,则按照程序名的字母顺序启动,所以rsyslog会先于sudo启动。

这个目录里的所有文件(除了README),就是启动时要加载的程序。如果想增加或删除某些程序,不建议手动修改 /etc/rcN.d 目录,最好是用一些专门命令进行管理(参考这里这里)。

第四步、加载开机启动程序

前面提到,七种预设的运行级别各自有一个目录,存放需要开机启动的程序。不难想到,如果多个运行级别需要启动同一个程序,那么这个程序的启动脚本,就会在每一个目录里都有一个拷贝。这样会造成管理上的困扰:如果要修改启动脚本,岂不是每个目录都要改一遍?

Linux的解决办法,就是七个 /etc/rcN.d 目录里列出的程序,都设为链接文件,指向另外一个目录 /etc/init.d ,真正的启动脚本都统一放在这个目录中。init进程逐一加载开机启动程序,其实就是运行这个目录里的启动脚本。

clip_image005

下面就是链接文件真正的指向。

 

  $ ls l /etc/rc2.d

  

  README

  S01motd -> ../init.d/motd

  S13rpcbind -> ../init.d/rpcbind

  S14nfscommon -> ../init.d/nfscommon

  S16binfmtsupport -> ../init.d/binfmtsupport

  S16rsyslog -> ../init.d/rsyslog

  S16sudo -> ../init.d/sudo

  S17apache2 -> ../init.d/apache2

  S18acpid -> ../init.d/acpid

  

  

这样做的另一个好处,就是如果你要手动关闭或重启某个进程,直接到目录 /etc/init.d 中寻找启动脚本即可。比如,我要重启Apache服务器,就运行下面的命令:

 

  $ sudo /etc/init.d/apache2 restart

  

/etc/init.d 这个目录名最后一个字母d,是directory的意思,表示这是一个目录,用来与程序 /etc/init 区分。

第五步、用户登录

开机启动程序加载完毕以后,就要让用户登录了。

clip_image006

一般来说,用户的登录方式有三种:

  (1)命令行登录

  (2ssh登录

  (3)图形界面登录

这三种情况,都有自己的方式对用户进行认证。

1)命令行登录:init进程调用getty程序(意为get teletype),让用户输入用户名和密码。输入完成后,再调用login程序,核对密码(Debian还会再多运行一个身份核对程序/etc/pam.d/login)。如果密码正确,就从文件 /etc/passwd 读取该用户指定的shell,然后启动这个shell

2ssh登录:这时系统调用sshd程序(Debian还会再运行/etc/pam.d/ssh ),取代gettylogin,然后启动shell

3)图形界面登录:init进程调用显示管理器,Gnome图形界面对应的显示管理器为gdmGNOME Display Manager),然后用户输入用户名和密码。如果密码正确,就读取/etc/gdm3/Xsession,启动用户的会话。

第六步、进入 login shell

所谓shell,简单说就是命令行界面,让用户可以直接与操作系统对话。用户登录时打开的shell,就叫做login shell

clip_image007

Debian默认的shellBash,它会读入一系列的配置文件。上一步的三种情况,在这一步的处理,也存在差异。

1)命令行登录:首先读入 /etc/profile,这是对所有用户都有效的配置;然后依次寻找下面三个文件,这是针对当前用户的配置。

 

  ~/.bash_profile

  ~/.bash_login

  ~/.profile

  

需要注意的是,这三个文件只要有一个存在,就不再读入后面的文件了。比如,要是 ~/.bash_profile 存在,就不会再读入后面两个文件了。

2ssh登录:与第一种情况完全相同。

3)图形界面登录:只加载 /etc/profile ~/.profile。也就是说,~/.bash_profile 不管有没有,都不会运行。

第七步,打开 non-login shell

老实说,上一步完成以后,Linux的启动过程就算结束了,用户已经可以看到命令行提示符或者图形界面了。但是,为了内容的完整,必须再介绍一下这一步。

用户进入操作系统以后,常常会再手动开启一个shell。这个shell就叫做 non-login shell,意思是它不同于登录时出现的那个shell,不读取/etc/profile.profile等配置文件。

clip_image008

non-login shell的重要性,不仅在于它是用户最常接触的那个shell,还在于它会读入用户自己的bash配置文件 ~/.bashrc。大多数时候,我们对于bash的定制,都是写在这个文件里面的。

你也许会问,要是不进入 non-login shell,岂不是.bashrc就不会运行了,因此bash 也就不能完成定制了?事实上,Debian已经考虑到这个问题了,请打开文件 ~/.profile,可以看到下面的代码:

 

  if [ n $BASH_VERSION ]; then

    if [ f $HOME/.bashrc” ]; then

      . $HOME/.bashrc”

    fi

  fi

  

上面代码先判断变量 $BASH_VERSION 是否有值,然后判断主目录下是否存在 .bashrc 文件,如果存在就运行该文件。第三行开头的那个点,是source命令的简写形式,表示运行某个文件,写成“source ~/.bashrc”也是可以的。

因此,只要运行~/.profile文件,~/.bashrc文件就会连带运行。但是上一节的第一种情况提到过,如果存在~/.bash_profile文件,那么有可能不会运行~/.profile文件。解决这个问题很简单,把下面代码写入.bash_profile就行了。

 

  if [ f ~/.profile ]; then

    . ~/.profile

  fi

  

这样一来,不管是哪种情况,.bashrc都会执行,用户的设置可以放心地都写入这个文件了。

Bash的设置之所以如此繁琐,是由于历史原因造成的。早期的时候,计算机运行速度很慢,载入配置文件需要很长时间,Bash的作者只好把配置文件分成了几个部分,阶段性载入。系统的通用设置放在 /etc/profile,用户个人的、需要被所有子进程继承的设置放在.profile,不需要被继承的设置放在.bashrc

顺便提一下,除了Linux以外, Mac OS X 使用的shell也是Bash。但是,它只加载.bash_profile,然后在.bash_profile里面调用.bashrc。而且,不管是ssh登录,还是在图形界面里启动shell窗口,都是如此。

参考链接

[1] Debian Wiki, Environment Variables

[2] Debian Wiki, Dot Files

[3] Debian Administration, An introduction to run-levels

[4] Debian AdminDebian and Ubuntu Linux Run Levels

[5] Linux Information Project (LINFO), Runlevel Definition

[6] LinuxQuestions.org, What are run levels?

[7] Dalton Hubble, Bash Configurations Demystified

(完)

 

signal

Linux系统编程信号

信号的概念

clip_image001

       信号时提供处理异步事件机制的软件中断。这些事件可以来自系统外部(用户能够通过输入CTRL+cCtrl+\,或者是终端驱动程序分配给信号控制字符的其他任何键来请求内核产生信号;),或者来自程序或内核内部的活动(内核:当进程执行出错时,内核会给进程发送一个信号,例如非法段存取(内存访问违规)、浮点数溢出等;进程:一个进程可以通过系统调用kill给另一个进程发送信号,一个进程可以通过信号和另外一个进程进行通信。由进程的某个操作产生的信号称为同步信号(synchronous signals),例如除0;由象用户击键这样的进程外部事件产生的信号叫做异步信号。(asynchronous signals))。

       这里要注意的是,不仅仅事件的发生是异步的,程序对信号的处理也是异步的。

三个处理信号过程

clip_image002

l  接收默认处理:接收默认处理的进程通常会导致进程本身消亡。例如连接到终端的进程,用户按下CTRL+c,将导致内核向进程发送一个SIGINT的信号,进程如果不对该信号做特殊的处理,系统将采用默认的方式处理该信号,即终止进程的执行;

l  忽略信号:进程可以通过代码,显示地忽略某个信号的处理,例如:signal(SIGINT,SIGDEF);但是某些信号是不能被忽略的;

l  捕捉信号并处理:进程可以事先注册信号处理函数,当接收到信号时,由信号处理函数自动捕捉并且处理信号。

l  注意:有两个信号既不能被忽略也不能被捕捉,它们是SIGKILLSIGSTOP。即进程接收到这两个信号后,只能接受系统的默认处理,即终止线程。

Linux支持的信号列表

可以使用kill –l来查看linux支持的信号列表

clip_image003

信号处理函数的过程:

(1)注册信号处理函数

 信号的处理是由内核来代理的,首先程序通过sigalsigaction函数为每个信号注册处理函数,而内核中维护一张信号向量表,对应信号处理机制。这样,在信号在进程中注销完毕之后,会调用相应的处理函数进行处理。

(2)信号的检测与响应时机

在系统调用或中断返回用户态的前夕,内核会检查未决信号集,进行相应的信号处理。

(3)处理过程:

程序运行在用户态时->进程由于系统调用或中断进入内核->转向用户态执行信号处理函数->信号处理函数完毕后进入内核->返回用户态继续执行程序

 首先程序执行在用户态,在进程陷入内核并从内核返回的前夕,会去检查有没有信号没有被处理,如果有且没有被阻塞就会调用相应的信号处理程序去处理。首先,内核在用户栈上创建一个层,该层中将返回地址设置成信号处理函数的地址,这样,从内核返回用户态时,就会执行这个信号处理函数。当信号处理函数执行完,会再次进入内核,主要是检测有没有信号没有处理,以及恢复原先程序中断执行点,恢复内核栈等工作,这样,当从内核返回后便返回到原先程序执行的地方了。

fork信号

clip_image005

当使用fork()函数时,子进程会继承父进程完全相同的信号语义,这也是有道理的,因为父子进程共享一个地址空间,所以父进程的信号处理程序也存在于子进程中。

 

the meaning of postfix(.a,.la,.o,.so) and realize by programming

linux.a,.la,.o,.so文件的意义和编程实现

后缀含义

Linux下文件的类型是不依赖于其后缀名的,但一般来讲:

l  .o,是目标文件,相当于windows中的.obj文件

l  .so 为共享库,shared object,用于动态连接的,dll差不多

l  .a为静态库,是好多个.o合在一起,用于静态连接

l  .lalibtool自动生成的一些共享库,vi编辑查看,主要记录了一些配置信息。可以用如下命令查看.la文件的格式 $file .la .la: ASCII English text,所以可以用vi来查看其内容。

创建.a库文件和.o库文件:

$ gcc -c a.c

$ ar -rc a.a a.o

ar: creating a.a

动态库的编译

假定有三个.c文件:a.cb.cc.c,我们将这几个文件编译成一个动态库:libtest.so

$ gcc a.c b.c c.c -fPIC -shared -o libtest.so

动态库的链接

在上面,我们已经成功生成了一个自己的动态链接库libtest.so,下面我们通过一个程序来调用这个库里的函数。程序的源文件为:test.c

l test.c与动态库libtest.so链接生成执行文件test

$ gcc test.c -L. -ltest -o test

l 测试是否动态连接,如果列出libtest.so,那么应该是连接正常了

$ ldd test

l 执行test,可以看到它是如何调用动态库中的函数的。

编译参数解析

最主要的是GCC命令行的一个选项:

-shared 该选项指定生成动态连接库(让连接器生成T类型的导出符号表,有时候也生成弱连接W类型的导出符号),不用该标志外部程序无法连接。相当于一个可执行文件

-fPIC表示编译为位置独立的代码,不用此选项的话编译后的代码是位置相关的所以动态载入时是通过代码拷贝的方式来满足不同进程的需要,而不能达到真正代码段共享的目的,所以动态库必须要有此选项

-L.:表示要连接的库在当前目录中

-ltest:编译器查找动态连接库时有隐含的命名规则,即在给出的名字前面加上lib,后面加上.so来确定库的名称

LD_LIBRARY_PATH:这个环境变量指示动态连接器可以装载动态库的路径。

当然如果有root权限的话,可以修改/etc/ld.so.conf文件,然后调用 /sbin/ldconfig来达到同样的目的,不过如果没有root权限,那么只能采用输出LD_LIBRARY_PATH的方法了。

注意

调用动态库的时候有几个问题会经常碰到,有时,明明已经将库的头文件所在目录 通过 “-I” include进来了,库所在文件通过“-L”参数引导,并指定了“-l”的库名,但通过ldd命令察看时,就是死活找不到你指定链接的so文件,这时你要作的就是通过修改LD_LIBRARY_PATH或者/etc/ld.so.conf文件来指定动态库的目录。通常这样做就可以解决库无法链接的问题了。

makefile里面怎么正确的编译和连接生成.so库文件,然后又是在其他程序的makefile里面如何编译和连接才能调用这个库文件的函数:我们需要告诉动态链接器、加载器ld.so在哪里才能找到这个共享库,可以设置环境变量把库的路径添加到库目录/lib/usr/libLD_LIBRARY_PATH=$(pwd),这种方法采用命令行方法不太方便,一种替代方法

LD_LIBRARY_PATH可以在/etc/profile还是 ~/.profile还是 ./bash_profile里设置,或者.bashrc里,改完后运行source /etc/profile . /etc/profile更好的办法是

添入/etc/ld.so.conf, 然后执行 /sbin/ldconfig