背景:
root@119.10.6.23:/usr/local/php# ps aux|grep watchdog
root         6  0.0  0.0      0     0 ?        S    Aug28   4:50 [watchdog/0]
root        10  0.0  0.0      0     0 ?        S    Aug28   4:11 [watchdog/1]
root        14  0.0  0.0      0     0 ?        S    Aug28   3:58 [watchdog/2]
root        18  0.0  0.0      0     0 ?        S    Aug28   3:36 [watchdog/3]
附:
最简单的安装教程(CentOS)
yum install watchdog -y
modprobe softdog
chkconfig watchdog  on
/etc/init.d/watchdog start

配置看门狗程序,开机自动运行
chkconfig watchdog on
启动看门狗
sudo /etc/init.d/watchdog start
——————————————————————————————————————
     Linux 自带了一个 watchdog 的实现,用于监视系统的运行,包括一个内核 watchdog module 和一个用户空间的 watchdog 程序。内核 watchdog 模块通过 /dev/watchdog 这个字符设备与用户空间通信。用户空间程序一旦打开 /dev/watchdog 设备(俗称“开门放狗”),就会导致在内核中启动一个1分钟的定时器(系统默认时间),此后,用户空间程序需要保证在1分钟之内向这个设备写入数据(俗称“定期喂狗”),每次写操作会导致重新设定定时器。如果用户空间程序在1分钟之内没有写操作,定时器到期会导致一次系统 reboot 操作(“狗咬人了”呵呵)。通过这种机制,我们可以保证系统核心进程大部分时间都处于运行状态,即使特定情形下进程崩溃,因无法正常定时“喂狗”,Linux系统在看门狗作用下重新启动(reboot),核心进程又运行起来了。多用于嵌入式系统。


打开 /dev/watchdog 设备(“开门放狗”):


每隔一段时间向 /dev/watchdog 设备写入数据(“定期喂狗”):


关闭 /dev/watchdog 设备,通常不需要这个步骤:


所需头文件:



转自:http://blog.csdn.net/liigo/article/details/9227205
摘自:http://bbs.linuxtone.org/thread-19567-1-1.html
摘自:http://wjjchen.blog.163.com/blog/static/1628722201342354415584/
【解决方案】
在/etc/sudoers中修改:
Defaults    env_reset
为:
Defaults    !env_reset

一)这样,任何环境变量都可以通过sudo传进去了。
二)那你就把变量写到那个脚本里面去好了,sudo肯定是不会带这个用户的变量过去的,因为两个用户不一样,除非你通过sudo的时候加export去携带。
三)su - -c "命令集"

不过我希望的是,能够不改我的脚本,通过修改系统配置的方式把环境变量传进去。
以前好像通过在/etc/sudoers中配置env_reset和env_keep的方式搞定过。。。
那你直接写到/etc/profile里面不就得了

搞定了!在/etc/sudoers中修改:
Defaults    env_reset
为:
Defaults    !env_reset

这样,任何环境变量都可以通过sudo传进去了。

来自:http://bbs.chinaunix.net/thread-1920936-1-1.html
背景:经常碰到文件修改后才发现没有权限,而事先又没有使用sudo来编辑,有没办法实现保存此次修改不退出再sudo,也不存放临文件?
如:
root用户:
vi /tmp/tee.txt 写上123,保存退出后,再:
chmod -R 755 /tmp/tee.txt  
我再su xiangdong,打开这个文件,然后修改下,想保存,就会提示:E45: 'readonly' option is set (add ! to override)
你听vi提示后,真整个: w!  ,于是又提示你:
"tee.txt" E212: Can't open file for writing
Press ENTER or type command to continue
是不是很搞笑???下面扯了老半天,其说的就是这个问题。

root建立文件,属于root的,它再755后是一个什么状态分析起:
u g o :用户,组,其它!
R w X :读  ,写,执行!
4 2 1 : 4    , 2 ,   1   !
755,也就是说,root是啥都能干,组和其他只能是4+1,及是:读+执行,写2没有这个权限值。你是xiangdong,想修改当然不让修改了。
网上说是这样能摆平,如下:
:w !sudo tee %                                                                                                                                            
[sudo] password for xiangdong:
输入密码这儿
121
jack

Press ENTER or type command to continue  
于是按提示按下enter回车出现下面提示:
W12: Warning: File "tee.txt" has changed and the buffer was changed in Vim as well
See ":help W12" for more info.
[O]K, (L)oad File:
于是再按提示按L键出现(此时已经保存进去了。):
121
jack
"tee.txt" [readonly] 3L, 10C
xiangodng用户退出该vim后,再打开,确实保存成功了。
输入密码折腾一下验证确实是保存了的,经实践确实是可以的,下面就开始整这个是怎么实现的,我对此不太感兴趣,仅仅摘录如下:
——————————————————————————————————————————————————————————
在Linux上工作的朋友很可能遇到过这样一种情况,当你用Vim编辑完一个文件时,运行:wq保存退出,突然蹦出一个错误:
E45: 'readonly' option is set (add ! to override)

这表明文件是只读的,按照提示,加上!强制保存::w!,结果又一个错误出现:
"readonly-file-name" E212: Can't open file for writing

文件明明存在,为何提示无法打开?这错误又代表什么呢?查看文档:help E212:
For some reason the file you are writing to cannot be created or overwritten. The reason could be that you do not have permission to write in the directory or the file name is not valid.

原来是可能没有权限造成的。此时你才想起,这个文件需要root权限才能编辑,而当前登陆的只是普通用户,在编辑之前你忘了使用sudo来启动Vim,所以才保存失败。于是为了防止修改丢失,你只好先把它保存为另外一个临时文件temp-file-name,然后退出Vim,再运行sudo mv temp-file-name readonly-file-name覆盖原文件。

用vi修改文件,保存文件时,提示“readonly option is set”的解决方法:
This is a vim issue, not a file permission issue. If you did not have read permission on the file, you'd see a "Permission denied" error.

Do you invoke vi/vim with the -R option? Are you calling view instead of vi or vim? Do you have set readonly in your .vimrc or in a file in ~/.vim/ftplugin?

In vim you can enter :set noreadonly to unset the readonly flag.

步骤:

1.按Esc键

2.输入  :set noreadonly

3.然后就能正常保存了,你可以输入 :wq 来保存文件了。
来自:http://blog.csdn.net/longerandlonger/article/details/7266055

=============================================================================

目录
解决方案
Vim中执行外部命令
命令的另一种表示形式
%的意义
tee的作用
命令执行之后
更简单的方案:映射
另一种思路
重定向的问题
重定向方案
写在结尾
但这样操作过于繁琐。而且如果只是想暂存此文件,还需要接着修改,则希望保留Vim的工作状态,比如编辑历史,buffer状态等等,该怎么办?能不能在不退出Vim的情况下获得root权限来保存这个文件?

解决方案
答案是可以,执行这样一条命令即可:

:w !sudo tee %

接下来我们来分析这个命令为什么可以工作。首先查看文档:help :w,向下滚动一点可以看到:


把这个使用方法对应前面的命令,如下所示:


我们并未指定range,参见帮助文档最下面一行,当range未指定时,默认情况下是整个文件。此外,这里也没有指定opt。

Vim中执行外部命令
接下来是一个叹号!,它表示其后面部分是外部命令,即sudo tee %。文档中说的很清楚,这和直接执行:!{cmd}是一样的效果。后者的作用是打开shell执行一个命令,比如,运行:!ls,会显示当前工作目录下的所有文件,这非常有用,任何可以在shell中执行的命令都可以在不退出Vim的情况下运行,并且可以将结果读入到Vim中来。试想,如果你要在Vim中插入当前工作路径或者当前工作路径下的所有文件名,你可以运行:

:r !pwd或:r !ls
此时所有的内容便被读入至Vim,而不需要退出Vim,执行命令,然后拷贝粘贴至Vim中。有了它,Vim可以自由的操作shell而无需退出。

命令的另一种表示形式
再看前面的文档:

Execute {cmd} with [range] lines as standard input
所以实际上这个:w并未真的保存当前文件,就像执行:w new-file-name时,它将当前文件的内容保存到另外一个new-file-name的文件中,在这里它相当于一个另存为,而不是保存。它将当前文档的内容写到后面cmd的标准输入中,再来执行cmd,所以整个命令可以转换为一个具有相同功能的普通shell命令:

$ cat readonly-file-name | sudo tee %
这样看起来”正常”些了。其中sudo很好理解,意为切换至root执行后面的命令,tee和%是什么呢?

%的意义
我们先来看%,执行:help cmdline-special可以看到:



在执行外部命令时,%会扩展成当前文件名,所以上述的cmd也就成了sudo tee readonly-file-name。此时整个命令即:

$ cat readonly-file-name | sudo tee readonly-file-name
注意:在另外一个地方我们也经常用到%,没错,替换。但是那里%的作用不一样,执行:help :%查看文档:


在替换中,%的意义是代表整个文件,而不是文件名。所以对于命令:%s/old/new/g,它表示的是替换整篇文档中的old为new,而不是把文件名中的old换成new。

tee的作用
现在只剩一个难点: tee。它究竟有何用?维基百科上对其有一个详细的解释,你也可以查看man page。下面这幅图很形象的展示了tee是如何工作的:

点击在新窗口中浏览此图片
ls -l的输出经过管道传给了tee,后者做了两件事,首先拷贝一份数据到文件file.txt,同时再拷贝一份到其标准输出。数据再次经过管道传给less的标准输入,所以它在不影响原有管道的基础上对数据作了一份拷贝并保存到文件中。看上图中间部分,它很像大写的字母T,给数据流动增加了一个分支,tee的名字也由此而来。

现在上面的命令就容易理解了,tee将其标准输入中的内容写到了readonly-file-name中,从而达到了更新只读文件的目的。当然这里其实还有另外一半数据:tee的标准输出,但因为后面没有跟其它的命令,所以这份输出相当于被抛弃。当然也可以在后面补上> /dev/null,以显式的丢弃标准输出,但是这对整个操作没有影响,而且会增加输入的字符数,因此只需上述命令即可。

命令执行之后
运行完上述命令后,会出现下面的提示:

Vim提示文件更新,询问是确认还是重新加载文件。建议直接输入O,因为这样可以保留Vim的工作状态,比如编辑历史,buffer等,撤消等操作仍然可以继续。而如果选择L,文件会以全新的文件打开,所有的工作状态便丢失了,此时无法执行撤消,buffer中的内容也被清空。

更简单的方案:映射
上述方式非常完美的解决了文章开始提出的问题,但毕竟命令还是有些长,为了避免每次输入一长串的命令,可以将它映射为一个简单的命令加到.vimrc中:


这样,简单的运行:w!!即可。命令后半部分> /dev/null在前面已经解释过,作用为显式的丢掉标准输出的内容。

另一种思路
至此,一个比较完美但很tricky的方案已经完成。你可能会问,为什么不用下面这样更常见的命令呢?这不是更容易理解,更简单一些么?

:w !sudo cat > %
重定向的问题
我们来分析一遍,像前面一样,它可以被转换为相同功能的shell命令:

$ cat readonly-file-name | sudo cat > %
这条命令看起来一点问题没有,可一旦运行,又会出现另外一个错误:

/bin/sh: readonly-file-name: Permission denied  shell returned 1
这是怎么回事?不是明明加了sudo么,为什么还提示说没有权限?稍安勿躁,原因在于重定向,它是由shell执行的,在一切命令开始之前,shell便会执行重定向操作,所以重定向并未受sudo影响,而当前的shell本身也是以普通用户身份启动,也没有权限写此文件,因此便有了上面的错误。

重定向方案
这里介绍了几种解决重定向无权限错误的方法,当然除了tee方案以外,还有一种比较方便的方案:以sudo打开一个shell,然后在该具有root权限的shell中执行含重定向的命令,如:

:w !sudo sh -c 'cat > %'
可是这样执行时,由于单引号的存在,所以在Vim中%并不会展开,它被原封不动的传给了shell,而在shell中,一个单独的%相当于nil,所以文件被重定向到了nil,所有内容丢失,保存文件失败。

既然是由于%没有展开导致的错误,那么试着将单引号'换成双引号"再试一次:
:w !sudo sh -c "cat > %"
成功!这是因为在将命令传到shell去之前,%已经被扩展为当前的文件名。有关单引号和双引号的区别可以参考这里,简单的说就是单引号会将其内部的内容原封不动的传给命令,但是双引号会展开一些内容,比如变量,转义字符等。

当然,也可以像前面一样将它映射为一个简单的命令并添加到.vimrc中:

注意:这里不再需要把输出重定向到/dev/null中。

写在结尾
至此,借助Vim强大的灵活性,实现了两种方案,可以在以普通用户启动的Vim中保存需root权限的文件。两者的原理类似,都是利用了Vim可以执行外部命令这一特性,区别在于使用不同的shell命令。如果你还有其它的方案,欢迎给我留言。
来自:
http://www.kuqin.com/shuoit/20140731/341487.html
http://blog.csdn.net/xinhaozheng/article/details/5756838
http://segmentfault.com/q/1010000000130006
linxu中vim作为crontab -e的默认编辑器设置方法,
希望些方法对各位同学会有所帮助,设置命令很简单,代码如下:





vim /etc/bash.bashrc 或者 vim .bashrc
添加一行

    export EDITOR=vim

保存退出

pi@raspberrypi:~$ vi /home/pi/.bashrc
export EDITOR=vim


FreeBSD,实践OK:
setenv EDITOR /usr/local/bin/vim

vi /root/.cshrc
setenv  EDITOR  vi
setenv  PAGER   more
setenv  BLOCKSIZE   K
setenv  EDITOR /usr/local/bin/vim  

From:https://serverfault.com/questions/19843/change-default-crontab-editor-to-nano-in-freebsd
top使用_交互命令:
1、输入1可以看到CPU各个核的CPU负载(us,sy,id,wa等)
2、输入shift+p按CPU占用率排序
3、shift+m按内存占用率排序,
4 u然后输入用户名,查看指定用户的进程信息,shift+t按CPU用时排序,shift+n按PID排序  

重点讲下第一条:
1、输入1可以看到CPU各个核的CPU负载

Cpu0 : 1.0%us, 3.0%sy, 0.0%ni, 96.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st
Cpu1 : 0.0%us, 0.0%sy, 0.0%ni,100.0%id, 0.0%wa, 0.0%hi, 0.0%si, 0.0%st

这里对us,sy,ni,id,wa,hi,si,st进行分别说明:

us  列显示了用户模式下所花费 CPU 时间的百分比。

      us的值比较高时,说明用户进程消耗的cpu时间多,但是如果长期大于50%,需要考虑优化用户的程序。

sy   列显示了内核进程所花费的cpu时间的百分比。

      这里us + sy的参考值为80%,如果us+sy 大于 80%说明可能存在CPU不足。
ni   列显示了用户进程空间内改变过优先级的进程占用CPU百分比。

id   列显示了cpu处在空闲状态的时间百分比。

wa 列显示了IO等待所占用的CPU时间的百分比。

     这里wa的参考值为30%,如果wa超过30%,说明IO等待严重,这可能是磁盘大量随机访问造成的,也可能磁盘或者磁盘访问控制器的带宽瓶颈造成的(主要是块操作)。   //这个wa和vmstat中的wa是相同含义

hi   硬件中断占用CPU

si   软件中断占用CPU

st  丢失时间占用CPU

在后台服务器开发中需要关注us,sy,id,wa等常用指标。

更多:http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552012017105732762/
背景:对于大公司的同步,可能会采用zoomkeeper作肿裁加agent下发shell命令实现,而对于小公司,大都采用linux下有一个叫rsync这样的加上notice作同步。
如何杀死rsync的同步进程d:



阅读全文
背景:群里说到,没有注意,自己升级了下自己的vps服务器,后来公司要求也升级下线上服务器,才知事情严重,为过好国庆升级是必要 的,听说苹果系统说自己系统尽管也用这个bash,如果没有设置高级什么的,不存在此漏洞。

Bash 远程任意代码执行安全漏洞(最严重漏洞)
US-CERT 意识到 Bash 存在一个安全的漏洞,该漏洞直接影响基于 Unix 的系统(如 Linux、OS X 等)。该漏洞将导致远程攻击者在受影响的系统上执行任意代码。
US-CERT 建议用户和管理员重新检查这篇红帽的安全博客。更多的详情只能参考相应 Linux 发行商以获取相应补丁。
你可以使用如下命令来检查系统存在此漏洞:
env x='() { :;}; echo vulnerable' bash -c "echo this is a test"
受影响的系统包括:
CentOS
Debian
Redhat
Ubuntu
红帽系可通过更新 bash 并重启系统来解决这个问题:
# yum update bash
或者:
# yum update bash-4.1.2-15.el6_5.1
此举只是更新了 bash 包,还需要重启系统才能生效。

Ubuntu 用户可以通过如下命令打补丁,无需重启:
apt-get update
apt-get install bash

______________________________
[root@jackxiang ~]# rpm -qa|grep bash
bash-4.1.2-15.el6_5.1.x86_64

背景:想加个内存,Mysql服务器上的内存不够了,就算可以插(插槽都有,现在是4条4G内存,还有空闲八个槽。),不知道兼不兼容,否则不稳定的,不兼容的话,死的更惨,这个不一定了,停产了,就没有办法了。怎么办?得看内存的品牌及型号。
[root@jackxiang ~]# rpm -qa|grep dmidecode
dmidecode-2.11-2.el6.x86_64
[root@jackxiang ~]# dmidecode    
查看服务器型号、序列号:
[root@jackxiang ~]# dmidecode|grep "System Information" -A9|egrep  "Manufacturer|Product|Serial"  
        Manufacturer: VMware, Inc.
        Product Name: VMware Virtual Platform
        Serial Number: VMware-42 18 c8 32 77 c6 ec 16-3f 31 94 e9 d0 34 a6 ac
Linux 查看内存的插槽数,已经使用多少插槽.每条内存多大:
[root@jackxiang ~]# dmidecode|grep -A5 "Memory Device"|grep Size|grep -v Range
        Size: 4096 MB
        Size: 2048 MB
        Size: No Module Installed
        Size: No Module Installed

Linux 查看内存的频率:
[root@localhost htdocs]# dmidecode|grep -A16 "Memory Device"|grep 'Speed'
        Speed: 667 MHz (1.5 ns)
        Speed: 667 MHz (1.5 ns)
        Speed: 667 MHz (1.5 ns)
        Speed: 667 MHz (1.5 ns)
        Speed: Unknown

在linux查看内存型号的命令:
dmidecode -t memory

查看主板型号:
dmidecode |grep -A16 "System Information$"

内存槽及内存条:
dmidecode |grep -A16 "Memory Device$"

硬盘:
fdisk -l
smartctl -a /dev/sda

网卡:
mii-tool
————————————————————————————————————————————————————
dmidecode|grep -P 'Maximum\s+Capacity'    //最大支持几G内存
# cat  /proc/cpuinfo //查看cpu个数与频率
# dmidecode  |grep  "Product Name"  //查看服务器品牌和型号
# dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range       //总共几个插槽,已使用几个插槽
Size: 1024 MB       //此插槽有1根1G内存
Size: 1024 MB       //此插槽有1根1G内存
Size: 1024 MB       //此插槽有1根1G内存
Size: 1024 MB       //此插槽有1根1G内存
Size: No Module Installed       //此插槽未使用
Size: No Module Installed       //此插槽未使用

# dmidecode -t 17        //数字17是dmidecode的参数,本文最后有其他数字参数
dmidecode 2.7
SMBIOS 2.4 present.
Handle 0x0015, DMI type 17, 27 bytes.
Memory Device
  Array Handle: 0x0013
  Error Information Handle: Not Provided
  Total Width: 72 bits
  Data Width: 64 bits
  Size: 2048 MB 【插槽1有1条2GB内存】
  Form Factor: DIMM
  Set: None
  Locator: DIMM00
  Bank Locator: BANK
  Type: Other
  Type Detail: Other
  Speed: 667 MHz (1.5 ns)
  Manufacturer:
  Serial Number: BZACSKZ001
  Asset Tag: RAM82
  Part Number: MT9HTF6472FY-53EA2
Handle 0x0017, DMI type 17, 27 bytes.
Memory Device
  Array Handle: 0x0013
  Error Information Handle: Not Provided
  Total Width: 72 bits
  Data Width: 64 bits
  Size: 2048 MB 【插槽2有1条2GB内存】
  Form Factor: DIMM
  Set: None
  Locator: DIMM10
  Bank Locator: BANK
  Type: Other
  Type Detail: Other
  Speed: 667 MHz (1.5 ns)
  Manufacturer:
  Serial Number: BZACSKZ001
  Asset Tag: RAM83
  Part Number: MT9HTF6472FY-53EA2
Handle 0x0019, DMI type 17, 27 bytes.
Memory Device
  Array Handle: 0x0013
  Error Information Handle: Not Provided
  Total Width: 72 bits
  Data Width: 64 bits
  Size: 2048 MB 【插槽3有1条2GB内存】
  Form Factor: DIMM
  Set: None
  Locator: DIMM20
  Bank Locator: BANK
  Type: Other
  Type Detail: Other
  Speed: 667 MHz (1.5 ns)
  Manufacturer:
  Serial Number: BZACSKZ001
  Asset Tag: RAM84
  Part Number: MT9HTF6472FY-53EA2
Handle 0x001B, DMI type 17, 27 bytes.
Memory Device
  Array Handle: 0x0013
  Error Information Handle: Not Provided
  Total Width: 72 bits
  Data Width: 64 bits
  Size: 2048 MB 【插槽4有1条2GB内存】
  Form Factor: DIMM
  Set: None
  Locator: DIMM30
  Bank Locator: BANK
  Type: Other
  Type Detail: Other
  Speed: 667 MHz (1.5 ns)
  Manufacturer:
  Serial Number: BZACSKZ001
  Asset Tag: RAM85
  Part Number: MT9HTF6472FY-53EA2

实践来源:
http://www.jbxue.com/LINUXjishu/10053.html
http://www.linuxsir.org/bbs/thread309696.html
http://xclinux.diandian.com/post/2013-04-16/40049844350
FreeBSD 在 RPi 2上的用户名和密码:
默认的密码是 freebsd/freebsd 和 root/root

FreeBSD系统中无线网络连接无线网卡:
http://www.111cn.net/sys/freebsd/59534.htm
本篇文章来源于 Linux公社网站(www.linuxidc.com)  原文链接:http://www.linuxidc.com/Linux/2015-12/126724.htm

FreeBSD 11-CURRENT on Raspberry Pi Apache 2.4/MySQL 5.6/PHP 5.6, 如何在树莓派 2B 上安装 FreeBSD及网络配置:
http://jackxiang.com/post/8455/

定制Raspberry Pi网站:
http://www.embest-tech.cn/pi-customization/

FreeBSD has supported Raspberry Pi since November 2012, and the current production version (FreeBSD 10) is available as a pre-built image which can be copied onto a memory card.

Download the latest image file from the official FreeBSD ARM page. This page has images for other ARM-based boards like the Beaglebone and the Pandaboard. You need to download an image for the “RPI-B”: for example “FreeBSD-10.0-RELEASE-arm-armv6-RPI-B-20140131-r260789.img.bz2”
摘自 : https://www.maketecheasier.com/freebsd-on-raspberry-pi/

DRAM:  944 MiB
WARNING: Caches not enabled
RPI 2 Model B
MMC:   bcm2835_sdhci: 0
reading uboot.env

修改raspberry pi上安装的freebsd可用内存大小:
http://blog.sina.com.cn/s/blog_a0aacb430101mj69.html


background:Freebsd是真正的Unix血统的Os,其稳定性是顶级的,真正的坚如磐石。在树莓派下也有ARM版本了,最新稳定版本:
ftp://ftp6.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/10.0//FreeBSD-10.0-STABLE-arm-armv6-RPI-B-20140822-r270340.img.bz2  
CheckSum:
ftp://ftp6.freebsd.org/pub/FreeBSD/snapshots/arm/armv6/ISO-IMAGES/10.0/CHECKSUM.SHA256-10.0-STABLE-arm-armv6-RPI-B-20140822-r270340




三、FreeBSD 11 on Raspberri pi 2(树莓派 2 安装 FreeBSD 11)  :
A note for my own installation.(树莓派 2 安装 FreeBSD 11)
I tried compiling the FreeBSD 11 by myself, but I found there are ready-to-use systems here.
1. Identify your SD card:
# df -h
you will see the result as
de>/dev/mmcblk0p1de> or de>/dev/sdb1de> or something is different from /sda.

2. Unmount the card
# umount de>/dev/mmcblk0p1de> or de>/dev/sdb1de>

3. Copy your image file to the card, (Very important! DO NOT add the partition number p1 or 1, just use the whole card de>mmcblk0 or sdbde>)
# dd bs=4M if=your-freebsd-rpi2-image.img of=/dev/de>mmcblk0de>

4. First boot
After the raspberry pi 2 is powered on, you need login using user name : root, you need also set the password
# passwd

5.Increase swap space
# dd if=/dev/zero of=/usr/swap0 bs=1m count=1024
# chmod 0600 /usr/swap0
# echo 'md99 none swap sw,file=/usr/swap0 0 0' >> /etc/fstab
# swapon -aq

*系统目前很卡,还是不建议安装。感觉Raspbian 还是最流畅的。
来自:http://rhuta.blog.163.com/blog/static/17757006220154129421478/
阅读全文
Q: 我正在写一个unix server程序,不是daemon,经常需要在命令行上重启它,绝大多数时候工作正常,但是某些时候会报告"bind: address in use",于是重启失败。
A: Andrew Gierth
server程序总是应该在调用bind()之前设置SO_REUSEADDR套接字选项。至于TIME_WAIT状态,你无法避免,那是TCP协议的一部分。阅读全文
这个相当于windows里的启动项
vi  /etc/rc.d/rc.local
按i
然后把你的命令贴进去 ,一行一条命令
/bin/bash /usr/local/scripts/autoStartNginxEnterSSLKey.sh
然后按 esc
再 :wq 保存  注意前面有两点的冒号
下次重启的时候这个就会自动执行你添加的命令。



vi /usr/local/scripts/autoStartNginxEnterSSLKey.sh


./startNginx.sh
cat ./startNginx.sh
/usr/local/nginx/sbin/nginx

来自:http://zhidao.baidu.com/link?url=D7tZLZFqg7LODR60qIkvAeoSk-ocjBWgLppmxkHh_gSxH3AvOkZ_S9SxTj-C50espCswUiYZRK9F4JYi2nVC8K
  最近一直在看《Linux程序设计(第3版)》,照着书上的代码原封不动地敲上去,编译后就出现了à警告:隐式声明与内建函数’exit’不兼容。
警告:隐式声明与内建函数‘exit’不兼容



       原因其实很简单了,没有把stdlib.h包含进来,加上就没问题了。后来google搜索的时候发现网上很多人有这个问题,今天来记下这个问题的解决方案。

以此类推,编译后出现警告:隐式声明与内建函数’XXX’不兼容的问题所在都是因为没有包含相应的头文件,加上就OK!

来自:http://blog.csdn.net/monkey_d_meng/article/details/5565667
背景:有时在重启时出现nginx启动比sshd还快,导致加了ssh启动nginx要密码(后来去了),卡在那儿起不来,作为vps,打电话太麻烦了,于是否,能不定定个顺序,可能好一些。
  我们知道,在Linux系统中,系统服务的启动脚本一般放在/etc/init.d目录下。不同的开机模式,则分别对应到/etc/rcx.d目录下。其实/etc/rcx.d上的文件,一般都是链接到/etc/init.d目录下的对应文件的。我们还知道,/etc/rcx.d下的文件名,是以S+数字或K+数字打头的,这里的S表示启动,K表示关闭,数值其后面的数值则表示服务启动或服务退出时的次序。那么,这些数值是怎样来的呢?是不是需要在/etc/rcx.d下去修改文件名呢?答案是否定的。那应该怎么做呢?

        打开/etc/init.d下的脚本,查找类似下面的一句:

        #chkconfig: 2345 64 36

        这里的64,就是启动的顺序值,36则是退出的顺序值,如果需要改变顺序,就在这里改。然后执行下面的命令:

        #chkconfig --del servicename

        #chkconfig --add servicename

        #chkconfig servicename on



        servicename对应您的服务名称。

来自:http://blog.csdn.net/yetyongjin/article/details/7050068

实践如下:
vi /var/log/boot.log
Starting mcelog daemon
^[[60G[^[[0;32m  OK  ^[[0;39m]^MStarting php-fpm  done
Starting nginx...  done
Starting sshd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M
Starting xinetd: ^[[60G[^[[0;32m  OK  ^[[0;39m]^M
Starting MySQL^[[60G[^[[0;32m  OK  ^[[0;39m]^M

vi /etc/init.d/sshd
# chkconfig: 2345 55 25
vi /etc/init.d/nginx
# chkconfig: 2345 55 25
于是作下调整如下:
vi /etc/init.d/sshd
# chkconfig: 2345 5425
linux在启动过程中都干了些什么,都有哪些程序被调用,是不是看系统的启动日志就可以?启动日志是哪个文件?
终端运行下就知道了
dmesg | less
启动的文件日志
less /var/log/boot.log
其他日至都在/var/log里

less /var/log/boot.log
less /var/log/dmesg

http://bbs.chinaunix.net/thread-2140832-1-1.html
1)stop vnc server from linux terminal:
~/stopvncserver.sh


2)start vnc server from linux terminal:
~/startvncserver.sh


真实实践:
一)实践没有问题的脚本:
cat /root/startvncserver.sh  


二)vnc的端口情况(如何修改linux里的VNC的默认端口5901):


三)Iptable得放开这个端口,否则连接不上:

总论详细文章Url:http://www.tuicool.com/articles/zQrQNz

1.安装xwindow system
#yum groupinstall "X Window System"
2.安装GNOME
#yum groupinstall "Desktop"
3.安装中文支持
#yum groupinstall chinese-support
4.修改启动级别为5
#vi /etc/inittab
改default 5

来自:http://javacxn.blog.163.com/blog/static/1832776420139269545905/

Centos 6.4 安装 vnc:
安装:vnc
sudo yum install tigervnc  tigervnc-server
安完后先设置密码:
vncpasswd

启动:
vncserver :1
查看:
vncserver -list
杀死进程 :
vncserver -kill :1

远程连接:
用vnc软件,之后输入地址,如:mycclove.oicp.net:5901
119.10.6.23:5901

第二个屏则是:
119.10.6.23:2
1152x864

注意一点:需要在iptables中添加一条规则
-A INPUT -m state --state NEW -m tcp -p tcp --dport 5901 -j ACCEPT


========================
补充:
在windows下连接vnc有一个vncviewer软件,我在ubuntu中有现成的软件, 在CentOS中安装tigervnc后就出现了vncviewer的命令,就可以连接到服务器的vnc了。

连接之后黑屏:
把 用户下面的.vnc/目录下的xstartup添加777权限

来自:http://blog.sina.com.cn/s/blog_6c9d65a10101dyt0.html


设置VNC服务随系统启动自动加载
第一种方法:使用“ntsysv”命令启动图形化服务配置程序,在vncserver服务前加上星号,点击确定,配置完成。
第二种方法:使用“chkconfig”在命令行模式下进行操作,命令使用如下(预知chkconfig详细使用方法请自助式man一下)
[root@testdb ~]# chkconfig vncserver on
[root@testdb ~]# chkconfig --list vncserver
vncserver       0:off   1:off   2:on    3:on    4:on    5:on    6:off

摘自:http://blog.csdn.net/alvin969/article/details/6170884

附加:http://www.linuxidc.com/Linux/2012-11/73471.htm
1、which  vncserver  得到VNC Server运行脚本所在位置。
RHEL5默认为:/usr/bin/vncserver
2、使用vi打开vncserver
vi /usr/bin/vncserver
3、查找到默认的分辨率:1024X768,然后进行修改。该行在注释结束的第一段参数部分。根据实际使用显示器的分辨率,修改该参数。
4、修改完vncserver后,重新执行vncserver时即以新的分辨率开始。
5、验证:ps -ef | grep vnc,可以看到所显示的分辨率参数为修改后的参数。
来自姜源兄弟的博客:
http://blog.vetcafe.net/2013/12/
由于 KVM 支持全虚拟,所以可以在上面安装各类操作系统,再加上它跟FreeBSD的jail一样,属于系统自带的,我们可以用其搭建属于自己的开发展测试环境。阅读全文


【需求】
不影响服务器处理的前提下,检测客户端程序是否被强制终了。
【现状】
服务器端和客户端的Socket都设定了keepalive属性。
服务器端设定了探测次数等参数,客户端、服务器只是打开了keepalive机能
服务器端起了一个监视线程,利用select来检测socket是否被关闭。。。

下面这是我的一点肤浅理解。

1.关于keep alive

无论windows,还是linux,keepalive就三个参数:

    sk->keepalive_probes:探测次数
    sk->keepalive_time   探测的超时
    sk->keepalive_intvl 探测间隔

对 于一个已经建立的tcp连接。如果在keepalive_time时间内双方没有任何的数据包传输,则开启keepalive功能的一端将发送 eepalive数据包,若没有收到应答,则每隔keepalive_intvl时间再发送该数据包,发送keepalive_probes次。一直没有 收到应答,则发送rst包关闭连接。若收到应答,则将计时器清零。例如★:

    sk->keepalive_probes = 3;
    sk->keepalive_time   = 30;
    sk->keepalive_intvl = 1;

意 思就是说对于tcp连接,如果一直在socket上有数据来往就不会触发keepalive,但是如果30秒一直没有数据往来,则keep alive开始工作:发送探测包,受到响应则认为网络,是好的,结束探测;如果没有相应就每隔1秒发探测包,一共发送3次,3次后仍没有相应,
就 关闭连接,也就是从网络开始断到你的socket能够意识到网络异常,最多花33秒。但是如果没有设置keep alive,可能你在你的socket(阻塞性)的上面,接收: recv会一直阻塞不能返回,除非对端主动关闭连接,因为recv不知道socket断了。发送:取决于数据量的大小,只要底层协议站的buffer能放 下你的发送数据,应用程序级别的send就会一直成功返回。 直到buffer满,甚至buffer满了还要阻塞一段时间试图等待buffer空闲。所以你对send的返回值的检查根本检测不到失败。开启了keep alive功能,你直接通过发送接收的函数返回值就可以知道网络是否异常。设置的方法(应用层):

    int keepalive = 1; // 开启keepalive属性
    int keepidle = 60; // 如该连接在60秒内没有任何数据往来,则进行探测
    int keepinterval = 5; // 探测时发包的时间间隔为5 秒
    int keepcount = 3; // 探测尝试的次数.如果第1次探测包就收到响应了,则后2次的不再发.
    setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepalive , sizeof(keepalive ));
    setsockopt(rs, SOL_TCP, TCP_KEEPIDLE, (void*)&keepidle , sizeof(keepidle ));
    setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepinterval , sizeof(keepinterval ));
    setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepcount , sizeof(keepcount ));

2.select和keep alive的关系

select 是为单个线程使用多个socket而设计的,跟检测连接无关,如果只是检测一个socket的话,没有必要使用select。开了keepalive机能 的话,每次调用recv或send时检查返回值,判断是否出错或为0.如果出错,再检查errno查资料,看哪个或哪几个错误号表示链接断了或不存在就可 以了。

另外,谁想定期检查连接状况,谁就启用keep alive。另一端可以不起,只是被动地对探测包进行响应,这种响应是tcp协议的基本要求,跟keep alive无关。并不需要客户端和服务器端都开启keep alive。

3.测试结果

按照例★的值在一端的socket上开启keep alive,然后阻塞在一个recv或者不停的send,这个时候拔了网线,测试从拔掉网线到recv/send返回失败的时间。

在linux kernel里头的测试发现,对于阻塞型的socket,当recv的时候,如果没有设置keep alive,即使网线拔掉或者ifdown,recv很长时间不会返回,最长达17分钟,虽然这个时间比linux的默认超时时间()短了很多。但是如果 设置了keep alive,基本都在keepalive_time +keepalive_probes*keepalive_intvl =33秒内返回错误。

但是对于循环不停send的socket,当拔掉网线后,会持续一段时间send返 回成功(0~10秒左右,取决 于发送数据的量),然后send阻塞,因为协议层的buffer满了,在等待buffer空闲,大概90秒左右后才会返回错误。由此看来,send的时 候,keep alive似乎没有起到作用,这个原因至今也不清楚。后来通过给send之前设置timer来解决的。


来自:http://blog.csdn.net/guomsh/article/details/8484207

linux下使用TCP存活(keepalive)定时器
一、什么是keepalive定时器?[1]
在一个空闲的(idle)TCP连接上,没有任何的数据流,许多TCP/IP的初学者都对此感到惊奇。也就是说,如果TCP连接两端没有任何一个进程在向对方发送数据,那么在这两个TCP模块之间没有任何的数据交换。你可能在其它的网络协议中发现有轮询(polling),但在TCP中它不存在。言外之意就是我们只要启动一个客户端进程,同服务器建立了TCP连接,不管你离开几小时,几天,几星期或是几个月,连接依旧存在。中间的路由器可能崩溃或者重启,电话线可能go down或者back up,只要连接两端的主机没有重启,连接依旧保持建立。
这就可以认为不管是客户端的还是服务器端的应用程序都没有应用程序级(application-level)的定时器来探测连接的不活动状态(inactivity),从而引起任何一个应用程序的终止。然而有的时候,服务器需要知道客户端主机是否已崩溃并且关闭,或者崩溃但重启。许多实现提供了存活定时器来完成这个任务。
存活定时器是一个包含争议的特征。许多人认为,即使需要这个特征,这种对对方的轮询也应该由应用程序来完成,而不是由TCP中实现。此外,如果两个终端系统之间的某个中间网络上有连接的暂时中断,那么存活选项(option)就能够引起两个进程间一个良好连接的终止。例如,如果正好在某个中间路由器崩溃、重启的时候发送存活探测,TCP就将会认为客户端主机已经崩溃,但事实并非如此。
存活(keepalive)并不是TCP规范的一部分。在Host Requirements RFC罗列有不使用它的三个理由:(1)在短暂的故障期间,它们可能引起一个良好连接(good connection)被释放(dropped),(2)它们消费了不必要的宽带,(3)在以数据包计费的互联网上它们(额外)花费金钱。然而,在许多的实现中提供了存活定时器。
一些服务器应用程序可能代表客户端占用资源,它们需要知道客户端主机是否崩溃。存活定时器可以为这些应用程序提供探测服务。Telnet服务器和Rlogin服务器的许多版本都默认提供存活选项。
个人计算机用户使用TCP/IP协议通过Telnet登录一台主机,这是能够说明需要使用存活定时器的一个常用例子。如果某个用户在使用结束时只是关掉了电源,而没有注销(log off),那么他就留下了一个半打开(half-open)的连接。在图18.16,我们看到如何在一个半打开连接上通过发送数据,得到一个复位(reset)返回,但那是在客户端,是由客户端发送的数据。如果客户端消失,留给了服务器端半打开的连接,并且服务器又在等待客户端的数据,那么等待将永远持续下去。存活特征的目的就是在服务器端检测这种半打开连接。

二、keepalive如何工作?[1]
在此描述中,我们称使用存活选项的那一段为服务器,另一端为客户端。也可以在客户端设置该选项,且没有不允许这样做的理由,但通常设置在服务器。如果连接两端都需要探测对方是否消失,那么就可以在两端同时设置(比如NFS)。
若在一个给定连接上,两小时之内无任何活动,服务器便向客户端发送一个探测段。(我们将在下面的例子中看到探测段的样子。)客户端主机必须是下列四种状态之一:
1) 客户端主机依旧活跃(up)运行,并且从服务器可到达。从客户端TCP的正常响应,服务器知道对方仍然活跃。服务器的TCP为接下来的两小时复位存活定时器,如果在这两个小时到期之前,连接上发生应用程序的通信,则定时器重新为往下的两小时复位,并且接着交换数据。
2) 客户端已经崩溃,或者已经关闭(down),或者正在重启过程中。在这两种情况下,它的TCP都不会响应。服务器没有收到对其发出探测的响应,并且在75秒之后超时。服务器将总共发送10个这样的探测,每个探测75秒。如果没有收到一个响应,它就认为客户端主机已经关闭并终止连接。
3) 客户端曾经崩溃,但已经重启。这种情况下,服务器将会收到对其存活探测的响应,但该响应是一个复位,从而引起服务器对连接的终止。
4) 客户端主机活跃运行,但从服务器不可到达。这与状态2类似,因为TCP无法区别它们两个。它所能表明的仅是未收到对其探测的回复。
服务器不必担心客户端主机被关闭然后重启的情况(这里指的是操作员执行的正常关闭,而不是主机的崩溃)。当系统被操作员关闭时,所有的应用程序进程(也就是客户端进程)都将被终止,客户端TCP会在连接上发送一个FIN。收到这个FIN后,服务器TCP向服务器进程报告一个文件结束,以允许服务器检测这种状态。
在第一种状态下,服务器应用程序不知道存活探测是否发生。凡事都是由TCP层处理的,存活探测对应用程序透明,直到后面2,3,4三种状态发生。在这三种状态下,通过服务器的TCP,返回给服务器应用程序错误信息。(通常服务器向网络发出一个读请求,等待客户端的数据。如果存活特征返回一个错误信息,则将该信息作为读操作的返回值返回给服务器。)在状态2,错误信息类似于“连接超时”。状态3则为“连接被对方复位”。第四种状态看起来像连接超时,或者根据是否收到与该连接相关的ICMP错误信息,而可能返回其它的错误信息。

三、在Linux中如何使用keepalive?[2]
Linux has built-in support for keepalive. You need to enable TCP/IP networking in order to use it. You also need procfs support andsysctl support to be able to configure the kernel parameters at runtime.
The procedures involving keepalive use three user-driven variables:

tcp_keepalive_time
    the interval between the last data packet sent (simple ACKs are not considered data) and the first keepalive probe; after the connection is marked to need keepalive, this counter is not used any further
tcp_keepalive_intvl
    the interval between subsequential keepalive probes, regardless of what the connection has exchanged in the meantime
tcp_keepalive_probes
    the number of unacknowledged probes to send before considering the connection dead and notifying the application layer

Remember that keepalive support, even if configured in the kernel, is not the default behavior in Linux. Programs must request keepalive control for their sockets using the setsockopt interface. There are relatively few programs implementing keepalive, but you can easily add keepalive support for most of them following the instructions.
上面一段话已经说得很明白,linux内核包含对keepalive的支持。其中使用了三个参数:tcp_keepalive_time(开启keepalive的闲置时长)tcp_keepalive_intvl(keepalive探测包的发送间隔) 和tcp_keepalive_probes (如果对方不予应答,探测包的发送次数);如何配置这三个参数呢?
There are two ways to configure keepalive parameters inside the kernel via userspace commands:

    procfs interface
    sysctl interface

We mainly discuss how this is accomplished on the procfs interface because it's the most used, recommended and the easiest to understand. The sysctl interface, particularly regarding the sysctl(2) syscall and not the sysctl(8) tool, is only here for the purpose of background knowledge.
The procfs interface
This interface requires both sysctl and procfs to be built into the kernel, and procfs mounted somewhere in the filesystem (usually on/proc, as in the examples below). You can read the values for the actual parameters by "catting" files in /proc/sys/net/ipv4/directory:

  # cat /proc/sys/net/ipv4/tcp_keepalive_time
  7200
  # cat /proc/sys/net/ipv4/tcp_keepalive_intvl
  75
  # cat /proc/sys/net/ipv4/tcp_keepalive_probes
  9

The first two parameters are expressed in seconds, and the last is the pure number. This means that the keepalive routines wait for two hours (7200 secs) before sending the first keepalive probe, and then resend it every 75 seconds. If no ACK response is received for nine consecutive times, the connection is marked as broken.
Modifying this value is straightforward: you need to write new values into the files. Suppose you decide to configure the host so that keepalive starts after ten minutes of channel inactivity, and then send probes in intervals of one minute. Because of the high instability of our network trunk and the low value of the interval, suppose you also want to increase the number of probes to 20.
Here's how we would change the settings:

  # echo 600 > /proc/sys/net/ipv4/tcp_keepalive_time
  # echo 60 > /proc/sys/net/ipv4/tcp_keepalive_intvl
  # echo 20 > /proc/sys/net/ipv4/tcp_keepalive_probes

To be sure that all succeeds, recheck the files and confirm these new values are showing in place of the old ones.
这样,上面的三个参数配置完毕。使这些参数重启时保持不变的方法请阅读参考文献[2]。

四、在程序中如何使用keepalive?[2]-[4]
All you need to enable keepalive for a specific socket is to set the specific socket option on the socket itself. The prototype of the function is as follows:

int setsockopt(int s, int level, int optname,
                 const void *optval, socklen_t optlen)

The first parameter is the socket, previously created with the socket(2); the second one must be SOL_SOCKET, and the third must beSO_KEEPALIVE . The fourth parameter must be a boolean integer value, indicating that we want to enable the option, while the last is the size of the value passed before.
According to the manpage, 0 is returned upon success, and -1 is returned on error (and errno is properly set).
There are also three other socket options you can set for keepalive when you write your application. They all use the SOL_TCP level instead of SOL_SOCKET, and they override system-wide variables only for the current socket. If you read without writing first, the current system-wide parameters will be returned.
TCP_KEEPCNT: overrides tcp_keepalive_probes
TCP_KEEPIDLE: overrides tcp_keepalive_time
TCP_KEEPINTVL: overrides tcp_keepalive_intvlint keepAlive = 1; // 开启keepalive属性
我们看到keepalive是一个开关选项,可以通过函数来使能。具体地说,可以使用以下代码:
setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive));
上面英文资料中提到的第二个参数可以取为SOL_TCP,以设置keepalive的三个参数(具体代码参考文献[3]),在程序中实现需要头文件“netinet/tcp.h”。当然,在实际编程时也可以采用系统调用的方式配置的keepalive参数。
关于setsockopt的其他参数可以参考文献[4]。

五、如何判断TCP连接是否断开?[3]
当tcp检测到对端socket不再可用时(不能发出探测包,或探测包没有收到ACK的响应包),select会返回socket可读,并且在recv时返回-1,同时置上errno为ETIMEDOUT。

来自:http://machael.blog.51cto.com/829462/211989/
分页: 15/23 第一页 上页 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 下页 最后页 [ 显示模式: 摘要 | 列表 ]