2015年11月

Jitsi Meet安装

系统:Debian GNU/Linux 7.0 (wheezy)
先安装ngixn,参考nginx官网http://nginx.org/en/linux_packages.html#stable
添加源(163的源和jitsi的源)

nano /etc/apt/sources.list#添加下面的源
deb http://mirrors.163.com/debian wheezy main non-free contrib
deb http://mirrors.163.com/debian wheezy-proposed-updates main contrib non-free
deb-src http://mirrors.163.com/debian wheezy main non-free contrib
deb-src http://mirrors.163.com/debian wheezy-proposed-updates main contrib non-free
deb http://mirrors.163.com/debian-security wheezy/updates main contrib non-free 
deb-src http://mirrors.163.com/debian-security wheezy/updates main contrib non-free 
deb http://download.jitsi.org/nightly/deb unstable/
#设置key
wget -qO - https://download.jitsi.org/nightly/deb/unstable/archive.key | apt-key add -

安装jits需要安装jquery,没有163的源(别的源也可以)会安装失败

apt-get update 
apt-get -y install jitsi-meet

安装过程中需要输入主机名,输入自己的主机名或者机器静态ip都可以(这里是test.com)
还选择是否生成ssl证书,我选择第一个,会自动生成
创建软连接

ln -s /etc/nginx/sites-available/test.meet.conf /etc/nginx/conf.d/test.meet.conf
service nginx restart

然后用chrome浏览试试吧

nginx配置文件解析

user nginx nginx

Nginx用户及组:用户 组。window下不指定

worker_processes 8;

工作进程:数目。根据硬件调整,通常等于CPU数量或者2倍于CPU。

error_log logs/error.log; error_log logs/error.log notice; error_log logs/error.log info;

错误日志:存放路径。

pid logs/nginx.pid;

pid(进程标识符):存放路径。

worker_rlimit_nofile 204800;

指定进程可以打开的最大描述符:数目。
这个指令是指当一个nginx进程打开的最多文件描述符数目,理论值应该是最多打开文件数(ulimit -n)与nginx进程数相除,但是nginx分配请求并不是那么均匀,所以最好与ulimit -n 的值保持一致。 现在在linux 2.6内核下开启文件打开数为65535,worker_rlimit_nofile就相应应该填写65535。 这是因为nginx调度时分配请求到进程并不是那么的均衡,所以假如填写10240,总并发量达到3-4万时就有进程可能超过10240了,这时会返回502错误。

events {
use epoll;

使用epoll的I/O 模型。linux建议epoll,FreeBSD建议采用kqueue,window下不指定。 补充说明: 与apache相类,nginx针对不同的操作系统,有不同的事件模型 A)标准事件模型
#Select、poll属于标准事件模型,如果当前系统不存在更有效的方法,nginx会选择select或poll B)高效事件模型
#Kqueue:使用于FreeBSD 4.1+, OpenBSD 2.9+, NetBSD 2.0 和 MacOS X.使用双处理器的MacOS X系统使用kqueue可能会造成内核崩溃。
#Epoll:使用于Linux内核2.6版本及以后的系统。
#/dev/poll:使用于Solaris 7 11/99+,HP/UX 11.22+ (eventport),IRIX 6.5.15+ 和 Tru64 UNIX 5.1A+。 Eventport:使用于Solaris 10。 为了防止出现内核崩溃的问题, 有必要安装安全补丁。

worker_connections 204800;

每个工作进程的最大连接数量。根据硬件调整,和前面工作进程配合起来用,尽量大,但是别把cpu跑到100%就行。每个进程允许的最多连接数,理论上每台nginx服务器的最大连接数为。worker_processes*worker_connections

keepalive_timeout 60; keepalive

超时时间。

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求头的大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。 分页大小可以用命令getconf PAGESIZE 取得。 [root@web001 ~]# getconf PAGESIZE 4096
但也有client_header_buffer_size超过4k的情况,但是client_header_buffer_size该值必须设置为“系统分页大小”的整倍数。

open_file_cache max=65535 inactive=60s;

这个将为打开文件指定缓存,默认是没有启用的,max指定缓存数量,建议和打开文件数一致,inactive是指经过多长时间文件没被请求后删除缓存。

open_file_cache_valid 80s;

这个是指多长时间检查一次缓存的有效信息。

open_file_cache_min_uses 1;

open_file_cache指令中的inactive参数时间内文件的最少使用次数,如果超过这个数字,文件描述符一直是在缓存中打开的,如上例,如果有一个文件在inactive时间内一次没被使用,它将被移除。

}
###设定http服务器,利用它的反向代理功能提供负载均衡支持

http {
includemime.types;

设定mime类型,类型由mime.type文件定义

default_type application/octet-stream;

日志文件记录信息的格式

log_format main
'$remote_addr - $remote_user [$time_local] "$request" ' '\$status \$body_bytes_sent "\$http_referer" ' '"\$http_user_agent" "\$http_x_forwarded_for"';
log_format log404 '\$status [\$time_local] \$remote_addr \$host\$request_uri \$sent_http_location';

日志格式设置。
\$remote_addr与\$http_x_forwarded_for用以记录客户端的ip地址;
\$remote_user:用来记录客户端用户名称;
\$time_local: 用来记录访问时间与时区;
\$request: 用来记录请求的url与http协议;
\$status: 用来记录请求状态;成功是200,
\$body_bytes_sent :记录发送给客户端文件主体内容大小;
\$http_referer:用来记录从那个页面链接访问过来的;
\$http_user_agent:记录客户浏览器的相关信息;
通常web服务器放在反向代理的后面,这样就不能获取到客户的IP地址了,通过\$remote_add拿到的IP地址是反向代理服务器的iP地址。反向代理服务器在转发请求的http头信息中,可以增加x_forwarded_for信息,用以记录原有客户端的IP地址和原来客户端的请求的服务器地址。

access_log logs/host.access.log main;
access_log logs/host.access.404.log log404;

用了log_format指令设置了日志格式之后,需要用access_log指令指定日志文件的存放路径;

server_names_hash_bucket_size 128;

保存服务器名字的hash表是由指令server_names_hash_max_size 和server_names_hash_bucket_size所控制的。参数hash bucket size总是等于hash表的大小,并且是一路处理器缓存大小的倍数。在减少了在内存中的存取次数后,使在处理器中加速查找hash表键值成为可能。如果hash bucket size等于一路处理器缓存的大小,那么在查找键的时候,最坏的情况下在内存中查找的次数为2。第一次是确定存储单元的地址,第二次是在存储单元中查找键 值。因此,如果Nginx给出需要增大hash max size 或 hash bucket size的提示,那么首要的是增大前一个参数的大小.

client_header_buffer_size 4k;

客户端请求头部的缓冲区大小。这个可以根据你的系统分页大小来设置,一般一个请求的头部大小不会超过1k,不过由于一般系统分页都要大于1k,所以这里设置为分页大小。分页大小可以用命令getconf PAGESIZE取得。

large_client_header_buffers 8 128k;

客户请求头缓冲大小。nginx默认会用client_header_buffer_size这个buffer来读取header值,如果 header过大,它会使用large_client_header_buffers来读取。
open_file_cache max=102400 inactive=20s; #这个指令指定缓存是否启用。 
#例: open_file_cache max=1000 inactive=20s;   
    #open_file_cache_valid 30s;   
    #open_file_cache_min_uses 2;   
    #open_file_cache_errors on; 
    语法:open_file_cache_errors on | off 默认值:open_file_cache_errors off 使用字段:http, server, location 这个指令指定是否在搜索一个文件是记录cache错误. open_file_cache_min_uses 
    语法:open_file_cache_min_uses number 默认值:open_file_cache_min_uses 1 使用字段:http, server, location 这个指令指定了在open_file_cache指令无效的参数中一定的时间范围内可以使用的最小文件数,如果使用更大的值,文件描述符在cache中总是打开状态. open_file_cache_valid 
    语法:open_file_cache_valid time 默认值:open_file_cache_valid 60 使用字段:http, server, location 这个指令指定了何时需要检查open_file_cache中缓存项目的有效信息.

client_max_body_size 300m;

设定通过nginx上传文件的大小

sendfile on;

sendfile指令指定 nginx 是否调用sendfile 函数(zero copy 方式)来输出文件,对于普通应用,必须设为on。如果用来进行下载等应用磁盘IO重负载应用,可设置为off,以平衡磁盘与网络IO处理速度,降低系统uptime。

tcp_nopush on;

此选项允许或禁止使用socke的TCP_CORK的选项,此选项仅在使用sendfile的时候使用

proxy_connect_timeout 90;

后端服务器连接的超时时间_发起握手等候响应超时时间

proxy_read_timeout 180;

连接成功后

等候后端服务器响应时间

其实已经进入后端的排队之中等候处理(也可以说是后端服务器处理请求的时间)

proxy_send_timeout 180;

后端服务器数据回传时间_就是在规定时间之内后端服务器必须传完所有的数据

proxy_buffer_size 256k;

设置从被代理服务器读取的第一部分应答的缓冲区大小,通常情况下这部分应答中包含一个小的应答头,默认情况下这个值的大小为指令proxy_buffers中指定的一个缓冲区的大小,不过可以将其设置为更小

proxy_buffers 4 256k;

设置用于读取应答(来自被代理服务器)的缓冲区数目和大小,默认情况也为分页大小,根据操作系统的不同可能是4k或者8k

proxy_busy_buffers_size 256k;

proxy_temp_file_write_size 256k;

设置在写入proxy_temp_path时数据的大小,预防一个工作进程在传递文件时阻塞太长

proxy_temp_path /data0/proxy_temp_dir;

proxy_temp_path和proxy_cache_path指定的路径必须在同一分区

proxy_cache_path /data0/proxy_cache_dir levels=1:2 keys_zone=cache_one:200m inactive=1d max_size=30g;

设置内存缓存空间大小为200MB,1天没有被访问的内容自动清除,硬盘缓存空间大小为30GB。

keepalive_timeout 120;

keepalive超时时间。

tcp_nodelay on;

client_body_buffer_size 512k;

如果把它设置为比较大的数值,例如256k,那么,无论使用firefox还是IE浏览器,来提交任意小于256k的图片,都很正常。如果注释该指令,使用默认的client_body_buffer_size设置,也就是操作系统页面大小的两倍,8k或者16k,问题就出现了。
无论使用firefox4.0还是IE8.0,提交一个比较大,200k左右的图片,都返回500 Internal Server Error错误

proxy_intercept_errors on;

表示使nginx阻止HTTP应答代码为400或者更高的应答。

upstream bakend{ server 127.0.0.1:8027; server 127.0.0.1:8028; server 127.0.0.1:8029; hash \$request_uri; }
nginx的upstream目前支持4种方式的分配
1、轮询(默认)
每个请求按时间顺序逐一分配到不同的后端服务器,如果后端服务器down掉,能自动剔除。
2、weight
指定轮询几率,weight和访问比率成正比,用于后端服务器性能不均的情况。 例如:

    upstream bakend{ 
        server 192.168.0.14 weight=10; server 192.168.0.15 weight=10; 
    } 

2、ip_hash
每个请求按访问ip的hash结果分配,这样每个访客固定访问一个后端服务器,可以解决session的问题。 例如:

    upstream bakend { 
        ip_hash; 
        server 192.168.0.14:88; server 192.168.0.15:80; 
    } 

3、fair(第三方)
按后端服务器的响应时间来分配请求,响应时间短的优先分配。

    upstream backend { 
        server server1; server server2;
        fair; 
    } 

4、url_hash(第三方)
按访问url的hash结果来分配请求,使每个url定向到同一个后端服务器,后端服务器为缓存时比较有效。 例:在upstream中加入hash语句,server语句中不能写入weight等其他的参数,hash_method是使用的hash算法

    upstream backend { 
        server squid1:3128; server squid2:3128; hash $request_uri; hash_method crc32; 
    } 

tips:
upstream bakend{#定义负载均衡设备的Ip及设备状态}{
ip_hash;
server 127.0.0.1:9090 down;
server 127.0.0.1:8080 weight=2;
server 127.0.0.1:6060;
server 127.0.0.1:7070 backup;
}
在需要使用负载均衡的server中增加 proxy_pass http://bakend/; 每个设备的状态设置为:
1.down表示单前的server暂时不参与负载
2.weight为weight越大,负载的权重就越大。
3.max_fails:允许请求失败的次数默认为1.当超过最大次数时,返回proxy_next_upstream模块定义的错误
4.fail_timeout:max_fails次失败后,暂停的时间。
5.backup: 其它所有的非backup机器down或者忙的时候,请求backup机器。所以这台机器压力会最轻。
nginx支持同时设置多组的负载均衡,用来给不用的server来使用。
client_body_in_file_only设置为On 可以讲client post过来的数据记录到文件中用来做debug
client_body_temp_path设置记录文件的目录 可以设置最多3层目录
location对URL进行匹配.可以进行重定向或者进行新的代理 负载均衡
###配置虚拟机

server { 
    listen 80; 
    #配置监听端口  

    server_name image.***.com; 
    #配置访问域名
    location ~* \.(mp3|exe)$ { 
    #对以“mp3或exe”结尾的地址进行负载均衡  
        proxy_pass http://img_relay$request_uri; 
        #设置被代理服务器的端口或套接字,以及URL  
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        #以上三行,目的是将代理服务器收到的用户的信息传到真实服务器上 
    }  
    location /face { 
        if ($http_user_agent ~* "xnp") { 
            rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; 
        } 
        proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        error_page 404 502 = @fetch; 
    } 
    location @fetch { 
        access_log /data/logs/face.log log404; 
        rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; 
    } 
    location /image { 
        if ($http_user_agent ~* "xnp") { 
            rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; 
        } 
        proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
    } 
    location @fetch { 
        access_log /data/logs/image.log log404; 
        rewrite ^(.*)$ http://211.151.188.190:8080/face.jpg redirect; 
    } 
}

###其他举例

server { 
    listen 80; 
    server_name *.***.com *.***.cn; 
    location ~* \.(mp3|exe)$ { 
        proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
    } 
    location / { 
    if ($http_user_agent ~* "xnp") { 
        rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect; 
    } 
        proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        #error_page 404 http://i1.***img.com/help/noimg.gif; 
        error_page 404 502 = @fetch; 
    } 
    location @fetch { 
        access_log /data/logs/baijiaqi.log log404; 
        rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif redirect; 
    } 
}
server { 
    listen 80; 
    server_name *.***img.com;  
    location ~* \.(mp3|exe)$ { 
        proxy_pass http://img_relay$request_uri; 
        proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
    } 
    location / { 
    if ($http_user_agent ~* "xnp") { 
        rewrite ^(.*)$ http://i1.***img.com/help/noimg.gif; 
    } 
        proxy_pass http://img_relay$request_uri; proxy_set_header Host $host; 
        proxy_set_header X-Real-IP $remote_addr; 
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 
        error_page 404 = @fetch; 
    } 
    #access_log off; 
    location @fetch { 
    access_log /data/logs/baijiaqi.log log404; 
    } 
} 
server { 
    listen 8080; 
    server_namengx-ha.***img.com; 
    stub_status on; access_log off; 
} 
server { 
    listen 80; 
    server_name imgsrc1.***.net; root html; 
}
    server { 
        listen 80; 
        server_name ***.com w.***.com; 
        # access_log /usr/local/nginx/logs/access_log main; 
        location / { 
        } 
    } 
server { 
    listen 80; 
    server_name *******.com w.*******.com; 
    # access_log /usr/local/nginx/logs/access_log main; location / { 
    rewrite ^(.*)$ http://www.*******.com/; 
    } 
} 
server { listen 80; 
    server_name ******.com; 
    # access_log /usr/local/nginx/logs/access_log main; 
    location / { 
    } 
}
    location /NginxStatus { 
        access_log on; 
        auth_basic "NginxStatus"; 
        auth_basic_user_fileconf/htpasswd; 
    }
    #设定查看Nginx状态的地址 
    location ~ /\.ht { 
        deny all; 
    } 
    #禁止访问.htxxx文件 
}

###注释:变量

Ngx_http_core_module模块支持内置变量,他们的名字和apache的内置变量是一致的。 首先是说明客户请求title中的行,例如\$http_user_agent,\$http_cookie等等。 此外还有其它的一些变量
\$args此变量与请求行中的参数相等
\$content_length等于请求行的“Content_Length”的值。
\$content_type等同与请求头部的”Content_Type”的值 \$document_root等同于当前请求的root指令指定的值 \$document_uri与\$uri一样
\$host与请求头部中“Host”行指定的值或是request到达的server的名字(没有Host行)一样
\$limit_rate允许限制的连接速率
\$request_method等同于request的method,通常是“GET”或“POST”
\$remote_addr客户端ip
\$remote_port客户端port
\$remote_user等同于用户名,由ngx_http_auth_basic_module认证
\$request_filename当前请求的文件的路径名,由root或alias和URI request组合而成 \$request_body_file
\$request_uri含有参数的完整的初始URI \$query_string与\$args一样
\$sheeme http模式(http,https)尽在要求是评估例如
Rewrite ^(.+)\$ \$sheme://example.com\$; Redirect;
\$server_protocol等同于request的协议,使用“HTTP/或“HTTP/
\$server_addr request到达的server的ip,一般获得此变量的值的目的是进行系统调用。为了避免系统调用,有必要在listen指令中指明ip,并使用bind参数。 \$server_name请求到达的服务器名 \$server_port请求到达的服务器的端口号
\$uri等同于当前request中的URI,可不同于初始值,例如内部重定向时或使用index

VisualSVN Server客户端检出报错"服务器积极拒绝"

检出的时候报告错误
服务器地址:192.168.3.98
VisualSVN Server监听端口:8080
Unable to connect to a repository at URL 'svn://192.168.3.98' 无法连接主机“192.168.3.98”: 由于目标计算机积极拒绝,无法连接。
找了半天,也不知道服务器的svn监听的哪个端口,各种纠结,后来发现直接用浏览器能打开
地址:http://192.168.3.98:8080/svn/

再看到这个网址里面的回答:http://bbs.csdn.net/topics/380197945?page=1#post-394472641
于是在检出的url写成了:http://192.168.3.98:8080/svn/test/
test是我的项目名称,然后就ok了

Ubuntu10.04之grub2详解

在早期的Ubuntu中,使用Grub作为系统的启动引导程序,想修改系统启动项非常简单,只要用gedit打开系统菜单设定文件( sudo gedit /boot/grub/menu.lst ),修改该文件中到内容即可,但是到了Grub 2中,不能采用这种方式修改系统启动项了。

Grub 2特性
Grub 2(GRand Unified Bootloader, version 2)是Grub的第二版。Grub 2对Grub的接口进行了完整到重写,基于PUPA(详细介绍)项目到研究,Grub 2更模块化并且更方便扩展,Grub 2的一些提升如下:
具有图形化界面,支持主题
模块化加载
夸平台的兼容性
支持脚本
自定义的启动项目定义
修改分区命名
Grub 2结构
Grub 2包含下面几个部分:
/boot/grub/grub.cfg 文件
/etc/grub.d/ 文件夹
/etc/default/grub 文件

下面开始一个个介绍。
grub.cfg类似Grub中的 /boot/grub/menu.lst。里面的格式于menu.lst差不多,但是现在不允许你通过直接修改该文件到方式来修改启动项,因为该文件是在 执行"update-grub"或者update-grub2"之后,根据上面说到2、3两项动态生成到,也就是说,如果你修改了这个文件当下次这两个命 令被执行了(比如说更新内核后),你修改到内容就会背覆盖。官方文件只 www.2cto.com 说/boot/grub/grub.cfg不要手工修改,这个文件是运行 update-grub自动生成的。要修改配置文件的只要打开/boot/grub/grub.cfg文件,找到想修改的地方,然后根据注释找到相应的 /etc/default/grub或/etc/grub.d/ (folder)进行修改。

grub.cfg文件中主要包含两个部分,一部分是 各个启动项的定义,第二部分是启动界面的设置。你可以直接用gedit打开该文件看其中的内容。既然grub.cfg不能修改,那也没什么好详细说的了, 稍微研究下就能看懂里面是怎么写的。下面就介绍一下Grub 2的另外两个部分。
Grub 2的另外两部分内容其实就分别对应于grub.cfg中的两部分内容。

首先 /etc/grub.d/ 文件夹中定义各个启动项,其中的文件代表了一个或多个启动项,命名规范都是"两个数字

名称",前面的两位数字确定这个或这多个启动项在启动界面的位置, 默认的 "00

"是预留给"00_header"的,"10_是预留给当前系统内核的,20_是预留给第三方程序的,除了这些你都可以使用,增加自己的,比如 05_ , 15_,数字越小越前面。这里的文件好像是代码,我还没研究透,不会自己写,只会改。当执行前面说的"update-grub"或者update- grub2"命令之后,这个文件夹中的文件就是用于生成 grub.cfg 中启动项的定义的。

Grub 2的最后一部分是 /etc/default/grub 文件,该文件主要是启动界面的配置,比如默认的启动项,等待用户选择启动项的时间等。文件内容很简单,就是一些键值对,详细的可配置属性可以参考Grub 2的Wiki中"grub (/etc/default/grub)"这一节。当执行前面说的"update-grub"或者update-grub2"命令之后,这个文件的内容就 用于生成 grub.cfg 中启动界面的设置。
/etc/default/grub文件详细修改方法
sudo gedit /etc/default/grub

系统安装完成后,用户就会发现/boot/grub/grub.cfg文件只有root权限可读,如果要直接修改grub.cfg文件,要先修改其权 限。好不容易把grub.cfg修改好了,系统内核或grub升级时,会 自动执行update-grub,grub.cfg文件就会被打回原形,如何保证修改后的配置文件能一直保留下来呢?  www.2cto.com  
其实不用修改 grub.cfg,只要把个性化配置写入/etc/default/目录下的grub和/etc/gurb.d目录下的脚本文件,以后不管升级内核或者是升级grub所执行的update-grub,都会按要求创建个性化的grub.cfg。

1、首先看下 /etc/default/grub,先从应用程序-附件里打开终端,输入
sudo gedit /etc/default/grub
看看打开的文件可作什么修改:

    # If you change this file, run 'update-grub' afterwards to update
    # /boot/grub/grub.cfg.
    GRUB_DEFAULT=0 
    设置默认启动项,按menuentry顺序。比如要默认从第四个菜单项启动,数字改为3,若改为 saved,则默认为上次启动项。
        GRUB_HIDDEN_TIMEOUT=0 默认为0,单系统时启动菜单自动隐藏,要取消自动隐藏菜单,改为大于0再sudo update-grub。(注意:单系统下/etc/grub.d/30_os- prober可能没引用这里的变量,如果修改这里不能显示菜单,还要修改 /etc/grub.d/30_os-prober,具体看下面修改部份)
    GRUB_HIDDEN_TIMEOUT_QUIET=true
    GRUB_TIMEOUT="3"----------->设置进入默认启动项的等候时间,默认值10秒,按自己需要修改
    GRUB_DISTRIBUTOR=`lsb_release -i -s 2> /dev/null || echo Debian`
    GRUB_CMDLINE_LINUX_DEFAULT="quiet splash" ----------->添加内核启动参数,这个为默认
    GRUB_CMDLINE_LINUX="noresume"--------->手动添加内核启动参数,比如 acpi=off noapic等可在这里添加,加 text 参数启动进入字符模式。

    # Uncomment to disable graphical terminal (grub-pc only)
    #GRUB_TERMINAL=console ---------->设置是否使用图形介面。去除前面#,仅使用控制台终端,不使用图形介面  www.2cto.com  
    # The resolution used on graphical terminal
    # note that you can use only modes which your graphic card supports via VBE
    # you can see them in real GRUB with the command `vbeinfo'
    #GRUB_GFXMODE=640x480 设定图形介面分辨率,如不使用默认,把前面#去掉,把分辨率改为800x600或1024x768

    # Uncomment if you don't want GRUB to pass "root=UUID=xxx" parameter to Linux
    #GRUB_DISABLE_LINUX_UUID=true ---------->设置grub命令是否使用UUID,去掉#,使用root=/dev/sdax而不用root=UUDI=xxx
    # Uncomment to disable generation of recovery mode menu entrys
    #GRUB_DISABLE_LINUX_RECOVERY="true"----------->设定是否创建修复模式菜单项

/etc/grub.d文件夹详细修改方法

再看下 /etc/grub.d文件夹下的什么东东:
00_header 05_debian_theme 10_linux 20_memtest86+ 30_os-prober 40_custom README
前面这五个脚本对应grub.cfg上的各个部分,怎样修改这些脚本文件才能保证不会破坏update-grub的运行,又能让grub.cfg符合你的意愿呢?其实很简单,只要找到

cat << EOF
********
********
********
EOF

这类语句,EOF中间的文本会直接写入grub.cfg中相应位置,所以个性化的语句添加在这地方就可以了。
00_header 可供修改的有两地方

cat << EOF 
load_env
set default=${GRUB_DEFAULT} <----- 这里根据 /etc/default/grub中default变量设定,不用修改
if [ /${prev_saved_entry} ]; then
saved_entry=/${prev_saved_entry}
save_env saved_entry
prev_saved_entry=
save_env prev_saved_entry
fi
insmod jpeg <---------这地方加入要加载的模块,如图片支持,或系统格式支持 insmod ntfs 和 insmod fat 等
insmod png <---------
EOF

另一个在最后

cat << EOF
set timeout=${GRUB_TIMEOUT} <------- timeout 根据上面 /etc/default/grub中的timeout 变量设定,这里不用改
background_image (hd0,7)/boot/images/012.jpg <----------这里背景图片的绝对路径(似乎没有作用,相见"实例")
EOF

05_debian_theme 修改背景颜色

cat << EOF 
set menu_color_normal=white/black <--------
set menu_color_highlight=yellow/black <------- 前面字体颜色可自定,后面背景一定要设为black,不然背景色会挡住背景图片。备注:修改前为set menu_color_highlight=black/light-gray
EOF

10_linux 这部分是自动搜索当前系统,建立当前系统的启动菜单,包括系统头,内核等信息,不要随便修改,要使用个性菜单名,比如中文菜单,可修改这里,其余地方不要做修改:

cat << EOF
menuentry "启动 $1" { <---------在 双引号 " " 和 变量 $1 这间加入个性文字,或直接把 变量$1 改为固定字符比如 Ubuntu Karmic
EOF

if [ "x$3" = "xquiet" ]; then
cat << EOF
set quiet=1
EOF

20_memtest86+ 添加内存测试启动项,可做修改的地方:

cat << EOF
menuentry "Memory test (memtest86+)" {<------可以修改为中文菜单如 menuentry "内存测试"{ ,双引号必须是英文字符
linux16 $MEMTESTPATH
}
# 下面第二个菜单项可删除
menuentry "Memory test (memtest86+)"
linux16 $MEMTESTPATH *********
}  www.2cto.com  
EOF

30_os-prober 查找其他分区中存在的系统并建立菜单项,依次为 windows >> linux >> macos,这里不必修改。
或根据自己的系统修改

menuentry "${LONGNAME} (on ${DEVICE})" <-------把引号中的变量改为固定,如 windows xp ,vista 或 linux , Fedora 之类的菜单项。
40_custom 自定义启动项,按菜单标准格式添加即可,update-grub后会自动添加到grub.cfg上,如:

menuentry "启动 Veket"{
set root=(hd0,8)
linux /veket/vmlinuz root=/dev/ram0 PMEDIA=hd
initrd /veket/initrd.gz
}
menuentry "启动 CDLinux"{
set root=(hd0,8)
linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDL_LANG=zh_CN.UTF-8
initrd /CDlinux/initrd
}
menuentry "启动 Grub4Dos"{
set root=(hd0,8)
linux /grub.exe
}

把各项修改后保存,然后

sudo update-grub
cat /boot/grub/grub.cfg

看看配置文件是不是和你想的一样了。
不一样??? 再改,再 sudo update-grub
实例:
要修改默认启动项,可以使用下面的方法:
1.修改 /etc/grub.d/ 中启动项的顺序,将你想要默认启动的项顺序设置为较小的值。优点是修改不会被update-grub命令覆盖掉,好像没啥缺电,只有另外的程序修改为比你的值更小了才会成为默认启动。

  1. 修改 /etc/default/grub 中默认的启动项,设置该文件中 GRUB_DEFAULT 为你想要的值,这个值是生成的 grub.cfg 中各个启动项的从0开始的下标。该方法优点是修改不会被update-grub命令覆盖,缺点是当启动项的顺序变化之后,下标也就变了。。。
    调整启动画面分辨率
    第一步:打开终端,修改/etc/default/grub文件
    $ sudo gedit /etc/default/grub
    取消#GRUB_GFXMODE=640×480这一行前面的注释符号,并将后面的数字修改为一个合适的值,不需要太高,比如1024x768。这个值同时会影响grub启动菜单和控制台里文字的分辨率。
    注意:启动菜单和启动界面分辨率相同,如果此处分辨率设置过高的话,启动菜单会很难看,似乎修改分辨率不会影响启动速度,
    第二步:修改/etc/grub.d/00_header文件
    $ sudo gedit /etc/grub.d/00_header
    按下ctrl+F,查找关键字"set gfxmode=${GRUB_GFXMODE}"(去掉双引号),然后在这行下面添加新行,内容是:"set gfxpayload=keep" (去掉双引号)

第三步:更新grub

$ sudo update-grub #我的系统没有这个命令,yum也不能安装,用下面的好像也能更新
[root@localhost ~]# grub2-mkconfig -o /boot/grub2/grub.cfg

好了,重启试试,不出意外的话你会看到plymouth的启动画面确实更漂亮了
给grub2菜单添加图片
1.在etc/grub.d文件夹中找到00_header 文件,打开后在
save_env prev_saved_entry
fi下添加一句
insmod png
2.在etc/grub.d/05_debian_theme中改为
set menu_color_normal=white/black

set menu_color_highlight=yellow/black (前面字体颜色可自定,后面背景一定要设为black,不然背景色会挡住背景图片。前面还有语句的详细)
3.根据图片位置可判断系统grub默认图片文件夹位置,在相同位置放上一张同名图片文件即可。
图中文件名为moreblue-orbit-grub.png

备注:
一.修改/boot/grub/grub.cfg 文件的方法(可以当作修改/etc/grub.d/ 文件夹和/etc/default/grub 文件的参考)
grub.cfg 默认为只读,要修改前先设为可写

sudo chmod +w /boot/grub/grub.cfg
set default=0
#默认为0 
insmod jpg
#添加jpg支持,如要使用png或tga文件做背景,加上 insmod png或insmod tga (添加图片好像不管用)

insmod ext2
#除了用作启动的分区外,其他分区格式可在menu底下再添加 
set root=(hd0,7)
#设定root分区 
search -no-floppy -fs-uuid -set f255285a-5ad4-4eb8-93f5-4f767190d3b3
#设定uuid=****的分区为root,和上句重复,可删除 
# 以下为终端配置 
if loadfont /usr/share/grub/unicode.pf2 ; then
#设置终端字体,unicode.pf2支持中文显示 
set gfxmode=640×480
#设置分辨率,默认为 640×480,可用800×600,1024×768,建议跟你想设定的图片大小一致 
insmod gfxterm
#插入模块 gfxterm,支持中文显 示,它还支持 24 位图像 
insmod vbe

#插入 vbe 模块,GRUB 2 引入很多模块的东西,要使用它,需要在这里加入 
if terminal_output gfxterm ; then true ; else
# For backward compatibility with versions of terminal.mod that don't
# understand terminal_output
terminal gfxterm
#设置 GRUB 2 终端为 gfxterm 
fi
fi
set timeout=10
background_image (hd0,7)/boot/images/1.jpg (添加图片好像不管用)
#设置背景图片
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/05_debian_theme ###
set menu_color_normal=white/black
set menu_color_highlight=cyan/black

#这两行为 Debian 下的菜单颜色设置,如果默认的话,你会发现背景完全被蓝色挡住了,你需要修改 blue 为 black,这样背景就会出现
### END /etc/grub.d/05_debian_theme ###
# 10_linux 为自动添加的当前root分区linux引导项
### BEGIN /etc/grub.d/10_linux ###
#菜单项,要包括 menuentry 双引号" " 和大括号 { }才完整,否则不显示菜单
menuentry "Ubuntu, Linux 2.6.31-9-386″ {
insmod ext2  www.2cto.com  
set root=(hd0,7)
search -no-floppy -fs-uuid -set f255285a-5ad4-4eb8-93f5-4f767190d3b3
#这句与set root=(hd0,7)重复,可删除

linux /boot/vmlinuz-2.6.31-9-386 root=UUID=f255285a-5ad4-4eb8-93f5-4f767190d3b3 ro quite splash
#不喜欢看到一长串的, roo=UUID=***可用root=/dev/sda7代替
initrd /boot/initrd.img-2.6.31-9-386
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_memtest86+ ###
menuentry "Memory test (memtest86+)" {
linux16 /boot/memtest86+.bin
}
### END /etc/grub.d/20_memtest86+ ###
# 自动添加存在于其他分区的系统引导项
### BEGIN /etc/grub.d/30_os-prober ###
#windows 启动菜单

menuentry "Windows Vista (loader) (on /dev/sda1)" {
insmod ntfs
#windows格式为ntfs,或为fat32改为 insmod fat
set root=(hd0,1)
search -no-floppy -fs-uuid -set ece067d2e067a196
#可删除
#grub2比较先进的地方就是如果发现windows启动是通过ntldr 引导的,定为2000/xp/2003,会在这加上 drivemap -s (hd0) ${root} ,作用相当于grub的map,可正常启动非第一硬盘的xp/2003系统。 

chainloader +1
}
# 查找到其他分区上的linux系统并自动添加
menuentry "Ubuntu karmic (development branch) (9.10) (on /dev/sda3)" {
insmod ext2
set root=(hd0,3)
search -no-floppy -fs-uuid -set 4d893970-0685-44ed-86b3-1de45b2db84a
linux /boot/vmlinuz-2.6.31-9-generic root=/dev/sda3
initrd /boot/initrd.img-2.6.31-9-generic
}

#若存在macos会自动在这里添加。
### END /etc/grub.d/30_os-prober ###
# 以下为手动添加的菜单项
### BEGIN /etc/grub.d/40_custom ###
menuentry "CDLinux"{
set root=(hd0,8)
linux /CDlinux/bzImage root=/dev/ram0 vga=791 CDL_LANG=zh_CN.UTF-8
initrd /CDlinux/initrd
}
### END /etc/grub.d/40_custom ###
# 手动添加时,硬盘编号从0开始(hd0),主分区编号从1开始(hd0,1),逻辑分区从5开始(hd0,5)

二、grub2终端部分命令介绍
在出现选择菜单时,按C进入终端命令行模式,按E进入当前菜单项编辑模式(和grub一样),编辑中按Ctrl + C退出,按Ctrl + X 以编辑内容启动。
1. help
查看命令用法,显示所有可用命令
help search
search 命令用法

  1. ls
    列出当前的所有设备。如 (hd0) (hd0,1) (hd0,5) (hd1) (hd1,1) (hd1,2) .......
    ls -l
    详细列出当前的所有设备。对于分区,会显示其label及uuid。
    ls /
    列出当前设为root的分区下的文件
    ls (hd1,1)/
    列出(hd1,1)分区下文件

  2. search
    search -f /ntldr
    列出根目录里包含ntldr文件的分区,返回为分区号
    search -l LINUX
    搜索label是LINUX的分区。
    search -set -f /ntldr
    搜索根目录包含ntldr文件的分区并设为root,注意如果多外分区含有ntldr文件,set 失去作用。

  3. loopback
    loopback命令可用于建立回放设备,如
    loopback lo0 (hd1,1)/abc.iso
    可以使用lo0设备来访问abc.iso里的内容,比如说,可以从abc.iso里的软盘映像中启动
    loopback lo0 (hd1,1)/aa.iso
    linux (lo0)/memdisk
    initrd (lo0)/abc.img
    要删除某一回放设备,可以使用-d参数:
    loopback -d lo0

  4. set
    使用set可以设置变量的值
    set root=
    set timeout=
    需要调用变量的值时,使用${AA},如set root=(hd1,1)
    则${root}=(hd1,1)

  5. pager
    分页显示。
    set pager=1
    满页时暂停,按space继续
    set pager=0
    取消分页

  6. linux
    linux取代grub中的kernel
    三,单linux系统或硬盘安装时iso放在C盘,umount /isodevice引起的误认为单系统
    不能出现菜单项的几种处理方法。

  7. 开机自检后时按几下shift键,可调出菜单项
  8. sudo update-grub
    重建grub.cfg,会发现新的系统而改写grub.cfg,一般能出现菜单项。
    3.如第二种方法不能解决,直接修改grub.cfg
    把在### BEGIN /etc/grub.d/30_os-prober 中的这一段
if keystatus; then
if keystatus -shift; then
set timeout=-1
else
set timeout=0
fi
else
if sleep$verbose -interruptible 3 ; then
set timeout=0
fi
fi

删除或修改三处set timeout=<大于0>

四、双硬盘双系统 Grub Loading时间过长的解决方案
grub2的boot.img设定root的uuid从第一分区开始搜索分区的/boot/grub下的模块并加载, 如果linux分区处于第二硬盘甚至第三硬盘,会导致搜索时间过长而,出现菜单时间会长达10多秒。
对双(多)硬盘的情况建议把grub安装在ubuntu所在硬盘的mbr上,/boot分区或 / 分区 尽量靠前,并设该硬盘为启动盘,会大大缩短启动时间。
五、grub2几种修复方法
1. 双系统重装windows造成grub2被改写的修复
方法一 grub4dos0.4.4
在Windows启动项上加上grub4dos启动(不多说了,看置顶贴),重启选择进入grub,在命令行下输入(/boot单独分区的去掉 /boot)

代码:

grub>find -set-root /boot/grub/core.img
grub>kernel /boot/grub/core.img
grub>boot

进入grub2菜单,进入系统后再执行
代码:

sudo grub-install /dev/sd?

方法二 进入Livecd 后修复(感谢billbear)
引用:

sudo -i
mount 你的根分区 /mnt
mount 你的/boot 分区 /mnt/boot #如果有的话
#挂载你其他的分区,如果有的话
# 重建grub到sda的mbr
grub-install -root-directory=/mnt /dev/sda
  1. 由于root分区uuid改变造成的不能正常启动,只能进入grub rescue模式的修复
    代码:
grub rescue>set
grub rescue>prefix=(hd?,?)/grub
grub rescue>root=hd?,?
grub rescue>set root=hd?,?
grub rescue>set prefix=(hd?,?)/boot/grub
grub rescue>set
grub rescue>root=hd?,?
grub rescue>prefix=(hd?,?)/boot/grub
grub rescue>insmod /boot/grub/normal.mod
grub rescue>normal

#这时就可以调出 /boot/grub/grub.cfg,修改相应uuid,
#改到命令行下
grub>insmod /boot/grub/linux.mod
grub>set root=hd?,?
grub>linux /boot/vmlinuz-*** root=/dev/sd??
grub>initrd /boot/initrg.img-****
#进入系统
#hd?,? 是grub文件所在分区 sda? 是/分区。
  1. grub模块和配置文件grub.cfg受损无法启动时修复
    Livcd启动进入试用
    引用:
sudo -i
mount 你的根分区 /mnt

mount 你的/boot 分区 /mnt/boot #如果有的话
# 挂载你其他的分区,如果有的话
# 重建grub到sda的mbr
grub-install -root-directory=/mnt /dev/sda
# 重建grub.cfg  www.2cto.com  
mount -bind /proc /mnt/proc
mount -bind /dev /mnt/dev
mount -bind /sys /mnt/sys
chroot /mnt update-grub
umount /mnt/sys
umount /mnt/dev
umount /mnt/proc

六、 另一些补充说明
1. chainloader
grub2将支持 chainloader /file 的用法。
目前支持的文件只有 grub2 的 boot.img 和 grub4dos 的grldr 和 grub.exe。希望正式版能支持 ntldr bootmgr peldr 等文件。
2. drivemap
drivemap 兼容 grub 的 map,主要用于只能从 (hd0) 引导启动的系统如 win2000 xp 2003,可以象 map 用法一样如:

menuentry "Windows XP" {
insmod ntfs
drivemap (hd0) (hd1)
drivemap (hd1) (hd0)
set root=(hd1,1)
chainloader +1
}

#实际上 drivemap 有了更方便的用法:
menuentry "Windows XP" {
insmod ntfs
set root=(hd1,1)
drivemap -s (hd0) ${root}
chainloader +1
}
  1. grub2 引导软盘img镜像启动
    比如要加载(hd1,1)根目录下的 a.img 镜像,先把 memdisk 从 memdisk.gz 中解压出来,用法是:
    linux (hd1,1)/memdisk #镜像文件超过2.88M要加上 c=* h=* s=*
    initrd (hd1,1)/a.img
    boot

转载自:http://tieba.baidu.com/p/3191017719?see_lz=1

centos7.0修改默认字符编码

转载自http://www.cnblogs.com/FlightButterfly/p/4227886.html

首先说一下写这篇博客的初衷。

由于公司这一期的产品准备支持的环境有CentOS 7、MySql 5.6、Java 8、Tomcat 8等等,并且因为人员严重不足,我本月的开发任务在原有的基础上又加上了好多环境检证的工作。

因为在这次环境检证过程中遇到了不少困难,特此记录一下。

重点:记录CentOS 7与以往不同的地方

1.取消ifconfig,使用ip addr 查看IP地址。

2.使用firewalld 取代 iptables。

3.系统默认编码设置文件,由/etc/sysconfig/i18n 更改为 /etc/locale.conf

因为自己电脑是Windows 8.1 + Ubuntu 14组合,所以对大部分Linux 命令还是比较熟悉的。但是面对CentOS 7,我发现过去使用Linux的经验反而成为限制我的最大障碍。

下面就让我来吐嘈一下万恶的CentOS 7吧:

首先,我像往常一样使用光盘安装了CentOS 7,事情进展到这里貌似还算顺利。接下来就是痛苦的开始了,装好系统以后,我准备使用 XShell 远程管理CentOS,但是这需要知道IP。于是我使用 ifconfig 查看IP,

※这里说一下,因为公司产品主要在日本销售,所以产品的运行环境上默认语言是日语。

我去,什么情况?难道是我敲错了?仔细核对了每一个字母,没错啊!!!后经度娘解惑,CentOS 7取消了ifconfig,改为ip addr查看ip地址。命令如下:

因为系统安装时网络连接设置的自动获取,先改成静态ip。配置方法如下:

第一步,vi /etc/sysconfig/network-scripts/ifcfg-enp0s25;

设置内容:

解释:

IPADDR0 --> ip
GATEWAY0 --> 网关
DNS1 -->DNS

第二步,重启网络服务 -->service network restart(特别重要,千万不要忘记。)
第三步.查看ip ip addr,再 ping 一下网络。这是网络配置基本就完成了。
事情进展到这里貌似也没什么难过的坎,我开始配置防火墙。先使用 iptables status 查看防火墙状态,

我去,什么鬼?我敲错了?有一次仔细核对了每一个字母,完全没错啊!!!不管怎么说,先看一下iptables脚本是否还存在吧。

咦,iptables脚本不见了。不用多想一定是CentOS 7使用了新型的防火墙,立即百度。

※度娘解惑:CentOS 7使用firewalld 取代 iptables。使用命令行工具firewalld-cmd获取firewalld状态,$ firwall-cmd --state。

这里如果读者朋友们对FirewallD不了解请自行百度,因为在编写这篇博客时我对它的了解也全部来自百度。

因为对FirewallD不是很熟悉,组里讨论决定防火墙还是使用 iptables。

※ 如果想使用iptables 和 ip6tables 静态防火墙规则,请自行安装iptables-services 并禁用firewalld。

禁用firewalld 相关命令:

systemctl start firewalld.service#启动firewall
systemctl stop firewalld.service#停止firewall
systemctl disable firewalld.service#禁止firewall开机启动
安装iptables-services

yum installiptables-services
※因为已经存在很多配置iptables 规则的教程了,小编就不再赘述了,读者朋友们可以自行百度。

iptables 规则:略

到这里,我已经被CentOS 7 恶心的不行不行的了,但是还没有结束。

由于时间关系今天先写到这里,剩下的我日后补上。

--------------------2015/01/16--------------------

首先集中回复一下评论中被问及的几个问题,

1.有网友评论称自己的电脑上ifconfig命令可以使用:

答:其实刚看到这条评论时我也不太清楚是怎么回事,于是立刻找度娘。度娘解释,CentOS 7 最小化安装时,未安装ifconfig,使用ip addr取代其作用。但是如果还是想要使用ifconfig 的话,可以自行安装。

2.网友提问:“设置静态IP的时候,IPADDR0这个下面的Prefixo=24是什么意思?”

答:PREFIX0=24 --> 前缀24位(相当于子网掩码共24为,即子网掩码为255.255.255.0)

可能有网友问,为啥要安装CentOS 7 最小化版本呢?

答:公司要求,我也没办啊。哭... 有同事自己电脑准备安装CentOS 7耍耍,我就建议他安装 GNOME Desktop 版。其实,CentOS 7 GNOME Desktop 也没有Windows或Ubuntu使用方便啊。在Windows或Ubuntu环境下都已经将命令行工具设置好了快捷键,用户只需要查询一下手册就能使用了。但是CentOS 7 它没有,竟然还需要自己配置。

下面设置方法来自百度:http://jingyan.baidu.com/article/cb5d61053598ed005d2fe05c.html

在桌面右上角找到系统设置,进入后找到键盘设置。进入后找到自定义快捷键。

名字:随便填,不重要。

命令:/usr/bin/gnome-terminal(不能填错,因为这是打开终端的脚本啊。)

设置如下

#####

说实话,小编在操作系统方面真心是一只小白,大多数时候遇到不明白的问题都是求教度娘的。

另外还是希望大家有什么问题(ps:可以是对CentOS 7使用方面的问题;可以是Linux 命令方面的问题;也可以是对小编其他博客相关的问题。都可以在评论区和我进行讨论,嘿嘿...)