分类目录归档:Linux配置

Linux下系统及常见服务配置相关的文章

在Ubuntu下基于Postfix/Dovecot安装自有邮箱服务

博客已经搭建了很多年了,一直想拥有一个自己的邮箱服务器,最近机缘巧合,给另外一个项目搭建了一个,刚好随手,就给自己的域名也搭建一个,拿来用一用装逼。

顺便,把整个流程记录下来。

1、以我的域名 stamhe.com 为例,要部署邮箱服务的IP地址为 149.28.109.196

2、建议购买vultr的主机,好处后面就知道了

主要参考文章为Linode的这篇文章:

https://www.linode.com/docs/email/postfix/email-with-postfix-dovecot-and-mysql/

到达率参考

http://lomu.me/post/SPF-DKIM-DMARC-PTR

一、申请SSL证书

通过Let’s Encrypt申请免费的SSL证书

cd /root
wget https://dl.eff.org/certbot-auto && chmod a+x certbot-auto
# 申请通配符域名
./certbot-auto -d "*.stamhe.com" --manual --preferred-challenges dns-01 certonly 
# 申请单一域名
./certbot-auto -d "mail.stamhe.com" --standalone certonly

按命令行提示进行操作,即可得到如下的证书

root@stamhe:~/certauto# ./certbot-auto certificates
Saving debug log to /var/log/letsencrypt/letsencrypt.log

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Found the following certs:
  Certificate Name: stamhe.com
    Domains: *.stamhe.com
    Expiry Date: 2019-10-22 05:33:50+00:00 (VALID: 89 days)
    Certificate Path: /etc/letsencrypt/live/stamhe.com/fullchain.pem
    Private Key Path: /etc/letsencrypt/live/stamhe.com/privkey.pem

其中,fullchain.pem 为公钥文件, privkey.pem 为私钥文件.

Let’s Encrypt 是免费证书,有效期为 90 天,快到期前,需要执行下面的命令申请延期

./certbot-auto  renew --manual-auth-hook certonly

注意: 如果服务器本身安装得有Web服务器,如Nginx、Apache之类的,在执行延期申请命令前,需要先停止在80、443端口的监听,延期成功后,再启动。

二、配置基本的DNS相关信息

类型名称
Amail149.28.109.196
MX@mail.stamhe.com
TXT@v=spf1 mx:mail.stamhe.com ip4:149.28.109.196 ~all

配置spf主要是为了防止发信被对方放垃圾邮箱的一个手段,后面会有详细介绍。

三、配置基础的MySQL账户信息

假设MySQL的连接信息如下:

localhost
3306
root
123456

创建库、表

create database mailserver;
use mailserver;

CREATE TABLE `virtual_domains` (  
  `id` int(11) NOT NULL auto_increment,  
  `name` varchar(50) NOT NULL,  
  PRIMARY KEY (`id`))  
ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE TABLE `virtual_users` (  
`id` int(11) NOT NULL auto_increment,  
`domain_id` int(11) NOT NULL,  
`password` varchar(106) NOT NULL,  
`email` varchar(100) NOT NULL,  
PRIMARY KEY (`id`),  
UNIQUE KEY `email` (`email`),  
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE)  
ENGINE=InnoDB DEFAULT CHARSET=utf8;

CREATE TABLE `virtual_aliases` (  
`id` int(11) NOT NULL auto_increment,  
`domain_id` int(11) NOT NULL,  
`source` varchar(100) NOT NULL,  
`destination` varchar(100) NOT NULL,  
PRIMARY KEY (`id`),  
FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE)  
ENGINE=InnoDB DEFAULT CHARSET=utf8;

插入两个测试用的邮箱账户信息

insert into virtual_domains(id,name) values(1,'mail.stamhe.com');     
insert into virtual_domains(id,name) values(2,'stamhe.com');


insert into virtual_users(id,domain_id,password,email) values (1,2,ENCRYPT('123456'),'love@stamhe.com');

insert into virtual_users(id,domain_id,password,email) values (2,2,ENCRYPT('12345678'),'you@stamhe.com');


insert into virtual_aliases(id,domain_id,source,destination) values (1,2,'all@stamhe.com','love@stamhe.com');

insert into virtual_aliases(id,domain_id,source,destination) values (2,2,'all@stamhe.com','you@stamhe.com');

四、Postfix的安装以及相关配置

安装Postfix

apt-get install postfix postfix-mysql postfix-doc mailutils

安装过程中需要选择Postfix的类型,请选择Internet Site,还会需要输入System mail name,这里请输入你要收发邮件的域名地址,我这儿是输入: stamhe.com

Postfix配置项的官方文档

http://www.postfix.org/documentation.html

查看Postfix的版本号

postconf -d | grep mail_version

打开 /etc/postfix/main.cf

1、删除掉下面的所有默认配置

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/certs/ssl-cert-snakeoil.pem
smtpd_tls_key_file=/etc/ssl/private/ssl-cert-snakeoil.key
smtpd_use_tls=yes
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
smtp_tls_session_cache_database = btree:${data_directory}/smtp_scache

2、新增下面的配置

smtpd_tls_cert_file=/etc/letsencrypt/archive/stamhe.com/fullchain1.pem
smtpd_tls_key_file=/etc/letsencrypt/archive/stamhe.com/privkey1.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may

3、新增下面的配置

smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
message_size_limit = 15728640
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_helo_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unlisted_recipient,
    reject_unauth_destination

smtpd_sender_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain

smtpd_relay_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    defer_unauth_destination

4、修改mydestination

mydestination = localhost

注意:mydestination参数中,不能出现在前面 virtual_domains 表中出现的域名,否则创建的账户会无法收到邮件。

5、新增如下配置,告诉Postfix不要使用LDA「Local Delivery Agent」转而使用Dovecot的LMTP完成本地邮件投递

virtual_transport = lmtp:unix:private/dovecot-lmtp

6、新增如下配置,告诉Postfix去MySQL数据库种寻找域名、用户帐号密码及邮件别名等信息

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

7、配置连接MySQL相关的信息

# cat /etc/postfix/mysql-virtual-mailbox-domains.cf
user = root
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT 1 FROM virtual_domains WHERE name='%s'


# cat /etc/postfix/mysql-virtual-mailbox-maps.cf
user = root
password = 123456
hosts = 127.0.0.1  
dbname = mailserver
query = SELECT 1 FROM virtual_users WHERE email='%s'

# cat /etc/postfix/mysql-virtual-alias-maps.cf
user = root
password = 123456
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

执行下面的命令重启postfix

systemctl restart postfix

测试上面的MySQL连接信息

# postmap -q stamhe.com mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
1

# postmap -q love@stamhe.com mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
1

# postmap -q all@stamhe.com mysql:/etc/postfix/mysql-virtual-alias-maps.cf
love@stamhe.com,you@stamhe.com

8、打开 /etc/postfix/master.cf 文件,去掉里面 submission和smtps所在的两行,并将其注释去掉。

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       y       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=$mua_client_restrictions
  -o smtpd_helo_restrictions=$mua_helo_restrictions
  -o smtpd_sender_restrictions=$mua_sender_restrictions
  -o smtpd_recipient_restrictions=
  -o smtpd_relay_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING

9、再次重启postfix

10、完整的main.cf配置文件如下

root@stamhe:~# cat /etc/postfix/main.cf
# See /usr/share/postfix/main.cf.dist for a commented, more complete version


# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

myhostname = stamhe
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydestination = $myhostname, stamhe, localhost.localdomain, , localhost
relayhost = 
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all
html_directory = /usr/share/doc/postfix/html

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = /usr/share/doc/postfix

# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/archive/stamhe.com/fullchain1.pem
smtpd_tls_key_file=/etc/letsencrypt/archive/stamhe.com/privkey1.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.



smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
message_size_limit = 15728640
broken_sasl_auth_clients = yes
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous
smtpd_helo_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_invalid_helo_hostname,
    reject_non_fqdn_helo_hostname

smtpd_recipient_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_recipient,
    reject_unknown_recipient_domain,
    reject_unlisted_recipient,
    reject_unauth_destination

smtpd_sender_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    reject_non_fqdn_sender,
    reject_unknown_sender_domain

smtpd_relay_restrictions =
    permit_mynetworks,
    permit_sasl_authenticated,
    defer_unauth_destination

virtual_transport = lmtp:unix:private/dovecot-lmtp

virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# Even more Restrictions and MTA params
disable_vrfy_command = yes
strict_rfc821_envelopes = yes

smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes

smtpd_timeout = 30s
smtp_helo_timeout = 15s
smtp_rcpt_timeout = 15s
smtpd_recipient_limit = 40
minimal_backoff_time = 180s
maximal_backoff_time = 3h

# Reply Rejection Codes
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550



# rate
smtpd_client_connection_count_limit = 100
smtpd_client_connection_rate_limit = 100
smtpd_client_message_rate_limit = 100
smtpd_client_recipient_rate_limit = 100
smtpd_client_new_tls_session_rate_limit = 100
smtpd_client_auth_rate_limit = 100
root@stamhe:~# 

五、Dovecot的安装及相关配置

Dovecot充当IMAP、POP服务器的角色,同时它也将负责用户登录时用户身份的验证「Dovecot会将真正的验证工作交给MySQL处理」。因为使用SSL,Dovecot将会使用993「IMAP协议」及995「POP协议」与外界通讯,所以需要允许放行993、995、465三个端口。

1、安装Dovecot

apt-get install dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql

2、修改 /etc/dovecot/dovecot.conf 配置文件

!include_try /usr/share/dovecot/protocols.d/*.protocol  
protocols = imap pop3 lmtp

3、修改 /etc/dovecot/conf.d/10-mail.conf 配置文件

mail_location = maildir:/var/mail/vhosts/%d/%n
mail_privileged_group = mail

同时执行下面的命令,创建 mail_location需要的工作目录

# mkdir -p /var/mail/vhosts/stamhe.com
# groupadd -g 5000 vmail  
# useradd -g vmail -u 5000 vmail -d /var/mail
# chown -R vmail:vmail /var/mail

4、修改 /etc/dovecot/conf.d/10-auth.conf 配置文件

disable_plaintext_auth = yes
auth_mechanisms = plain login

默认情况下,Dovecot是允许Ubuntu系统用户登录使用的,我们需要将其禁用。找到文件种如下内容并将其注释:

#!include auth-system.conf.ext

开启Dovecot的MySQL支持,取消!include auth-sql.conf.ext的注释符号:

#!include auth-system.conf.ext  
!include auth-sql.conf.ext  
#!include auth-ldap.conf.ext  
#!include auth-passwdfile.conf.ext  
#!include auth-checkpassword.conf.ext  
#!include auth-vpopmail.conf.ext  
#!include auth-static.conf.ext

5、修改 /etc/dovecot/conf.d/auth-sql.conf.ext 配置文件

passdb {  
    driver = sql  
    args = /etc/dovecot/dovecot-sql.conf.ext  
}  

userdb {  
    driver = static  
    args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n  
}

6、修改 /etc/dovecot/dovecot-sql.conf.ext 配置文件

driver = mysql
connect = host=127.0.0.1 dbname=mailserver user=root password=123456
default_pass_scheme = CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u'

注意: default_pass_scheme代表使用的密码的加密存储算法,我们前面在SQL语句中使用的是encrypt函数,对应的就是CRYPT,当然也可以使用其他算法,自己研究。

7、修改一下目录权限

chown -R vmail:dovecot /etc/dovecot

chmod -R o-rwx /etc/dovecot

8、修改 /etc/dovecot/conf.d/10-master.conf 配置文件

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
}

service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}

service lmtp {  
        unix_listener /var/spool/postfix/private/dovecot-lmtp {  
        mode = 0600  
        user = postfix  
        group = postfix  
  }
}


service auth {  
    unix_listener /var/spool/postfix/private/auth {  
            mode = 0666  
            user = postfix  
            group = postfix  
    }  

    unix_listener auth-userdb {  
            mode = 0600  
            user = vmail  
            #group =  
    }  

    user = dovecot  
}

service auth-worker {  
    user = vmail  
}

9、修改 /etc/dovecot/conf.d/10-ssl.conf 配置文件

ssl = required
ssl_cert = </etc/letsencrypt/archive/stamhe.com/fullchain1.pem
ssl_key = </etc/letsencrypt/archive/stamhe.com/privkey1.pem

注意: 这儿的证书路径最前面,有一个【<】开头,别漏了。。。

10、修改 /etc/dovecot/dovecot.conf 配置文件

postmaster_address = postmaster at stamhe.com

11、重启dovecot服务

systemctl restart dovecot

六、测试接收、发送邮件

建议使用 163、gmail来做测试对象, qq邮箱很多变态规则,在做下面的配置之前,可能你的很多发送都是失败的。。。

调试日志在

/var/log/mail.log

/var/log/mail.log
/var/log/mail.err

七、邮件服务器添加SPF、DKIM、DMARC、PTR提高送达率

主要参考

http://lomu.me/post/SPF-DKIM-DMARC-PTR

1、SPF的配置

我们前面已经做了,在DNS中,新增下面的TXT记录即可

v=spf1 mx:mail.stamhe.com ip4:149.28.109.196 ~all

2、DMARC配置

在DNS中,新增下面的TXT记录

主机名:
_dmarc

记录值:
v=DMARC1;p=reject;rua=support@stamhe.com

3、PTR配置

如果你是使用的vultr,那就简单了,在Server Detail -> Setting下面,修改 Reverse DNS 为【mail.stamhe.com】即可。

如果是其他的主机厂商,问客服

使用如下命令测试结果

dig -x 你的邮箱服务器IP

4、DKIM配置

安装OpenDKIM

apt install opendkim opendkim-tools

A、修改  /etc/opendkim.conf  配置文件

在最后面追加如下配置内容

AutoRestart             Yes
AutoRestartRate         10/1h
UMask                   002
Syslog                  yes
SyslogSuccess           Yes
LogWhy                  Yes

Canonicalization        relaxed/simple

ExternalIgnoreList      refile:/etc/opendkim/TrustedHosts
InternalHosts           refile:/etc/opendkim/TrustedHosts
KeyTable                refile:/etc/opendkim/KeyTable
SigningTable            refile:/etc/opendkim/SigningTable

Mode                    sv
PidFile                 /var/run/opendkim/opendkim.pid
SignatureAlgorithm      rsa-sha256

UserID                  opendkim:opendkim

Socket                  inet:12301@localhost

B、修改 /etc/default/opendkim 配置文件

SOCKET="inet:12301@localhost"

C、修改 /etc/postfix/main.cf 配置文件

milter_protocol = 6
milter_default_action = accept

smtpd_milters = inet:localhost:12301
non_smtpd_milters = inet:localhost:12301

milter_protocol = 6 这个参数,根据下面的命令来

# postconf -d | grep mail_version
当postfix版本为2.6+,milter_protocol=6; 版本为2.3到2.5,milter_protocol=2;

D、创建目录

mkdir -p /etc/opendkim/keys

E、修改 /etc/opendkim/TrustedHosts  配置文件

127.0.0.1
localhost
192.168.0.1/24

 *.stamhe.com

F、创建opendkim所需要的key

# cd /etc/opendkim/keys 
# mkdir stamhe.com
# cd stamhe.com
# opendkim-genkey -s mail –d stamhe.com
# chown opendkim:opendkim mail.private

注意,有一些DNS服务商的TXT值有限制长度,opendkim-genkey默认生成的为2048的key,太长了,对于有长度限制的,可以使用 1024的key

# opendkim-genkey -s mail -d stamhe.com -b 1024

得到如下两个文件

total 16
drwxr-xr-x 2 root     root     4096 Jul 24 08:05 ./
drwxr-xr-x 3 root     root     4096 Jul 24 08:04 ../
-rw------- 1 opendkim opendkim  891 Jul 24 08:05 mail.private
-rw------- 1 root     root      308 Jul 24 08:05 mail.txt

G、修改 /etc/opendkim/KeyTable 配置文件

mail._domainkey.stamhe.com 
 stamhe.com:mail:/etc/opendkim/keys/stamhe.com/mail.private

H、修改 /etc/opendkim/SigningTable 配置文件

*@stamhe.com    mail._domainkey.stamhe.com

H、新增一条DNS记录

主机名:
mail._domainkey

记录值:
v=DKIM1; k=rsa; p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCptXy6RtzzWujOEfCAm96Kw/OAzGXGFXzky69T6crWOFl71R7Km8WDbJxLqmz1EfDwq5gVP7QP8lkKBbn/28KLIRlSmkzMaMB+JaZinZ3UJBvKZz6thBePSbAx9AuNU/IwLFlH1NXkK7DBk657EZusD3FgV3rx3sZzH6HcJ9O55wIDAQAB

记录值的来源:

root@stamhe:/etc/opendkim/keys/stamhe.com# cat mail.txt 
mail._domainkey IN      TXT     ( "v=DKIM1; k=rsa; "
          "p=MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCptXy6RtzzWujOEfCAm96Kw/OAzGXGFXzky69T6crWOFl71R7Km8WDbJxLqmz1EfDwq5gVP7QP8lkKBbn/28KLIRlSmkzMaMB+JaZinZ3UJBvKZz6thBePSbAx9AuNU/IwLFlH1NXkK7DBk657EZusD3FgV3rx3sZzH6HcJ9O55wIDAQAB" )  ; ----- DKIM key mail for stamhe.com

I、重启postfix、opendkim服务

systemctl restart postfix
systemctl restart opendkim

测试opendkim的配置结果

opendkim-testkey -d stamhe.com -s mail -vvv

所有这些配置完毕,可以访问 下面的网站,用配置的账户信息,发送一封已经过去,测试一下得分情况。

http://www.mail-tester.com

一种通用的百亿级数据清洗方案

最近两个月,一直在和刀哥两个人重构连尚读书这边的用户行为日志系统。到本周放量完所有的数据到新系统,基本算告一个段落。

目前的业务情况,大概是有新旧两套日志系统数据,日志规模(2018.11),新日志一天产生6000万条日志,旧日志一天产生4000万条日志数据,合计1亿条上报日志,这些日志数据,都是合并上报的,根据统计,大概一条上报日志,会产生50条最终日志数据。所以最终的日志量,超过了50亿条(写这篇博客时,2019.1,已经超过70亿条)。

根据业务特点,预计的高峰期是10个小时(按40000秒计算), 100000000 / 40000 = 2500条/秒。整个系统每秒要完成 2500条上报日志的收集。然后要转化为 2500 * 50 = 125000条/秒的最终结果日志数据。晚上21 ~ 22点的最高峰,处理量还要预留x4,估计会处理10000条的收集日志数据,完成生产500000条/秒最终结果日志数据。

最终结果日志数据文件的单条大小在1 ~ 2 kbyte之间,多数为1 kbyte

最终结果日志数据,需要存储在本地硬盘+大数据的Kafka集群(9台机器)两边做容灾。

如此大规模的数据,不管是收集,清洗,本地存储,还是入库,都是非常有挑战的一项工作,更何况是重构。。。

一、旧的架构情况,使用的机器规模大概是20台机器.

注释:

1、Bear服务是这边之前的同事用Golang + Leveldb写的一个服务,可以用来接收HTTP请求传输的数据到Leveldb,然后再把对应的数据,发送到指定的HTTP 地址(转发数据)或者是发送到指定的Kafka集群,可以起到数据的缓存作用

2、之前得到的同事的反馈,都说这个Bear服务的性能很高,不存在问题

旧架构存在的问题

1、无法追踪单条数据的处理情况,因为数据没有任何的标号,导致要反查或者是顺查数据,基本没法

2、Bear只会把数据存储在Leveldb里面,外层没有日志,再加上没有源码,无法做任何修改(我也不知道为啥没源码啊)

3、之前的同事反馈说Bear的性能很高,不存在性能问题,但是我们实际观察发现,问题最大的就是这个Bear,一个是接收性能不行,另外一个就是数据转发性能不行,不管是接收HTTP数据,还是转发数据到HTTP或者Kafka集群,Bear都给不出来量,所以导致经常出现拥堵的情况,需要不停的多开Bear服务,其性能有严重的问题

4、本地没有数据,无法做数据重放。不管是收集日志,还是最终日志,我们这边完全没任何原始数据,一旦入了Kafka集群后,我们就无能为力了,无法校对数据,无法重放,无法追踪处理流程

5、因为使用Bear做数据缓存,他只支持HTTP请求的数据清洗,导致只能走php-fpm,然后他的转发性能又不行,所以导致整个系统的数据清洗能力极低

二、新的架构情况,使用的机器规模为12台 + 3 组Redis实例

优点

1、不管是收集的原始日志数据还是处理以后的最终日志数据,我们都有存储,随时可以重放

2、每条日志加了不会重复的logid,可以根据logid追踪到任何一条数据的流转过程和处理结果,并且大数据那边可以根据logid去重数据

3、不管是收集端的API日志服务器,还是Redis,还是消费服务器,都是可以任意的横向的扩展的,而且不影响任何第三方,性能可以直线上升

4、日志数据压缩,采用的是pigz的并行压缩,每天凌晨压缩前一天的日志数据文件,在目前的日志规模下,在一个小时内,可以压缩完成所有的日志,对业务和机器负载不会带来任何影响,而且数据的压缩比率,在1:20以上

5、因为采用了脚本主动拉取的模式,所以只要消费服务器足够,理论上任何数据都会在3s内被处理,达到实时效果

6、业务采用了脚本的模式,执行效率相比原来的Nginx + php-fpm的模式,性能提升了几十倍,而且因为不走HTTP协议了,所以内网的带宽使用也成倍的下降,不到原来的一半

7、因为使用了Logstash的批量提交模式,数据入Kafka的性能,提升了几十倍

8、因为启用了Logstash的永久队列,基本上保障了数据的不丢失,经过对比,和Kafka里面统计出来的数据,误差在百万分之几的级别

9、在入Logstash时,采用了失败就扔Redis队列再用另外的消费脚本入可用的其他Logstash的方式,保障说即使本地的Logstash宕机,数据依然可以正常的入Kafka集群

10、消费脚本进程,采用了supervisor来做管理,新、旧版消费日志脚本,单机各开100个脚本,主要 supervisor 需要采用 3.3以上的版本,3.3以下的版本,对于管理几百个进程,会有问题

11、各段都可以方便的知道性能瓶颈,不管是Filebeat的收集端,Redis队列端,还是Logstash端,都提供了良好的监控数据,可以即时了解系统的工作状态。

三、重构完成后,新旧系统的服务器机器负载对比

旧系统单机

新系统

消费服务器的负载
Redis负载

目前,单日清洗的数据量,已经超过70亿条,按现在的机器负载预估,这5台机器,预计处理清洗150亿条日志数据,没有任何问题。

Linux Mint 18(ubuntu 16.04)桌面版本系统安装完成后的初始化

永久修改dns服务器

vim /etc/resolvconf/resolv.conf.d/head
nameserver 119.29.29.29
nameserver 8.8.8.8
或者
vim /etc/network/interfaces
dns-nameservers 119.29.29.29 8.8.8.8
apt-get install fonts-wqy-zenhei fonts-wqy-microhei ttf-wqy-microhei ttf-wqy-zenhei openssl libssl-dev build-essential libevent-dev -y

安装java 8

apt-get install openjdk-8-jre-headless

安装nginx & mysql

apt-get install nginx
apt-get install apt-get install mysql-server-5.7 mysql-client-5.7

安装php7.1

add-apt-repository ppa:ondrej/php
apt-get update

apt-get remove php5-fpm php5-cli php5-dev -y

apt-get install php7.1 php7.1-cgi php7.1-cli  php7.1-dev php7.1-fpm php7.1-bcmath php7.1-bz2 php7.1-common php7.1-curl php7.1-gd php7.1-gmp php7.1-imap php7.1-json php7.1-mbstring php7.1-mcrypt php7.1-mysql php7.1-odbc php7.1-readline php7.1-soap php7.1-xml php7.1-xmlrpc php7.1-zip php7.1-opcache php-redis php-memcache php-memcached

安装event扩展支持workerman

pecl install event 
或
wget -c "https://www.openssl.org/source/old/1.0.1/openssl-1.0.1u.tar.gz"
wget -c http://pecl.php.net/get/event-2.3.0.tgz


./configure --with-event-openssl --with-openssl-dir=/usr --with-libdir=lib/x86_64-linux-gnu/
make
make install

安装搜狗拼音输入法

apt-get install -f
dpkg -i /windows/epan/sogoupinyin_2.1.0.0086_amd64.deb

重启&设置输入法即可

ubuntu下shadowsocks启动报错

pip install shadowsocks

http://blog.csdn.net/blackfrog_unique/article/details/60320737
用vim打开文件:vim /usr/local/lib/python2.7/dist-packages/shadowsocks/crypto/openssl.py (该路径请根据自己的系统情况自行修改,如果不知道该文件在哪里的话,可以使用find命令查找文件位置)
跳转到52行(shadowsocks2.8.2版本,其他版本搜索一下cleanup)
进入编辑模式
将第52行libcrypto.EVP_CIPHER_CTX_cleanup.argtypes = (c_void_p,)
改为libcrypto.EVP_CIPHER_CTX_reset.argtypes = (c_void_p,)
再次搜索cleanup(全文件共2处,此处位于111行),将libcrypto.EVP_CIPHER_CTX_cleanup(self._ctx)
改为libcrypto.EVP_CIPHER_CTX_reset(self._ctx)
保存并退出
启动shadowsocks服务:service shadowsocks start 或 sslocal -c ss配置文件目录
问题解决

cp /windows/dpan/linux/linux-config/myown.service /lib/systemd/system/myown.service
systemctl start myown

终端字体
文泉驿等宽微米黑 12号

安装shutter

apt-get install  libgoo-canvas-perl
apt-get install shutter

键盘快捷键里面映射 【shutter -s 】为【Ctrl + Alt + A】

安装uget

add-apt-repository ppa:plushuang-tw/uget-stable
apt-get update
apt-get install uget

安装aria2

add-apt-repository ppa:t-tujikawa/ppa
apt-get update
apt-get install aria2

安装teamviewer

apt-get install -f
apt-get install /windows/epan/teamviewer_i386.deb

安装vlc

add-apt-repository ppa:videolan/master-daily
apt-get update
apt-get install vlc

安装cairo-dock

add-apt-repository ppa:cairo-dock-team/ppa 
apt-get update
apt-get install cairo-dock cairo-dock-plug-ins
cairo-dock

Ubuntu 14.04升级到php7.1等版本

命令如下

add-apt-repository ppa:ondrej/php
apt-get update

apt-get remove php5-fpm php5-cli php5-dev -y

apt-get install php7.1 php7.1-cgi php7.1-cli  php7.1-dev php7.1-fpm php7.1-bcmath php7.1-bz2 php7.1-common php7.1-curl php7.1-gd php7.1-gmp php7.1-imap php7.1-json php7.1-mbstring php7.1-mcrypt php7.1-mysql php7.1-odbc php7.1-readline php7.1-soap php7.1-xml php7.1-xmlrpc php7.1-zip php7.1-opcache php-redis php-memcache php-memcached -y

service php7.1-fpm restart

ansible ——批量 linux/unix服务器管理工具

https://github.com/ansible/ansible

无意中看到这个项目,感觉跟puppet很相似,花时间了解了一下,发现还是很不错,而且支持使用python添加自己需要的模块,很简单。
而且相对来说,ansible有如下优点:
1、轻量级,他不需要去客户端安装agent,更新时,只需要在操作机上进行一次更新即可
2、批量任务执行可以写成脚本,而且不用分发到远程就可以执行
3、使用python编写的,维护更简单,ruby语法过于复杂
4、支持sudo

缺点:
1、对于几千台、上万台机器的操作,还不清楚性能、效率情况如何,需要进一步了解。

简要使用方法如下:
ansible 在centos 6.2上的安装

源码安装,源码去github上下载即可

yum install PyYAML.x86_64 python-paramiko.noarch python-jinja2.x86_64 
python setup.py build
python setup.py install

rpm 安装

git clone git://github.com/ansible/ansible.git
cd ./ansible
make rpm
sudo rpm -Uvh ~/rpmbuild/ansible-*.noarch.rpm

在/etc/profile下面添加上下面的环境变量

export ANSIBLE_HOSTS=/etc/ansible/ansible_hosts
export ANSIBLE_CONFIG=/etc/ansible/ansible.cfg

其中/etc/ansible/ansible_hosts里面就是要操作的主机列表,当然,在执行命令时,也可以带【-i】参数来指定主机列表文件名

ansible all -m command -a "/bin/echo hello" --ask-pass
ansible all -m ping --ask-pass -u root
ansible all -m script -a "/root/hequan/shell/t.sh" -k
ansible all -m copy -a "src=/root/hequan/shell/t.sh dest=/tmp/ mode=755 owner=root group=root" -k -u root
ansible all -m file -a "dest=/tmp/t.sh mode=755 owner=root group=root" -k -u root
ansible all -i /etc/ansible/serverlist -m shell -a "/tmp/t.sh" -k -u root

ansible all -m user -a "name=foo password="
ansible all -m user -a "name=foo state=absent"

ps:因为现在公司使用的管理程序,是我手工写的(同样用python),现在机器少,已经足够用了,等后面业务起来了,再详细的研究他。

【转】很好用的翻墙工具利用GAE实现,那个速度刚刚的啊,主要是免费!

很好用的翻墙工具利用GAE实现,那个速度刚刚的啊,主要是免费!
http://www.mysqlops.com/2012/04/19/fanqiang.html

GAE免费翻墙,我是用不着这个的,转载给需要的童鞋。
=================================================

1.http://code.google.com/p/goagent/ #下载最新稳定版本
2.申请Google Appengine #申请时当要你验证手机时,注意手机号填如+8613800138000
3.把下载下来的goagent-server上传到你申请的APP上就可以了。
4.把下载下来的goagent-local里的proxy.ini配置文件修改下:
[gae]
enable = 1
appid = app-name #标红的你申请的APP名称
password =
path = /fetch.py
debuglevel = 0
5.运行goagent-local(也可以运行proxy.py在linux系统里)里的proxy.exe ,然后在使用firefox的autoproxy代理插件配置一下就完成了,翻墙了配置方法如下:
配置autoproxy >autoproxy 首选项 >点击代理服务器>编辑代理服务器> 输入 GAE(名字) 127.0.0.1(代理IP) 8087(端口) 保存一下
然后新建一个 新的“添加规则分组 ”编辑一下>默认代理里的选择 “GAE” >输入一个标示名称GAPP 点OK,选择启用即可。
-6.另外也可以使用chrome的ProxySwitchySharp (推荐)插件来配置浏览器代理(在情景模式里设置),最后打开你的firefox或chrome即可畅游真实的世界是不是很High啊!

【转】free 命令结果完全剖析

free 命令结果完全剖析
http://blog.chinaunix.net/uid-15007890-id-3067490.html

 

相信有许多同学都对free命令中的buffers cached十分不理解,今天笔者就对free命令机器结果做一个详细的剖析。

以下是笔者在虚拟机上运行的debian系统的free情况。该虚拟机内存只有128M,同时分配了256M的SWAP交换区。

total used free shared buffers cached

Mem: 124788 113432 11356 0 15308 75568

-/+ buffers/cache: 22556 102232

Swap: 245752 20 245732

第一行 (可以理解为从操作系统的角度来看内存分配)

total 总物理内存大小。
used 已分配的大小,注意,对操作系统来说任何被使用的内存都是used。
free 未被分配的物理内存大小。
shared 共享内存大小,主要用于进程间通信,例如Oracle会使用上GB的共享内存。
buffers 主要用于块设备数据缓冲,例如记录文件系统的metadata(目录、权限等等信息)。
cached 主要用于文件内容缓冲

# 这里补充一下关于文件系统的常识 ^_^

# 文件系统实际上可以粗略的划分为两个部分:

# (1)metadata:即通常说的元数据,包括目录结构、文件的名字、大小、修改时间、权限等等信息。

# (2)filedata:即文件中真正存储的内容。

# 由于计算机中各个部件之间的速度相差很大,通常情况下CPU的cache最快,其次是内存,最慢的自然就是硬盘等外部设备了。

# 而越慢的设备越廉价,所以硬盘就被用来存储大量数据(有一天内存不要钱了大家就不用在被buffer、cache这个东东折磨了 <( ̄︶ ̄)>)。

# 所以,文件系统就被放在了硬盘上(不可避免的悲剧~~)。但是由于硬盘速度实在太慢了,为了改善IO性能,最终就诞生了”缓存”这一概念。

# “缓存”实际上就是在内存中划分一块区域作为硬盘和进程之间的缓冲区域,写进程把数据写到这里然后就干其他事情去了,读进程需要时先在这里找,找不到再去找硬盘,这样就大大提高了读写效率,同时缩短了IO等待时间,否则你在linux上运行man iptables 这样的命令的时候每次都会等N久。。。

# 这里还有一个”物理内存”和”虚拟内存”的概念,这个概念比较难讲,大家去google一些大牛的帖子看吧,涉及的东西太多了。。。。

所以,这里,buffer实际上是用来存储了文件系统的元数据(这样我们每次ls就会很快了 ^_^),而cache则缓存了近期读写过的文件的内容(第一次读文件会很慢,以后就会很快,就是因为有cache的存在),把这个理解了free命令就理解了大半了。

继续讲。。。

第二行 (可以理解为从应用程序的角度来看内存分配)

-/+ buffers/cached: 22556 102232

这里的 -/+ 实际上分别指的是 – buffers/cached 和 + buffers/cached 两个部分。

– buffers/cached = used(第一行) – buffers – cached 实际上是程序当前”真实使用”的”物理内存”的大小。
+ buffers/cached = buffers + cached 两个加起来可以理解为”暂时借给”系统作为”缓冲区”使用的内存大小。

大家做一下简单的加减法就清楚了:

从应用多角度来说,实际上系统还可以分配给他的内存有这么多:11356(free) + 15308(buffers) + 75568(cached)= 102232(free)

而系统所拥有的总的物理内存大小 113432 = 22556( – buffers/cached) + 102232 (+ buffers/cached)

所以,第一行的数据实际上是从操作系统角度来看的。

对于操作系统来说已分配的内存表示已经被某些数据所占据了,但是具体这些数数据是用来做什么的他不会去理会。

实际上正如前面所说,这部分物理内存被拿来做”缓存”了。

但是,是不是应用就不能使用了呢?

当然不是!!!!

不然我也不用写了,大家都懂了。。。

前面说到buffers和cached这部分内存是”借给”操作系统使用的,之所以说是”借的”,这里主要原因还在于”虚拟内存”与”物理内存”的区别。

对于应用来说,我申请了1000KB的内存,操作系统同意了,给程序一个地址,告诉他你要的内存在这里,然后程序就拿着这个地址去用了。

但是实际上大多数时候程序不会立刻将这些内存使用掉,而是一点一点的使用,所以,在没有使用之前,系统就能将这一部分物理内存拿去做其他事情已提升整个系统的性能,比如说这里的”缓存”。

当然,这样理解”虚拟内存”是非常片面的,实际情况比这要复杂得多,比如说这还涉及到程序的运行空间、代码的编译、链接、加载等等,必须结合起来才能解释清楚为什么需要虚拟内存,实际上”虚拟内存”是一个抽象的概念的实现,大大简化了操作系统和应用的设计复杂度。

虽然要讲的太多太多,但是,今天这样理解”虚拟内存”在这里也够用了。 ^_^

在这里操作系统就相当于”借”了一部分内存出去以提高系统的IO性能。

对于”虚拟内存”和”物理内存”可以通过ps aux命令简单看一下:

USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND

root 1471 0.0 0.3 2152 428 ? S 15:55 0:00 /usr/bin/daemon /etc/init.d/mpt-statusd check_mpt

root 1474 0.0 0.4 1748 556 ? S 15:55 0:00 /bin/sh /etc/init.d/mpt-statusd check_mpt

VSZ这一列显示的就是对应程序所分配的”虚拟内存”大小,而RSS则是程序实际使用的内存,VSZ实际是比RSS要大的,说明程序没有使用到他所申请的那么多内存,如果分配出去了肯定是闲的蛋疼。。。你的机器也不能像现在这样一边跑QQ一边看网页。。。开个chrome就完蛋了。。

细心的同学会发现,上面讲的这个”借”的过程和银行的业务很相似,大家把手里的现钱存到银行去,银行给我们一张卡,卡上有个卡号,银行说”凭这个卡和密码你就可以随时来取钱了”。然后我们就放心的把钱存在银行里,等需要钱的时候就拿着卡去取钱,而银行这时候也能拿着我们的钱去投资修桥补路。

唯一的区别可能就是银行有利息,这里么有~~~~~

扯远了,回到主题上。

好,既然我们说这个内存是”借”来的,那当然有程序会拿着地址过来要内存的时候(就跟取钱一样)。

这时候操作系统就会从第一行的free这里去找空闲内存分给程序用。

但是大家肯定发现了,大部分的内存是被buffers和cached占用了,万一来个需求大的内存的时候怎么办?

答案很简单嘛,把放出去的”贷款”收回来呗~~~~

那就从buffers和cached中释放内存,同时将所释放空间中的数据回写到硬盘上,防止数据丢失。

再插一句,要是buffers和cached也没了怎么办?那”银行”就只有从其他地方”借钱”来还了~~~

这次”借”就是从硬盘借了,也就是我们所说的分配SWAP空间,将一部分内存页面换到SWAP空间中。

当然实际的处理过程系统不会等到buffers和cached回收完才使用SWAP空间的,比你想象的要轻易得多,因为有时候缩小”缓存”的性能代价比使用SWAP空间更高,Linux系统还是很smart的~~~

回来继续说。

那什么时候系统会开始回收buffers和cached部分的内存呢?

这里要看一下数据:

root@debian01:~# cat /proc/meminfo

MemTotal: 124788 kB

MemFree: 11596 kB

Buffers: 15332 kB

Cached: 75568 kB

SwapCached: 20 kB

Active: 54884 kB

Inactive: 45564 kB

Active(anon): 2124 kB

Inactive(anon): 7560 kB

Active(file): 52760 kB

Inactive(file): 38004 kB

Unevictable: 0 kB

Mlocked: 0 kB

HighTotal: 0 kB

HighFree: 0 kB

LowTotal: 124788 kB

LowFree: 11596 kB

SwapTotal: 245752 kB

SwapFree: 245732 kB

Dirty: 0 kB

Writeback: 0 kB

AnonPages: 9544 kB

Mapped: 5884 kB

Shmem: 136 kB

Slab: 8784 kB

SReclaimable: 4940 kB

SUnreclaim: 3844 kB

KernelStack: 528 kB

PageTables: 456 kB

NFS_Unstable: 0 kB

Bounce: 0 kB

WritebackTmp: 0 kB

CommitLimit: 308144 kB

Committed_AS: 43272 kB

VmallocTotal: 897016 kB

VmallocUsed: 6344 kB

VmallocChunk: 879908 kB

HardwareCorrupted: 0 kB

HugePages_Total: 0

HugePages_Free: 0

HugePages_Rsvd: 0

HugePages_Surp: 0

Hugepagesize: 4096 kB

DirectMap4k: 16384 kB

DirectMap4M: 114688 kB

meminfo的数据比较多,这里就不细讲了,我们只关注一个数据。

LowFree: 11596 kB

实际上当free部分的内存小于这个值的时候,系统就会考虑是否需要回收”缓存”部分的物理内存,当然这不是绝对的,这可以作为一个参考阀值。

OK,最后一部分。

说了这么多,那么到底有没有办法强制释放呢??

当然有啊!!!银行欠你钱你会不去要???

话说办法其实很简单,在控制台执行以下命令即可:

echo 3 > /proc/sys/vm/drop_caches

这里的”3″表示释放所有buffers和cached中能释放的部分。

root@debian01:~# echo 3 > /proc/sys/vm/drop_caches

root@debian01:~# free

total used free shared buffers cached

Mem: 124788 26764 98024 0 148 6144

-/+ buffers/cache: 20472 104316

Swap: 245752 20 245732

手工释放以后大家可以测试一下,运行几次类似以下这些命令,会明显发现又涨上去了。。。

ls -la /dev/

find / -name *.sh

man iptables

root@debian01:~# free

total used free shared buffers cached

Mem: 124788 87368 37420 0 30692 25512

-/+ buffers/cache: 31164 93624

Swap: 245752 20 245732

OK,到这里free相关的东西就讲的差不多了。。。

写了好久~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

查看CPU是否支持虚拟化及cpuinfo标识说明

查看CPU是否支持虚拟化及cpuinfo标识说明

一、Windows平台:
使用小工具securable。

二、Linux平台:
在终端执行cat /proc/cpuinfo命令,找到flags部分,如果其中输出有VMX或SVM,即表明支持虚拟化技术。

cat /proc/cpuinfo | grep -i  VMX (for Intel CPU)
or cat /proc/cpuinfo | grep -i  SVM (for AMD CPU)

三、Linux显示的flags部分解释:

fpu – Onboard FPU
vme – Virtual Mode Extensions
de – Debugging Extensions
pse – Page Size Extensions
tsc – Time Stamp Counter
msr – Model-Specific Registers
pae – Physical Address Extensions
mce – Machine Check Architecture
cx8 – CMPXCHG8 instruction
apic – Onboard APIC
sep – SYSENTER/SYSEXIT
mtrr – Memory Type Range Registers
pge – Page Global Enable
mca – Machine Check Architecture
cmov – CMOV instructions (plus FCMOVcc, FCOMI with FPU)
pat – Page Attribute Table
pse36 – 36-bit PSEs
pn – Processor serial number
clflush – CLFLUSH instruction
dts – Debug Store
acpi – ACPI via MSR
mmx – Multimedia Extensions
fxsr – FXSAVE/FXRSTOR, CR4.OSFXSR
sse – SSE
sse2 – SSE2
ss – CPU self snoop
ht – Hyper-Threading
tm – Automatic clock control
ia64 – IA-64 processor
pbe – Pending Break Enable

syscall – SYSCALL/SYSRET
mp – MP Capable
nx – Execute Disable
mmxext – AMD MMX extensions
fxsr_opt – FXSAVE/FXRSTOR optimizations
pdpe1gb – GB pages
rdtscp – RDTSCP
lm – Long Mode (x86-64)
3dnowext – AMD 3DNow! extensions
3dnow – 3DNow!
k8 – Opteron, Athlon64
k7 – Athlon
constant_tsc – TSC ticks at a constant rate
up – smp kernel running on up
pebs – Precise-Event Based Sampling
bts – Branch Trace Store
nonstop_tsc – TSC does not stop in C states
pni – SSE-3
pclmulqdq – PCLMULQDQ instruction
dtes64 – 64-bit Debug Store
monitor – Monitor/Mwait support
ds_cpl – CPL Qual. Debug Store
vmx – Hardware virtualization      //intel的虚拟化技术VT技术
smx – Safer mode
est – Enhanced SpeedStep
tm2 – Thermal Monitor 2
ssse3 – Supplemental SSE-3
cid – Context ID
fma – Fused multiply-add
cx16 – CMPXCHG16B
xptr – Send Task Priority Messages
pdcm – Performance Capabilities
dca – Direct Cache Access
sse4_1 – SSE-4.1
sse4_2 – SSE-4.2
x2apic – x2APIC
aes – AES instructions
xsave – XSAVE/XRSTOR/XSETBV/XGETBV
avx – Advanced Vector Extensions
hypervisor – Running on a hypervisor
lahf_lm – LAHF/SAHF in long mode
cmp_legacy – If yes HyperThreading not valid
svm – Secure virtual machine      //AMD的虚拟化技术AMD-V
extapic – Extended APIC space
cr8legacy – CR8 in 32-bit mode
abm – Advanced bit manipulation
sse4a – SSE-4A
ibs – Instruction Based Sampling
sse5 – SSE-5
skinit – SKINIT/STGI instructions
wdt – Watchdog timer

linux权限–强制位与冒险位

强制位与冒险位
除了读写执行权限以外,ext3文件系统还支持强制位(setuid 和setgid)与冒险位(sticky)的特别权限。针对u,g,o,分别有set uid,set gid,及sticky。强制位与冒险位添加在执行权限的位置上。如果该位置上原已有执行权限。则强制位与冒险位以小写字母的方式表示,否则,以大写字母表示。强制位set uid与set gid在u和g的x位置上各采用一个s,冒险位(sticky)使用一个t。
强制位对文件的作用
在可执行文件上,用户可以添加set uid和set gid。默认情况下,用户执行一个指令,会以该用户的身份来运行进程。指令文件上的强制位,可以让用户执行的指令,以指令文件的拥有者或所属组的身份运行进程。这里有一个很好的例子。你管理着几个大型的数据库系统,而对它们进行备份需要有系统管理权限。你写了几个脚本,并设置了它们的suid,这样你指定的一些用户只要执行这些脚本就能够完成相应的工作,而无须以数据库管理员的身份登录,以免不小心破坏了数据库服务器。通过执行这些脚本,他们可以完成数据库备份及其他管理任务,而且在这些脚本运行结束之后,他们就又回复到他们作为普通用户的权限。另一个例子是/bin/passwd ,要读写/etc/passwd文件需要超级用户权限,但一般用户也需要随时可以改变自己的密码,所以/bin/passwd就设置了suid,当用户改自己密码的时侯就拥有了超级用户权限
强制位对目录的作用
默认情况下,用户建立的文件属于用户当前所在的组。目录上设置了setgid,表示在此目录中,任何人建立的文件,都会属于目录所属的组。
冒险位对目录的作用
默认情况下,如果一个目录上有w和x权限,则任何人可以在此目录中建立与删除文件。一旦目录上设置了冒险位,则表示在此目录中,只有文件的拥有者、目录的拥有者与系统管理员可以删除文件。
设置强制位与冒险位
用户可以用chmod指令来为文件设置强制位与冒险位。
set uid:chmod u+s 文件名
set gid:chmod g+s 文件名
sticky:chmod o+t 文件名
强制位与冒险位也可以通过一个数字加和,放在读写执行的三位数字前来指定。
4(set uid)
2(set gid)
1(sticky)

本文出自 “風殘あ淩度ツ” 博客,请务必保留此出处http://ivan8321.blog.51cto.com/681139/191653