<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[xdays Blog RSS Feed]]></title><description><![CDATA[记录着我技术的成长，生活的点滴和感悟，能对你有所帮助那更好。]]></description><link>https://xdays.me</link><generator>GatsbyJS</generator><lastBuildDate>Fri, 06 Dec 2024 05:51:37 GMT</lastBuildDate><item><title><![CDATA[Ansible教程之Collection]]></title><description><![CDATA[简介 Ansible 最新版(v2.10)已经切换到 collection 了，简单来说 collection 是一种分发 playbook, role, module 和 plugin 的方式，相比之前所有的东西都在一个仓库里管理，每个 collection…]]></description><link>https://xdays.me/Ansible教程之Collection/</link><guid isPermaLink="false">https://xdays.me/Ansible教程之Collection/</guid><pubDate>Mon, 28 Sep 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Ansible 最新版(v2.10)已经切换到 collection 了，简单来说 collection 是一种分发 playbook, role, module 和 plugin 的方式，相比之前所有的东西都在一个仓库里管理，每个 collection 都有自己单独的仓库更便于维护。&lt;/p&gt;
&lt;h1&gt;创建&lt;/h1&gt;
&lt;p&gt;创建 Collection 很简单，只需要按照规范把响应的资源放进去就可以了，标准目录结构：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;collection/
├── docs/
├── galaxy.yml
├── meta/
│   └── runtime.yml
├── plugins/
│   ├── modules/
│   │   └── module1.py
│   ├── inventory/
│   └── .../
├── README.md
├── roles/
│   ├── role1/
│   ├── role2/
│   └── .../
├── playbooks/
│   ├── files/
│   ├── vars/
│   ├── templates/
│   └── tasks/
└── tests/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Collection 开发文档可以&lt;a href=&quot;https://docs.ansible.com/ansible/latest/dev_guide/developing_collections.html&quot;&gt;参考这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;可以参考下[我的 Ansible Collection)(&lt;a href=&quot;https://github.com/xdays/ansible&quot;&gt;https://github.com/xdays/ansible&lt;/a&gt;)&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# install from galaxy
ansible-galaxy collection install my_namespace.my_collection:==1.0.0-beta.1

# install from github
ansible-galaxy collection install git+https://github.com/organization/repo_name.git,devel

# list installed collections
ansible-galaxy collection list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;p&gt;可以使用模块的绝对路径来引用模块:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- hosts: all
  tasks:
    - my_namespace.my_collection.mymodule:
        option1: value&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;因为每次都写 collection 的 namespace 有些麻烦，可以预先声明 collection 的 namespace&lt;/p&gt;
&lt;p&gt;在 role 里可以写在 meta data 里:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# myrole/meta/main.yml
collections:
  - my_namespace.first_collection
  - my_namespace.second_collection
  - other_namespace.other_collection&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;在 playbook 里可以这么写:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- hosts: all
  collections:
    - my_namespace.my_collection

  tasks:
    - import_role:
        name: role1

    - mymodule:
        option1: value&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样就可以像之前的版本一样继续使用模块了。&lt;/p&gt;
&lt;h1&gt;Inventory&lt;/h1&gt;
&lt;p&gt;因为在最新版里 inventory 脚本也都是放在了 collection 里，使用 inventory 脚本也和之前不一样了，这里整理了下 aws 的配置方法&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在配置文件&lt;code class=&quot;language-text&quot;&gt;ansible.cfg&lt;/code&gt;里声明&lt;code class=&quot;language-text&quot;&gt;aws_ec2&lt;/code&gt;这个 plugin&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[inventory]
enable_plugins = host_list, script, auto, yaml, ini, toml, aws_ec2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ol start=&quot;2&quot;&gt;
&lt;li&gt;编写 inventory 配置文件，注意这里一定要以&lt;code class=&quot;language-text&quot;&gt;_aws_ec2.yml&lt;/code&gt;结尾才行，我这里命名为&lt;code class=&quot;language-text&quot;&gt;test_aws_ec2.yml&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;plugin: aws_ec2
regions:
  - us-west-2
cache: yes
keyed_groups:
  - key: tags
    prefix: tag
  - key: architecture
    prefix: arch
  - key: instance_type
    prefix: aws_instance_type
  - key: placement.region
    prefix: aws_region
  - key: image_id
    prefix: aws_image
  - key: hypervisor
    prefix: aws_hypervisor
  - key: &apos;security_groups|json_query(&quot;[].group_id&quot;)&apos;
    prefix: &apos;security_groups&apos;
hostnames:
  - private-ip-address
  - ip-address&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;a href=&quot;https://docs.ansible.com/ansible/latest/collections/amazon/aws/aws_ec2_inventory.html&quot;&gt;配置参考官方文档&lt;/a&gt;&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;使用这个 inventory plugin 和以前的方法一样，可以直接放到配置文件里定义的 inventory 目录里，也可以直接命令行引用&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 在配置文件里定义inventory目录
inventory=/etc/ansible/inventory/

# 命令行直接引用
ansible -i test_aws_ec2.yml all --list-hosts&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Clash透明代理]]></title><description><![CDATA[目标 配置 Clash 使其走 vmess 协议来处理透明代理流量 配置 iptables 转发流量 注意：本文是基于安装了 Debian 系统的的软路由配置的，Openwrt 也可以参考自行修改。 Clash 优势 相比原生的 V2Ray，Clash…]]></description><link>https://xdays.me/Clash透明代理/</link><guid isPermaLink="false">https://xdays.me/Clash透明代理/</guid><pubDate>Sat, 11 Jul 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;目标&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;配置 Clash 使其走 vmess 协议来处理透明代理流量&lt;/li&gt;
&lt;li&gt;配置 iptables 转发流量&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;注意：本文是基于安装了 Debian 系统的的软路由配置的，Openwrt 也可以参考自行修改。&lt;/p&gt;
&lt;h1&gt;Clash 优势&lt;/h1&gt;
&lt;p&gt;相比原生的 V2Ray，Clash 的优势如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;灵活管理 proxy，支持不同的策略来选择最优的 proxy&lt;/li&gt;
&lt;li&gt;内置 DNS，支持 DOH&lt;/li&gt;
&lt;li&gt;基于规则来的流量转发&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;Clash 安装配置&lt;/h1&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;TARGET=/usr/local/clash
[ -e $TARGET ] || mkdir $TARGET
VERSION=v1.8.0
FILENAME=clash-linux-amd64-$VERSION
curl -sLO https://github.com/Dreamacro/clash/releases/download/$VERSION/$FILENAME.gz
gunzip $FILENAME.gz
mv $FILENAME $TARGET/clash
chmod 755 $TARGET/clash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Clash 配置&lt;/h1&gt;
&lt;p&gt;配置这里我是基于&lt;a href=&quot;https://github.com/Hackl0us/SS-Rule-Snippet/blob/master/LAZY_RULES/clash.yaml&quot;&gt;这个模板&lt;/a&gt;修改的，精简了一些配置。&lt;/p&gt;
&lt;p&gt;配置放在 &lt;code class=&quot;language-text&quot;&gt;/usr/local/clash/config.yml&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mixed-port: 7890
redir-port: 7892
allow-lan: true
mode: Rule
log-level: info
# secret: &quot;&quot;

dns:
  enable: true
  listen: 0.0.0.0:53
  enhanced-mode: redir-host
  default-nameserver:
    - 119.29.29.29
    - 223.5.5.5
  nameserver:
    - https://doh.pub/dns-query
    - https://dns.alidns.com/dns-query
  fallback:
    - https://1.1.1.1/dns-query # DNS over HTTPS
    - https://8.8.8.8/dns-query # DNS over HTTPS
  fallback-filter:
    geoip: true
    geoip-code: CN
    ipcidr:
      - 240.0.0.0/4

proxies:
- name: vmess-hkg01
  type: vmess
  server: 1.1.1.1
  port: 443
  uuid: changeme
  alterId: 64
  cipher: aes-128-gcm
  network: ws
  ws-path: /
  ws-headers:
    Host: foo.xdays.me
  tls: true
- name: vmess-hkg02
  type: vmess
  server: 2.2.2.2
  port: 443
  uuid: changeme
  alterId: 64
  cipher: aes-128-gcm
  network: ws
  ws-path: /
  ws-headers:
    Host: foo.xdays.me
  tls: true

# 代理组策略
proxy-groups:
# url-test 通过指定的 URL 测试并选择延迟最低的节点
- name: &quot;Group1&quot;
  type: url-test
  proxies:
    - &quot;vmess-hkg01&quot;
    - &quot;vmess-hkg02&quot;
  url: &apos;http://www.gstatic.com/generate_204&apos;
  interval: 300

# 代理节点选择
- name: &quot;GSLB&quot;
  type: select
  proxies:
    - &quot;Group1&quot;
    - &quot;DIRECT&quot;

rules:
  # Local Area Network
  - IP-CIDR,192.168.0.0/16,DIRECT
  - IP-CIDR,10.0.0.0/8,DIRECT
  - IP-CIDR,172.16.0.0/12,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,100.64.0.0/10,DIRECT
  - DOMAIN-KEYWORD,linkedin,GSLB
  - GEOIP,CN,DIRECT
  - MATCH,GSLB&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;透明代理配置&lt;/h1&gt;
&lt;p&gt;Clash 的透明代理需要做两步：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;DNS 解析要经过 Clash 自己监听的 DNS 服务, 我这里是 UDP 的 853 端口&lt;/li&gt;
&lt;li&gt;iptables 把流量 redirect 给 clash&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;先说第一步，我的做法是用 dnsmasq 来作为局域网的 dhcp 和 dns server，然后 dnsmasq 将 dns 请求转发给 clash 的 853 端口，dnsmasq 的配置如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bogus-priv
no-resolv
server=127.0.0.1#853
domain=lan,192.168.2.0/24
dhcp-range=192.168.2.100,192.168.2.200,12h
dhcp-leasefile=/var/lib/misc/dnsmasq.leases
cache-size=150&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再说第二步，iptables 的配置也很简单，我写了一个脚本来开关 iptables 规则&lt;/p&gt;
&lt;p&gt;脚本放在 &lt;code class=&quot;language-text&quot;&gt;/usr/local/clash/proxy.sh&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/bash

DNSCONF=/etc/dnsmasq.d/local
echo 1 &gt; /proc/sys/net/ipv4/ip_forward

start() {
    # TCP Redirect
    # Create new chain
    echo &quot;create a new chain&quot;
    iptables -t nat -N CLASH

    # Ignore LANs and any other addresses you&apos;d like to bypass the proxy
    # See Wikipedia and RFC5735 for full list of reserved networks.
    iptables -t nat -A CLASH -d 0.0.0.0/8 -j RETURN
    iptables -t nat -A CLASH -d 10.0.0.0/8 -j RETURN
    iptables -t nat -A CLASH -d 127.0.0.0/8 -j RETURN
    iptables -t nat -A CLASH -d 169.254.0.0/16 -j RETURN
    iptables -t nat -A CLASH -d 172.16.0.0/12 -j RETURN
    iptables -t nat -A CLASH -d 192.168.0.0/16 -j RETURN
    iptables -t nat -A CLASH -d 224.0.0.0/4 -j RETURN
    iptables -t nat -A CLASH -d 240.0.0.0/4 -j RETURN
    iptables -t nat -A CLASH -s 192.168.2.0/24 -p tcp -j REDIRECT --to-ports 7892

    # apply redirect for traffic forworded by this proxy
    echo &quot;apply the clash chain&quot;
    iptables -t nat -A PREROUTING  -p tcp -j CLASH

    # apply redirect for proxy itself
    # for i in $OID; do
    #     iptables -t nat -A OUTPUT -m owner --uid-owner $i -j RETURN
    # done
    # iptables -t nat -A OUTPUT -p tcp -j CLASH
    echo &quot;change dns server&quot;
    use-gfw-dns
}

stop() {
    iptables -t nat -D PREROUTING  -p tcp -j CLASH
    iptables -t nat -F CLASH
    iptables -t nat -X CLASH
    use-normal-dns
}

status() {
    echo &quot;==== Iptable rules ====&quot;
    iptables -t nat -nL
    echo
    echo &quot;==== DNS Sever====&quot;
    grep &quot;^server=&quot; $DNSCONF
}

use-normal-dns() {
    # 这里要改成一个你自己的dns服务器
    sed -i &apos;/server=.*/s/.*/server=192.168.1.1/&apos; $DNSCONF
    systemctl restart dnsmasq
}

use-gfw-dns() {
    sed -i &apos;/server=.*/s/.*/server=127.0.0.1#853/&apos; $DNSCONF
    systemctl restart dnsmasq
}

case $1 in
start)
    start
    ;;
stop)
    stop
    ;;
status)
    status
    ;;
*)
    echo &quot;$0 start | stop | status&quot;
    ;;
esac&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;改下可执行权限&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;chmod 755 /usr/local/clash/proxy.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这个脚本里还包括的切换 dnsmasq 的 dns 配置的操作，因为如果 clash 停了整个局域网所有机器的 dns 解析就会失败，这是配合后边一键启停翻墙做准备的。&lt;/p&gt;
&lt;h1&gt;一键开关透明代理&lt;/h1&gt;
&lt;p&gt;编辑 &lt;code class=&quot;language-text&quot;&gt;/etc/systemd/system/clash.service&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Unit]
Description=Clash Service
After=network.target
Wants=network.target

[Service]
# User=nobody
# Group=nobody
Type=simple
PIDFile=/run/clash.pid
ExecStartPre=/usr/local/clash/proxy.sh start
ExecStart=/usr/local/clash/clash -d /usr/local/clash/
ExecStopPost=/usr/local/clash/proxy.sh stop
Restart=on-failure
RestartPreventExitStatus=23

[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后加载配置，开机启动透明代理&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;systemctl daemon-reload
systemctl start clash
systemctl enable clash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Linux-Btrfs文件系统]]></title><description><![CDATA[简介 BtrFS（B-tree 文件系统，又称为 Butter FS 或 Better FS），2007 由 oracle 开源后，得到了 IBM、intel 等厂商的大力支持，其目标计划是替代 linux 目前的 ext3/4，成为下一代 linux…]]></description><link>https://xdays.me/Linux-btrfs文件系统/</link><guid isPermaLink="false">https://xdays.me/Linux-btrfs文件系统/</guid><pubDate>Sat, 04 Jan 2020 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;BtrFS（B-tree 文件系统，又称为 Butter FS 或 Better FS），2007 由 oracle 开源后，得到了 IBM、intel 等厂商的大力支持，其目标计划是替代 linux 目前的 ext3/4，成为下一代 linux 标准的文件系统。 支持写时复制（CoW）、快照、在线扩容缩容、数据 checksum、subvolume、磁盘阵列（raid）等，运行在 linux 上，并遵循 GPL 协议的强大文件系统。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;CoW(Copy on Write)可以保证数据一致性，每次改动块都会创建新的文件&lt;/li&gt;
&lt;li&gt;基于 Cow 技术可以在 volume 和文件级别创建快照&lt;/li&gt;
&lt;li&gt;数据块和 inode 都可以动态分配&lt;/li&gt;
&lt;li&gt;可以给 metadata 和 data 块来创建多个副本&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;文件系统管理&lt;/h1&gt;
&lt;h2&gt;创建&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 单个设备&lt;/span&gt;
mkfs.btrfs &lt;span class=&quot;token parameter variable&quot;&gt;-L&lt;/span&gt; data /dev/sdb1
&lt;span class=&quot;token comment&quot;&gt;# 多个设备，metadata保留多个副本&lt;/span&gt;
mkfs.btrfs &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; raid0 &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; raid1 /dev/sdb1 /dev/sdc1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;添加/删除设备&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;btrfs device &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; /dev/part3
btrfs device remove /dev/part3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;修改数据快或者 meta 块的副本&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;btrfs balance start &lt;span class=&quot;token parameter variable&quot;&gt;-dconvert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dup /srv/shared/
btrfs balance start &lt;span class=&quot;token parameter variable&quot;&gt;-mconvert&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;dup /srv/shared/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;创建挂载删除 subvolume&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;btrfs subvolume create /srv/shared/video
&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;subvol&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;video /dev/sdb1 /mnt
&lt;span class=&quot;token function&quot;&gt;umount&lt;/span&gt; /mnt
btrfs subvolume delete /srv/shared/video&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Quota 磁盘配额&lt;/h2&gt;
&lt;p&gt;适用于多用户场景，给每个用户分配固定的空间，还可以动态调整&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# enable quota for subvolume&lt;/span&gt;
btrfs &lt;span class=&quot;token function&quot;&gt;quota&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt; /srv/shared/video
&lt;span class=&quot;token comment&quot;&gt;# get limit&lt;/span&gt;
btrfs qgroup show &lt;span class=&quot;token parameter variable&quot;&gt;-reF&lt;/span&gt; /srv/shared/video
&lt;span class=&quot;token comment&quot;&gt;# set limit&lt;/span&gt;
btrfs qgroup limit &lt;span class=&quot;token parameter variable&quot;&gt;-e&lt;/span&gt; 10G &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;/260 /srv/shared/video/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后测试下配额是否生效&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# dd if=/dev/zero of=/mnt/11G.bin bs=1M count=20480
dd: error writing &apos;/mnt/11G.bin&apos;: Disk quota exceeded
10240+0 records in
10239+0 records out
10737377280 bytes (11 GB, 10 GiB) copied, 163.942 s, 65.5 MB/s&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;快照&lt;/h2&gt;
&lt;p&gt;建快照就是从当前状态下的 subvolume 新建一个 subvolume，你也可以直接挂载 snapshot&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;btrfs subvolume snapshot /srv/shared/video /srv/shared/video-backup
&lt;span class=&quot;token function&quot;&gt;mount&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-o&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;subvol&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;video-backup /dev/sdb1 /mnt
&lt;span class=&quot;token function&quot;&gt;ls&lt;/span&gt; /mnt
&lt;span class=&quot;token function&quot;&gt;umount&lt;/span&gt; /mnt
btrfs subvolume delete /srv/shared/video-backup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;高能警告&lt;/h2&gt;
&lt;p&gt;目前社区有一些关于 btrfs 非常负面的评价，褒贬不一，使用前请想好退路，数据无价。看看官方的 &lt;a href=&quot;https://btrfs.wiki.kernel.org/index.php/Status&quot;&gt;status&lt;/a&gt; 页面，了解下各个功能当前是否稳定了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[基于速度的TCP负载均衡]]></title><description><![CDATA[需求 基于订阅的科学上网工具方便之处在于可以随意切换节点，这时候我就想能不能用负载均衡软件来作为正向代理帮助这些工具自动选择最优的上层节点呢，先列下需求: 支持订阅 能自动屏蔽掉不可用的节点 根据建连时间和响应速度来选择最优的节点 实现 比较流行的负载均衡软件有 nginx…]]></description><link>https://xdays.me/基于速度的TCP负载均衡/</link><guid isPermaLink="false">https://xdays.me/基于速度的TCP负载均衡/</guid><pubDate>Tue, 17 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;需求&lt;/h1&gt;
&lt;p&gt;基于订阅的科学上网工具方便之处在于可以随意切换节点，这时候我就想能不能用负载均衡软件来作为正向代理帮助这些工具自动选择最优的上层节点呢，先列下需求:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;支持订阅&lt;/li&gt;
&lt;li&gt;能自动屏蔽掉不可用的节点&lt;/li&gt;
&lt;li&gt;根据建连时间和响应速度来选择最优的节点&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;实现&lt;/h1&gt;
&lt;p&gt;比较流行的负载均衡软件有 nginx，haproxy 和 apache，调研了这三个项目后，我只在 nginx 的商业版 nginx plus 里发现了&lt;a href=&quot;http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#least_time&quot;&gt;least_time&lt;/a&gt;可以按照最小响应时间来调度。&lt;/p&gt;
&lt;p&gt;这样，只能自己造轮子了，首选的方案当然是&lt;a href=&quot;https://openresty.org/en/&quot;&gt;OpenResty&lt;/a&gt;，一下是我用到 OpenResty 相关的功能：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;lua-resty-http&lt;/code&gt; 这个是用来发 http 请求的，获取订阅节点&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;lua_shared_dict&lt;/code&gt; 用来存储元数据和统计数据的，注意由于 &lt;code class=&quot;language-text&quot;&gt;nginx.shared.DICT&lt;/code&gt; 的限制怎么用其提供的 key/value 来组织数据需要好好想想了，我的设计是通过增加额外的 key 来避免序列化&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;ngx.balancer&lt;/code&gt; 这个是本项目的核心，它可以在请求级别控制 nginx 对 upstream server 的选择，挑战主要是你需要自己实现调度逻辑&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;再说下整个项目的大体逻辑:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定时器 &lt;code class=&quot;language-text&quot;&gt;ngx.timer&lt;/code&gt; 会随 worker 启动而初始化，定时器主要是定时从订阅接口获取节点，同时也会删掉不在订阅里的节点&lt;/li&gt;
&lt;li&gt;当一个请求到来的时候，因为所有的节点都没有统计数据，不知道哪个节点好，这就开始了一个冷启动的过程，这时候采用随机分发的策略，直到所有的节点都接收到 10 个请求了&lt;/li&gt;
&lt;li&gt;当然有些节点可能是不可用的，这里我的做法是 fail fast 逻辑，一旦发现节点不可用，立马丢到黑洞里；可是如果只是这样的话，那这些节点即使将来恢复了也不会被用到，所幸 &lt;code class=&quot;language-text&quot;&gt;ngx.shared.DICT&lt;/code&gt; 支持 &lt;code class=&quot;language-text&quot;&gt;expire_time&lt;/code&gt;，这样过了超时时间，这些不可用的节点对应的 key 就过期了，节点会从订阅里重新被添加进来，这样节点又会走一遍冷启动的逻辑&lt;/li&gt;
&lt;li&gt;要实现调度，前提是知道所有节点的统计信息，这一块我用到了 &lt;a href=&quot;http://nginx.org/en/docs/stream/ngx_stream_upstream_module.html#variables&quot;&gt;ngx_stream_upstream_modle 的几个变量&lt;/a&gt;，&lt;code class=&quot;language-text&quot;&gt;$upstream_bytes_received&lt;/code&gt;，&lt;code class=&quot;language-text&quot;&gt;$upstream_first_byte_time&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;$upstream_session_time&lt;/code&gt;分别代表了从后端获取的流量，首包时间和总时间，基于这些变量，就能统计出来后端节点的平均首包时间和传输速度。&lt;/li&gt;
&lt;li&gt;有了统计信息，调度就简单了，只需要根据设定的调度策略选择最优的节点，然后通过 &lt;code class=&quot;language-text&quot;&gt;ngx.balancer&lt;/code&gt; 将请求转发给节点就行了&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;安装配置&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/xdays/tlb&quot;&gt;项目地址再这里&lt;/a&gt; 其实 readme 里已经交代的挺清楚了&lt;/p&gt;
&lt;p&gt;先编辑 &lt;code class=&quot;language-text&quot;&gt;.env&lt;/code&gt; 修改配置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;PANEL_HOST&lt;/code&gt; 是订阅地址&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;PANEL_TYPE&lt;/code&gt; 是订阅地址的类型，目前只支持 ss 和 v2ray&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;然后启动就行了&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Enjoy!&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Windows10下招行专业版乱码问题]]></title><description><![CDATA[从换到 Windows10 系统后尝试了几次安装招行专业版，最后都因为乱码问题没解决放弃了。今天在一顿猛如虎的操作之后终于解决了，这里记录下。 一图胜万言: cmbchina messup 注意！红色圈圈里的这个设置一定不要选，别问我怎么知道的。]]></description><link>https://xdays.me/Windows10下招行专业版乱码问题/</link><guid isPermaLink="false">https://xdays.me/Windows10下招行专业版乱码问题/</guid><pubDate>Fri, 06 Sep 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;从换到 Windows10 系统后尝试了几次安装招行专业版，最后都因为乱码问题没解决放弃了。今天在一顿猛如虎的操作之后终于解决了，这里记录下。&lt;/p&gt;
&lt;p&gt;一图胜万言:&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2019/09/cmbchina-messup.png&quot; alt=&quot;cmbchina messup&quot;&gt;&lt;/p&gt;
&lt;p&gt;注意！红色圈圈里的这个设置一定不要选，别问我怎么知道的。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[处理非可见字符]]></title><description><![CDATA[有时候复制粘贴命令或者配置的时候明明看着是对的，可是就是报错，这时候就要怀疑文本里是不是有不可见字符了。 那么如何找出不可见字符呢？ 我目前有两种方式： 通过命令，这个命令看到了如，之类的，就是不可见字符 通过 vim 的命令也可以显示出不可见字符，另外捎带说下在 vim…]]></description><link>https://xdays.me/处理非可见字符/</link><guid isPermaLink="false">https://xdays.me/处理非可见字符/</guid><pubDate>Wed, 21 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;有时候复制粘贴命令或者配置的时候明明看着是对的，可是就是报错，这时候就要怀疑文本里是不是有不可见字符了。&lt;/p&gt;
&lt;p&gt;那么如何找出不可见字符呢？&lt;/p&gt;
&lt;p&gt;我目前有两种方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过&lt;code class=&quot;language-text&quot;&gt;cat -A&lt;/code&gt;命令，这个命令看到了如&lt;code class=&quot;language-text&quot;&gt;^I&lt;/code&gt;，&lt;code class=&quot;language-text&quot;&gt;M-BM-^@&lt;/code&gt;之类的，就是不可见字符&lt;/li&gt;
&lt;li&gt;通过 vim 的&lt;code class=&quot;language-text&quot;&gt;set list&lt;/code&gt;命令也可以显示出不可见字符，另外捎带说下在 vim 的编辑模式下先敲 Ctrl+V，然后敲字符的十进制的 ASCII 编码也可以输入特殊字符，比如这个&lt;code class=&quot;language-text&quot;&gt;®&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;还有个有意思的点，这些&lt;code class=&quot;language-text&quot;&gt;^I&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;M-BM-^@&lt;/code&gt;到底是啥玩意儿，通过&lt;a href=&quot;https://stackoverflow.com/a/56410651/1853876&quot;&gt;这个回答&lt;/a&gt;我们知道这是一种表示字符的方式而已。&lt;/p&gt;
&lt;p&gt;下面我用脚本把&lt;a href=&quot;https://zh.wikipedia.org/wiki/EASCII&quot;&gt;扩展 ASCII 码&lt;/a&gt;的 256 个字符打印出来，然后传给&lt;code class=&quot;language-text&quot;&gt;cat -A&lt;/code&gt;一看就明白了。&lt;/p&gt;
&lt;p&gt;脚本&lt;code class=&quot;language-text&quot;&gt;ascii-char.py&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;python&quot;&gt;&lt;pre class=&quot;language-python&quot;&gt;&lt;code class=&quot;language-python&quot;&gt;output &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;for&lt;/span&gt; i &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; &lt;span class=&quot;token builtin&quot;&gt;range&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;:&lt;/span&gt;
    output &lt;span class=&quot;token operator&quot;&gt;+=&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;%c\n&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;%&lt;/span&gt; i
&lt;span class=&quot;token keyword&quot;&gt;print&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;output&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;输出结果&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;~/ascii-char.py &lt;span class=&quot;token operator&quot;&gt;|&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;cat&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt;
^@$
^A$
^B$
^C$
^D$
^E$
^F$
^G$
^H$
^I$
$
$
^K$
^L$
^M$
^N$
^O$
^P$
^Q$
^R$
^S$
^T$
^U$
^V$
^W$
^X$
^Y$
^Z$
^&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;$
^&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;$
^&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$
^^$
^_$
 $
&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$
&quot;$
&lt;span class=&quot;token comment&quot;&gt;#$&lt;/span&gt;
&lt;span class=&quot;token variable&quot;&gt;$$&lt;/span&gt;
%$
&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;$
&lt;span class=&quot;token string&quot;&gt;&apos;$
($
)$
*$
+$
,$
-$
.$
/$
0$
1$
2$
3$
4$
5$
6$
7$
8$
9$
:$
;$
&amp;lt;$
=$
&gt;$
?$
@$
A$
B$
C$
D$
E$
F$
G$
H$
I$
J$
K$
L$
M$
N$
O$
P$
Q$
R$
S$
T$
U$
V$
W$
X$
Y$
Z$
[$
\$
]$
^$
_$
`$
a$
b$
c$
d$
e$
f$
g$
h$
i$
j$
k$
l$
m$
n$
o$
p$
q$
r$
s$
t$
u$
v$
w$
x$
y$
z$
{$
|$
}$
~$
^?$
M-BM-^@$
M-BM-^A$
M-BM-^B$
M-BM-^C$
M-BM-^D$
M-BM-^E$
M-BM-^F$
M-BM-^G$
M-BM-^H$
M-BM-^I$
M-BM-^J$
M-BM-^K$
M-BM-^L$
M-BM-^M$
M-BM-^N$
M-BM-^O$
M-BM-^P$
M-BM-^Q$
M-BM-^R$
M-BM-^S$
M-BM-^T$
M-BM-^U$
M-BM-^V$
M-BM-^W$
M-BM-^X$
M-BM-^Y$
M-BM-^Z$
M-BM-^[$
M-BM-^\$
M-BM-^]$
M-BM-^^$
M-BM-^_$
M-BM- $
M-BM-!$
M-BM-&quot;$
M-BM-#$
M-BM-$$
M-BM-%$
M-BM-&amp;amp;$
M-BM-&apos;&lt;/span&gt;$
M-BM-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$
M-BM-&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;$
M-BM-*$
M-BM-+$
M-BM-,$
M-BM--$
M-BM-.$
M-BM-/$
M-BM-0$
M-BM-1$
M-BM-2$
M-BM-3$
M-BM-4$
M-BM-5$
M-BM-6$
M-BM-7$
M-BM-8$
M-BM-9$
M-BM-:$
M-BM-&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;$
M-BM-&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;$
M-BM-&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;$
M-BM-&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;$
M-BM-?$
M-CM-^@$
M-CM-^A$
M-CM-^B$
M-CM-^C$
M-CM-^D$
M-CM-^E$
M-CM-^F$
M-CM-^G$
M-CM-^H$
M-CM-^I$
M-CM-^J$
M-CM-^K$
M-CM-^L$
M-CM-^M$
M-CM-^N$
M-CM-^O$
M-CM-^P$
M-CM-^Q$
M-CM-^R$
M-CM-^S$
M-CM-^T$
M-CM-^U$
M-CM-^V$
M-CM-^W$
M-CM-^X$
M-CM-^Y$
M-CM-^Z$
M-CM-^&lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;$
M-CM-^&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;$
M-CM-^&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;$
M-CM-^^$
M-CM-^_$
M-CM- $
M-CM-&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;$
M-CM-&quot;$
M-CM-&lt;span class=&quot;token comment&quot;&gt;#$&lt;/span&gt;
M-CM-&lt;span class=&quot;token variable&quot;&gt;$$&lt;/span&gt;
M-CM-%$
M-CM-&lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;$
M-CM-&apos;$
M-CM-&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;$
M-CM-&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;$
M-CM-*$
M-CM-+$
M-CM-,$
M-CM--$
M-CM-.$
M-CM-/$
M-CM-0$
M-CM-1$
M-CM-2$
M-CM-3$
M-CM-4$
M-CM-5$
M-CM-6$
M-CM-7$
M-CM-8$
M-CM-9$
M-CM-:$
M-CM-&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;$
M-CM-&lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;$
M-CM-&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;$
M-CM-&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;$
$&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[家庭网接入V2RAY透明代理]]></title><description><![CDATA[目标 上一篇V2Ray 透明代理里详细解释了在 OpenWrt 上配置 V2RAY 作为透明代理，本文提供两种将这种透明代理应用到家庭局域网的两种方式。主要目标有以下几个： 兼容各种设备，比如 IPTV，NAS…]]></description><link>https://xdays.me/家庭网接入V2RAY透明代理/</link><guid isPermaLink="false">https://xdays.me/家庭网接入V2RAY透明代理/</guid><pubDate>Wed, 21 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;目标&lt;/h1&gt;
&lt;p&gt;上一篇&lt;a href=&quot;/V2RAY%E9%80%8F%E6%98%8E%E4%BB%A3%E7%90%86/&quot;&gt;V2Ray 透明代理&lt;/a&gt;里详细解释了在 OpenWrt 上配置 V2RAY 作为透明代理，本文提供两种将这种透明代理应用到家庭局域网的两种方式。主要目标有以下几个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;兼容各种设备，比如 IPTV，NAS&lt;/li&gt;
&lt;li&gt;接入设备无感知，无需做任何配置&lt;/li&gt;
&lt;li&gt;设备间互访不受影响&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下图为应用透明代理前我的家庭网拓扑：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2019/08/home-network-before.png&quot; alt=&quot;home network before&quot;&gt;&lt;/p&gt;
&lt;p&gt;由于联通路由光猫如果改成光猫的话 IPTV 就不好使了，所以这个猫比如像其名字一样作为家庭网关了。&lt;/p&gt;
&lt;h1&gt;方案 1 嵌套路由器模式&lt;/h1&gt;
&lt;p&gt;这种方案的网络拓扑图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2019/08/home-network-1.png&quot; alt=&quot;home network after1&quot;&gt;&lt;/p&gt;
&lt;p&gt;直接把极路由刷上 OpenWrt 改成路由模式，然后上透明代理就可以了。这种方案优点就是配置成本很小，缺点是电视，IPTV 和 NAS 和手机电脑等设备被分割到了两个局域网内，这就造成了：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;只能单向发起通信，比如电脑可以访问 NAS，而 NAS 就不能直接访问电脑了&lt;/li&gt;
&lt;li&gt;AirPlay 之类的就不好使了，手机没法投屏到电视了&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;方案 2 两个网关模式&lt;/h1&gt;
&lt;p&gt;这种方案拓扑图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2019/08/home-network-2.png&quot; alt=&quot;home network after2&quot;&gt;&lt;/p&gt;
&lt;p&gt;极路由还是工作在 AP 模式，当然也可以把透明代理做在上面。由于我的极路由已经跑了老毛子系统，而且从 NAS 上虚拟出来的 OpenWrt 性能应该比极路由更好一些，所以我就跑了一个 OpenWrt 以单臂路由方式当做透明代理。首先，这个拓扑上所有的设备都跑在一个局域网内，包括极路由，NAS 以及 NAS 上的虚拟机，而且这个局域网里有两个网关路由光猫和 OpenWrt；然后，我要关闭路由光猫的 DHCP 功能，因为这个 DHCP 不满足条件，不能将非本机的的 IP 配置成 DHCP 网关；最后，我需要在 OpenWrt 上做如下的配置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;默认的 DHCP 配置让所有的设备的网关指向了 OpenWrt&lt;/li&gt;
&lt;li&gt;OpenWrt 要配置一个静态地址，而且默认路由要指向路由光猫&lt;/li&gt;
&lt;li&gt;我们可以配置 DHCP 来根据 mac 地址来让部分设备的网关直接指向路由光猫，这样对于不需要翻墙的电视和 IPTV 就绕过了 OpenWrt 直接出去了。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;现在我们来配置下 OpenWrt：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# 在lan接口上开启DHCP&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.lan.ignore&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;0&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.lan.start&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;100&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.lan.limit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;99&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 配置静态IP并且默认路由指向联通路由光猫&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;network.lan.proto&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;static&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;network.lan.ipaddr&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;192.168.1.200&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;network.lan.netmask&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;255.255.255.0&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;network.lan.gateway&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;192.168.1.1&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;network.lan.dns&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;192.168.1.1&apos;&lt;/span&gt;

&lt;span class=&quot;token comment&quot;&gt;# 匹配特定mac地址，对它们分配特殊的网关地址&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.iptv&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;host
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.iptv.name&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;iptv&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.iptv.tag&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;free&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.iptv.mac&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;2c:55:d3:ab:86:64&apos;&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;c8:0e:77:75:ea:b3&apos;&lt;/span&gt;
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.free&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;tag
uci &lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; &lt;span class=&quot;token assign-left variable&quot;&gt;dhcp.free.dhcp_option&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;3,192.168.1.1&apos;&lt;/span&gt;

uci commit
&lt;span class=&quot;token function&quot;&gt;service&lt;/span&gt; dnsmasq restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;方案 3 单路由器模式&lt;/h2&gt;
&lt;p&gt;这种方案拓扑图如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2019/08/home-network-3.png&quot; alt=&quot;home network after3&quot;&gt;&lt;/p&gt;
&lt;p&gt;首先，修改联通路由光猫改成桥接模式让其只作为猫使用，具体可以参考&lt;a href=&quot;https://www.v2ex.com/t/583187#reply35&quot;&gt;这个帖子&lt;/a&gt;，具体方法如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进 &lt;a href=&quot;http://192.168.1.1/hidden_version_switch.gch&quot;&gt;http://192.168.1.1/hidden_version_switch.gch&lt;/a&gt; ，选 default version，密码 CUAdmin&lt;/li&gt;
&lt;li&gt;机器自动重启之后就可以进 &lt;a href=&quot;http://192.168.1.1/cu.html&quot;&gt;http://192.168.1.1/cu.html&lt;/a&gt; 了， 选管理员账户，密码 CUAdmin&lt;/li&gt;
&lt;li&gt;进去之后删掉之前的 internet 配置，然后新建 internet bridge，vlan 选项记得选改 tag，然后在 vlan_id 里填 3961（这里是北京联通的 vlan_id，我测试是可以的）&lt;/li&gt;
&lt;li&gt;iptv 那块选 dhcp，vlan_i 填 3964 即可（这步我做了但是 iptv 并不能工作，IPTV 能正常工作的朋友请分享下你的配置吧）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;然后极路由作为网关和透明代理，所有的设备都以极路由为网关，而且 DHCP 这块不需要啥特殊配置了。但是路由光猫改成桥接模式后 IPTV 就不好使了，所以这种场景不适合我，如果你不需要 IPTV，那么这种模式最为理想，当然得有个比较牛逼的路由器哇。&lt;/p&gt;
&lt;h1&gt;参考文档&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.hi-linux.com/posts/17088.html&quot;&gt;利用 Dnsmasq 部署 DHCP 服务&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.networksorcery.com/enp/protocol/bootp/options.htm&quot;&gt;DHCP Option Reference&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openwrt.org/docs/guide-user/base-system/dhcp&quot;&gt;OpenWrt DNS and DHCP configuration&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://openwrt.org/docs/guide-user/base-system/dhcp_configuration&quot;&gt;OpenWrt DNS and DHCP configuration examples&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[V2RAY透明代理]]></title><description><![CDATA[目标 配置 v2ray 使其接受透明代理的流量 配置 iptables 将所有 tcp 和 udp 53 的流量转发给 v2ray OpenWrt 配置 v2ray 服务 V2ray 配置 v2ray 的配置如下： 配置里有几个重点要说下，第一个是 dokudemo-door…]]></description><link>https://xdays.me/V2RAY透明代理/</link><guid isPermaLink="false">https://xdays.me/V2RAY透明代理/</guid><pubDate>Tue, 20 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;目标&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;配置 v2ray 使其接受透明代理的流量&lt;/li&gt;
&lt;li&gt;配置 iptables 将所有 tcp 和 udp 53 的流量转发给 v2ray&lt;/li&gt;
&lt;li&gt;OpenWrt 配置 v2ray 服务&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;V2ray 配置&lt;/h1&gt;
&lt;p&gt;v2ray 的配置如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;log&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;access&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;error&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;loglevel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;warning&quot;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;policy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;levels&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;0&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;uplinkOnly&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;downlinkOnly&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;connIdle&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;150&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;handshake&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;inbounds&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1088&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;listen&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;userLevel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;auth&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;noauth&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;udp&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;ip&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;streamSettings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;sockopt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;mark&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1099&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;listen&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dokodemo-door&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;userLevel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;network&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tcp,udp&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;timeout&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;followRedirect&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;sniffing&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;destOverride&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tls&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;outbounds&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;mux&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;false&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;concurrency&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;8&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;vmess&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;default&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;vnext&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;address&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;127.0.0.1&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;users&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;id&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;a994b3c1-c7cc-4868-8072-c93e491bba0b&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;alterId&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;64&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;level&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
                &lt;span class=&quot;token property&quot;&gt;&quot;security&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;aes-128-gcm&quot;&lt;/span&gt;
              &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
            &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
            &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10086&lt;/span&gt;
          &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;freedom&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;tag&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;direct&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;streamSettings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;sockopt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;mark&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;dns&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;servers&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;8.8.8.8&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;8.8.4.4&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;localhost&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;routing&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;strategy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;rules&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;domainStrategy&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;IPIfNonMatch&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token property&quot;&gt;&quot;rules&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;ip&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;geoip:private&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;outboundTag&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;direct&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;ip&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;geoip:cn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;outboundTag&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;direct&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;type&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;field&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;domain&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;geosite:cn&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;outboundTag&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;direct&quot;&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置里有几个重点要说下，第一个是 dokudemo-door 的配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;port&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;1099&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;listen&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;0.0.0.0&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;protocol&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;dokodemo-door&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;settings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;userLevel&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;network&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tcp,udp&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;timeout&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;30&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;followRedirect&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token property&quot;&gt;&quot;sniffing&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;enabled&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token boolean&quot;&gt;true&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token property&quot;&gt;&quot;destOverride&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;[&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&quot;http&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;tls&quot;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;]&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;不要忘了添加&lt;code class=&quot;language-text&quot;&gt;sniffing&lt;/code&gt;的配置，这个配置是为了从流量中提取 ip 和 domain 信息，这样针对 ip 和 domain 的路由规则才能生效。&lt;/p&gt;
&lt;p&gt;第二个是要给所有的&lt;code class=&quot;language-text&quot;&gt;outbound&lt;/code&gt;都打上 mark 的配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;json&quot;&gt;&lt;pre class=&quot;language-json&quot;&gt;&lt;code class=&quot;language-json&quot;&gt;      &lt;span class=&quot;token property&quot;&gt;&quot;streamSettings&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token property&quot;&gt;&quot;sockopt&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token property&quot;&gt;&quot;mark&quot;&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;255&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样 iptables 才能区分 v2ray 流量和非 v2ray 流量，非 v2ray 流量会被转发给 v2ray，v2ray 流量就直接从路由器发出去了。这样就避免了死循环，后面 iptables 规则的时候还会提到。&lt;/p&gt;
&lt;p&gt;接下来就可以启动 v2ray 测试了&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;./v2ray &lt;span class=&quot;token parameter variable&quot;&gt;-config&lt;/span&gt; client_proxy.json&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通过 http 的&lt;code class=&quot;language-text&quot;&gt;inbound&lt;/code&gt;来测试下隧道&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;curl&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-Is&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-x&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.1:1088 https://www.google.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;没问题就可以配置 iptables 了。&lt;/p&gt;
&lt;h1&gt;Iptables 配置&lt;/h1&gt;
&lt;p&gt;先说明一点，Linux 内核的包处理框架是 Netfilter，而 iptables 只是 userspace 的工具而已，但是多年来大家叫 iptables 其实多数都是指的 Netfilter，只是习惯了。&lt;/p&gt;
&lt;p&gt;Iptables 这块的挑战比较大，我一路试错过来，总结来说有以下几点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;要理解 iptables 的各个表中的链的先后顺序&lt;/li&gt;
&lt;li&gt;要捕捉其他设备过来的 tcp 流量&lt;/li&gt;
&lt;li&gt;要捕捉本机发起的 tcp 流量&lt;/li&gt;
&lt;li&gt;要捕捉其他设备过来的 udp 53 流量，也就是 DNS 流量&lt;/li&gt;
&lt;li&gt;要捕捉本机发起的 DNS 流量&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Netfilter 数据包流程图&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;https://upload.wikimedia.org/wikipedia/commons/3/37/Netfilter-packet-flow.svg&quot; alt=&quot;Package flow in Netfilter&quot;&gt;&lt;/p&gt;
&lt;p&gt;从这张图中我们可以看出对于其他设备过来的流量都应该在&lt;code class=&quot;language-text&quot;&gt;PREROUTING&lt;/code&gt;这个链来做，而对于本机发出的流量应该在&lt;code class=&quot;language-text&quot;&gt;OUTPUT&lt;/code&gt;这个链来做。但由于重定向 tcp 和 udp 流量在实现上有区别，分别用到了 iptables 里的&lt;code class=&quot;language-text&quot;&gt;REDIRECT&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;TPROXY&lt;/code&gt;两种技术。参考&lt;a href=&quot;https://www.jianshu.com/p/76cea3ef249d&quot;&gt;这篇博客所说&lt;/a&gt;，是因为 ss-redir 应用没有实现 UDP REDIRECT 相关的代码，当然我也把 UDP 全都通过&lt;code class=&quot;language-text&quot;&gt;REDIRECT&lt;/code&gt;转发给了 v2ray 结果也不行，所以 UDP 转发的部分还是通过&lt;code class=&quot;language-text&quot;&gt;TPROXY&lt;/code&gt;来实现的。&lt;/p&gt;
&lt;h1&gt;REDIRECT vs TPROXY&lt;/h1&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;REDIRECT&lt;/code&gt;其实是 DNAT 的一种特殊形式，特殊在其把数据包的目标 IP 改成了 127.0.0.1，端口改成了&lt;code class=&quot;language-text&quot;&gt;--to-ports&lt;/code&gt; 参数指定的本地端口，这样本机的透明代理程序就能处理这个包，应用能通过内核的状态信息拿到被改写之前的目标 IP 和端口号，&lt;a href=&quot;https://unix.stackexchange.com/questions/166692/how-does-a-transparent-socks-proxy-know-which-destination-ip-to-use&quot;&gt;具体参考这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;TPROXY&lt;/code&gt;比&lt;code class=&quot;language-text&quot;&gt;REDIRECT&lt;/code&gt;新的特性，它能做到不修改数据包，应用只需一点改动就能实现&lt;code class=&quot;language-text&quot;&gt;REDIRECT&lt;/code&gt;所有的功能，内核文档里有如下说明：&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Transparent proxying often involves &quot;intercepting&quot; traffic on a router. This is
usually done with the iptables REDIRECT target; however, there are serious
limitations of that method. One of the major issues is that it actually
modifies the packets to change the destination address -- which might not be
acceptable in certain situations. (Think of proxying UDP for example: you won&apos;t
be able to find out the original destination address. Even in case of TCP
getting the original destination address is racy.)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;从这段说明里似乎 UDP 并没有内核状态来记录更改前的 IP 地址，这与&lt;a href=&quot;https://www.jianshu.com/p/76cea3ef249d&quot;&gt;这篇博客所说&lt;/a&gt;所说的有些矛盾，我目前的理解还是 UDP 在内核没有状态记录。&lt;code class=&quot;language-text&quot;&gt;TPROXY&lt;/code&gt;得以实现归结为三个要点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将流量重定向到本地路由&lt;/li&gt;
&lt;li&gt;路由规则定义去向&lt;/li&gt;
&lt;li&gt;代理程序监听，通过特殊的参数可以响应非本机的 IP(因为包的目的地址没改嘛)&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;重定向 TCP 流量&lt;/h1&gt;
&lt;p&gt;新建一个 nat 链，排除私网地址流量&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; V2RAY
&lt;span class=&quot;token comment&quot;&gt;# Ignore your V2Ray outbound traffic&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# It&apos;s very IMPORTANT, just be careful.&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; mark &lt;span class=&quot;token parameter variable&quot;&gt;--mark&lt;/span&gt; 0xff
&lt;span class=&quot;token comment&quot;&gt;# Ignore LANs and any other addresses you&apos;d like to bypass the proxy&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# See Wikipedia and RFC5735 for full list of reserved networks.&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;.0.0/8 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10.0&lt;/span&gt;.0.0/8 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.0/8 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;169.254&lt;/span&gt;.0.0/16 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172.16&lt;/span&gt;.0.0/12 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.0.0/16 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;224.0&lt;/span&gt;.0.0/4 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;240.0&lt;/span&gt;.0.0/4 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
&lt;span class=&quot;token comment&quot;&gt;# Anything else should be redirected to Dokodemo-door&apos;s local port&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; REDIRECT --to-ports &lt;span class=&quot;token number&quot;&gt;1099&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意这里有一个关键规则&lt;code class=&quot;language-text&quot;&gt;iptables -t nat -A V2RAY -p tcp -j RETURN -m mark --mark 0xff&lt;/code&gt;，这个规则就是为了排除 v2ray 要发出去的流量，没有这个规则的话就成死循环了，v2ray 要发出去的流量又被重定向给了 v2ray。&lt;/p&gt;
&lt;p&gt;然后分别在&lt;code class=&quot;language-text&quot;&gt;PREROUTING&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;OUTPUT&lt;/code&gt;连个链里应用我们新建的&lt;code class=&quot;language-text&quot;&gt;V2RAY&lt;/code&gt;链，前者是为了重定向其他设备过来的 TCP 流量，后者是重定向本机发出的 TCP 流量。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# apply redirect for traffic forworded by this proxy&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; PREROUTING  &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY
&lt;span class=&quot;token comment&quot;&gt;# apply redirect for proxy itself&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; OUTPUT &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;重定向 UDP 流量&lt;/h1&gt;
&lt;p&gt;这块要复杂一些，先新建一个 mangle 链，匹配 UDP 流量，然后应用&lt;code class=&quot;language-text&quot;&gt;TPROXY&lt;/code&gt;target，同时打上特定的 mark&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# UDP Redirect&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; V2RAY
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; mark &lt;span class=&quot;token parameter variable&quot;&gt;--mark&lt;/span&gt; 0xff
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;--dport&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;53&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; TPROXY --on-port &lt;span class=&quot;token number&quot;&gt;1099&lt;/span&gt; --tproxy-mark 0x01/0x01&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意这里也有一个关键规则&lt;code class=&quot;language-text&quot;&gt;iptables -t mangle -A V2RAY -p udp -j RETURN -m mark --mark 0xff&lt;/code&gt;目的和 TCP REDIRECT 里的一样，避免死循环。&lt;/p&gt;
&lt;p&gt;然后配置策略路由，按 mark 匹配流量，将流量路由到本机回环接口。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;# add route for udp traffic&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; route &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; default dev lo table &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
&lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; rule &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; fwmark &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; lookup &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意，这条路由规则的类型是&lt;code class=&quot;language-text&quot;&gt;local&lt;/code&gt;，我的理解内核把&lt;code class=&quot;language-text&quot;&gt;TPEOXY&lt;/code&gt;和路由关联起来了&lt;/p&gt;
&lt;p&gt;最后就是，把这条链应用到&lt;code class=&quot;language-text&quot;&gt;PREROUTING&lt;/code&gt;链里，这样就能重定向其他设备过来的 UDP 流量了。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; PREROUTING &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;好像还没有完，我们还没有重定向本机发出的 UDP 流量，这也是我目前的一个困惑点。先说我的做法吧，我再 mangle 表的&lt;code class=&quot;language-text&quot;&gt;OUTPUT&lt;/code&gt;链里添加了如下两条规则：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; V2RAY_MARK
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY_MARK &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; mark &lt;span class=&quot;token parameter variable&quot;&gt;--mark&lt;/span&gt; 0xff
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY_MARK &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;--dport&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;53&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; MARK --set-mark &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; OUTPUT &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY_MARK&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;第一条规则仍然是排除 v2ray 自己的流量，第二条是给 UDP 数据包打上了 mark，而只是打上 mark 怎么就出发上面的重定向规则嘞？目前我的比较粗浅的理解就是上面数据包流程图里 mangle 的&lt;code class=&quot;language-text&quot;&gt;OUTPUT&lt;/code&gt;链会触发 reroute check，也就让数据包重新从&lt;code class=&quot;language-text&quot;&gt;PREROUTING&lt;/code&gt;链走了一遍。&lt;/p&gt;
&lt;h1&gt;OpenWrt 集成&lt;/h1&gt;
&lt;p&gt;将 v2ray 作为 OpenWrt 跑到时候需要安装一些依赖包&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;opkg update
opkg &lt;span class=&quot;token function&quot;&gt;install&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;bash&lt;/span&gt; kmod-ipt-tproxy iptables-mod-tproxy bind-dig&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;编写 iptables 操作脚本&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/bash&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# -*- coding: utf-8 -*-&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# TCP Redirect&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# Create new chain&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; V2RAY

    &lt;span class=&quot;token comment&quot;&gt;# Ignore your V2Ray outbound traffic&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# It&apos;s very IMPORTANT, just be careful.&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; mark &lt;span class=&quot;token parameter variable&quot;&gt;--mark&lt;/span&gt; 0xff
    &lt;span class=&quot;token comment&quot;&gt;# Ignore LANs and any other addresses you&apos;d like to bypass the proxy&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# See Wikipedia and RFC5735 for full list of reserved networks.&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0.0&lt;/span&gt;.0.0/8 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;10.0&lt;/span&gt;.0.0/8 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;127.0&lt;/span&gt;.0.0/8 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;169.254&lt;/span&gt;.0.0/16 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;172.16&lt;/span&gt;.0.0/12 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;192.168&lt;/span&gt;.0.0/16 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;224.0&lt;/span&gt;.0.0/4 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-d&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;240.0&lt;/span&gt;.0.0/4 &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN
    &lt;span class=&quot;token comment&quot;&gt;# Anything else should be redirected to Dokodemo-door&apos;s local port&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; REDIRECT --to-ports &lt;span class=&quot;token number&quot;&gt;1099&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# apply redirect for traffic forworded by this proxy&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; PREROUTING  &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY
    &lt;span class=&quot;token comment&quot;&gt;# apply redirect for proxy itself&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; OUTPUT &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY


    &lt;span class=&quot;token comment&quot;&gt;# UDP Redirect&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; mark &lt;span class=&quot;token parameter variable&quot;&gt;--mark&lt;/span&gt; 0xff
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;--dport&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;53&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; TPROXY --on-port &lt;span class=&quot;token number&quot;&gt;1099&lt;/span&gt; --tproxy-mark 0x01/0x01
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-N&lt;/span&gt; V2RAY_MARK
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY_MARK &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; RETURN &lt;span class=&quot;token parameter variable&quot;&gt;-m&lt;/span&gt; mark &lt;span class=&quot;token parameter variable&quot;&gt;--mark&lt;/span&gt; 0xff
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; V2RAY_MARK &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; udp &lt;span class=&quot;token parameter variable&quot;&gt;--dport&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;53&lt;/span&gt; &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; MARK --set-mark &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# add route for udp traffic&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; route &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; default dev lo table &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; rule &lt;span class=&quot;token function&quot;&gt;add&lt;/span&gt; fwmark &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; lookup &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;

    &lt;span class=&quot;token comment&quot;&gt;# Apply the rules&lt;/span&gt;
    &lt;span class=&quot;token comment&quot;&gt;# apply udp tproxy for traffic forworded by this proxy&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; PREROUTING &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY
    &lt;span class=&quot;token comment&quot;&gt;# apply udp tproxy for proxy itself&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-A&lt;/span&gt; OUTPUT &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY_MARK
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; PREROUTING  &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; OUTPUT &lt;span class=&quot;token parameter variable&quot;&gt;-p&lt;/span&gt; tcp &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-F&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; nat &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; PREROUTING &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-F&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; V2RAY
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-D&lt;/span&gt; OUTPUT &lt;span class=&quot;token parameter variable&quot;&gt;-j&lt;/span&gt; V2RAY_MARK
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-F&lt;/span&gt; V2RAY_MARK
    iptables &lt;span class=&quot;token parameter variable&quot;&gt;-t&lt;/span&gt; mangle &lt;span class=&quot;token parameter variable&quot;&gt;-X&lt;/span&gt; V2RAY_MARK
    &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; rule del fwmark &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; lookup &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
    &lt;span class=&quot;token function&quot;&gt;ip&lt;/span&gt; route del &lt;span class=&quot;token builtin class-name&quot;&gt;local&lt;/span&gt; default dev lo table &lt;span class=&quot;token number&quot;&gt;100&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token keyword&quot;&gt;case&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$1&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt;
start&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    start
    &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
stop&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    stop
    &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
*&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
    &lt;span class=&quot;token builtin class-name&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;&lt;span class=&quot;token variable&quot;&gt;$0&lt;/span&gt; start|stop&quot;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;esac&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后是服务管理脚本&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token shebang important&quot;&gt;#!/bin/sh /etc/rc.common&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# &quot;new&quot; style init script&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# Look at /lib/functions/service.sh on a running system for explanations of what other SERVICE_&lt;/span&gt;
&lt;span class=&quot;token comment&quot;&gt;# options you can use, and when you might want them.&lt;/span&gt;

&lt;span class=&quot;token assign-left variable&quot;&gt;START&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;80&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;STOP&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;APP&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;v2ray
&lt;span class=&quot;token assign-left variable&quot;&gt;SERVICE_WRITE_PID&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;SERVICE_DAEMONIZE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token assign-left variable&quot;&gt;PREFIX&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;/usr/local/v2ray

&lt;span class=&quot;token function-name function&quot;&gt;start&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    service_start &lt;span class=&quot;token variable&quot;&gt;$PREFIX&lt;/span&gt;/v2ray &lt;span class=&quot;token parameter variable&quot;&gt;-config&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$PREFIX&lt;/span&gt;/client_proxy.json
    &lt;span class=&quot;token variable&quot;&gt;$PREFIX&lt;/span&gt;/client_proxy.sh start
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;

&lt;span class=&quot;token function-name function&quot;&gt;stop&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token variable&quot;&gt;$PREFIX&lt;/span&gt;/client_proxy.sh stop
    service_stop &lt;span class=&quot;token variable&quot;&gt;$PREFIX&lt;/span&gt;/v2ray
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后启用脚本，开机启动&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;/etc/init.d/v2ray start
/etc/init.d/v2ray &lt;span class=&quot;token builtin class-name&quot;&gt;enable&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;参考文档&lt;/h1&gt;
&lt;p&gt;感谢！&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html&quot;&gt;Iptables 指南&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.v2ray.com/chapter_02/protocols/dokodemo.html&quot;&gt;v2ray 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.jianshu.com/p/76cea3ef249d&quot;&gt;Linux 使用 TPROXY 进行 UDP 的透明代理&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://toutyrater.github.io/app/transparent_proxy.html&quot;&gt;v2ray 白话文教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://powerdns.org/tproxydoc/tproxy.md.html&quot;&gt;PowerDNS 关于 TPROXY 的解释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kernel.org/doc/Documentation/networking/tproxy.txt&quot;&gt;TPROXY 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://en.wikipedia.org/wiki/Netfilter&quot;&gt;Netfilter 维基百科&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://oldwiki.archive.openwrt.org/doc/techref/initscripts&quot;&gt;OpenWrt 服务脚本&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Golang依赖管理]]></title><description><![CDATA[关于 Module Module 在 1.11 成为官方的依赖管理工具，虽然引起了不小的关于 Go Module 的争吵 ,但是应该就是以后主流的依赖管理工具了。 Module 使用 当前版本 1.12.8 中 go 自动判断是否启用 module 功能，当位于 GOPATH…]]></description><link>https://xdays.me/Golang依赖管理/</link><guid isPermaLink="false">https://xdays.me/Golang依赖管理/</guid><pubDate>Sat, 17 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;关于 Module&lt;/h1&gt;
&lt;p&gt;Module 在 1.11 成为官方的依赖管理工具，虽然引起了不小的&lt;a href=&quot;https://zhuanlan.zhihu.com/p/41627929&quot;&gt;关于 Go Module 的争吵&lt;/a&gt; ,但是应该就是以后主流的依赖管理工具了。&lt;/p&gt;
&lt;h1&gt;Module 使用&lt;/h1&gt;
&lt;p&gt;当前版本 1.12.8 中 go 自动判断是否启用 module 功能，当位于 GOPATH 里时关闭，否则自动开启。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token assign-left variable&quot;&gt;GO111MODULE&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt;auto&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;新建一个 module&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mkdir&lt;/span&gt; example
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; example
go mod init github.com/xdays/example&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后你就基本不需要单独跑&lt;code class=&quot;language-text&quot;&gt;go get&lt;/code&gt;来获取依赖了，&lt;code class=&quot;language-text&quot;&gt;go run&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;go build&lt;/code&gt;等命令会根据你的&lt;code class=&quot;language-text&quot;&gt;import&lt;/code&gt;来自动下载依赖并确立依赖的版本，至于怎么确立的可以在跑完命令后参考&lt;code class=&quot;language-text&quot;&gt;go.mod&lt;/code&gt;文件的内容。&lt;/p&gt;
&lt;p&gt;再者就是如果你更新了依赖版本，可以通过如下命令来清掉旧版本&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;go mod tidy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Module 的管理&lt;/h1&gt;
&lt;p&gt;对于包管理者来说也可以通过上面的步骤切换到 module 上来，但是当需要更新大版本的时候就需要注意了。官方的原则是：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“If an old package and a new package have the same import path, the new package must be backwards compatible with the old package.”&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;简而言之，更新大版本只需要如下几个步骤：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;将上一个版本开个分支，比如&lt;code class=&quot;language-text&quot;&gt;v5&lt;/code&gt;，然后打上 tag，继续维护&lt;/li&gt;
&lt;li&gt;在 master 分支上开发不兼容的&lt;code class=&quot;language-text&quot;&gt;v6&lt;/code&gt;分支，然后打上对应的 tag&lt;/li&gt;
&lt;li&gt;最重要的是更新 module 的 path，在最后添加上大版本的后缀，如果之前是&lt;code class=&quot;language-text&quot;&gt;github.com/xdays/example&lt;/code&gt;，那么更新之后就是&lt;code class=&quot;language-text&quot;&gt;github.com/xdays/example/v6&lt;/code&gt;，所以其实已经是不同的 package 了&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;更复杂的需求可以参&lt;a href=&quot;https://github.com/golang/go/wiki/Modules&quot;&gt;考官方的 Module 文档&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;使用中遇到的问题&lt;/h2&gt;
&lt;h2&gt;go-redis 代码不兼容问题&lt;/h2&gt;
&lt;h3&gt;问题&lt;/h3&gt;
&lt;p&gt;测试代码在这里&lt;a href=&quot;https://github.com/xdays/go-utils/tree/9455f2e5946e582553b977059903e59f5e1fe4cf&quot;&gt;redis-migrate&lt;/a&gt;，直接运行代码有问题&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;$ go run main.go
./main.go:105:55: cannot use &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;rangeBy &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type *redis.ZRangeBy&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; as &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; redis.ZRangeBy &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; argument to srcClient.cmdable.ZRangeByScoreWithScores
./main.go:110:33: cannot use &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&lt;/span&gt;z &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;type *redis.Z&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; as &lt;span class=&quot;token builtin class-name&quot;&gt;type&lt;/span&gt; redis.Z &lt;span class=&quot;token keyword&quot;&gt;in&lt;/span&gt; argument to dstClient.cmdable.ZAdd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但是通过&lt;code class=&quot;language-text&quot;&gt;go get&lt;/code&gt;获取的 redis-migrate 却没有问题&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;go get github.com/xdays/go-utils/redis-migrate
redis-migrate                                            &lt;span class=&quot;token operator&quot;&gt;&amp;lt;&lt;/span&gt;aws:loop-staging&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;
found &lt;span class=&quot;token number&quot;&gt;5&lt;/span&gt; keys
start migrating key test3 from scratch
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; ttl to &lt;span class=&quot;token parameter variable&quot;&gt;-1ns&lt;/span&gt;
start migrating key test5 from scratch
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; ttl to &lt;span class=&quot;token parameter variable&quot;&gt;-1ns&lt;/span&gt;
start migrating key test2 from scratch
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; ttl to &lt;span class=&quot;token parameter variable&quot;&gt;-1ns&lt;/span&gt;
start migrating key test1 from scratch
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; ttl to &lt;span class=&quot;token parameter variable&quot;&gt;-1ns&lt;/span&gt;
start migrating key test4 from scratch
&lt;span class=&quot;token builtin class-name&quot;&gt;set&lt;/span&gt; ttl to &lt;span class=&quot;token parameter variable&quot;&gt;-1ns&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;分析&lt;/h3&gt;
&lt;p&gt;如果我在开启了 module，这样 import&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;github.com/go-redis/redis&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;那么 go module 拿到的就是最小的稳定版本，go.mod 里是这样的&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;github&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;com&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token keyword&quot;&gt;go&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;redis&lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt;redis v6&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;15.3&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt;incompatible&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;而如果我用传统的方式获取这个 package，那我拿到的就是 master 分支的代码&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;go get github.com/go-redis/redis
&lt;span class=&quot;token builtin class-name&quot;&gt;cd&lt;/span&gt; &lt;span class=&quot;token variable&quot;&gt;$GOPATH&lt;/span&gt;/src/github.com/go-redis/redis
&lt;span class=&quot;token function&quot;&gt;git&lt;/span&gt; branch&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以看到两种方式拿到的 package 的版本并不一样。&lt;/p&gt;
&lt;h3&gt;解决&lt;/h3&gt;
&lt;p&gt;把 import 的 package 路径改为&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;go&quot;&gt;&lt;pre class=&quot;language-go&quot;&gt;&lt;code class=&quot;language-go&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;import&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&quot;github.com/go-redis/redis/v7&quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后执行&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;go mod tidy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再看&lt;code class=&quot;language-text&quot;&gt;go.mod&lt;/code&gt;，已经更新到最新的版本了&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;github.com/go-redis/redis/v7 v7.0.0-beta.2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;所以如果项目开启了 module，在 import 依赖的时候要去看下依赖的&lt;code class=&quot;language-text&quot;&gt;go.mod&lt;/code&gt;对应的路径，看看是不是有版本声明的后缀。这是&lt;a href=&quot;https://github.com/go-redis/redis/blob/master/go.mod#L1&quot;&gt;go-redis 的版本声明&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Gatsby添加分页]]></title><description><![CDATA[由于我现在的博客文章比较多了，而我基于 Gatsby 的博客又只有文章页和索引页两个页面，这样索引页看起来就特别长，这就有了分页的需求。本文主要学习这篇文章得来，gatsby-paginated-blog也是基于gatsby-starter-blog的。 关于 Gatsby…]]></description><link>https://xdays.me/Gatsby添加分页/</link><guid isPermaLink="false">https://xdays.me/Gatsby添加分页/</guid><pubDate>Sun, 11 Aug 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;由于我现在的博客文章比较多了，而我基于 Gatsby 的博客又只有文章页和索引页两个页面，这样索引页看起来就特别长，这就有了分页的需求。本文主要学习&lt;a href=&quot;https://nickymeuleman.netlify.com/blog/gatsby-pagination&quot;&gt;这篇文章&lt;/a&gt;得来，&lt;a href=&quot;https://github.com/NickyMeuleman/gatsby-paginated-blog&quot;&gt;gatsby-paginated-blog&lt;/a&gt;也是基于&lt;a href=&quot;https://github.com/gatsbyjs/gatsby-starter-blog&quot;&gt;gatsby-starter-blog&lt;/a&gt;的。&lt;/p&gt;
&lt;h1&gt;关于 Gatsby&lt;/h1&gt;
&lt;p&gt;这次添加分页读了一下&lt;a href=&quot;https://www.gatsbyjs.org/tutorial/&quot;&gt;官方的教程&lt;/a&gt;, 对 Gatsby 多了一些理解：&lt;/p&gt;
&lt;p&gt;Gatsby 的数据是存在 graphql 里的，而数据是插件处理生成的，比如最重要的两个插件：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;gatsby-source-filesystem&lt;/code&gt;在 graphql 里新增了&lt;code class=&quot;language-text&quot;&gt;allFile&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;file&lt;/code&gt;两个 object&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;gatsby-transformer-remark&lt;/code&gt;新增了&lt;code class=&quot;language-text&quot;&gt;allMarkdownRemark&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;markdownRemark&lt;/code&gt;两个 object&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Gatsby 不区分 page 和 post，内部都称为 page，所以在&lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt;里只有&lt;code class=&quot;language-text&quot;&gt;createPage&lt;/code&gt;这个接口。那如果要对博客索引分页就要模板化&lt;code class=&quot;language-text&quot;&gt;src/pages/index.js&lt;/code&gt;这个页面。&lt;/p&gt;
&lt;h1&gt;添加分页&lt;/h1&gt;
&lt;p&gt;所有的改动都在&lt;a href=&quot;https://github.com/xdays/xdays.me/commit/75368a606fb847b4bfcf35c98f5e19de7041631b&quot;&gt;这次 commit&lt;/a&gt;里了&lt;/p&gt;
&lt;h2&gt;模板化索引页&lt;/h2&gt;
&lt;p&gt;首先将博客索引页重命名并挪到 templates 目录下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;&lt;span class=&quot;token function&quot;&gt;mv&lt;/span&gt; src/pages/index.js src/templates/blog-list.js&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改 graphql 查询，添加 skip 和 limit 两个参数，来获取特定页面里的内容。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;export&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; pageQuery &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; graphql&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;
  query blogPageQuery($skip: Int!, $limit: Int!) {
    site {
      siteMetadata {
        title
      }
    }
    allMarkdownRemark(
      sort: { fields: [frontmatter___date], order: DESC }
      limit: $limit
      skip: $skip
    ) {
      edges {
        node {
          excerpt
          fields {
            slug
          }
          frontmatter {
            date(formatString: &quot;MMMM DD, YYYY&quot;)
            title
          }
        }
      }
    }
  }
&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;渲染索引页的时候还需要知道总共有多少页以及当年在第几页，这些都是作为 pros 传递给索引页的组件的。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; currentPage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; numPages &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token keyword&quot;&gt;this&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;props&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;pageContext
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isFirst &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; currentPage &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; isLast &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; currentPage &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; numPages
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; prevPage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; currentPage &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;/&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentPage &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; nextPage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;currentPage &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;toString&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后上一步初始化的几个变脸主要供分页导航里的逻辑使用的。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;jsx&quot;&gt;&lt;pre class=&quot;language-jsx&quot;&gt;&lt;code class=&quot;language-jsx&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;ul&lt;/span&gt;
  &lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;display&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;flex&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;flexWrap&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;wrap&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;justifyContent&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;space-between&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;alignItems&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;center&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;listStyle&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;none&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isFirst &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Link&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;prevPage&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;prev&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      ← Previous Page
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Link&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; numPages &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;li&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;key&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;pagination-number&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
        &lt;span class=&quot;token literal-property property&quot;&gt;margin&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Link&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
        &lt;span class=&quot;token attr-name&quot;&gt;style&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;padding&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;rhythm&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;4&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;textDecoration&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;none&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;color&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; currentPage &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#ffffff&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
          &lt;span class=&quot;token literal-property property&quot;&gt;background&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; currentPage &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;#007acc&apos;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token string&quot;&gt;&apos;&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
        &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
        &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Link&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;li&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
  &lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;!&lt;/span&gt;isLast &lt;span class=&quot;token operator&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;
    &lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Link&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;to&lt;/span&gt;&lt;span class=&quot;token script language-javascript&quot;&gt;&lt;span class=&quot;token script-punctuation punctuation&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;nextPage&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token attr-name&quot;&gt;rel&lt;/span&gt;&lt;span class=&quot;token attr-value&quot;&gt;&lt;span class=&quot;token punctuation attr-equals&quot;&gt;=&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;next&lt;span class=&quot;token punctuation&quot;&gt;&quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
      Next Page →
    &lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;&lt;span class=&quot;token class-name&quot;&gt;Link&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token plain-text&quot;&gt;
&lt;/span&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token tag&quot;&gt;&lt;span class=&quot;token punctuation&quot;&gt;&amp;lt;/&lt;/span&gt;ul&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;至此索引页模板化完成。&lt;/p&gt;
&lt;h2&gt;创建博客索引页&lt;/h2&gt;
&lt;p&gt;刚才说了所有的页面都是通过&lt;code class=&quot;language-text&quot;&gt;createPage&lt;/code&gt;这个接口创建，所以我们在&lt;code class=&quot;language-text&quot;&gt;gatsby-node.js&lt;/code&gt;里添加创建博客索引页页面的代码，然后通过 context 给组件传递对应的 props 就可以了&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;javascript&quot;&gt;&lt;pre class=&quot;language-javascript&quot;&gt;&lt;code class=&quot;language-javascript&quot;&gt;&lt;span class=&quot;token comment&quot;&gt;// Create blog post list pages&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; postsPerPage &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;20&lt;/span&gt;
&lt;span class=&quot;token keyword&quot;&gt;const&lt;/span&gt; numPages &lt;span class=&quot;token operator&quot;&gt;=&lt;/span&gt; Math&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;ceil&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;posts&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;length &lt;span class=&quot;token operator&quot;&gt;/&lt;/span&gt; postsPerPage&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;

Array&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;from&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt; &lt;span class=&quot;token literal-property property&quot;&gt;length&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; numPages &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;forEach&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token parameter&quot;&gt;_&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt; i&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;=&gt;&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
  &lt;span class=&quot;token function&quot;&gt;createPage&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;path&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;===&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;0&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;?&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token template-string&quot;&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;/&lt;/span&gt;&lt;span class=&quot;token interpolation&quot;&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;${&lt;/span&gt;i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token interpolation-punctuation punctuation&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token template-punctuation string&quot;&gt;`&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;component&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; path&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;resolve&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;./src/templates/blog-list.js&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token literal-property property&quot;&gt;context&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;{&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;limit&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; postsPerPage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;skip&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;*&lt;/span&gt; postsPerPage&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      numPages&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
      &lt;span class=&quot;token literal-property property&quot;&gt;currentPage&lt;/span&gt;&lt;span class=&quot;token operator&quot;&gt;:&lt;/span&gt; i &lt;span class=&quot;token operator&quot;&gt;+&lt;/span&gt; &lt;span class=&quot;token number&quot;&gt;1&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
    &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;,&lt;/span&gt;
  &lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;
&lt;span class=&quot;token punctuation&quot;&gt;}&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;先计算出一共分多少页，然后通过&lt;code class=&quot;language-text&quot;&gt;forEach&lt;/code&gt;创建所有的索引页。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[macOS命令行制作Windows10启动盘]]></title><description><![CDATA[缘起 标准的制作工具是Boot Camp Assistant，但是最新版的 macOS 对 U 盘大小做了限制，这个方法不好使了。现在只能通过命令行来只做了。 步骤 格式化 U 盘 注意添加 MBR 引导记录 挂载磁盘 命令会输出挂载路径，比如  拷贝数据 搞定！]]></description><link>https://xdays.me/macOS制作Windows10安装U盘/</link><guid isPermaLink="false">https://xdays.me/macOS制作Windows10安装U盘/</guid><pubDate>Thu, 20 Jun 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;缘起&lt;/h1&gt;
&lt;p&gt;标准的制作工具是&lt;a href=&quot;https://www.windowscentral.com/how-create-windows-10-installer-usb-drive-mac&quot;&gt;Boot Camp Assistant&lt;/a&gt;，但是最新版的 macOS 对 U 盘大小做了限制，这个方法不好使了。现在只能通过命令行来只做了。&lt;/p&gt;
&lt;h1&gt;步骤&lt;/h1&gt;
&lt;h2&gt;格式化 U 盘&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;diskutil eraseDisk MS-DOS &quot;WINDOWS10&quot; MBR disk2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意添加 MBR 引导记录&lt;/p&gt;
&lt;h2&gt;挂载磁盘&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hdiutil mount ~/Downloads/Win10_1903_V1_EnglishInternational_x64.iso&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;命令会输出挂载路径，比如 &lt;code class=&quot;language-text&quot;&gt;/Volumes/CCCOMA_X64FRE_EN-GB_DV9&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;拷贝数据&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rsync -vha --exclude=sources/install.wim /Volumes/CCCOMA_X64FRE_EN-US_DV9/ /Volumes/WINDOWS10/
brew install wimlib # 解决FAT32最大可保存4G文件
wimlib-imagex split /Volumes/CCCOMA_X64FRE_EN-US_DV9/sources/install.wim /Volumes/WINDOWS10/sources/install.swm 4000&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;搞定！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[驾照考试笔记]]></title><description><![CDATA[驾考记录 2019-04-03：科目一通过 2019-04-30：科目二第一次未通过 2019-07-01：科目二第二次未通过 2021-11-01 - 2021-11-2…]]></description><link>https://xdays.me/驾照考试笔记/</link><guid isPermaLink="false">https://xdays.me/驾照考试笔记/</guid><pubDate>Mon, 29 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;驾考记录&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;2019-04-03：科目一通过&lt;/li&gt;
&lt;li&gt;2019-04-30：科目二第一次未通过&lt;/li&gt;
&lt;li&gt;2019-07-01：科目二第二次未通过&lt;/li&gt;
&lt;li&gt;2021-11-01 - 2021-11-21：换驾校，科二三四一把过，看上去挺难的事情换个方法就简单了&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;科目一&lt;/h1&gt;
&lt;p&gt;驾考宝典背题&lt;/p&gt;
&lt;h1&gt;科目二&lt;/h1&gt;
&lt;h2&gt;考前准备&lt;/h2&gt;
&lt;p&gt;系安全带，调座椅（坐的和靠的），调后视镜，松手刹&lt;/p&gt;
&lt;h2&gt;倒车入库&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;按白色箭头指示驶入车库区域，两车轮对准黄线缺口处，黄线与肩膀平齐&lt;/li&gt;
&lt;li&gt;倒车直到左后视距离黄线一拳距离&lt;/li&gt;
&lt;li&gt;方向盘向右打死&lt;/li&gt;
&lt;li&gt;从右侧后视镜看车库右边角，当右边角出现在后视镜时，回轮半圈到一圈轮修正，直至有边角消失&lt;/li&gt;
&lt;li&gt;从左后视镜观察车库边缘黄线，当车与黄线平行时，方向盘回正&lt;/li&gt;
&lt;li&gt;继续倒车直到左后视镜贴近车库边缘黄线&lt;/li&gt;
&lt;li&gt;踩离合挂前进挡，当车前盖盖住黄线时，方向盘向左打死，待车正方向盘回正，就向前直到黄线与肩平齐&lt;/li&gt;
&lt;li&gt;踩离合，挂倒挡，慢送离合&lt;/li&gt;
&lt;li&gt;倒车直到左后视镜与黄线平齐&lt;/li&gt;
&lt;li&gt;方向盘向左打死&lt;/li&gt;
&lt;li&gt;从左后视镜观察车库左侧，知道车身与黄线平行，方向盘回正&lt;/li&gt;
&lt;li&gt;继续倒车知道左后视镜贴近车库边缘黄线&lt;/li&gt;
&lt;li&gt;踩离合，挂前进挡，当车前盖盖住黄线时，方向盘向右打死，带车正方向盘回正，驶出黄线，右转去下一个项目，尽量通过外圈走&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;侧方停车&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;驶入侧方停车时需注意车右侧距离黄线距离，可参考路上白色指示箭头，将后对齐左肩&lt;/li&gt;
&lt;li&gt;当从右后视镜看到停车位左前角时，方向盘右打死&lt;/li&gt;
&lt;li&gt;观察左后视镜，直至停车位右后角出现，方向盘回正&lt;/li&gt;
&lt;li&gt;继续倒车，观察左后视镜，当后轮在黄线上时，方向盘左打死&lt;/li&gt;
&lt;li&gt;从左后视镜观察，待车身与黄线平行，踩离合和刹车（按需）&lt;/li&gt;
&lt;li&gt;打左转向灯，挂前进挡，慢抬离合&lt;/li&gt;
&lt;li&gt;从左后视镜观察，直到停车位右后角出现，方向盘迅速回正&lt;/li&gt;
&lt;li&gt;回正后继续向右打方向盘，直到车身朝向正前&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;坡道定点停车和起步&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;提前调整车辆右侧到黄线的距离，记得右脚放到刹车上&lt;/li&gt;
&lt;li&gt;随着上坡慢抬离合器，当车右前侧小后视镜与标杆对齐时(凭运气)踩刹车&lt;/li&gt;
&lt;li&gt;拉上手刹&lt;/li&gt;
&lt;li&gt;松开脚刹&lt;/li&gt;
&lt;li&gt;慢抬离合器，直到车身颤动，此处一定要保持离合器，千万不能上台&lt;/li&gt;
&lt;li&gt;保持离合器不动，松手刹，可以稍微提一下手刹一遍手刹按钮更容易按下去，同时一定要保持离合不动&lt;/li&gt;
&lt;li&gt;开始爬坡&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;直角转弯&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;提前调整好车辆右侧到黄线的距离，打左转向灯&lt;/li&gt;
&lt;li&gt;当车前盖盖住黄线时，方向盘左打死&lt;/li&gt;
&lt;li&gt;拨回转向灯&lt;/li&gt;
&lt;li&gt;待车正，方向盘回正&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;曲线行驶&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;缓慢行驶&lt;/li&gt;
&lt;li&gt;有转弯靠左行驶，左转弯靠右行驶&lt;/li&gt;
&lt;li&gt;最后一个右转弯陡弯，给左侧留出一些距离以便让右后轮通过，但不要太大避免左前轮压线&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;注意点&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;挂挡之后，送离合之前注意检查是否送手刹&lt;/li&gt;
&lt;li&gt;车辆熄火后，需要挂空挡点火&lt;/li&gt;
&lt;li&gt;倒车入库要倒到位&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Windows10的一些使用体验]]></title><description><![CDATA[一点体会 自从 2014 年切换到 macOS 系统上就一直没有使用过 Windows 系统了，这期间 Win10 发布了，我对其理解也就是样子变了，并没有深入体验。最近需要在 MacBook 之外找一台更便携的辅助办公的设备，在 iPad Pro 和 Surface…]]></description><link>https://xdays.me/Windows10的一些使用体验/</link><guid isPermaLink="false">https://xdays.me/Windows10的一些使用体验/</guid><pubDate>Sun, 13 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;一点体会&lt;/h2&gt;
&lt;p&gt;自从 2014 年切换到 macOS 系统上就一直没有使用过 Windows 系统了，这期间 Win10 发布了，我对其理解也就是样子变了，并没有深入体验。最近需要在 MacBook 之外找一台更便携的辅助办公的设备，在 iPad Pro 和 Surface 之间调研了半天，最终因为 iPad Pro 的软件生态不行而选择了 Surface Pro 5，也在过去的两周深度的体验了下 Windows 10 系统。总提上感觉就是开启了一扇新的大门微软真改变了很多，就像是一个中年大叔变年轻了，最直接的提现就是能从起产品中看到很多新的技术，甚至开始顾及到 Linux 用户的体验了。以下列举了几个我觉得不错的功能。&lt;/p&gt;
&lt;h2&gt;PowerShell&lt;/h2&gt;
&lt;p&gt;PowerShell 在 Windows 7 上也用过，但是比较初级，基本上就当做更好用的 CMD 来使用的，其实很多命令也不通用的。这一次发现 PowerShell 竟然开源了，而且是全平台支持的(看样子是随着.NET Core 开源后的事情)。基本上所有能用图形界面做的事情现在都可以用 PowerShell 来做了，这对我这种什么东西都想自动化的人来说简直是利器。&lt;/p&gt;
&lt;p&gt;我再 macOS 环境下 90%的软件都是的 brew 来安装了，之前也听说 Windows 下同类型的工具 chocolatey，这次体验还可以。以管理员身份运行 PowerShell，然后执行如下命令即可&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;powershell&quot;&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Set-ExecutionPolicy&lt;/span&gt; Bypass &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Scope &lt;span class=&quot;token keyword&quot;&gt;Process&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Force&lt;span class=&quot;token punctuation&quot;&gt;;&lt;/span&gt; &lt;span class=&quot;token function&quot;&gt;iex&lt;/span&gt; &lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token function&quot;&gt;New-Object&lt;/span&gt; System&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;Net&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;WebClient&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;.&lt;/span&gt;DownloadString&lt;span class=&quot;token punctuation&quot;&gt;(&lt;/span&gt;&lt;span class=&quot;token string&quot;&gt;&apos;https://chocolatey.org/install.ps1&apos;&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;span class=&quot;token punctuation&quot;&gt;)&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;日常使用看下帮助就能上手。这里也说下两点不足：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;国内的软件好多没有的，这可以归结为 Windows 生态的问题&lt;/li&gt;
&lt;li&gt;没有一个类似 bundle 的东西，可以批量导入已安装的软件及其版本的列表&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;WSL&lt;/h2&gt;
&lt;p&gt;当时从 Windows 换到 macOS 体验最好的就是 macOS 可以同时获得优秀的桌面环境和 Linux 的命令行环境，而且 macOS 的软件生态也很好。现在 Windows 终于有了 WSL，可以同时享受到 Linux 的命令行环境，虽然 Windows 软件质量良莠不齐但是生态巨大，现在在通过 WSL 支持了 Linux 算是补齐了一个短板。&lt;/p&gt;
&lt;p&gt;下边来说说 WSL 吧，WSL 其实是在 Windows 之上实现的兼容 Linux 内核的接口层，或者说微软实现了一个精简的 Linux 内核，这个内核可以兼容 Linux 的二进制程序。&lt;/p&gt;
&lt;p&gt;首先开启 WSL 功能&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;powershell&quot;&gt;&lt;pre class=&quot;language-powershell&quot;&gt;&lt;code class=&quot;language-powershell&quot;&gt;&lt;span class=&quot;token function&quot;&gt;Enable-WindowsOptionalFeature&lt;/span&gt; &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;Online &lt;span class=&quot;token operator&quot;&gt;-&lt;/span&gt;FeatureName Microsoft-Windows-Subsystem-Linux&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后从 Microsoft Store 上搜索 Ubuntu 安装，之后可以运行&lt;code class=&quot;language-text&quot;&gt;ubuntu&lt;/code&gt;来启动 Linux 命令行&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;bash&quot;&gt;&lt;pre class=&quot;language-bash&quot;&gt;&lt;code class=&quot;language-bash&quot;&gt;C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Users&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;xdays&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;ubuntu config --default-user root

C:&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;Users&lt;span class=&quot;token punctuation&quot;&gt;\&lt;/span&gt;xdays&lt;span class=&quot;token operator&quot;&gt;&gt;&lt;/span&gt;ubuntu
root@xdays-parallels:~&lt;span class=&quot;token comment&quot;&gt;# uname -a&lt;/span&gt;
Linux xdays-parallels &lt;span class=&quot;token number&quot;&gt;4.4&lt;/span&gt;.0-17763-Microsoft &lt;span class=&quot;token comment&quot;&gt;#253-Microsoft Mon Dec 31 17:49:00 PST 2018 x86_64 x86_64 x86_64 GNU/Linux&lt;/span&gt;
root@xdays-parallels:~&lt;span class=&quot;token comment&quot;&gt;# lsb_release -a&lt;/span&gt;
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu &lt;span class=&quot;token number&quot;&gt;18.04&lt;/span&gt;.1 LTS
Release:        &lt;span class=&quot;token number&quot;&gt;18.04&lt;/span&gt;
Codename:       bionic&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后你就拥有了一个完整的 Ubuntu 版本，此外&lt;a href=&quot;https://docs.microsoft.com/en-us/windows/wsl/release-notes#build-18305&quot;&gt;预览版的 WSL 还支持了导出和导入的功能&lt;/a&gt;，现阶段可以用&lt;a href=&quot;https://help.ubuntu.com/community/BackupYourSystem/TAR&quot;&gt;Ubuntu 官方的备份方法&lt;/a&gt;来实现想想看，你配置了一个自己的开发环境然后导入一个备份儿，将来新换一个机器直接导入自己的开发环境，整体体验要比 Vagrant 和 Docker 还好，因为这两个工具对宿主机都有要求。因为 WSL 我都想拿 Surface 来作为主力办公的设备了:)&lt;/p&gt;
&lt;h2&gt;Office 365&lt;/h2&gt;
&lt;p&gt;现在的 Office 365 也已经完全的云化了，以 OneDrive 为储存中心，Office 套件可以 Web，PC 和 macOS 无缝衔接。早年投身 Google Docs 就是因为可以云端同步，现在 Office 365 除了云端还有自己强大的本地程序更牛逼了，况且 Office 的云端同步虽然也不快，但是至少不需要翻墙就能打开。&lt;/p&gt;
&lt;p&gt;再说一个我自己的需求，有时候我通过画图表给别人演示一个东西。这个需求包含两部分：第一是我这一端需要手写笔，Surface Pen 虽然不如 Apple Pencil 但也是除此之外最好的选择了；第二部分是我需要别人能直接实时查看我画的东西。OneNote 正好可以满足这个需求，主要问题是延迟，本地修改好长时间才能在页面上展示出来，不如 Google Docs 体验好，这块不知道是网络问题，还是微软没做好。其他的功能还有待学习啦。&lt;/p&gt;
&lt;h1&gt;Surface&lt;/h1&gt;
&lt;p&gt;最后还是说下 Surface Pro 吧&lt;/p&gt;
&lt;p&gt;不足目前还没有体会到，先说优点吧：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;轻便但是却很强大，移动办公&lt;/li&gt;
&lt;li&gt;Windows Hello 登录体验棒&lt;/li&gt;
&lt;li&gt;Surface Pen 随时以另一方式记录自己的想法&lt;/li&gt;
&lt;li&gt;Windows 强大的生态&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[从Pelican到Gatsby]]></title><description><![CDATA[最近一直在关注 React 生态，本着更好的学习 React 的目的和新年新气象重新开起写博客的计划，把博客从 Pelican 迁移到了 Gatsby，接下来记录下整个迁移过程。 初始化 模板 首先 Gatsby…]]></description><link>https://xdays.me/从Pelican到Gatsby/</link><guid isPermaLink="false">https://xdays.me/从Pelican到Gatsby/</guid><pubDate>Thu, 03 Jan 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近一直在关注 React 生态，本着更好的学习 React 的目的和新年新气象重新开起写博客的计划，把博客从 Pelican 迁移到了 Gatsby，接下来记录下整个迁移过程。&lt;/p&gt;
&lt;h2&gt;初始化&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;npm i -g gatsby-cli
gatsby new blog https://github.com/gatsbyjs/gatsby-starter-blog
cd blog
gatsby develop&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;模板&lt;/h2&gt;
&lt;p&gt;首先 Gatsby 的模板机制并不像其他的静态网站生成器那样可插拔，官方叫 starters，你可以基于这些 starters 构建自己的模板，或者说这些 starters 还比较简单，虽然可以开箱即用但是不够完善。这里我用的 &lt;a href=&quot;https://github.com/gatsbyjs/gatsby-starter-blog&quot;&gt;gatsby-starter-blog&lt;/a&gt;, 这个 starter 只有索引页和博客内容页，不过这倒挺符合我目前的想法，过去的几年里我一直做加法，以后要开始做减法了。&lt;/p&gt;
&lt;h2&gt;迁移源码&lt;/h2&gt;
&lt;p&gt;由于之前 pelican 也是用 markdown 写的，所以迁移起来不算麻烦，我写了一个脚本来转换：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;python gatsby-migrate.py &apos;/path/to/src.md&apos; content/blog/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;静态资源&lt;/h2&gt;
&lt;p&gt;因为我的图片都是早年间从 wordpress 里迁移过来的，所以都是集中放到一个目录下的，现在只需要把 wp-content 放到 static 目录下即可&lt;/p&gt;
&lt;h2&gt;持续集成&lt;/h2&gt;
&lt;p&gt;这里我做了两条持续集成的 pipeline(固有的运维思维，什么事情都想着有个备份)，一条是 gitlab 的 CI，另一条是 netlify 平台&lt;/p&gt;
&lt;p&gt;先说 Gitlab，也比较简单，因为之前我有一个 &lt;a href=&quot;https://gitlab.com/xdays/xdays.gitlab.io&quot;&gt;xdays.gitlab.io&lt;/a&gt;, 这次只需要修改 &lt;code class=&quot;language-text&quot;&gt;.gitlab-ci.yml&lt;/code&gt; :&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;image: node:8.11.2-alpine
pages:
  script:
  - npm i -g gatsby-cli
  - npm i
  - gatsby build
  artifacts:
    paths:
    - public/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;即可，然后每次推送新的 commit，我就可以在这里 &lt;a href=&quot;https://xdays.gitlab.io&quot;&gt;https://xdays.gitlab.io&lt;/a&gt; 访问我的新博客了。&lt;/p&gt;
&lt;p&gt;再说 Netlify，这个本来主打静态网站托管的 SaaS 服务，现在又集成了 Severless 的一些服务，使用起来确实很方便：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Github 账号登陆&lt;/li&gt;
&lt;li&gt;添加个人仓库，Netlify 自动识别 Gatsby 项目&lt;/li&gt;
&lt;li&gt;添加自定义域名，将域名解析指向到 Netlify 给的 CNAME。&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[回首2017和展望2018]]></title><description><![CDATA[回首 2017 回首 2017 的一个核心关键字就是“慌”，两个字就是“焦虑”。因为在写这篇文章之前我思考了一下，脑子一片空白。虽然这一年我基本没有在 12 点之前睡觉过，但是我仍然没法准确的描述出来这一年有何建树。但这应该就是回首的意义所在，在 201…]]></description><link>https://xdays.me/回首2017和展望2018/</link><guid isPermaLink="false">https://xdays.me/回首2017和展望2018/</guid><pubDate>Sun, 31 Dec 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;回首 2017&lt;/h1&gt;
&lt;h2&gt;回首&lt;/h2&gt;
&lt;p&gt;2017 的一个核心关键字就是“慌”，两个字就是“焦虑”。因为在写这篇文章之前我思考了一下，脑子一片空白。虽然这一年我基本没有在 12 点之前睡觉过，但是我仍然没法准确的描述出来这一年有何建树。但这应该就是回首的意义所在，在 2017 我错在哪里。&lt;/p&gt;
&lt;h2&gt;流水账&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;我女儿出生了，难以言表&lt;/li&gt;
&lt;li&gt;创业失败&lt;/li&gt;
&lt;li&gt;兼职糊口&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;得失&lt;/h2&gt;
&lt;h3&gt;得&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;女儿&lt;/li&gt;
&lt;li&gt;生活&lt;/li&gt;
&lt;li&gt;创业&lt;/li&gt;
&lt;li&gt;挣钱思维&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;失&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;时间&lt;/li&gt;
&lt;li&gt;技术成长&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;体会&lt;/h2&gt;
&lt;h3&gt;父女&lt;/h3&gt;
&lt;p&gt;4 月 19 号晚上 11 点半，我的女儿来到了我们的身边。我现在仍然记得 20 号早上我在看完老婆写的孕期日记擦完泪水，倒床眯了一会，然后带着妈熬好的小米粥去安贞医院给老婆送饭。这一年我变得脆弱了：看一场《寻梦环游记》两次流泪；Apple 给我推了一段回忆女儿从出生到现在的变化，泪水又在眼里打转。我以为我内心冷漠这辈子都不会哭了，没想到我自己也渐渐的变了。谢谢你，宝贝。另一方面，我经常问自己，我能做一个好爸爸吗？我该如何教育我的女儿呢？&lt;/p&gt;
&lt;h3&gt;家庭&lt;/h3&gt;
&lt;p&gt;在我写在这里之后，我要告诉我的老婆：“老婆，谢谢你给我的给这个家的所有的理解和支持，我爱你”。这一年谈到家庭，有欢笑，有泪水。其乐融融时，有家的温暖，我所期望和缺少的；闹矛盾时，心累，孤独。我觉得家庭就是命吧，你有一个贤妻和良母，不见得就能有一个美满的家庭，联系就是命。所以要认命，要付出，方有收获。&lt;/p&gt;
&lt;h3&gt;创业&lt;/h3&gt;
&lt;p&gt;现在想来，我可能是创了一个假的业，假的不是业本身，而是我创业的心态。回想我当初加入的时候，我内心真实想法是什么，一年嘛，体验下什么是创业，成与不成次要，体验最重要。好吧，在这个心态下，脏活累活时，凝聚力不行的时候，自己在想什么呢。所以创业对于我来说是失败的。&lt;/p&gt;
&lt;h3&gt;技术&lt;/h3&gt;
&lt;p&gt;碎片化的技术积累对于自己的不可替代性几乎没有帮助，通过在十几个技术 weekly 订阅中，每周技术文章阅读量不下 100 篇，现在看来并没有什么卵用。成块的东西能想到的也就是 Kubernetes 了，也是接下来要发力的一个方向。关于 JS，书也看了，视频教程看了，做出了什么？什么也没有。所以，以目标为向导的技术成长也许才是有意义的。&lt;/p&gt;
&lt;h2&gt;打分&lt;/h2&gt;
&lt;p&gt;40&lt;/p&gt;
&lt;h1&gt;展望 2018&lt;/h1&gt;
&lt;h1&gt;工作&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;目标向导的技术成长&lt;/li&gt;
&lt;li&gt;Kubernetes&lt;/li&gt;
&lt;li&gt;JavaScript&lt;/li&gt;
&lt;li&gt;Ops as a Service&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;生活&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;驾照&lt;/li&gt;
&lt;li&gt;买房&lt;/li&gt;
&lt;li&gt;锻炼&lt;/li&gt;
&lt;li&gt;育儿&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[如何充分利用你的24h]]></title><description><![CDATA[最近在豆瓣阅读上读了一本极短的书，时间管理: 如何充分利用你的 2…]]></description><link>https://xdays.me/如何充分利用你的24h/</link><guid isPermaLink="false">https://xdays.me/如何充分利用你的24h/</guid><pubDate>Sun, 10 Sep 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;最近在豆瓣阅读上读了一本极短的书，&lt;a href=&quot;https://book.douban.com/subject/7001106/&quot;&gt;时间管理: 如何充分利用你的 24 小时&lt;/a&gt; 。个人感觉，抛去外界条件，人与人之间的差距在于对时间的利用。我个人在时间管理上遇到的最大的问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;难以坚持&lt;/li&gt;
&lt;li&gt;对任务的主次优先不敏感&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面是本书的读书笔记，贴在这里希望以后能反复来反思自己。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;你现在是如何利用时间的?&lt;/h1&gt;
&lt;h2&gt;意识&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;意识到时间知道可以利用的时间，才可以调整&lt;/li&gt;
&lt;li&gt;会把时间当做一种资产对待&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;目标&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;给任务列个清单&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;选择&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;生命就是在相互竞争的压力下不断的平衡&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;让你拥有的时间发挥最大的效应&lt;/h1&gt;
&lt;h2&gt;你可以创造时间&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;精力&lt;/li&gt;
&lt;li&gt;寻找时间空隙&lt;/li&gt;
&lt;li&gt;杜绝浪费时间&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;拖延是大敌&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;你不是你的思想&lt;/li&gt;
&lt;li&gt;跟任何东西一样，思想也是有型的物体&lt;/li&gt;
&lt;li&gt;你的大脑一次只能处理一个主导思想&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;策略和技巧&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;清理头脑和生活中的杂波&lt;/li&gt;
&lt;li&gt;规划&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;计划清单的神奇魔力&lt;/li&gt;
&lt;li&gt;确定事项的优先次序的力量&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;集中精力的为例&lt;/li&gt;
&lt;li&gt;技巧&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2017/09/time-management-1.jpg&quot; alt=&quot;time-management-1&quot;&gt;
&lt;img src=&quot;/wp-content/uploads/2017/09/time-management-2.jpg&quot; alt=&quot;time-management-2&quot;&gt;
&lt;img src=&quot;/wp-content/uploads/2017/09/time-management-3.jpg&quot; alt=&quot;time-management-3&quot;&gt;
&lt;img src=&quot;/wp-content/uploads/2017/09/time-management-4.jpg&quot; alt=&quot;time-management-4&quot;&gt;
&lt;img src=&quot;/wp-content/uploads/2017/09/time-management-5.jpg&quot; alt=&quot;time-management-5&quot;&gt;&lt;/p&gt;
&lt;p&gt;总结来说就是：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;知道自己的时间都花到哪里去了&lt;/li&gt;
&lt;li&gt;掌握利用时间的方式，以实现时间利用的最大化&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Docker基础教程之镜像安全]]></title><description><![CDATA[上一篇我总结下了Docker 的镜像构建，这一篇我来谈下镜像安全。 概述 安全一直是一个不出事没人关心等到出事的时候也已经晚了的话题，以我目前的了解成熟的项目基本没有，而且比较知名的就是 Docker Cloud 和 Quay.io…]]></description><link>https://xdays.me/Docker基础教程之镜像安全/</link><guid isPermaLink="false">https://xdays.me/Docker基础教程之镜像安全/</guid><pubDate>Sun, 16 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇我总结下了&lt;a href=&quot;//docker%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E9%95%9C%E5%83%8F%E6%9E%84%E5%BB%BA/&quot;&gt;Docker 的镜像构建&lt;/a&gt;，这一篇我来谈下镜像安全。&lt;/p&gt;
&lt;h1&gt;概述&lt;/h1&gt;
&lt;p&gt;安全一直是一个不出事没人关心等到出事的时候也已经晚了的话题，以我目前的了解成熟的项目基本没有，而且比较知名的就是 Docker Cloud 和 Quay.io 在收费版里集成了安全扫描的功能。本文主要是我以 &lt;a href=&quot;https://thenewstack.io/draft-vulnerability-scanners/&quot;&gt;A Scan of the Container Vulnerability Scanner Landscape&lt;/a&gt; 这篇文章为线索，实战了其中的 Anchore 和 Clair 两个项目的简单介绍，后续还会持续观察更新。这类工具的共同特点就是静态分析镜像里的内容，找出其中的软件包和对应的版本，然后和从各大 Linux 版本的 CVE 源下载漏洞数据库做匹配，最终判断镜像里的安全漏洞。&lt;/p&gt;
&lt;h1&gt;Anchore&lt;/h1&gt;
&lt;p&gt;项目地址在&lt;a href=&quot;https://github.com/anchore/anchore&quot;&gt;这里&lt;/a&gt; 。总体来说 anchore 还是比较简陋，其对应的 &lt;a href=&quot;https://anchore.io/&quot;&gt;SaaS 服务&lt;/a&gt; 也是处于比较初级的阶段，还有待观察。&lt;/p&gt;
&lt;h2&gt;安装配置&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install epel-release &amp;amp;&amp;amp; yum install -y python-pip rpm-python dpkg
pip install anchore
anchore feeds sync&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;实战演示&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 分析本地的镜像
anchore analyze --image ubuntu:latest --imagetype base
# 从分析结果生成报告
anchore gate --image ubuntu:latest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;报告中会显示哪个包有漏洞，已经漏洞对应的链接。&lt;/p&gt;
&lt;h1&gt;Clair&lt;/h1&gt;
&lt;p&gt;来自 CoreOS 的&lt;a href=&quot;https://github.com/coreos/clair&quot;&gt;Clair&lt;/a&gt;实现了一个 restful 的服务，同样是周期性的同步各种漏洞源信息，然后客户端可以将镜像传给 Clair，然后 Clair 解析出镜像里的软件包，如果软件包包含漏洞的话， Clair 可以调 webhook 发送通知到外部服务。我的理解 Clair 并不是一个完备的解决方案，但是你可以很容易的将 Clair 集成到自己的工作流中去。可惜这个东西目前还比较小众，目前还看到有人基于这个搞个方案。如下两个链接可以了解更多：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://coreos.com/blog/vulnerability-analysis-for-containers.html&quot;&gt;https://coreos.com/blog/vulnerability-analysis-for-containers.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://coreos.com/clair/docs/latest/api_v1.html&quot;&gt;https://coreos.com/clair/docs/latest/api_v1.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装配置&lt;/h2&gt;
&lt;p&gt;准备 sample 配置文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir clair/clair_config/
curl -L https://raw.githubusercontent.com/coreos/clair/master/config.example.yaml -o clair/clair_config/config.yaml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改数据库配置 &lt;code class=&quot;language-text&quot;&gt;vi clair/clair_config/config.yaml&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;source: host=postgres port=5432 user=postgres password=password sslmode=disable statement_timeout=60000&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;准备 compose file&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd clair
curl -L https://raw.githubusercontent.com/coreos/clair/master/docker-compose.yml -o docker-compose.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker-compose up -d&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;实战演示&lt;/h2&gt;
&lt;p&gt;刚才我也提到，Clair 只是提供了 api 接口，所以使用起来并不是那么方便，我在 Github 上找到了 clairctl 这个客户端工具，可以方便的测试 Clair 的功能&lt;/p&gt;
&lt;h3&gt;安装 clairctl&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;go get github.com/jgsqware/clairctl
cd ~/go/src/github.com/jgsqware/clairctl
go build
cp clairctl /usr/local/bin/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;分析镜像&lt;/h3&gt;
&lt;p&gt;检查是否已经连接上 Clair&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;~ clairctl health

Clair: ✔&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;将镜像上传到 Clair&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;~ clairctl push -l mongo
mongo:latest has been pushed to Clair&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;分析镜像中的漏洞&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;~ clairctl analyze mongo

Image: docker.io/mongo:latest
 11 layers found

  ➜ Analysis [sha256:bb0dc] found 36 vulnerabilities.
  ➜ Analysis [sha256:2369c] found 36 vulnerabilities.
  ➜ Analysis [sha256:ef2c7] found 36 vulnerabilities.
  ➜ Analysis [sha256:9504d] found 36 vulnerabilities.
  ➜ Analysis [sha256:7584b] found 34 vulnerabilities.
  ➜ Analysis [sha256:081d7] found 34 vulnerabilities.
  ➜ Analysis [sha256:b394c] found 34 vulnerabilities.
  ➜ Analysis [sha256:a647e] found 34 vulnerabilities.
  ➜ Analysis [sha256:90df9] found 34 vulnerabilities.
  ➜ Analysis [sha256:b03f9] found 34 vulnerabilities.
  ➜ Analysis [sha256:e45e8] found 34 vulnerabilities.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;生成漏洞报告&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;~ clairctl report mongo
HTML report at reports/html/analysis-mongo-latest.html&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2017/04/clair-report.png&quot; alt=&quot;clair report&quot;&gt;&lt;/p&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;Open Source Solution&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://developers.redhat.com/blog/2016/05/02/introducing-atomic-scan-container-vulnerability-detection/&quot;&gt;OpenSCAP/atomic scan&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Commercial Solution&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloud.docker.com/&quot;&gt;Docker Cloud&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://quay.io/&quot;&gt;Quay.io&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.aquasec.com/products/aqua-container-security-platform/&quot;&gt;Aqua&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Docker基础教程之镜像构建]]></title><description><![CDATA[这个系列已经好久没更新了，上一篇我总结了目前主流的镜像存储方案，这一篇总结下 Docker 的镜像构建 Dockerfile 这是 Docker 官方的构建镜像的方案，其背后的思想和早在 Docker 诞生之前就已经广泛使用的配置管理工具(puppet, ansible…]]></description><link>https://xdays.me/Docker基础教程之镜像构建/</link><guid isPermaLink="false">https://xdays.me/Docker基础教程之镜像构建/</guid><pubDate>Mon, 03 Apr 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这个系列已经好久没更新了，上一篇我总结了目前主流的镜像存储方案，这一篇总结下 Docker 的镜像构建&lt;/p&gt;
&lt;h1&gt;Dockerfile&lt;/h1&gt;
&lt;p&gt;这是 Docker 官方的构建镜像的方案，其背后的思想和早在 Docker 诞生之前就已经广泛使用的配置管理工具(puppet, ansible, chef 等)是一样的，就是说你只需要用一个文件来描述你想要的镜像是什么样的，然后 Docker 会依据 Dockerfile 来 build 出来目标镜像，并且你在 Dockerfile 里的指令就是对应最终镜像的每一层，这样就可以充分利用镜像分层复用的优势了。只不过不同点在于目前主流的配置管理工具在你的描述文件和实际运行的系统命令之间进行了一层抽象，这样就大大降低了学习的成本也便于复用代码(puppet 的 module, ansible 的 role)，而 Dockerfile 来的就比较直接，你直接写 shell 命令，其优缺点也就是 shell 的优缺点了。总结来说，Dockerfile 通过定义一些指令提供了一种可重复构建镜像的方式。&lt;/p&gt;
&lt;p&gt;这一小节我只针对常用的指令进行一个介绍，更多关于 Dockerfile 的每个指令的详细解释不是本文的重点，你可以在用的时候&lt;a href=&quot;https://docs.docker.com/engine/reference/builder/&quot;&gt;参考这里&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;FROM centos

ADD iami.txt /root/
RUN echo &quot;Hello World!&quot; &gt; /root/iami.txt

EXPOSE 80
CMD [&quot;cat&quot;, &quot;/root/iami.txt&quot;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;指令解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FROM 指定要 build 的镜像是基于哪个镜像 build 的&lt;/li&gt;
&lt;li&gt;ADD 添加本地的文件到镜像中&lt;/li&gt;
&lt;li&gt;RUN 运行的 shell 命令的所做的修改都会体现在新 build 的镜像中&lt;/li&gt;
&lt;li&gt;EXPOSE 用于声明镜像对外暴露的端口&lt;/li&gt;
&lt;li&gt;CMD 指定启动镜像是的默认命令&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后我们运行如下命令新的镜像就 build 出来了&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker build -t xdays/demo .&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后再说下 Dockerfile 的问题： 通过 &lt;code class=&quot;language-text&quot;&gt;RUN&lt;/code&gt; 指令来运行 shell 太过简陋，如果你之前用 ansible 之类的工具实现的复杂的软件构建流程，那么迁移到 Docker 上来是挺痛苦的，因为你要用 shell 把之前的逻辑全部写一遍。在这个过程中也会有些问题凸显，比如：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;如果你的软件需要编译安装，那么你就得先安装 gcc 和依赖库等软件包，而事实上一旦编译完成你并不需要这些软件包了，这样就导致最终 build 的 image 较大&lt;/li&gt;
&lt;li&gt;由于只能通过 shell 命令来构建镜像，那整个构建过程的可复用性就比较差，虽然 Docker 的分层机制能起到复用作用，但是还是不能瞒住更细粒度的复用，就像 puppet 的 module，ansible 的 role。这是硬伤。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;既然 Dockerfile 有其自身的不足，那我们接下来就来看看社区有什么好的解决方案。&lt;/p&gt;
&lt;h1&gt;habitus/source-to-image&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.habitus.io/&quot;&gt;Habitus&lt;/a&gt;和&lt;a href=&quot;https://github.com/openshift/source-to-image&quot;&gt;source-to-image&lt;/a&gt;这两个项目都是优化镜像构建流程的工具，他们本质上还是基于 Dockerfile 的。这里我只是说下我对这个两个项目解决问题的思路，并不会用实例来演示如何使用他们，因为我觉得他们并没有解决根本问题。&lt;/p&gt;
&lt;p&gt;先来说下 Habitus 吧，我觉得 Habitus 最大的亮点在于其解决了上一节我提到的 Dockerfile 的第一个问题，它提出了 artifacts 的概念，巧妙的将一个镜像 build 的过程拆分成两个，用一个 image 来编译代码，然后将编译的结果文件从结果镜像中拷贝出来，然后再将这些文件打包的运行时的镜像中去作为最终的镜像，这样最终 build 出来的镜像就不会特别大，用流程图来描述如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;builer image(javac) --&gt; artifacts(war or jar) -&gt; runtime imaage(java + jar)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;此外，Habitus 还提供了两个功能也不错：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;secrets，由 Habitus 内置的 webserver 来管理所有的隐私文件，然后镜像构建过程中通过 curl 或者 wget 来获取隐私文件，这样能保证隐私文件不会提交到代码仓库中去&lt;/li&gt;
&lt;li&gt;squashing，合并 image，可以彻底清除一些不必要的文件，减小镜像的体积。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;再来看下 source-to-image，基于 workflow 的描述：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;s2i creates a container based on the build image and passes it a tar file that contains:
a. The application source in src, excluding any files selected by .s2iignore
b. The build artifacts in artifacts (if applicable - see incremental builds)&lt;/li&gt;
&lt;li&gt;s2i sets the environment variables from .s2i/environment (optional)&lt;/li&gt;
&lt;li&gt;s2i starts the container and runs its assemble script&lt;/li&gt;
&lt;li&gt;s2i waits for the container to finish&lt;/li&gt;
&lt;li&gt;s2i commits the container, setting the CMD for the output image to be the run script and tagging the image with the name provided.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;我们就能明白 source-to-image 也是将一次 build 拆分成两次来做，只不过它的方式是对 builder image 定义了一个规范，需要你提前准备好 builder image。&lt;/p&gt;
&lt;p&gt;好了，总结一下吧！Habitus 和 source-to-image 都解决了如何让最终 build 出来的镜像的体积变小，但是他们并没有从根本上能让镜像构建的过程变的在很小粒度上可复用。&lt;/p&gt;
&lt;p&gt;另外，Docker 已经将&lt;a href=&quot;http://blog.alexellis.io/mutli-stage-docker-builds/&quot;&gt;Multi-Stage building&lt;/a&gt;合并到了 master 分支 ，不久的将来 Docker 会原生支持了。&lt;/p&gt;
&lt;h1&gt;Ansible/Puppet/Packer&lt;/h1&gt;
&lt;p&gt;下面我来看下如何解决构建过程可复用的问题，目前主流的配置管理系统都对 Docker 镜像构建有所支持，他们的优势就是可以充分利用现在配置管理系统的生态，实现最大程度的可复用性，而做出的牺牲就是完全摒弃了 Dockerfile。具体支持方式如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.ansible.com/&quot;&gt;ansible&lt;/a&gt; 直接用 ansible 来构建镜像&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/ansible/ansible-container&quot;&gt;ansible-container&lt;/a&gt; 管理应用的整个声明周期，包括 build 和部署等&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/puppetlabs/puppetlabs-image_build&quot;&gt;puppet image_build&lt;/a&gt; 用 puppet 来构建镜像&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.packer.io/docs/builders/docker.html&quot;&gt;packer docker builder&lt;/a&gt; 基于 packer 构建工具来构建镜像&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Ansible/Ansible-Container&lt;/h2&gt;
&lt;p&gt;虽然 ansible-container 是一个单独的致力于解决基于容器构建应用的整个生命周期，但是一向以小而美著称的 ansible 这次看上去并不是那么的“小”了，它把构建部署等过程绑定在一个工具里在我看来也不那么“美”了，所以我们还是先看看这个项目最终能发展成什么样子吧。&lt;/p&gt;
&lt;p&gt;这里我主要说下如何把 ansible 纳入到镜像构建中来，我们目前用的一种简单粗暴的方式：直接在 base 镜像里集成了 ansible，然后在构建镜像的时候把 ansible 的 playbook 以及相关的 role 全部放入到 build 的 context 里，然后在 build 完成后再删掉相关的不需要的文件。举例来说，先看下目录结构：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;.
├── Dockerfile
├── README.md
├── roles
│   └── README.md
└── site.yml&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中在构建镜像前要将 ansible 相关的 role 拷贝到 roles 目录下。&lt;/p&gt;
&lt;p&gt;Dockerfile 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;FROM xdays/builder

WORKDIR /opt/xdays/
ADD . /tmp/
RUN cd /tmp &amp;amp;&amp;amp; ansible-playbook site.yml

CMD [&quot;/opt/xdays/start.sh&quot;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;site.yml 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- hosts: localhost
  connection: local

  vars_files:
  - global.yml

  roles:
  - top&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;有几点需要说明下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;xdays/builder&lt;/code&gt; 这个 image 里已经安装了 ansible，并且 inventory 里也包含了 localhost&lt;/li&gt;
&lt;li&gt;ansible 的 playbook 需要的变量文件&lt;code class=&quot;language-text&quot;&gt;global.yml&lt;/code&gt;也需要在构建之前拷贝到当前目录下&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这种方式的优点是可以复用 ansible 的 role；缺点也很明显，首先是虽然也有 Dockerfile 但是 build 缓存已经不存在了，因为所有的构建构成都在&lt;code class=&quot;language-text&quot;&gt;RUN cd /tmp &amp;amp;&amp;amp; ansible-playbook site.yml&lt;/code&gt; 这一层完成的，其次把 ansible 安装到 base 镜像里会增大最终 build 出来的镜像。&lt;/p&gt;
&lt;h2&gt;Puppet&lt;/h2&gt;
&lt;p&gt;Puppet 的 image_build 模块构建镜像的方式和我们的做法类似，也是将 puppet 安装到镜像里，然后构建过程中将 puppet 的 manifest 打包到 build 的 context 里，只不过&lt;code class=&quot;language-text&quot;&gt;image_build&lt;/code&gt;模块实现了将 puppet 的 manifest 转成 Dockerfile 的功能，这样就能充分里利用 Dockerfile 的缓存机制&lt;/p&gt;
&lt;p&gt;官方给的例子也很好理解:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;puppet module install puppetlabs/image_build
git clone https://github.com/puppetlabs/puppetlabs-image_build.git
cd puppetlabs-image_build/examples/nginx
puppet docker build
puppet docker dockerfile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这种方式要比上一节我们使用的 ansible 的方式要好，但还是有一个缺点就是 build 出来的镜像相对比较大。&lt;/p&gt;
&lt;h2&gt;Packer&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://www.packer.io/&quot;&gt;Packer&lt;/a&gt;是一个通用镜像构建工具，其大概思路就是将镜像构建拆分为 builder， provisioner 和 post-processor 三个阶段：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;builder 决定了镜像的格式，比如 AWS, Azure, GCP。而 Docker 也是其中的一种&lt;/li&gt;
&lt;li&gt;provisioner 决定了怎么构建镜像，其闪光点在于其只定义了怎么调用 provisioner 框架，具体构建的细节还是由 provisioner 自己来决定，这样足够开放，让所有的配置管理工具大放光彩&lt;/li&gt;
&lt;li&gt;post-processor 决定了镜像构建完成如何处理，比如上传到 AWS 还是上传到 Docker Hub。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Packer 构建 Docker 镜像的方式是从 base 镜像启动一个 container 然后对这个 container 运行 provisioner，最后将这个 container 提交为镜像，这种方式完全也脱离了 Dockerfile，但是有没有将配置管理工具打包到 base 镜像里，这样既保证了 build 的镜像体积较小也充分利用了配置管理工具。当然缺点还是没有办法充分利用 Dockerfile 的 build 缓存。&lt;/p&gt;
&lt;p&gt;下面举个简单的例子，新建 template.json 文件如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
  &quot;variables&quot;: {
    &quot;ansible_host&quot;: &quot;default&quot;,
    &quot;ansible_connection&quot;: &quot;docker&quot;
  },
  &quot;builders&quot;: [
    {
      &quot;type&quot;: &quot;docker&quot;,
      &quot;image&quot;: &quot;ubuntu&quot;,
      &quot;commit&quot;: &quot;true&quot;,
      &quot;run_command&quot;: [
        &quot;-d&quot;,
        &quot;-i&quot;,
        &quot;-t&quot;,
        &quot;--name&quot;,
        &quot;{{user `ansible_host`}}&quot;,
        &quot;{{.Image}}&quot;,
        &quot;/bin/bash&quot;
      ]
    }
  ],
  &quot;provisioners&quot;: [
    {
      &quot;type&quot;: &quot;shell&quot;,
      &quot;inline&quot;: [
        &quot;apt-get update&quot;,
        &quot;apt-get install python -yq&quot;
      ]
    },
    {
      &quot;type&quot;: &quot;ansible&quot;,
      &quot;user&quot;: &quot;root&quot;,
      &quot;playbook_file&quot;: &quot;./playbook.yml&quot;,
      &quot;extra_arguments&quot;: [
        &quot;--extra-vars&quot;,
        &quot;ansible_host={{user `ansible_host`}} ansible_connection={{user `ansible_connection`}}&quot;
      ]
    }
  ],
  &quot;post-processors&quot;: [
    [
      {
        &quot;type&quot;: &quot;docker-tag&quot;,
        &quot;repository&quot;: &quot;xdays/demo&quot;
      }
    ]
  ]
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后编辑 playbook.yml 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
- hosts: all
  tasks:
    - name: create a foobar file
      copy:
        dest: /root/foobar
        content: Hello World!
        owner: root&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后运行 packer:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;packer build template.json&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;至此，Packer 来构建 Docker 镜像也介绍完了。另外多说依据，build 缓存在 Packer 的开发计划之中， 官方文档的描述如下：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Dockerfiles will snapshot the container at each step, allowing you to go back to any step in the history of building. Packer doesn’t do this yet, but inter-step snapshotting is on the way.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;最后总结下吧，个人认为 Packer 是目前最接近我所期待的 Docker 镜像工具。当然我也更期待 Dockerfile 能够在未来的版本中和目前主流的配置管理工具更友好一些。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[基于OpenResty自动签发Let's Encrypt证书]]></title><description><![CDATA[安装 OpenResty OpenResty 所有的文件以及依赖包都安装在  目录下 安装配置 lua-resty-auto-ssl 安装 Luarocks Luarocks 是 Lua 的包管理工具，很多 OpenResty 的包都可以通过 luarocks…]]></description><link>https://xdays.me/基于openresty签发letsencrypt证书/</link><guid isPermaLink="false">https://xdays.me/基于openresty签发letsencrypt证书/</guid><pubDate>Thu, 30 Mar 2017 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装 OpenResty&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -so /etc/yum.repos.d/openresty.repo  https://openresty.org/package/centos/openresty.repo &amp;amp;&amp;amp; \
    yum install -y openresty gcc make diffutils openssl &amp;amp;&amp;amp; \&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OpenResty 所有的文件以及依赖包都安装在 &lt;code class=&quot;language-text&quot;&gt;/usr/local/openresty&lt;/code&gt; 目录下&lt;/p&gt;
&lt;h1&gt;安装配置 lua-resty-auto-ssl&lt;/h1&gt;
&lt;h2&gt;安装 Luarocks&lt;/h2&gt;
&lt;p&gt;Luarocks 是 Lua 的包管理工具，很多 OpenResty 的包都可以通过 luarocks 来安装。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -so - http://luarocks.github.io/luarocks/releases/luarocks-3.3.1.tar.gz | tar xzf - &amp;amp;&amp;amp; \
    cd luarocks-3.3.1 &amp;amp;&amp;amp; ./configure --prefix=/usr/local/openresty/luajit/ \
    --with-lua=/usr/local/openresty/luajit/ \
    --with-lua-include=/usr/local/openresty/luajit/include/luajit-2.1/ &amp;amp;&amp;amp; \
    make build &amp;amp;&amp;amp; make install &amp;amp;&amp;amp; cd .. &amp;amp;&amp;amp; rm -rf ../luarocks-* &amp;amp;&amp;amp; \
    ln -s /usr/local/openresty/luajit/bin/luarocks /usr/local/bin/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;安装 lua-resty-auto-ssl&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;luarocks install lua-resty-auto-ssl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置 lua-resty-auto-ssl&lt;/h2&gt;
&lt;p&gt;编辑配置文件 &lt;code class=&quot;language-text&quot;&gt;vim conf/nginx.conf&lt;/code&gt; ，内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;env DOMAINS;

events {
  worker_connections 1024;
}

http {
  # The &quot;auto_ssl&quot; shared dict should be defined with enough storage space to
  # hold your certificate data. 1MB of storage holds certificates for
  # approximately 100 separate domains.
  lua_shared_dict auto_ssl 1m;
  # The &quot;auto_ssl_settings&quot; shared dict is used to temporarily store various settings
  # like the secret used by the hook server on port 8999. Do not change or
  # omit it.
  lua_shared_dict auto_ssl_settings 64k;

  # A DNS resolver must be defined for OCSP stapling to function.
  #
  # This example uses Google&apos;s DNS server. You may want to use your system&apos;s
  # default DNS servers, which can be found in /etc/resolv.conf. If your network
  # is not IPv6 compatible, you may wish to disable IPv6 results by using the
  # &quot;ipv6=off&quot; flag (like &quot;resolver 8.8.8.8 ipv6=off&quot;).
  resolver 8.8.8.8;

  # Initial setup tasks.
  init_by_lua_block {
    auto_ssl = (require &quot;resty.auto-ssl&quot;).new()

    -- Define a function to determine which SNI domains to automatically handle
    -- and register new certificates for. Defaults to not allowing any domains,
    -- so this must be configured.
    auto_ssl:set(&quot;allow_domain&quot;, function(domain)
      domains = os.getenv(&quot;DOMAINS&quot;)
      return ngx.re.match(domain, domains, &quot;ijo&quot;)
    end)
    auto_ssl:set(&quot;dir&quot;, &quot;/tmp/&quot;)

    auto_ssl:init()
  }

  init_worker_by_lua_block {
    auto_ssl:init_worker()
  }

  # HTTPS server
  server {
    listen 443 ssl;

    # Dynamic handler for issuing or returning certs for SNI domains.
    ssl_certificate_by_lua_block {
      auto_ssl:ssl_certificate()
    }

    # You must still define a static ssl_certificate file for nginx to start.
    #
    # You may generate a self-signed fallback with:
    #
    # openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 \
    #   -subj &apos;/CN=sni-support-required-for-valid-ssl&apos; \
    #   -keyout /etc/ssl/resty-auto-ssl-fallback.key \
    #   -out /etc/ssl/resty-auto-ssl-fallback.crt
    ssl_certificate /etc/ssl/resty-auto-ssl-fallback.crt;
    ssl_certificate_key /etc/ssl/resty-auto-ssl-fallback.key;
  }

  # HTTP server
  server {
    listen 80;

    # Endpoint used for performing domain verification with Let&apos;s Encrypt.
    location /.well-known/acme-challenge/ {
      content_by_lua_block {
        auto_ssl:challenge_server()
      }
    }
  }

  # Internal server running on port 8999 for handling certificate tasks.
  server {
    listen 127.0.0.1:8999;
    location / {
      content_by_lua_block {
        auto_ssl:hook_server()
      }
    }
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;！以上配置文件来自项目的 README 的示例配置，我修改了两个地方：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;证书的输出路径，为了避免权限问题我将证书写到了/tmp/目录下，但是 &lt;strong&gt;非常不建议&lt;/strong&gt; 在生产环境下降证书写到这里。&lt;/li&gt;
&lt;li&gt;默认配置允许给所有的域名签发证书，这样显然可能会被滥用，所以我对 &lt;code class=&quot;language-text&quot;&gt;allow_domain&lt;/code&gt; 这个配置项加了一些限制，只允许我自己的域名进来。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;启动 OpenResty&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;openresty -t
openresty&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;容器化 lua-resty-auto-ssl&lt;/h1&gt;
&lt;p&gt;如果你觉得上边这个过程太复杂了，那么你也可以使用我自己 build 的&lt;a href=&quot;https://github.com/xdays/dockerfiles/tree/master/letsencrypt&quot;&gt;Let’s encrypt image&lt;/a&gt;来运行&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name letsencrypt --net host -e DOMAINS=example.com -v $PWD:/tmp xdays/letsencrypt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;p&gt;首先将你要签发证书的域名解析到运行 openresty 的机器上，然后直接向域名发送 https 请求即可拿到对应的证书：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl https://i.xdays.me/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;按照我的配置证书在 &lt;code class=&quot;language-text&quot;&gt;/tmp/storage/&lt;/code&gt; 下。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker基础教程之镜像存储]]></title><description><![CDATA[上一篇我总结下了Docker 的基本概念，这一篇我来重点总结下目前主流的镜像存储的方案。 Registry 总体上来说，我这里的方案是启动一个仅支持 http 的 registry 服务，然后在前面放一个 nginx 来终结 https 请求和用户验证(basic auth…]]></description><link>https://xdays.me/Docker基础教程之镜像存储/</link><guid isPermaLink="false">https://xdays.me/Docker基础教程之镜像存储/</guid><pubDate>Mon, 02 Jan 2017 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上一篇我总结下了&lt;a href=&quot;http://xdays.me/docker%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B.html&quot;&gt;Docker 的基本概念&lt;/a&gt;，这一篇我来重点总结下目前主流的镜像存储的方案。&lt;/p&gt;
&lt;h1&gt;Registry&lt;/h1&gt;
&lt;p&gt;总体上来说，我这里的方案是启动一个仅支持 http 的 registry 服务，然后在前面放一个 nginx 来终结 https 请求和用户验证(basic auth 或者通过第三方模块来集成 LDAP)。&lt;/p&gt;
&lt;h2&gt;启动 registry&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d -p 5000:5000 --restart=always --name registry \
    -v /data:/registry/var/lib/registry registry:2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;编译安装 nginx&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir /opt/source
git clone https://github.com/kvspb/nginx-auth-ldap.git
git clone https://github.com/openresty/headers-more-nginx-module.git
wget -O - | tar xzf - -C /opt/source &amp;amp;&amp;amp; \
./configure --prefix=/opt/nginx-1.11.8 --add-module=/opt/source/nginx-auth-ldap --add-module=/opt/source/headers-more-nginx-module --with-http_ssl_module &amp;amp;&amp;amp; \
make &amp;amp;&amp;amp; make install
ln -s /opt/nginx-1.11.8 /opt/nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置 nginx&lt;/h2&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;vim /opt/nginx/conf/registry.conf&lt;/code&gt; 内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldap_server test1 {
    url ldaps://dir.xdays.me/ou=people,dc=everstring,dc=com?uid?sub?(objectclass=posixAccount);
    require valid_user;
}

## Set a variable to help us decide if we need to add the
## &apos;Docker-Distribution-Api-Version&apos; header.
## The registry always sets this header.
## In the case of nginx performing auth, the header will be unset
## since nginx is auth-ing before proxying.
map $upstream_http_docker_distribution_api_version $docker_distribution_api_version {
  &apos;registry/2.0&apos; &apos;&apos;;
  default registry/2.0;
}

server {
  listen 443 ssl;
  server_name registry.xdays.me;

  # SSL
  ssl_certificate /opt/nginx/conf/certs.d/xdays.me.crt;
  ssl_certificate_key /opt/nginx/conf/certs.d/xdays.me.key;

  # Recommendations from https://raymii.org/s/tutorials/Strong_SSL_Security_On_nginx.html
  ssl_protocols TLSv1.1 TLSv1.2;
  ssl_ciphers &apos;EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH&apos;;
  ssl_prefer_server_ciphers on;
  ssl_session_cache shared:SSL:10m;

  # disable any limits to avoid HTTP 413 for large image uploads
  client_max_body_size 0;

  # required to avoid HTTP 411: see Issue #1486 (https://github.com/docker/docker/issues/1486)
  chunked_transfer_encoding on;

  location /v2/ {
    # Do not allow connections from docker 1.5 and earlier
    # docker pre-1.6.0 did not properly set the user agent on ping, catch &quot;Go *&quot; user agents
    if ($http_user_agent ~ &quot;^(docker\/1\.(3|4|5(?!\.[0-9]-dev))|Go ).*$&quot; ) {
      return 404;
    }

    # To add basic authentication to v2 use auth_basic setting.
    auth_ldap &quot;Private Registry&quot;;
    auth_ldap_servers test1;

    ## If  is empty, the header will not be added.
    ## See the map directive above where this variable is defined.
    add_header &apos;Docker-Distribution-Api-Version&apos; $docker_distribution_api_version always;

    proxy_pass                          http://127.0.0.1:5000;
    proxy_set_header  Host              $http_host;   # required for docker client&apos;s sake
    proxy_set_header  X-Real-IP         $remote_addr; # pass on real client&apos;s IP
    proxy_set_header  X-Forwarded-For   $proxy_add_x_forwarded_for;
    proxy_set_header  X-Forwarded-Proto $scheme;
    proxy_read_timeout                  900;
  }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;准备证书的环境我这里就略过了。&lt;/p&gt;
&lt;p&gt;然后启动 nginx&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/opt/nginx/sbin/nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;OK，官方的 registry 的安装配置就介绍到这里了。&lt;/p&gt;
&lt;h1&gt;Nexus&lt;/h1&gt;
&lt;p&gt;Nexus 起初是 maven 仓库服务软件，后来 Sonatype 在 maven 基础上添加了基本上目前主流语言的包管理功能，包括 pypi, rubygems，npm 等，其中一个闪亮的功能是加入了 docker registry 的支持。简单来说，使用 Nexus 的优势在于：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;你可以用一套程序来处理所有对包管理的需求，便于维护&lt;/li&gt;
&lt;li&gt;Nexus 有原生的 LDAP 支持，便于管理用户&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;启动 Nexus&lt;/h2&gt;
&lt;p&gt;基于 Nexus 的方案和上一节的 registry 比较类似，启动仅处理 http 的 Nexus 服务，然后前面放一个 nginx 来处理 https 请求。安装配置 Nexus 比较简单，只需要启动 Nexus 容器即可。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir -p /data/nexus-data &amp;amp;&amp;amp; chown -R 200 /data/nexus-data
docker run -d --net host --name nexus -v /data/nexus-data:/nexus-data sonatype/nexus3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后我们新建一个类型为 docker hostsed 的 repository，具体配置如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2017/01/nexus-config.png&quot; alt=&quot;Nexus Config&quot;&gt;&lt;/p&gt;
&lt;p&gt;注意： 由于 Nexus 自己不处理 https 请求，它要暴露给 nginx 一个端口让 nginx 将对 registry 的请求转发过来。&lt;/p&gt;
&lt;h2&gt;配置 nginx&lt;/h2&gt;
&lt;p&gt;这里对 nginx 没有特殊要求，所以可以用系统自带的 nginx 版本，相关的配置如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;client_max_body_size 0;
proxy_read_timeout 900s;
proxy_send_timeout 900s;
proxy_set_header Host      $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-Proto $scheme;

server {
    listen       443 ssl;
    server_name registry.xdays.me;

    ssl_certificate /etc/nginx/certs.d/xdays.me.crt;
    ssl_certificate_key /etc/nginx/certs.d/xdays.me.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers &apos;HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!DHE&apos;;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8082;
    }
}

server {
    listen       443 ssl;
    server_name nexus.xdays.me pypi.xdays.me;

    ssl_certificate /etc/nginx/certs.d/xdays.me.crt;
    ssl_certificate_key /etc/nginx/certs.d/xdays.me.key;
    ssl_protocols       TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers &apos;HIGH:!aNULL:!eNULL:!EXPORT:!DES:!RC4:!MD5:!PSK:!aECDH:!DHE&apos;;
    ssl_prefer_server_ciphers on;

    location / {
        proxy_pass http://127.0.0.1:8081;
    }
}

server {
    listen         80;
    server_name nexus.xdays.me;
    return         301 https://$server_name$request_uri;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动 nginx&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;systemctl start nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;Harbor&lt;/h1&gt;
&lt;p&gt;Harbor 是 VMWare 开源的一个号称及企业级的镜像管理系统，是基于我们第一部分提到的官方的 registry 开发的，主要利用了官方 registry 的 auth 和 notification 的 hook，然后自己开发了一套 web 界面以及跑其他任务的 jobservice。Harbor 的优势在于：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;易用的 web 管理界面&lt;/li&gt;
&lt;li&gt;可以基于 project 管理镜像&lt;/li&gt;
&lt;li&gt;支持 LDAP 管理用户认证&lt;/li&gt;
&lt;li&gt;支持多系统之间的数据同步，这对于搭建多地 registry 镜像很有用&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;安装配置&lt;/h2&gt;
&lt;p&gt;Harbor 的安装配置也叫容易，推荐使用 compose file 来启动 Harbor。&lt;/p&gt;
&lt;p&gt;首先，根据网络，可以选择下载在线和离线安装包(国情)，我这里下载在线安装包：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget -O - https://github.com/vmware/harbor/releases/download/0.5.0/harbor-online-installer-0.5.0.tgz | tar xzf - -C /opt/source/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后编辑配置文件 &lt;code class=&quot;language-text&quot;&gt;vim harbor.cfg&lt;/code&gt; 修改如下配置项：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hostname = reg.xdays.me
ui_url_protocol = https
customize_crt = off
ssl_cert = /data/cert/server.crt
ssl_cert_key = /data/cert/server.key&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意，我这里用的自己的证书，这样能避免&lt;a href=&quot;https://github.com/vmware/harbor/blob/master/docs/user_guide.md#pulling-and-pushing-images-using-docker-client&quot;&gt;官方提到的—insecure-registry 配置&lt;/a&gt;，但前提是你需要有一个合法的 ssl 证书，推荐使用&lt;a href=&quot;https://letsencrypt.org/&quot;&gt;Let’s Encrypt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;最后启动 Harbor 套件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;./install.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;好了，目前目前主流的集中镜像存储工具就介绍完了。&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;你可能会问，我该用哪种来搭建我自己的私有仓库呢？这个要根据自己的需求来：registry 比较简单，需要你自己从零开始搭建；Nexus 是个大而全的方案，维护较为方便，但是比较耗资源；Harbor 确实有一些企业级的特性，通过自动安装脚本简化了部署的过程，但是因为涉及的组件较多，维护成本也较大，而且因为其自己的套件集成了 nginx，所以可能就需要一个单独的机器来跑，不能和自己已有的服务融合起来。所以，我个人比较倾向于使用 Nexus。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker基础教程之基本概念]]></title><description><![CDATA[简介 本文是整个系列教程的第一篇，我将从一个使用者的角度向你展示其中几个技术：namespace, cgroups, veth, bridge, copy-on-write, image 和 container。整个容器技术的核心包括 namespace 和 cgroup…]]></description><link>https://xdays.me/Docker基础教程之基本概念/</link><guid isPermaLink="false">https://xdays.me/Docker基础教程之基本概念/</guid><pubDate>Mon, 14 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;本文是整个系列教程的第一篇，我将从一个使用者的角度向你展示其中几个技术：namespace, cgroups, veth, bridge, copy-on-write, image 和 container。整个容器技术的核心包括 namespace 和 cgroup 两个部分，其中 namespace 负责资源隔离，cgroups 负责资源限制。而 Docker 在这两个技术之上提出了几个重要概念让容器技术得以流行。&lt;/p&gt;
&lt;p&gt;如果你刚接触 Docker 请参考我另外两篇文章:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;//docker%E5%88%9D%E8%AF%86/&quot;&gt;Docker 初识&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;//docker%E8%AF%A6%E8%A7%A3/&quot;&gt;Docker 详解&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;官方提供了很方便的安装脚本，只需运行如下命令即可安装完成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -s https://get.docker.com | bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;namespace&lt;/h1&gt;
&lt;p&gt;Namespace 是 Linux 在内核级别的隔离技术，它可以让进城拥有自己独立的进程号，网络，文件系统（类似 chroot）等，不同 namespace 下的进程之间相互不可见。因为系统是通过底层的系统调用来提供 namespace 功能的，所以并没有用户态的管理 namespace 的工具，关于怎么创建具体类型的 namespace 可以参考酷壳的两篇文章&lt;a href=&quot;http://coolshell.cn/articles/17010.html&quot;&gt;Docker 基础技术：Linux Namespace（上）&lt;/a&gt;和&lt;a href=&quot;http://coolshell.cn/articles/17029.html&quot;&gt;Docker 基础技术：Linux Namespace（下）&lt;/a&gt;，但是等进程在 namespace 启动之后有时候我们需要进入到进程的运行环境来 debug 等操作。&lt;/p&gt;
&lt;p&gt;目前的 Docker 版本已经可以通过 exec 子命令直接切换到进程所在的 namespace：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name nginx nginx
docker exec -it nginx ls
docker exec -it nginx ip a
docker exec -it nginx ps -ef&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果在早期的版本，或者其他容器引擎的话，可以通过 nsenter：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install util-linux
PID=$(docker inspect --format {{.State.Pid}} container_name
nsenter --target $PID --mount --uts --ipc --net --pid&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;cgroups&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;有了资源隔离之后，如果不能对各个 namespace 下进程的资源使用做限制的话，那么隔离也没有意义了。所以 Docker 使用 cgroups 另一种内核技术，来实现对进程以及其子进程做资源限制。需要说明是，我们通过本地的文件系统来管理 cgroups 配置，就像修改/sys 目录下的文件内容可以修改内核参数一样。但是在 Docker 引擎这一层已经帮我们屏蔽了底层的细节，我们可以通过 docker 命令很方便的配置 cgroup 相关的参数。&lt;/p&gt;
&lt;p&gt;首先查看当前开启的 cgroup 子系统：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# mount -t cgroup
# ls /sys/fs/cgroup/*/docker/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以看到 docker 将 container 相关的 cgroup 配置放到了 docker 目录下。&lt;/p&gt;
&lt;h2&gt;CPU 子系统&lt;/h2&gt;
&lt;p&gt;cgroups 提供了三种限制 CPU 资源的方式：cpuset， cpuquota 和 cpushares&lt;/p&gt;
&lt;h3&gt;cpuset&lt;/h3&gt;
&lt;p&gt;cpuset 可以限制进程使用 CPU 的核心数，可以通过 &lt;code class=&quot;language-text&quot;&gt;cpuset/cpuset.cpus&lt;/code&gt; 来管理，对应的 docker 命令为：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    docker run --cpuset-cpus 0 -d --name nginx nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;cpuquota&lt;/h3&gt;
&lt;p&gt;cpuquota 可以以时间片的使用率来限制 CPU 资源，要比 cpuset 的细粒度大一些，只需要设置一个相对 100000 的值就可以达到限制一个百分比的效果, 通过 &lt;code class=&quot;language-text&quot;&gt;cpu/cpu.cfs_period_us&lt;/code&gt; （配置时间片单位，默认为 100000）和 &lt;code class=&quot;language-text&quot;&gt;cpu/cpu.cfs_quota_us&lt;/code&gt; (时间片占比)两个文件来管理， 对应的 docker 命令为:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    docker run --cpu-quota 50000 -d --name nginx nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;cpushares&lt;/h3&gt;
&lt;p&gt;cpushares 可以根据权重来分配 CPU 资源，比如如果只有一个进程权重为 1024，那么进程可以使用 100%的 CPU 资源，如果有两个进程且权重都是 1024，那么每个进程可以使用 50%的 CPU 资源 , 通过 &lt;code class=&quot;language-text&quot;&gt;cpu/cpu.shares&lt;/code&gt; 来管理，对应的 docker 命令为：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    docker run --cpu-shares 1024 -d --name nginx nignx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;更多关于 cgroups 的 CPU 子系统的实践可以参考如下链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.v2ex.com/t/246791&quot;&gt;Cgroup - 从 CPU 资源隔离说起(一)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.v2ex.com/t/246792&quot;&gt;Cgroup － 从 CPU 资源隔离说起（二）&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.v2ex.com/t/246793&quot;&gt;Cgroup － 从 CPU 资源隔离说起（三）&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;内存子系统&lt;/h2&gt;
&lt;p&gt;cgroups 对内存的限制包括物理内存和 swap 两块，当进程使用内存达到上限的时候会背 kill 掉。关于内存的限制几个文件主要包括:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    memory.limit_in_bytes memory.soft_limit_in_bytes memory.memsw.limit_in_bytes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;同样的 docker 帮我们去做底层的管理：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    docker run -m 100m -d --name nginx nginx&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;需要特殊说明的一点是 docker 默认会将 swap 的限制设置为 2 倍内存，这样你会发现进程实际使用的内存可能会大于 &lt;code class=&quot;language-text&quot;&gt;-m&lt;/code&gt; 设置的内存大小。&lt;/p&gt;
&lt;h2&gt;blkio 子系统&lt;/h2&gt;
&lt;p&gt;blkio 子系统的功能是对块设备读写的速率限制，目前个人还没怎么在这块时间，具体介绍可参考 &lt;a href=&quot;https://www.v2ex.com/t/251497&quot;&gt;Cgroup - Linux 的 IO 资源隔离&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;veth&lt;/h1&gt;
&lt;p&gt;veth 是一种特殊的 Linux 网络接口设备，它总是成对出现的，而且发到一端的数据包会从另一端发出来，下边我通过命令演示 docker 里 container 内的网络和 host 的网络是怎么联通的。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 新建一个net namespace
➜  ~ ip netns add test
➜  ~ ip netns list
test
# 新建一对veth网络接口
➜  ~ ip link add veth0-0 type veth peer name veth0-1
➜  ~ ip link list
27: veth0-1@veth0-0: &amp;lt;BROADCAST,MULTICAST,M-DOWN&gt; mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether da:bd:24:5f:e6:a8 brd ff:ff:ff:ff:ff:ff
28: veth0-0@veth0-1: &amp;lt;BROADCAST,MULTICAST,M-DOWN&gt; mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether 36:0f:fc:64:1d:f0 brd ff:ff:ff:ff:ff:ff
# 将veth0-0放到第一步新建的namespace里
➜  ~ ip link set veth0-0 netns test
➜  ~ ip link
27: veth0-1@if28: &amp;lt;BROADCAST,MULTICAST&gt; mtu 1500 qdisc noop state DOWN mode DEFAULT qlen 1000
    link/ether da:bd:24:5f:e6:a8 brd ff:ff:ff:ff:ff:ff link-netnsid 4
# 给namespace里的网络接口配置ip
➜  ~ ip netns exec test ip addr add local 10.0.78.3/24 dev veth0-0
➜  ~ ip netns exec test ip link set veth0-0 up
➜  ~
# 给host上的的网络接口配置ip
➜  ~ ip addr add local 10.0.78.4/24 dev veth0-1
➜  ~ ip link set veth0-1 up
➜  ~ ip a
27: veth0-1@if28: &amp;lt;BROADCAST,MULTICAST,UP,LOWER_UP&gt; mtu 1500 qdisc noqueue state UP qlen 1000
    link/ether da:bd:24:5f:e6:a8 brd ff:ff:ff:ff:ff:ff link-netnsid 4
    inet 10.0.78.4/24 scope global veth0-1
       valid_lft forever preferred_lft forever
    inet6 fe80::d8bd:24ff:fe5f:e6a8/64 scope link
       valid_lft forever preferred_lft forever
# 测试host和namespace网络的连通性
➜  ~ ping 10.0.78.3
PING 10.0.78.3 (10.0.78.3) 56(84) bytes of data.
64 bytes from 10.0.78.3: icmp_seq=1 ttl=64 time=0.115 ms
64 bytes from 10.0.78.3: icmp_seq=2 ttl=64 time=0.054 ms
^C
--- 10.0.78.3 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1000ms
rtt min/avg/max/mdev = 0.054/0.084/0.115/0.031 m

➜  ~ ip netns delete test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;bridge&lt;/h1&gt;
&lt;p&gt;bridge 是另一种 Linux 网络接口设备，你可以把他理解成一个交换机，所有加到这个 bridge 接口上的其他网络接口都在一个大的二层网络上，而 docker 要让同一台机器上所有的 container 相互通信，通过的方式就是将所有在 host 上的的 veth 接口加入到名为 docker0 的 bridge 接口上。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name nginx1 nginx
docker run -d --name nginx2 nginx
yum install bridge-utils
brctl show docker0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;copy-on-write&lt;/h1&gt;
&lt;p&gt;copy-on-write 是联合文件系统的机制，联合文件系统是将不同的文件系统的目录聚合在一起的文件系统。我竟让像比人这样解释联合文件系统：想象一下，现在你有几块透明的玻璃，然后你用笔在每块玻璃上写下一些文字，然后将这些玻璃按照一定的顺序叠加在一起，从上往下看去你就能看到所有的文字了；而当你要修改某个文字的时候，你所有的涂改都是在最上边的那块玻璃上发生了，下层的玻璃上的文字只是被覆盖住了而实际上没有任何修改。具体到 Linux 的联合文件系统上呢，当我们需要修改一个文件的内容的时候，操作系统会将这个文件拷贝一份新的放到最上层的目录上然后修改文件，实际上下层的目录并没有改动。&lt;/p&gt;
&lt;p&gt;我以 overlayfs 文件系统为例演示下 copy-on-write 是如何工作的：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 创建目录结构
# mkdir test
# cd test/
# mkdir lower upper work merged
# ls
lower  merged  upper  work
# 分别在上下两层创建两个文件
# echo lower &gt; lower/lower.txt
# touch upper/upper.txt
# 挂在overlayfs文件系统到merged目录
# mount -t overlay overlay -olowerdir=./lower,upperdir=./upper,workdir=./work ./merged
# 查看挂载后的目录内容
# ls merged/
lower.txt  upper.txt
# 新创建的目录实际上位于uppper目录内
# touch merged/merged.txt
# ls upper/
merged.txt  upper.txt
# 对文件修改时实际上是将文件从lower目录拷贝到upper目录，然后修改其内容
# echo change lower &gt; merged/lower.txt
# ls upper/
lower.txt  merged.txt  upper.txt
# cat upper/lower.txt
change lower
# cat lower/lower.txt
lower&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;image&lt;/h1&gt;
&lt;p&gt;以上提到的所有技术都非 docker 首创，然后 docker 的牛逼之处在于将现有的技术组织起来，然后定义了一套规范让我们更方便的构建，传递和使用容器技术。image，顾名思义，是容器的模板，就像我们从镜像来启动虚拟机一样。关于 image 我们可以对比虚拟机镜像来看：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;他们都是模板的一种形式，我们从虚拟机镜像启动虚拟机，从 image 运行 container。image 一旦 build 好之后就不能修改了。&lt;/li&gt;
&lt;li&gt;一个 image 和虚拟机镜像最大的区别就是 image 不包含内核，它仅仅包含了一个程序本身和程序的所有依赖，所以相比虚拟机镜像，image 可以很小。&lt;/li&gt;
&lt;li&gt;image 有自己的规范&lt;a href=&quot;https://github.com/opencontainers/image-spec&quot;&gt;OCI Image Specification&lt;/a&gt;，这就让 image 的构建和传播更方便，也就有了&lt;a href=&quot;https://hub.docker.com/&quot;&gt;Docker Hub&lt;/a&gt;的诞生。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;个人认为，image 最牛逼的地方在于分享，传统的下载源码包，然后 configure，然后 make(可能涉及解决依赖问题)，最后 make install 的流程已经被 &lt;code class=&quot;language-text&quot;&gt;docker run&lt;/code&gt; 所取代。&lt;/p&gt;
&lt;h1&gt;container&lt;/h1&gt;
&lt;p&gt;container 在我看来更像是将以上所有技术的一个包装，一个 container 有自己的各种 namespace，里的进程挂在 cgroups 的文件系统的某个层级上，有自己的网卡，然后 container 从 image 创建而来，在 image 之上加上一层可写的目录，基于 copy-on-write 的机制，所有对 container 的修改都会发生在这一层目录之上。同样的，我这里将 container 和虚拟机简单对比下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;虚拟机里运行了一个完整的操作系统，而 container 只是通过 host 的内核运行了一个程序&lt;/li&gt;
&lt;li&gt;对虚拟机资源的变更通常设计虚拟机重启，而对 container 资源的变更可以在线操作，不影响程序的运行&lt;/li&gt;
&lt;li&gt;对虚拟机的调度目前都在分钟级，而对 container 的调度都在秒级&lt;/li&gt;
&lt;li&gt;虚拟机相比 container 来说隔离性好，所以更安全。&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[Docker基础教程]]></title><description><![CDATA[…]]></description><link>https://xdays.me/Docker基础教程/</link><guid isPermaLink="false">https://xdays.me/Docker基础教程/</guid><pubDate>Fri, 04 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;回首一看，又有一个多月没有更新博客了。最近工作上发生了一些变动：公司裁员，无论主动的还是被动的，多数人拿了补偿走人了；而因为我做的还可以公司希望我留下，然而当我选择离开时公司认为我是主动离职不支付赔偿，我问了下律师被告知公司从法律上没有什么问题，也就作罢。趁工作交接之际，我整理下近两年多自己的容器领域的技术积累，算是给自己的一个总结，如果能对于别人有所帮助，幸甚至哉！&lt;/p&gt;
&lt;p&gt;我要总结的第一个系列是 Docker，我从 14 年开始使用 Docker，大概是 0.5 或者 0.6 的版本，一路过来见证了 Docker 从一个小而美发展成了大而全的项目，也见证了整个容器生态圈的蓬勃发展。简单整理了下这个系列的大纲：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;//docker%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E5%9F%BA%E6%9C%AC%E6%A6%82%E5%BF%B5/&quot;&gt;基本概念&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;cgroups&lt;/li&gt;
&lt;li&gt;namespace&lt;/li&gt;
&lt;li&gt;veth&lt;/li&gt;
&lt;li&gt;bridge&lt;/li&gt;
&lt;li&gt;nat&lt;/li&gt;
&lt;li&gt;copy-on-write&lt;/li&gt;
&lt;li&gt;image&lt;/li&gt;
&lt;li&gt;container&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;//docker%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E9%95%9C%E5%83%8F%E5%AD%98%E5%82%A8/&quot;&gt;镜像存储&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;registry&lt;/li&gt;
&lt;li&gt;nexus&lt;/li&gt;
&lt;li&gt;harbor&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;//docker%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E9%95%9C%E5%83%8F%E6%9E%84%E5%BB%BA/&quot;&gt;镜像构建&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;docker build&lt;/li&gt;
&lt;li&gt;puppet&lt;/li&gt;
&lt;li&gt;ansible&lt;/li&gt;
&lt;li&gt;packer&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;//docker%E5%9F%BA%E7%A1%80%E6%95%99%E7%A8%8B%E4%B9%8B%E9%95%9C%E5%83%8F%E5%AE%89%E5%85%A8/&quot;&gt;镜像安全&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;anchore&lt;/li&gt;
&lt;li&gt;clair&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;声明：我只是一个具备基础开发能力的运维，我没有能力解释清楚容器技术的底层原理，所有本系列的大多数知识都是我从实践中得来，但也不能保证百分百正确，如果你在阅读过程中发现错误或者疑问欢迎沟通。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[基于GitLab的Pages服务构建静态博客]]></title><description><![CDATA[背景 之前我有一篇博客讨论过基于 Pelican, Github 以及 Nginx+Lua 实现的自动发布静态博客。最近重新思考这个方案感觉不够精简，也许当时是出于学习的目的引入了 Ngnix+Lua 这块。正好今年上半年GitLab 宣布支持 Pages…]]></description><link>https://xdays.me/基于GitLab的Pages服务构建静态博客/</link><guid isPermaLink="false">https://xdays.me/基于GitLab的Pages服务构建静态博客/</guid><pubDate>Fri, 04 Nov 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;之前我有&lt;a href=&quot;//Pelican%E5%92%8CGithub%E6%9E%84%E5%BB%BA%E9%9D%99%E6%80%81%E5%8D%9A%E5%AE%A2/&quot;&gt;一篇博客&lt;/a&gt;讨论过基于 Pelican, Github 以及 Nginx+Lua 实现的自动发布静态博客。最近重新思考这个方案感觉不够精简，也许当时是出于学习的目的引入了 Ngnix+Lua 这块。正好今年上半年&lt;a href=&quot;https://about.gitlab.com/2016/04/07/gitlab-pages-setup/&quot;&gt;GitLab 宣布支持 Pages 服务&lt;/a&gt;了，而且支持的远比 Github 彻底，所以决定将我的博客托管在 GitLab 的 Pages 上。&lt;/p&gt;
&lt;h1&gt;流程&lt;/h1&gt;
&lt;p&gt;本地只需要往 Git 仓库里添加或者编辑 markdown 文件，当源文件被 push 到 Gitlab 服务端，触发 GitLab 的 Pipeline，Pipeline 完成由 markdown 源码到 html 文件的构建，最后由 GitLab 的 Pages 服务来托管 html 文件。&lt;/p&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;迁移仓库&lt;/h2&gt;
&lt;p&gt;在 GitLab 上新建一个仓库，按照规范我这里将其命名为 &lt;code class=&quot;language-text&quot;&gt;xdays.gitlab.io&lt;/code&gt; ，然后将 Github 上的源码 pull 下来推到 GitLab 上：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone git@github.com:xdays/xdays.me.git
git remote add gitlab git@gitlab.com:xdays/xdays.gitlab.io.git
git push gitlab master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;添加 gitlab-ci.yml&lt;/h2&gt;
&lt;p&gt;由于 Pipeline 是由仓库根目录下的 &lt;code class=&quot;language-text&quot;&gt;.gitlab-ci.yml&lt;/code&gt; 驱动的，我们需要往仓库里添加一个 yml 文件，内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;image: python:2.7-alpine
pages:
  script:
  - apk update &amp;amp;&amp;amp; apk add git &amp;amp;&amp;amp; git submodule update --init --recursive
  - pip install -r requirements.txt
  - ./genblog.sh
  artifacts:
    paths:
    - public/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意： 按照 GitLab 的规范，输出目录的名字必须是 public，否则 deploy 会失败。&lt;/p&gt;
&lt;p&gt;这样当再次 push 源文件到 GitLab 时就会触发 Pipeline 了，例如这是一次&lt;a href=&quot;https://gitlab.com/xdays/xdays.gitlab.io/pipelines/4867226&quot;&gt;成功的 Build&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;如果 Build 成功，我们就可以通过 &lt;a href=&quot;http://xdays.gitlab.io/&quot;&gt;http://xdays.gitlab.io/&lt;/a&gt; 访问静态博客了。&lt;/p&gt;
&lt;h2&gt;添加自定义域名&lt;/h2&gt;
&lt;p&gt;接下来要在这个页面下 &lt;a href=&quot;https://gitlab.com/xdays/xdays.gitlab.io/pages&quot;&gt;https://gitlab.com/xdays/xdays.gitlab.io/pages&lt;/a&gt; 添加自定义域名，以便通过 &lt;a href=&quot;http://xdays.me&quot;&gt;http://xdays.me&lt;/a&gt; 来访问我的博客。你甚至可以上传证书来让 GitLab 支持 https。&lt;/p&gt;
&lt;p&gt;然后在域名服务商那里将添加 CNAME 记录 &lt;code class=&quot;language-text&quot;&gt;xdays.me&lt;/code&gt; 解析到 &lt;code class=&quot;language-text&quot;&gt;xdays.gitlab.io&lt;/code&gt; 。&lt;/p&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;h2&gt;CDN&lt;/h2&gt;
&lt;p&gt;由于 GitLab 在国外，国内访问较慢，所以我再源站前加上了&lt;a href=&quot;https://www.cloudflare.com/&quot;&gt;CloudFlare&lt;/a&gt;这一 CDN 服务，具体步骤不在这里介绍了。&lt;/p&gt;
&lt;h2&gt;Mirror&lt;/h2&gt;
&lt;p&gt;虽然我将 Git 仓库从 Github 迁移到了 GitLab，但是 Github 有很强的社交氛围，所以还想做一个从 GitLab 到 Github 的 mirror，目前还没有发现好的解决办法，暂时用 Git 的 hook 来实现。编辑仓库目录下的 &lt;code class=&quot;language-text&quot;&gt;.git/hooks/pre-push&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/bash

exec git push github -f --mirror&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样每次 push 到 GitLab 时也会 push 到 Github 一份。&lt;/p&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://pages.gitlab.io/&quot;&gt;http://pages.gitlab.io/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://gitlab.com/pages/pelican&quot;&gt;https://gitlab.com/pages/pelican&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[利用mailgun搭建私有域名邮箱]]></title><description><![CDATA[起因 本着折腾中进步的原则，从切换到 xdays.me 这个域名之后就想折腾下邮箱。个人邮箱主要带来以下好处： 有些服务需要用企业邮箱 看上去牛逼一些 本文总结了利用 mailgun 和 gmail 来实现私有域名邮箱功能。 Mailgun Mailgun 是 Rackspace…]]></description><link>https://xdays.me/利用mailgun搭建私有域名邮箱/</link><guid isPermaLink="false">https://xdays.me/利用mailgun搭建私有域名邮箱/</guid><pubDate>Sat, 27 Aug 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;起因&lt;/h1&gt;
&lt;p&gt;本着折腾中进步的原则，从切换到 xdays.me 这个域名之后就想折腾下邮箱。个人邮箱主要带来以下好处：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;有些服务需要用企业邮箱&lt;/li&gt;
&lt;li&gt;看上去牛逼一些&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;本文总结了利用 mailgun 和 gmail 来实现私有域名邮箱功能。&lt;/p&gt;
&lt;h1&gt;Mailgun&lt;/h1&gt;
&lt;p&gt;Mailgun 是 Rackspace 面向开发者的邮件发送服务，但是它提供的功能足够我们打造属于自己的个人邮箱了。我们知道邮箱服务简单来说就两个功能，发送邮件和接收邮件。Mailgun 为我们提供了 SMTP server 用于发送邮件和 Email Route 用于转发邮件到特定的邮箱以收取邮件。此外还涉及一些反垃圾邮件的机制。&lt;/p&gt;
&lt;h2&gt;Domain&lt;/h2&gt;
&lt;p&gt;注册了 mailgun 的账号之后，你需要添加一个 domain，然后根据向导添加对应的 DNS 记录，等 mailgun 验证通过。&lt;/p&gt;
&lt;h2&gt;SMTP Server&lt;/h2&gt;
&lt;p&gt;添加了 Domain 之后我们的 SMTP Server 已经设置好了，但是我们需要添加一个和 Gmail 继承的账号，如下图所示，点击“Manage SMTP credentials”来管理账号&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2016/08/mailgun-credentials.png&quot; alt=&quot;mailgun-credentials&quot;&gt;&lt;/p&gt;
&lt;p&gt;添加完账号之后就可以登录 SMTP 服务器发送邮件了，假设我们这里添加的是 &lt;a href=&quot;mailto:test@xdays.me&quot;&gt;test@xdays.me&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;Route&lt;/h2&gt;
&lt;p&gt;虽然 mailgun 没有提供 POP3 的服务，但是其提供了邮件路由的功能同样能达到让我们收取邮件的目的。按照下图所示添加一个邮件路由，用来将所有发给 &lt;a href=&quot;mailto:test@xdays.me&quot;&gt;test@xdays.me&lt;/a&gt; 的邮件都转发给你的 Gmail 邮箱&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2016/08/mailgun-routes.png&quot; alt=&quot;mailgun-routes&quot;&gt;&lt;/p&gt;
&lt;p&gt;到这里 mailgun 的部分就配置完成了&lt;/p&gt;
&lt;h1&gt;Gmail&lt;/h1&gt;
&lt;p&gt;其实 Gmail 的配置和添加其他免费邮箱账号没有区别。&lt;/p&gt;
&lt;p&gt;点击 Settings -&gt; Accounts and Import -&gt; Add another email address you own，然后根据向导配置你的 SMTP Server 的认证信息即可。&lt;/p&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;p&gt;简单说下完成之后邮件的流向，当有人向 &lt;a href=&quot;mailto:test@xdays.me&quot;&gt;test@xdays.me&lt;/a&gt; 发送邮件时，mailgun 会将邮件通过邮件路由转发到 Gmail 邮箱，然后当在 Gmail 里回复邮件的时候，Gmail 通过 mailgun 的 SMTP 服务器将邮件回复给发送者。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Kafka基础]]></title><description><![CDATA[简介 Kafka 是一个分布式的，基于分区存储的，多副本提交的日志系统。其特点包括： 高吞吐 无缝扩展 消息持久化 基本概念 broker broker 是 Kafka 集群的一个节点，负责接收 producer 发来的消息和响应 consumer 发来的消息请求。 topic…]]></description><link>https://xdays.me/Kafka基础/</link><guid isPermaLink="false">https://xdays.me/Kafka基础/</guid><pubDate>Fri, 10 Jun 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Kafka 是一个分布式的，基于分区存储的，多副本提交的日志系统。其特点包括：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;高吞吐&lt;/li&gt;
&lt;li&gt;无缝扩展&lt;/li&gt;
&lt;li&gt;消息持久化&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;基本概念&lt;/h1&gt;
&lt;h2&gt;broker&lt;/h2&gt;
&lt;p&gt;broker 是 Kafka 集群的一个节点，负责接收 producer 发来的消息和响应 consumer 发来的消息请求。&lt;/p&gt;
&lt;h2&gt;topic 和 partition&lt;/h2&gt;
&lt;p&gt;topic 是 Kafka 组织消息的方式，可以认为是消息的类别。一个 topic 可以有多个 partition 来保存消息，消息在 partition 里是顺序存储的。这里注意，需要注意的是，Kafka 保存数据是根据时间来决定的，而不是它是否被消费者消费。如果在数据的生命周期内，它被消费后仍然会存储在 Kafka 中。但如果它在生命周期内没有被消费，同样它也会在生命周期结束时被丢弃。&lt;/p&gt;
&lt;h2&gt;分布式&lt;/h2&gt;
&lt;p&gt;partition 分布在所有的 broker 上。partition 有 leader 和 follower，partition 的 leader broker 负责接收读写请求，而 follower broker 只负责从 leader 同步消息。当 leader broker 挂掉的时候，会通过 Zookeeper 的 failover 机制从 follower 中选举出新的 leader。&lt;/p&gt;
&lt;h2&gt;producer&lt;/h2&gt;
&lt;p&gt;消息的生产者，producer 根据 topic 的 partition 策略讲消息发给 broker。&lt;/p&gt;
&lt;h2&gt;consumer&lt;/h2&gt;
&lt;p&gt;消息的消费者，Kafka 在 consumer 之上引入了消费者组的概念，消费者会被被划分成一个个消费者组，属于某一个主题的消息会被分派到它的一个分区下，而该分区与订阅了该主题的消费组中的某一个消费者相对应，也就是说消息只会发送给订阅的消费者组中的一个消费者。可以把消费者组理解成消息的真正的订阅者，而它下面的消费者只是处理消息的线程池，这样做可以保证系统的扩展性和容错性。而消费者与分区的关系是，每个分区只能有一个消费者，这样保证了在这一分区中的所有消息都能按序处理。但不同分区中的消息处理顺序不能保证，如果要保证所有的数据都按序处理，可以使每个话题只有一个分区，每个消费者组只有一个消费者。&lt;/p&gt;
&lt;h1&gt;安装配置&lt;/h1&gt;
&lt;p&gt;安装配置 Java 略过&lt;/p&gt;
&lt;p&gt;下载解压 Kafka&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget http://apache.fayea.com/kafka/0.10.0.0/kafka_2.11-0.10.0.0.tgz &amp;amp;&amp;amp; tar xzf kafka_2.11-0.10.0.0.tgz&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动 Zookeeper&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/zookeeper-server-start.sh config/zookeeper.properties&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动 Kafka broker&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/kafka-server-start.sh config/server.properties&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动 console producer&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动 console consumer&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/kafka-console-consumer.sh --zookeeper localhost:2181 --topic test --from-beginning&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;日常维护&lt;/h1&gt;
&lt;h2&gt;topic 管理&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/kafka-topics.sh --zookeeper zk_host:port/chroot --create --topic my_topic_name
       --partitions 20 --replication-factor 3 --config x=y
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --create --topic my_topic_name
       --partitions 20 --replication-factor 3 --config x=y
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name --config x=y
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --alter --topic my_topic_name --delete-config x
bin/kafka-topics.sh --zookeeper zk_host:port/chroot --delete --topic my_topic_name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;均衡 leader&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/kafka-preferred-replica-election.sh --zookeeper zk_host:port/chroot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;consumer group 管理&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;bin/kafka-consumer-groups.sh --zookeeper localhost:2181 --list
bin/kafka-consumer-groups.sh --zookeeper localhost:2181 --describe --group test-consumer-group
bin/kafka-consumer-groups.sh --new-consumer --bootstrap-server broker1:9092 --list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;监控&lt;/h1&gt;
&lt;h2&gt;consumer lag&lt;/h2&gt;
&lt;p&gt;consumer 的当前 offset 和日志的最后位置的间隔&lt;/p&gt;
&lt;h2&gt;producer time&lt;/h2&gt;
&lt;p&gt;producer 的响应时间&lt;/p&gt;
&lt;h2&gt;consumer time&lt;/h2&gt;
&lt;p&gt;consumer 的响应时间&lt;/p&gt;
&lt;h2&gt;metadata time&lt;/h2&gt;
&lt;p&gt;metadata 的更新时间&lt;/p&gt;
&lt;p&gt;更多监控可参考 &lt;a href=&quot;http://kafka.apache.org/documentation.html#monitoring&quot;&gt;http://kafka.apache.org/documentation.html#monitoring&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://kafka.apache.org/documentation.html&quot;&gt;http://kafka.apache.org/documentation.html&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/yfkiss/article/details/17348693&quot;&gt;http://blog.csdn.net/yfkiss/article/details/17348693&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/suifeng3051/article/details/48053965&quot;&gt;http://blog.csdn.net/suifeng3051/article/details/48053965&lt;/a&gt;
&lt;a href=&quot;http://blog.csdn.net/u013291394/article/details/50224491&quot;&gt;http://blog.csdn.net/u013291394/article/details/50224491&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux Systemd笔记]]></title><description><![CDATA[背景 这是我的一篇我之前学习 systemd 的这个系列教程的笔记，在此记录下吧。 简介 和 init 和 upstart 类似的 Linux 服务管理程序 提供优秀框架以表示系统服务间的依赖关系 并行启动服务，并通过 cgroup…]]></description><link>https://xdays.me/Linux-Systemd/</link><guid isPermaLink="false">https://xdays.me/Linux-Systemd/</guid><pubDate>Sat, 16 Apr 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;这是我的一篇我之前学习 systemd 的这个&lt;a href=&quot;http://0pointer.net/blog/projects/systemd-pdf.html&quot;&gt;系列教程&lt;/a&gt;的笔记，在此记录下吧。&lt;/p&gt;
&lt;h1&gt;简介&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;和 init 和 upstart 类似的 Linux 服务管理程序&lt;/li&gt;
&lt;li&gt;提供优秀框架以表示系统服务间的依赖关系&lt;/li&gt;
&lt;li&gt;并行启动服务，并通过 cgroup 跟踪服务进程&lt;/li&gt;
&lt;li&gt;支持对系统状态建立和恢复快照&lt;/li&gt;
&lt;li&gt;支持 crontab&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;h2&gt;服务状态&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;因为启动过程太快，用户可能来不及看服务启动过程，故 systemd 跟踪进程的启动过程保留下来，以便后续查看。通过 systemctl status 能看到服务的状态以及返回的状态码。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;cgroup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;通过 cgroup 来管理进程，没有继承可以脱离管理。通过两个命令来查看进程的所属 cgroup，一个是&lt;code class=&quot;language-text&quot;&gt;ps xawf -eo pid,user,cgroup,args&lt;/code&gt;，一个是 systemd-cgls&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;迁移 sysv 脚本&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;如何把传统的 sysv 脚本迁移为 systemd 的配置文件。shell 脚本的弊端，慢，可读性差，脆弱，不具备有序并行执行，不能监控进程。&lt;/li&gt;
&lt;li&gt;迁移需要获取的信息，服务描述，服务依赖，运行级别，启动命令&lt;/li&gt;
&lt;li&gt;字段描述
&lt;ul&gt;
&lt;li&gt;Unit 段表示服务的通用信息，systemd 不仅管理服务，还管理设备，挂载点，时钟等系统的其他组件，所有这些被管理的对象都称为 unit&lt;/li&gt;
&lt;li&gt;After 仅表达一种依赖关系，不会对依赖服务做任何操作&lt;/li&gt;
&lt;li&gt;Servcie 段表示服务的本身信息，ExecStart 表示启动命令，Type 表示服务如何告知系统其已经启动完毕，早先都是通过 forking 的方式，现在为了让 systemd 更好的监视进程用 dbus，配合指定一个 BusName 来制定其标识&lt;/li&gt;
&lt;li&gt;Install 段表示什么条件下才会启动该服务，WantedBy 表示在需要启动哪个 target 的时候启动该服务&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;关闭服务&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;systemctl kill name.service&lt;/li&gt;
&lt;li&gt;systemctl kill -s SIGKILL name.service&lt;/li&gt;
&lt;li&gt;systemctl kill -s HUP —kill-who=main name.service&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;开关启动&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;systemctl enable/disable name.service 开关开机启动&lt;/li&gt;
&lt;li&gt;systemctl start/stop name.service 开关服务&lt;/li&gt;
&lt;li&gt;/etc/systemd/system 里的配置覆盖/lib/systemd/system 里的配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;chroot&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;chroot 有两种用法，一个是为了安全，一个是为了测试和调试等&lt;/li&gt;
&lt;li&gt;ReadOnlyDirectories 和 InaccessibleDirectories 是一个替代 chroot 的解决办法&lt;/li&gt;
&lt;li&gt;RootDirectory 就是 chroot，要配合 ExecStartPre 脚本把环境弄好&lt;/li&gt;
&lt;li&gt;systemd-nspawn 就是一个精简的 LXC&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;系统提速&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;systemd-analyze blame&lt;/li&gt;
&lt;li&gt;systemd-analyze plot &gt; /tmp/boot.svg&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置文件&lt;/h2&gt;
&lt;h3&gt;新增功能&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;文件系统挂载&lt;/li&gt;
&lt;li&gt;文件系统配额&lt;/li&gt;
&lt;li&gt;配置主机名&lt;/li&gt;
&lt;li&gt;配置环回接口设备&lt;/li&gt;
&lt;li&gt;加载 SELinux 策略&lt;/li&gt;
&lt;li&gt;注册额外的二进制格式，如 java，wine 等&lt;/li&gt;
&lt;li&gt;设置系统 locale&lt;/li&gt;
&lt;li&gt;配置 console 字体和字符集&lt;/li&gt;
&lt;li&gt;创建删除临时文件&lt;/li&gt;
&lt;li&gt;应用/etc/fstab 的挂在选项&lt;/li&gt;
&lt;li&gt;应用 sysctl 的设置&lt;/li&gt;
&lt;li&gt;收集和中继预读信息&lt;/li&gt;
&lt;li&gt;更新 utmp 文件&lt;/li&gt;
&lt;li&gt;加载和保存随即 seed&lt;/li&gt;
&lt;li&gt;静态加载特定的内核模块&lt;/li&gt;
&lt;li&gt;配置加密磁盘和分区&lt;/li&gt;
&lt;li&gt;在 console 口启动 tty&lt;/li&gt;
&lt;li&gt;维护 plymouth&lt;/li&gt;
&lt;li&gt;机器 ID 维护&lt;/li&gt;
&lt;li&gt;设置 UTC 时钟&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;配置文件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;/etc/hostname&lt;/li&gt;
&lt;li&gt;/etc/vconsole.conf 终端的字符集和字体&lt;/li&gt;
&lt;li&gt;/etc/locale&lt;/li&gt;
&lt;li&gt;/etc/modules-load.d/*.conf 静态加载内核模块&lt;/li&gt;
&lt;li&gt;/etc/sysctl.d/*.conf&lt;/li&gt;
&lt;li&gt;/etc/tmpfiles.d/*.conf 临时文件目录，在开机和关机时会被创建更新和删除&lt;/li&gt;
&lt;li&gt;/etc/binfmt.d/*.conf 二进制文件注册&lt;/li&gt;
&lt;li&gt;/etc/os-releases&lt;/li&gt;
&lt;li&gt;/etc/machine-id&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;/etc/sysconfig 和/etc/default&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;作者列举了一堆理由来说明这两个目录已经不需要了&lt;/li&gt;
&lt;li&gt;目录存在的意义就是更新时保持兼容&lt;/li&gt;
&lt;li&gt;EnvironmentFile 这个指令来兼容这两个目录&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;实例化进程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;我想大概就是通过定义模板来实例化多个进程吧&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;迁移 inetd 服务&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;system 基于 socket 激活服务机制&lt;/li&gt;
&lt;li&gt;socket 激活的三种应用场景
&lt;ul&gt;
&lt;li&gt;为并行性，简化性，鲁棒性&lt;/li&gt;
&lt;li&gt;当请求时激活单个进程&lt;/li&gt;
&lt;li&gt;当请求时每个请求激活单个进程&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;加固服务&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;服务和网络隔离，PrivateNetwork&lt;/li&gt;
&lt;li&gt;服务单独的/tmp，PrivateTmp&lt;/li&gt;
&lt;li&gt;让目录对服务不可见或者只读，ReadOnlyDirectories 和 InaccessibleDirectories&lt;/li&gt;
&lt;li&gt;Taking away capabilities from services，CapabilityBoundingSet&lt;/li&gt;
&lt;li&gt;不允许 forking，限制服务创建文件，RLIMIT_NPROC 和 RLIMIT_FSIZE&lt;/li&gt;
&lt;li&gt;控制服务访问设备，DeviceAllow&lt;/li&gt;
&lt;li&gt;其他选项 RootDirectory，USER，GROUP&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;日志和服务状态&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;systemctl status&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;不言自明的启动过程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;systemctl status 有对应服务的 manpage&lt;/li&gt;
&lt;li&gt;启动过程&lt;a href=&quot;http://www.freedesktop.org/software/systemd/man/bootup.html&quot;&gt;http://www.freedesktop.org/software/systemd/man/bootup.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;watchdog&lt;/h2&gt;
&lt;h2&gt;串口终端&lt;/h2&gt;
&lt;h2&gt;日志管理&lt;/h2&gt;
&lt;p&gt;日志通过 journalctl 命令查看&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-f 追踪日志&lt;/li&gt;
&lt;li&gt;-b 查看本次启动的日志&lt;/li&gt;
&lt;li&gt;-p 错误等级&lt;/li&gt;
&lt;li&gt;—since —until 时间范围&lt;/li&gt;
&lt;li&gt;_metadata 通过 meta 信息查询&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;管理资源&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;DefaultControllers，可配置 cpu, memory 和 blkio 分别对 cpu，内存和 io 做限制&lt;/li&gt;
&lt;li&gt;cpu，CPUShares&lt;/li&gt;
&lt;li&gt;memory，MemoryLimit 和 MemorySoftLimit&lt;/li&gt;
&lt;li&gt;blkio，BlockIOWeight，BlockIOReadBandwidth 和 BlockIOWriteBandwidth 可针对磁盘和目录做控制&lt;/li&gt;
&lt;li&gt;其他控制 ControlGroupAttribute&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;虚拟化&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;systemd-detect-virt 用来检测虚拟化&lt;/li&gt;
&lt;li&gt;ConditionVirtualization 可以指定 yes/no，也可以指定特定的虚拟化类型&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Socket 激活服务和容器&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;socket 激活可复用资源&lt;/li&gt;
&lt;li&gt;systemd 通过 socket 启动 container(通过 service 名一一对应)，然后和 container 里的 systemd 配合，启动 container 里的 service&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.freedesktop.org/wiki/Software/systemd/&quot;&gt;http://www.freedesktop.org/wiki/Software/systemd/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html&quot;&gt;http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[etcd基础]]></title><description><![CDATA[简介 etcd 是一个分布式 kv 存储，与我前面介绍的Consul有些类似，底层都是基于raft协议的，它的主要用途包括为应用提供集中的配置管理和服务发现。 安装 etcd 是 go 语言开发的，所以安装成本非常低，一般我们用 systemd 来管理 etcd…]]></description><link>https://xdays.me/Etcd基础/</link><guid isPermaLink="false">https://xdays.me/Etcd基础/</guid><pubDate>Thu, 03 Mar 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;etcd 是一个分布式 kv 存储，与我前面介绍的&lt;a href=&quot;http://xdays.me/Consul%E5%9F%BA%E7%A1%80.html&quot;&gt;Consul&lt;/a&gt;有些类似，底层都是基于&lt;a href=&quot;http://thesecretlivesofdata.com/raft&quot;&gt;raft&lt;/a&gt;协议的，它的主要用途包括为应用提供集中的配置管理和服务发现。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;etcd 是 go 语言开发的，所以安装成本非常低，一般我们用 systemd 来管理 etcd，这里我们简单过下安装过程：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -L  https://github.com/coreos/etcd/releases/download/v2.2.5/etcd-v2.2.5-linux-amd64.tar.gz -o etcd-v2.2.5-linux-amd64.tar.gz
tar xzvf etcd-v2.2.5-linux-amd64.tar.gz
cd etcd-v2.2.5-linux-amd64
mkdir -p /opt/etcd/bin &amp;amp;&amp;amp; cp etcd etcdctl /opt/etcd/bin/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后准备 systemd 配置文件 &lt;code class=&quot;language-text&quot;&gt;/usr/lib/systemd/system/etcd.service&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Unit]
Description=etcd

[Service]
Type=notify
Restart=always
RestartSec=10s
LimitNOFILE=40000
Environment=ETCD_DATA_DIR=/opt/etcd/default.etcd
Environment=ETCD_NAME=%m
Environment=ETCD_ELECTION_TIMEOUT=1200
Environment=&quot;ETCD_LISTEN_PEER_URLS=http://{{host.ip}}:2380,http://{{host.ip}}:7001&quot;
Environment=&quot;ETCD_ADVERTISE_CLIENT_URLS=http://{{host.ip}}:2379,http://{{host.ip}}:4001&quot;
Environment=&quot;ETCD_LISTEN_CLIENT_URLS=http://0.0.0.0:2379&quot;
ExecStart=/opt/everstring/etcd/bin/etcd

[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意： 上述配置中 &lt;code class=&quot;language-text&quot;&gt;{{host.ip}}&lt;/code&gt; 要替换成本机从外面可以访问的 IP。&lt;/p&gt;
&lt;p&gt;然后重新加载 systemd 配置&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;systemctl daemon-reload&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;h2&gt;单机模式&lt;/h2&gt;
&lt;p&gt;对于单机模式，没有需要特殊说明，直接启动 etcd 即是以单机模式运行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;systemctl start etcd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后可以运行客户端命令查看集群状态：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcdctl cluster-health&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;集群模式&lt;/h2&gt;
&lt;p&gt;对于集群模式，我们有几个方面要说下。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;架设集群&lt;/li&gt;
&lt;li&gt;增删成员&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;架设集群&lt;/h3&gt;
&lt;p&gt;根据&lt;a href=&quot;https://coreos.com/etcd/docs/latest/clustering.html&quot;&gt;官方集群文档&lt;/a&gt;的介绍，有两种架设集群的方式：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;static&lt;/li&gt;
&lt;li&gt;etcd discovery&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;官方建议 etcd 集群的数量是奇数个，这样能保证在网络分割的时候不会选出来两个 leader。这里我重点说下 Static 的方式，只要理解了这种方式 etc discovery 就很好理解了。先来看下集群的启动命令：&lt;/p&gt;
&lt;p&gt;etcd0&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcd --name etcd0 -advertise-client-urls http://192.168.99.101:2379 \
-listen-client-urls http://0.0.0.0:2379 \
-listen-peer-urls http://0.0.0.0:2380 \
-initial-advertise-peer-urls http://192.168.99.101:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://192.168.99.101:2380,etcd1=http://192.168.99.102:2380,etcd2=http://192.168.99.103:2380 \
-initial-cluster-state new&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;etcd1&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcd --name etcd1 -advertise-client-urls http://192.168.99.102:2379 \
-listen-client-urls http://0.0.0.0:2379 \
-listen-peer-urls http://0.0.0.0:2380 \
-initial-advertise-peer-urls http://192.168.99.102:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://192.168.99.101:2380,etcd1=http://192.168.99.102:2380,etcd2=http://192.168.99.103:2380 \
-initial-cluster-state new&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;etcd2&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcd --name etcd2 -advertise-client-urls http://192.168.99.103:2379 \
-listen-client-urls http://0.0.0.0:2379 \
-listen-peer-urls http://0.0.0.0:2380 \
-initial-advertise-peer-urls http://192.168.99.103:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://192.168.99.101:2380,etcd1=http://192.168.99.102:2380,etcd2=http://192.168.99.103:2380 \
-initial-cluster-state new&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;要让一组 etcd 实例组成集群：首先要给集群一个标识，由&lt;code class=&quot;language-text&quot;&gt;--initial-cluster-token&lt;/code&gt;指定；然后在启动的时候要让集群里的 etcd 知道彼此，由&lt;code class=&quot;language-text&quot;&gt;--initial-cluster&lt;/code&gt;指定；此外既然集群的每个成员要接收客户端的连接就要在集群里通告自己提供给客户端连接的 endpoint，由&lt;code class=&quot;language-text&quot;&gt;-advertise-client-urls&lt;/code&gt;指定。&lt;/p&gt;
&lt;p&gt;但是，static 方式架设集群的前提是我们已经知道了集群中所有 etcd 的 ip 列表了，如果我们在启动第一个 etcd 实例的时候还不知道第二个 etcd 实例的 ip 的话就要用 etcd discovery 的方式来动态发现集群中的所有的 etcd 实例列表。具体示例请参考&lt;a href=&quot;https://coreos.com/etcd/docs/latest/clustering.html&quot;&gt;官方集群文档&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;增删成员&lt;/h3&gt;
&lt;p&gt;这里要指出：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在集群可用的时候，也就是说集群中大多数 etcd 实例仍然存活的时候，我们可以通过 etcdctl 来增删成员；&lt;/li&gt;
&lt;li&gt;在集群不可用的时候，也就是说离线成员超过半数，但是离线成员的数据依然存在，可以直接重启 etcd 成员使集群恢复健康状态&lt;/li&gt;
&lt;li&gt;在集群不可用的时候，也就是说离线成员超过半数，而且离线成员数据全部丢失，这种情况只能通过离线恢复来重建整个集群，具体可参考&lt;a href=&quot;https://coreos.com/etcd/docs/latest/admin_guide.html#disaster-recovery&quot;&gt;灾难恢复&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;下面我演示下如何增删成员：&lt;/p&gt;
&lt;p&gt;新增成员&lt;/p&gt;
&lt;p&gt;在现有的集群里增加要加入的节点信息,&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcdctl -C http://192.168.99.101:2379 member add etcd2 http://192.168.99.103:2380&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动新增的节点&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcd --name etcd2 -advertise-client-urls http://192.168.99.103:2379 \
-listen-client-urls http://0.0.0.0:2379 \
-listen-peer-urls http://0.0.0.0:2380 \
-initial-advertise-peer-urls http://192.168.99.103:2380 \
-initial-cluster-token etcd-cluster-1 \
-initial-cluster etcd0=http://192.168.99.101:2380,etcd1=http://192.168.99.102:2380,etcd2=http://192.168.99.103:2380 \
-initial-cluster-state existing&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;删除成员&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcdctl -C http://192.168.99.101:2379 member remove 9636be876f777946&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意： 如果一个 etcd 实例从集群中剔除，实例会自动退出，而且不能再加入集群；已删除的 etcd 实例，只有清空数据后重新按照新增成员的步骤才能重新加入集群。&lt;/p&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;h2&gt;key 的增删改查&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcdctl set /key1 value1
etcdctl set --swap-with-value value1 /key1 value2
etcdctl rm /key1
etcdctl update /key1 /value2
etcdctl get /key1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;key 的 watch&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;etcdctl mkdir /test
etcdctl watch --recursive /test&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后在 test 目录下 set 一个 key 就能看到 watch 的效果&lt;/p&gt;
&lt;h2&gt;常见问题&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;etcd 监听在 0.0.0.0，但是 etcdctl 却无法连接到。这种情况可能因为 etcd 没有指定 &lt;code class=&quot;language-text&quot;&gt;-advertise-client-urls&lt;/code&gt; ，然后 etcd 就会在集群里宣告默认的 127.0.1，这样 etcdctl 从集群里拿到的就是 127.0.0.1 的地址。解决办法是，给 etcdctl 加 &lt;code class=&quot;language-text&quot;&gt;--no-sync&lt;/code&gt; 参数强制 etcdctl 不从集群里同步状态，然后通过 &lt;code class=&quot;language-text&quot;&gt;--peers&lt;/code&gt; 直接去连接 etcd。&lt;/li&gt;
&lt;/ol&gt;</content:encoded></item><item><title><![CDATA[搭建私有pypi仓库]]></title><description><![CDATA[背景 为了对公司内部的 Python 库进行统一管理，但出于隐私考虑不能直接放到公共 pypi 服务器上，故考虑搭建私有 pypi 仓库。 服务端 安装 安装 pypiserver 安装 supervisor 配置 新建 package 存放目录 创建用于上传 package…]]></description><link>https://xdays.me/搭建私有pypi仓库/</link><guid isPermaLink="false">https://xdays.me/搭建私有pypi仓库/</guid><pubDate>Thu, 25 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;为了对公司内部的 Python 库进行统一管理，但出于隐私考虑不能直接放到公共 pypi 服务器上，故考虑搭建私有 pypi 仓库。&lt;/p&gt;
&lt;h1&gt;服务端&lt;/h1&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;安装 pypiserver&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pip install pypiserver passlib&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;安装 supervisor&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install supervisor&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;p&gt;新建 package 存放目录&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir -p /opt/pypi/packages&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;创建用于上传 package 的密码&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;htpasswd -sc /opt/pypi/.htaccess user&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;新建 supervisor 配置文件，vim /etc/supervisor/conf.d/pypi.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[program:pypi]
directory=/opt/pypi/
command=pypi-server -p 8082 -P .htaccess /opt/pypi/packages
autostart=true
autorestart=true
redirect_stderr=true
stderr_logfile=NONE&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置 nginx， vim /etc/nginx/site-enabled/pypi.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;server {
    listen 80;
    server_name pypi.example.com;
    location / {
        proxy_pass http://127.0.0.1:8082;
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;客户端&lt;/h1&gt;
&lt;h2&gt;setup.py&lt;/h2&gt;
&lt;p&gt;编辑~/.pypirc 添加如下配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[distutils]
index-servers: example
[example]
repository: http://pypi.example.com
username: user
password: pass&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;pip&lt;/h2&gt;
&lt;p&gt;编辑~/.pip/pip.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[global]
trusted-host = pypi.example.com
index-url = http://pypi.example.com/simple&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Consul基础]]></title><description><![CDATA[简介 服务发现，提供了 DNS 和 HTTP 两种接口 健康检查，可针对服务和节点两个级别检查 KV 存储，提供 HTTP 接口 多数据中心支持 基础 概览 architect-of-consul 通过一个 WAN 的 Gossip…]]></description><link>https://xdays.me/Consul基础/</link><guid isPermaLink="false">https://xdays.me/Consul基础/</guid><pubDate>Wed, 24 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;服务发现，提供了 DNS 和 HTTP 两种接口&lt;/li&gt;
&lt;li&gt;健康检查，可针对服务和节点两个级别检查&lt;/li&gt;
&lt;li&gt;KV 存储，提供 HTTP 接口&lt;/li&gt;
&lt;li&gt;多数据中心支持&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;基础&lt;/h1&gt;
&lt;h2&gt;概览&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2016/02/consul-arch.png&quot; alt=&quot;architect-of-consul&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过一个 WAN 的 Gossip 池来原生支持跨数据中心的状态同步&lt;/li&gt;
&lt;li&gt;一个数据中心内部通过 LAN Gossip 来维持数据中心内部状态同步&lt;/li&gt;
&lt;li&gt;一个数据中心内部通过 Raft 协议来维护在 Server 模式的 agent 之间的 leader 选举和同步数据&lt;/li&gt;
&lt;li&gt;Client 模式下的 agent 负责转发 RPC 请求给 Server 模式的 agent&lt;/li&gt;
&lt;li&gt;所有的 agent 都负责做健康检查&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Raft&lt;/h2&gt;
&lt;p&gt;Raft 一致性算法是 Consul 的核心，用于在一个数据中心内部的 Server 之间同步数据，关于 Raft 算法&lt;a href=&quot;http://thesecretlivesofdata.com/raft&quot;&gt;这里&lt;/a&gt;有个非常直观的演示。&lt;/p&gt;
&lt;h2&gt;Gossip&lt;/h2&gt;
&lt;p&gt;Gossip 分布式通信协议是 Consul 的另一个核心，用于管理成员和广播消息。&lt;/p&gt;
&lt;h2&gt;Agent&lt;/h2&gt;
&lt;p&gt;Consul 要在集群的所有的节点上部署一个 agent，可以工作在 client 或者 server 模式。client 模式 agent 主要职责是做健康检查，对外提供 HTTP 和 DNS 接口以及同步数据，以及向 server 模式的 agent 转发请求；server 模式的 agent 额外的需要维护集群的状态跨数据中心通信等。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;consul 仅有一个二进制文件，开箱即用。 从&lt;a href=&quot;https://www.consul.io/downloads.html&quot;&gt;这里&lt;/a&gt;下载。&lt;/p&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;h2&gt;启动 Server 模式的 agent&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;consul agent -server -bootstrap-expect 1 -data-dir /tmp/consul -ui-dir /tmp/dist -client=0.0.0.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意： &lt;code class=&quot;language-text&quot;&gt;--ui-dir&lt;/code&gt; 启动了 Consul 的 web-ui, 该参数是可选的。&lt;/p&gt;
&lt;h2&gt;启动 Client 模式的 agent&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;consul agent -data-dir=/tmp/consul&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;加入集群&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;consul join peer-ip&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;安全&lt;/h1&gt;
&lt;p&gt;0.4 之后的版本开始支持 ACL 控制，控制对象包括 kv 和 service，这里我们给出初始的 ACL 配置 config.json：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
  &quot;acl_datacenter&quot;: &quot;dc1&quot;,
  &quot;acl_master_token&quot;: &quot;changeme&quot;,
  &quot;acl_token&quot;: &quot;ttSsL3mx3k9vqd5OzXgD&quot;,
  &quot;acl_default_policy&quot;: &quot;deny&quot;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;启动的时候添加 &lt;code class=&quot;language-text&quot;&gt;-config-file=config.json&lt;/code&gt; 即可&lt;/p&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;p&gt;Consul 的 systemd 配置文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[Unit]
Description=consul agent
Requires=network-online.target
After=network-online.target
[Service]
EnvironmentFile=-/etc/sysconfig/consul
Environment=GOMAXPROCS=2
Restart=on-failure
ExecStart=/usr/local/sbin/consul agent $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillSignal=SIGINT
[Install]
WantedBy=multi-user.target&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[U盘安装CentOS7系统]]></title><description><![CDATA[需求 U 盘安装 小规模 自动安装 工具 system-config-kickstart kickstart livecd-iso-to-disk 配置过程 将 iso 文件写入 U 盘 用 system-config-kickstart 创建 ks…]]></description><link>https://xdays.me/U盘安装CentOS7系统/</link><guid isPermaLink="false">https://xdays.me/U盘安装CentOS7系统/</guid><pubDate>Tue, 23 Feb 2016 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;需求&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;U 盘安装&lt;/li&gt;
&lt;li&gt;小规模&lt;/li&gt;
&lt;li&gt;自动安装&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;工具&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;system-config-kickstart&lt;/li&gt;
&lt;li&gt;kickstart&lt;/li&gt;
&lt;li&gt;livecd-iso-to-disk&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置过程&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;将 iso 文件写入 U 盘&lt;code class=&quot;language-text&quot;&gt;sudo livecd-iso-to-disk --format --reset-mbr ./CentOS-6.4-x86_64-minimal.iso /dev/sdb&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;用 system-config-kickstart 创建 ks 文件，注意修改以下两点：
&lt;ul&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;harddrive --partition=sda1 --dir=/&lt;/code&gt; 这里是制定安装介质的存放目录&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;bootloader --location=mbr --driveorder=sdb,sda&lt;/code&gt; 指定 grub 的安装磁盘，如果不指定会写到 U 盘上去的&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;将 ks.cfg 拷贝只 U 盘根目录下&lt;/li&gt;
&lt;li&gt;修改 U 盘上的 grub 引导菜单 syslinux/extlinux.conf，添加内核参数 ks=hd:sda1:/ks.cfg&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;设备设置 U 盘第一启动，启动菜单第一个即可&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;参考&lt;/h1&gt;
&lt;h2&gt;ks.cfg&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#platform=x86, AMD64, or Intel EM64T
#version=DEVEL
# Install OS instead of upgrade
install
# Keyboard layouts
keyboard &apos;us&apos;
# Reboot after installation
reboot
# Root password
rootpw --iscrypted $1$CU9rtnsD$/V7sKSQAJrE3cLn.CO0
# System timezone
timezone Asia/Shanghai
# System language
lang en_US
# Firewall configuration
firewall --disabled
# System authorization information
auth  --useshadow  --passalgo=sha512
# Use CDROM installation media
harddrive --partition=sda1 --dir=/
# Use text mode install
text
firstboot --disable
# SELinux configuration
selinux --disabled

# System bootloader configuration
bootloader --location=mbr --driveorder=sdb,sda
# Clear the Master Boot Record
zerombr
# Partition clearing information
clearpart --all
# Disk partitioning information
part / --asprimary --fstype=&quot;ext4&quot; --size=10240
&amp;lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[OpenLDAP构建统一认证之项目实战]]></title><description><![CDATA[背景 问题 登录服务器的账号分散在所有的机器上，这样就带来两个问题： 维护成本高，需要专门在 playbook 里定义用户权限 没有明确的权限划分 不便于和其他系统（如 Google Apps）对接 需求 数据集中管理 根据用户组控制用户的登陆权限 控制用户的 sudo…]]></description><link>https://xdays.me/OpenLDAP构建统一认证之项目实战/</link><guid isPermaLink="false">https://xdays.me/OpenLDAP构建统一认证之项目实战/</guid><pubDate>Sat, 26 Dec 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;登录服务器的账号分散在所有的机器上，这样就带来两个问题：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;维护成本高，需要专门在 playbook 里定义用户权限&lt;/li&gt;
&lt;li&gt;没有明确的权限划分&lt;/li&gt;
&lt;li&gt;不便于和其他系统（如 Google Apps）对接&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;需求&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;数据集中管理&lt;/li&gt;
&lt;li&gt;根据用户组控制用户的登陆权限&lt;/li&gt;
&lt;li&gt;控制用户的 sudo 权限，只有 operation 有 sudo 的权限&lt;/li&gt;
&lt;li&gt;自动创建家目录&lt;/li&gt;
&lt;li&gt;Web 管理界面&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;原则&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;尽可能少的涉及组件，减少维护成本&lt;/li&gt;
&lt;li&gt;尽可能的不入侵系统配置，便于恢复&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;服务端&lt;/h2&gt;
&lt;h3&gt;OpenLDAP 安装配置&lt;/h3&gt;
&lt;p&gt;关于 OpenLDAP 的安装可以参考&lt;a href=&quot;//openldap%E6%9E%84%E5%BB%BA%E7%BB%9F%E4%B8%80%E8%AE%A4%E8%AF%81%E4%B9%8B%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AE/&quot;&gt;OpenLDAP 构建统一认证之安装配置&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;LAM 安装配置&lt;/h3&gt;
&lt;p&gt;关于 LAM 安装配置可以参考&lt;a href=&quot;//openldap%E6%9E%84%E5%BB%BA%E7%BB%9F%E4%B8%80%E8%AE%A4%E8%AF%81%E4%B9%8B%E7%AE%A1%E7%90%86%E5%B7%A5%E5%85%B7/&quot;&gt;OpenLDAP 构建统一认证之管理工具&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;管理账号&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcSuffix
olcSuffix: dc=example,dc=com

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootDN
olcRootDN: cn=admin,dc=example,dc=com

dn: olcDatabase={2}bdb,cn=config
changetype: modify
replace: olcRootPW
olcRootPW: {SSHA}1Ahx2TU+7DrRzk6eJMNIk2pPaxKsS+Om # generated by ldappasswd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;使配置生效&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapmodify -Y EXTERNAL -H ldapi:/// -f example.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ssh 公钥&lt;/h3&gt;
&lt;p&gt;为了配合客户端支持 ssh 的公钥登陆，我们需要为 LDAP Server 添加 openssh-lpk 的 schema，由于最新的 OpenLDAP 都是 olc 模式来管理服务器配置，所以所有的 schema 需要通过 LDIF 的通用格式导入，这里我找到了一个能和 sssd 以及 LAM 配合的 schema：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: cn=openssh-lpk,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: openssh-lpk
olcAttributeTypes: ( 1.3.6.1.4.1.24552.500.1.1.1.13 NAME &apos;sshPublicKey&apos;
    DESC &apos;MANDATORY: OpenSSH Public key&apos;
    EQUALITY octetStringMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.40 )
olcObjectClasses: ( 1.3.6.1.4.1.24552.500.1.1.2.0 NAME &apos;ldapPublicKey&apos; SUP top AUXILIARY
    DESC &apos;MANDATORY: OpenSSH LPK objectclass&apos;
    MAY ( sshPublicKey $ uid )
    )&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后导入该 schema&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapadd -Y EXTERNAL -H ldapi:/// -f openssh-lpk.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后给 LAM 添加上 ssh key 的模块即可用来管理 public key&lt;/p&gt;
&lt;h3&gt;sudo 权限&lt;/h3&gt;
&lt;p&gt;和 ssh 公钥一样，sudo 权限也需要添加相应的 schema，如下的 LDIF 是我根据官方的 schema 转换而来的。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: cn=sudoRole,cn=schema,cn=config
objectClass: olcSchemaConfig
cn: sudoRole
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.1
   NAME &apos;sudoUser&apos;
   DESC &apos;User(s) who may  run sudo&apos;
   EQUALITY caseExactIA5Match
   SUBSTR caseExactIA5SubstringsMatch
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.2
   NAME &apos;sudoHost&apos;
   DESC &apos;Host(s) who may run sudo&apos;
   EQUALITY caseExactIA5Match
   SUBSTR caseExactIA5SubstringsMatch
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.3
   NAME &apos;sudoCommand&apos;
   DESC &apos;Command(s) to be executed by sudo&apos;
   EQUALITY caseExactIA5Match
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.4
   NAME &apos;sudoRunAs&apos;
   DESC &apos;User(s) impersonated by sudo&apos;
   EQUALITY caseExactIA5Match
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.5
   NAME &apos;sudoOption&apos;
   DESC &apos;Options(s) followed by sudo&apos;
   EQUALITY caseExactIA5Match
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.6
   NAME &apos;sudoRunAsUser&apos;
   DESC &apos;User(s) impersonated by sudo&apos;
   EQUALITY caseExactIA5Match
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.7
   NAME &apos;sudoRunAsGroup&apos;
   DESC &apos;Group(s) impersonated by sudo&apos;
   EQUALITY caseExactIA5Match
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.26 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.8
   NAME &apos;sudoNotBefore&apos;
   DESC &apos;Start of time interval for which the entry is valid&apos;
   EQUALITY generalizedTimeMatch
   ORDERING generalizedTimeOrderingMatch
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.9
   NAME &apos;sudoNotAfter&apos;
   DESC &apos;End of time interval for which the entry is valid&apos;
   EQUALITY generalizedTimeMatch
   ORDERING generalizedTimeOrderingMatch
   SYNTAX 1.3.6.1.4.1.1466.115.121.1.24 )
olcAttributeTypes: ( 1.3.6.1.4.1.15953.9.1.10
    NAME &apos;sudoOrder&apos;
    DESC &apos;an integer to order the sudoRole entries&apos;
    EQUALITY integerMatch
    ORDERING integerOrderingMatch
    SYNTAX 1.3.6.1.4.1.1466.115.121.1.27 )
olcObjectClasses: ( 1.3.6.1.4.1.15953.9.2.1 NAME &apos;sudoRole&apos; SUP top STRUCTURAL
   DESC &apos;Sudoer Entries&apos;
   MUST ( cn )
   MAY ( sudoUser $ sudoHost $ sudoCommand $ sudoRunAs $ sudoRunAsUser $ sudoRunAsGroup $ sudoOption $ sudoNotBefore $ sudoNotAfter $ sudoOrder $ description ))&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后导入该 schema：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapadd -Y EXTERNAL -H ldapi:/// -f sudoers.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;由于 LAM 的 sudo 管理模块是收费的，所以只能自己手动添加 sudo 策略，示例 LDIF 文件如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: ou=sudoers,dc=example,dc=com
objectClass: top
objectclass: organizationalUnit
ou: sudoers

dn: cn=operation,ou=sudoers,dc=example,dc=com
objectClass: top
objectClass: sudoRole
cn: operation
sudoUser: %operation
sudoHost: ALL
sudoRunAsUser: ALL
sudoCommand: ALL
sudoOption: !authenticate&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;导入该配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapadd -D &apos;cn=admin,dc=example,dc=com&apos; -W -H ldapi:/// -f sudo.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ACL 配置&lt;/h3&gt;
&lt;p&gt;该配置主要是允许用户修改自己的密码&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to attr=userPassword by self =xw by anonymous auth by * none

dn: olcDatabase={2}bdb,cn=config
changetype: modify
add: olcAccess
olcAccess: to * by * read&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;导入该配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapmodify -Y EXTERNAL -H ldapi:/// -f acl.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;客户端（手动）&lt;/h2&gt;
&lt;h3&gt;NSS 交由 sssd 管理&lt;/h3&gt;
&lt;p&gt;编辑/etc/nsswitch.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;passwd:         compat sss
group:          compat sss
shadow:         compat sss

hosts:          files dns
networks:       files

protocols:      db files
services:       db files

ethers:         db files
rpc:            db files

netgroup:       nis sss
sudoers:        files sss
automount:  files sss&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置 PAM&lt;/h3&gt;
&lt;p&gt;配置 PAM 主要为了解决两个问题，一个是用户认证走 SSSD，另一个是自动创建用户家目录。&lt;/p&gt;
&lt;p&gt;CentOS 系统编辑/etc/pam.d/system-auth&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;auth        sufficient    pam_sss.so use_first_pass
account     [default=bad success=ok user_unknown=ignore] pam_sss.so
password    sufficient    pam_sss.so use_authtok
session     optional      pam_sss.so&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后执行如下命令开启自动创建家目录&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;authconfig --enablemkhomedir --update&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; 此配置需要关闭 SELinux&lt;/p&gt;
&lt;p&gt;Ubuntu 系统无需配置，sssd 已经帮我们做了。除了为了能自动创建家目录，需添加如下行到/etc/pam.d/common-session 即可&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;session required        pam_mkhomedir.so umask=0022 skel=/etc/skel&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置 SSSD&lt;/h3&gt;
&lt;p&gt;编辑/etc/sssd/sssd.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[sssd]
config_file_version = 2
services = nss, pam, ssh, sudo
domains = example
debug_level = 3

[nss]
filter_users = root,ldap,named,avahi,haldaemon,dbus,radiusd,news,nscd

[domain/example]
debug_level = 9
ldap_id_use_start_tls = True
ldap_tls_reqcert = never
cache_credentials = True
ldap_schema = rfc2307
id_provider = ldap
auth_provider = ldap
chpass_provider = ldap
ldap_uri = ldaps://dir.example.com
ldap_search_base = dc=example,dc=com
ldap_user_ssh_public_key = sshPublicKey
sudo_provider = ldap
ldap_sudo_search_base = ou=sudoers,dc=example,dc=com
access_provider = simple
simple_allow_groups = operation,login&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置 SSHD&lt;/h3&gt;
&lt;p&gt;编辑/etc/ssh/sshd_config&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;AuthorizedKeysCommand /usr/bin/sss_ssh_authorizedkeys
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;客户端（Ansible）&lt;/h2&gt;
&lt;p&gt;具体请参考我的这个&lt;a href=&quot;https://github.com/xdays/ansible/tree/master/roles/ldap&quot;&gt;Ansible Role&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.zytrax.com/books/ldap/ch6/slapd-config.html&quot;&gt;http://www.zytrax.com/books/ldap/ch6/slapd-config.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wiki.gentoo.org/wiki/Centralized_authentication_using_OpenLDAP&quot;&gt;https://wiki.gentoo.org/wiki/Centralized_authentication_using_OpenLDAP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openldap.org/doc/admin24/&quot;&gt;http://www.openldap.org/doc/admin24/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://web.mit.edu/kerberos/krb5-latest/doc/admin/index.html&quot;&gt;http://web.mit.edu/kerberos/krb5-latest/doc/admin/index.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://serverfault.com/questions/653792/ssh-key-authentication-using-ldap&quot;&gt;http://serverfault.com/questions/653792/ssh-key-authentication-using-ldap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://vaab.blog.kal.fr/2010/03/06/how-to-add-a-schema-in-openldap-24/&quot;&gt;http://vaab.blog.kal.fr/2010/03/06/how-to-add-a-schema-in-openldap-24/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.ossramblings.com/using-ldap-to-store-ssh-public-keys-with-sssd&quot;&gt;http://www.ossramblings.com/using-ldap-to-store-ssh-public-keys-with-sssd&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lists.fedorahosted.org/pipermail/sssd-users/2013-March/000456.html&quot;&gt;https://lists.fedorahosted.org/pipermail/sssd-users/2013-March/000456.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://linux.die.net/man/5/sudoers.ldap&quot;&gt;http://linux.die.net/man/5/sudoers.ldap&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Identity_Management_Guide/users.html#homedir-pammod&quot;&gt;https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Identity_Management_Guide/users.html#homedir-pammod&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://support.hp.com/us-en/document/c03737146&quot;&gt;http://support.hp.com/us-en/document/c03737146&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://thornelabs.net/2013/01/28/linux-restrict-server-login-via-ldap-groups.html&quot;&gt;http://thornelabs.net/2013/01/28/linux-restrict-server-login-via-ldap-groups.html&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Keepalived安装配置]]></title><description><![CDATA[简介 Keepalived 是 Linux 的高可用软件，其主要是高可用协议的 VRRP 的开元实现，此外它还提供了方便管理 LVS 的接口。 安装 配置 启动]]></description><link>https://xdays.me/Keepalived安装配置/</link><guid isPermaLink="false">https://xdays.me/Keepalived安装配置/</guid><pubDate>Sun, 18 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Keepalived 是 Linux 的高可用软件，其主要是高可用协议的 VRRP 的开元实现，此外它还提供了方便管理 LVS 的接口。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget http://www.keepalived.org/software/keepalived-1.2.7.tar.gz &amp;amp;&amp;amp; tar xzf keepalived-1.2.7.tar.gz &amp;amp;&amp;amp; cd keepalived-1.2.7 &amp;amp;&amp;amp; ./configure --prefix=/usr/local/keepalived-1.2.7 &amp;amp;&amp;amp; make &amp;amp;&amp;amp;     make install &amp;amp;&amp;amp; cd /usr/local &amp;amp;&amp;amp; ln -s keepalived-1.2.7 keepalived&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mv keepalived.conf{,.default}
vim keepalived.conf
global_defs {
   notification_email {
      test@example.com
   }
   notification_email_from noreply@example.com
   smtp_server 127.0.0.1
   smtp_connect_timeout 30
   router_id minissr
}

vrrp_script chk_nginx {
   script &quot;if [ -f /var/run/down -o `ps U root -Ho cmd | grep -v grep | grep nginx | wc -l` -eq 0 ]; then exit 1; else exit 0; fi&quot;
   interval 2  # check every 2 seconds
   weight -40   # if failed, decrease 40 of the priority
   fall   1     # require 1 failures for failures
   rise   1     # require 1 sucesses for ok
}

vrrp_instance nginx {
    state MASTER
    #state BACKUP
    interface eth0
    virtual_router_id 51
    priority 102
    #priority 101
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1111
    }
    track_script {
       chk_nginx
    }
    virtual_ipaddress {
       192.168.110.110
    }
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/usr/local/keepalived/sbin/keepalived -f /usr/local/keepalived/etc/keepalived/keepalived.conf -D&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[VPN-基于LDAP认证的OpenVPN]]></title><description><![CDATA[安装 配置 证书 关于生成证书请参考 VPN-基于 OpenVPN 构建 /etc/openvpn/server.conf /etc/openvpn/auth/ldap.conf /etc/openldap/ldap.conf 最后追加一行 与桥接模式集成 openvpn…]]></description><link>https://xdays.me/VPN-基于ldap认证的openvpn/</link><guid isPermaLink="false">https://xdays.me/VPN-基于ldap认证的openvpn/</guid><pubDate>Sun, 18 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install -y openvpn openvpn-auth-ldap&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;证书&lt;/h2&gt;
&lt;p&gt;关于生成证书请参考 &lt;a href=&quot;/openvpn%E6%9E%84%E5%BB%BAvpn.html&quot;&gt;VPN-基于 OpenVPN 构建&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;/etc/openvpn/server.conf&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;port 1194
proto tcp
dev tun
ca /etc/openvpn/easy-rsa/keys/ca.crt
cert /etc/openvpn/easy-rsa/keys/BJ.crt
key /etc/openvpn/easy-rsa/keys/BJ.key  # This file should be kept secret
dh /etc/openvpn/easy-rsa/keys/dh2048.pem
server 172.16.100.0 255.255.255.0
ifconfig-pool-persist ipp.txt
duplicate-cn
keepalive 5 60
comp-lzo
persist-key
persist-tun
status openvpn-status.log
verb 3
push &quot;redirect-gateway def1 bypass-dhcp bypass-dns&quot;
push &quot;dhcp-option DNS 8.8.8.8&quot;
plugin /usr/lib64/openvpn/plugin/lib/openvpn-auth-ldap.so &quot;/etc/openvpn/auth/ldap.conf  uid=%u &quot;
client-cert-not-required
username-as-common-name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;/etc/openvpn/auth/ldap.conf&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;LDAP&gt;
    URL   ldaps://dir.example.com:636
    BindDN     uid=apps,ou=Operations,ou=People,dc=example,dc=com
    Password   changeme
    Timeout     15
    TLSEnable   no
    FollowReferrals yes
&amp;lt;/LDAP&gt;
&amp;lt;Authorization&gt;
    BaseDN      &quot;dc=example,dc=com&quot;
    SearchFilter &quot;(uid=%u)&quot;
    RequireGroup    false
    &amp;lt;Group&gt;
        BaseDN      &quot;ou=Groups,dc=example,dc=com&quot;
        SearchFilter    &quot;(|(cn=developers)(cn=artists))&quot;
        MemberAttribute uniqueMember
    &amp;lt;/Group&gt;
&amp;lt;/Authorization&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;/etc/openldap/ldap.conf&lt;/h1&gt;
&lt;p&gt;最后追加一行&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;TLS_REQCERT never&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;与桥接模式集成&lt;/h1&gt;
&lt;p&gt;openvpn-auth-ldap 不支持桥接模式，需要打 patch 才能正常工作，具体参考&lt;a href=&quot;https://code.google.com/p/openvpn-auth-ldap/issues/detail?id=4&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://openvpn.net/index.php/open-source/documentation/howto.html#pki&quot;&gt;https://openvpn.net/index.php/open-source/documentation/howto.html#pki&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[VPN-PPTP客户端自动登录]]></title><description><![CDATA[#安装
yum install pptp #配置
##chap-secrets
vim /etc/ppp/chap-secrets ##peers
vim /etc/ppp/peers/vpn-bos ##options
vim /etc/ppp/options 启动]]></description><link>https://xdays.me/VPN-pptp客户端自动登录/</link><guid isPermaLink="false">https://xdays.me/VPN-pptp客户端自动登录/</guid><pubDate>Sun, 18 Oct 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#安装
yum install pptp&lt;/p&gt;
&lt;p&gt;#配置
##chap-secrets
vim /etc/ppp/chap-secrets&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yottaa    pptp password *&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##peers
vim /etc/ppp/peers/vpn-bos&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pty &quot;pptp vpn-bos.yottaa.com --nolaunchpppd&quot;
name yottaa-1
remotename pptp
require-mppe-128
file /etc/ppp/options.pptp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##options
vim /etc/ppp/options&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;lock
lcp-echo-failure 10
lcp-echo-interval 1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pppd call vpn-bos
&amp;lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Zabbix代理模式]]></title><description><![CDATA[#简介
Proxy 模式用于监控服务器无法直接访问被监控机器的情况，如内网监控。 #安装 ##安装源
rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch…]]></description><link>https://xdays.me/Zabbix代理模式/</link><guid isPermaLink="false">https://xdays.me/Zabbix代理模式/</guid><pubDate>Sat, 13 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#简介
Proxy 模式用于监控服务器无法直接访问被监控机器的情况，如内网监控。&lt;/p&gt;
&lt;p&gt;#安装 ##安装源
rpm -ivh &lt;a href=&quot;http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm&quot;&gt;http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;##安装 proxy 及依赖
yum install -y zabbix-proxy-mysql mysql-server&lt;/p&gt;
&lt;p&gt;##mysql 初始化
/usr/bin/mysql_secure_installation&lt;/p&gt;
&lt;p&gt;#配置 ##创建数据库&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CREATE DATABASE zabbix CHARACTER SET utf8;
GRANT ALL ON zabbix.* TO zabbix@&apos;localhost&apos; IDENTIFIED BY &apos;zabbixpass&apos;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##导入数据
mysql -uzabbix -pzabbixpass zabbix &amp;#x3C; /usr/share/doc/zabbix-proxy-mysql-2.2.2/create/schema.sql&lt;/p&gt;
&lt;p&gt;##配置 proxy&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Server= 服务器IP
Hostname= 主机名
DBName=zabbix 数据库名
DBUser=zabbix 用户名
DBPassword=zabbixpass 密码&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##配置 server&lt;/p&gt;
&lt;p&gt;###添加 Proxy
在 administration-&gt;DM 下选择 Proxy，创建 Proxy。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;选择被动模式，注意这里的被动模式是指 Proxy 不主动向 Server 汇报监控数据，Server 要什么 Proxy 就问 Agent 要什么&lt;/li&gt;
&lt;li&gt;连接 IP 和端口号，填写 Proxy 的监听地址和端口&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;###添加 host
在 Server 的 web 界面上创建 host 的时候在 Monitored by proxy 选择要使用的 proxy 即可。&lt;/p&gt;
&lt;p&gt;##配置 agent
主要的配置向包括如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Server= 配置为Proxy的地址&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; 如果不需要开启主动探测，保持 ServerActive 配置项为空即可&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Zabbix监控MySQL]]></title><description><![CDATA[#安装源 #安装包 安装的软件包包括：percona-zabbix-templates php php-mysql zabbix-agent apr apr-util apr-util-ldap httpd httpd-tools mailcap php-cli php…]]></description><link>https://xdays.me/Zabbix监控MySQL/</link><guid isPermaLink="false">https://xdays.me/Zabbix监控MySQL/</guid><pubDate>Sat, 13 Jun 2015 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#安装源&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -ivh http://www.percona.com/downloads/percona-release/percona-release-0.0-1.x86_64.rpm
rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;#安装包&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install -y zabbix-agent php php-mysql percona-zabbix-templates&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;安装的软件包包括：percona-zabbix-templates php php-mysql zabbix-agent apr apr-util apr-util-ldap httpd httpd-tools mailcap php-cli php-common php-pdo zabbix&lt;/p&gt;
&lt;p&gt;#配置
##agent 配置
配置 Server 到 192.168.1.7&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sed -i &apos;s/^Server=.*/Server=192.168.1.7/&apos; /etc/zabbix/zabbix_agentd.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;拷贝配置文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cp /var/lib/zabbix/percona/templates/userparameter_percona_mysql.conf /etc/zabbix/zabbix_agentd.d/userparameter_percona_mysql.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##PHP 访问数据库权限
新建/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf 内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cat &gt;/var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf &amp;lt;&amp;lt;EOF
&amp;lt;?php
\$mysql_user = &quot;root&quot;;
\$mysql_pass = &quot;password&quot;;
EOF&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改 php.ini 内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sed -i &apos;s@mysql.default_socket =@mysql.default_socket = &quot;/tmp/mysql.sock&quot;@&apos; /etc/php.ini
sed -i &apos;s@mysqli.default_socket =@mysqli.default_socket = &quot;/tmp/mysql.sock&quot;@&apos; /etc/php.ini&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##脚本访问数据库权限
/var/lib/zabbix/.my.cnf 内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cat &gt;/var/lib/zabbix/.my.cnf &amp;lt;&amp;lt;EOF
[client]
user = root
password = password
EOF&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##外壳脚本修改
添加如下两行才能保证脚本正常运行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sed -i &apos;/^CACHEFILE/aPATH=/usr/local/mysql/bin/:$PATH\nHOME=/var/lib/zabbix/&apos; /var/lib/zabbix/percona/scripts/get_mysql_stats_wrapper.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##安全加固&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;chown zabbix.zabbix /var/lib/zabbix/.my.cnf /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf
chmod 600 /var/lib/zabbix/.my.cnf /var/lib/zabbix/percona/scripts/ss_get_mysql_stats.php.cnf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;##启动 agent&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/etc/init.d/zabbix-agent start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[回首2014和展望2015]]></title><description><![CDATA[回首 2014 回首 今天是 2015 年的元宵节，虽然这个年终总结比较晚，但还是必须要写写的，因为这一年经历了太多太多了，多到我怕我忘了它有多重要。2014 年是我个人意义上的“第十年”，是我有生以来记忆最深刻的两年之一（2003 年底，家随着父亲的离去散了；201…]]></description><link>https://xdays.me/回首2014和展望2015/</link><guid isPermaLink="false">https://xdays.me/回首2014和展望2015/</guid><pubDate>Fri, 03 Apr 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;回首 2014&lt;/h1&gt;
&lt;h2&gt;回首&lt;/h2&gt;
&lt;p&gt;今天是 2015 年的元宵节，虽然这个年终总结比较晚，但还是必须要写写的，因为这一年经历了太多太多了，多到我怕我忘了它有多重要。2014 年是我个人意义上的“第十年”，是我有生以来记忆最深刻的两年之一（2003 年底，家随着父亲的离去散了；2014 年底，我在北京租了两居室把妈妈接来和我的她一起生活，家又回来了）。我自豪于我的努力和拼搏，更感恩于我拥有的一切。&lt;/p&gt;
&lt;h2&gt;流水账&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;同往常一样，和我妈满怀希望地“艰难”的过了一个年&lt;/li&gt;
&lt;li&gt;她去了杭州&lt;/li&gt;
&lt;li&gt;西湖，太子湾公园，茅家埠，西溪湿地，中山陵，夫子庙&lt;/li&gt;
&lt;li&gt;在又拍通宵工作至第二天八点，第二次破纪录&lt;/li&gt;
&lt;li&gt;离职又拍，回北京，入职 Yottaa&lt;/li&gt;
&lt;li&gt;姥姥去世&lt;/li&gt;
&lt;li&gt;去广州见家长&lt;/li&gt;
&lt;li&gt;租房子，接妈妈来北京&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;得失&lt;/h2&gt;
&lt;h3&gt;得&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;一份可以糊口的工作&lt;/li&gt;
&lt;li&gt;项目经验，在又拍做了两三个项目，在 Yottaa 接手了几个项目&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;家&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;失&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;姥姥离世&lt;/li&gt;
&lt;li&gt;健康，感觉一年不如一年&lt;/li&gt;
&lt;li&gt;读书少&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;体会&lt;/h2&gt;
&lt;h3&gt;亲人离世&lt;/h3&gt;
&lt;p&gt;虽然我很早都面对了人生的生老病死的无奈，但是从妈妈给我打电话说姥姥去世了的很长一段时间里我都难以释怀。一方面，姥姥走的很痛苦，这是一位年近 80 的老人的不幸，我无法不去想她如何痛苦的走完最后这一段路；另一方面，妈妈和姥爷更痛苦，我想人生最痛苦的事情莫过于看着自己最亲人的痛苦，我看着妈妈和姥爷憔悴的不成样子时的痛苦大概和他们眼睁睁看着姥姥痛苦的离去时的痛苦是一样的吧。在最开始的一段日子里，我想的最多和担心的最多的是我亲爱的姥爷，他失去了陪着自己走过大半辈子的人，那个他天天提醒要吃药，那个在家里等着他赶集回来的人，那个和他一起烙饼给我们吃的人，我觉得这是我可能永远接受不了的残酷的事实。是的，时间终归会在带走很多记忆的同时带走我们失去亲人的痛苦，而我也很清楚的知道，珍惜家人朋友，爱他们才是人这一生的归宿。&lt;/p&gt;
&lt;h3&gt;家&lt;/h3&gt;
&lt;p&gt;年底我在育新附近租了一套两居室，年后把妈妈接到北京来了。妈妈，我和爱人终于生活在了一起，十一年后，家，回来了！刚租到房子坐在客厅里，我愣了十几分钟，她还问我在干嘛，当时我想我无法解释我的心情，这种心情就像高考后拿到了录取通知书，就像收到了第一份工作的 offer，七年的求学路和三年工作的打拼，当我知道年后我就会和妈妈一起来北京，和我的爱人一起生活在一起的时候，我感觉我毕业了。说实在的，这些年太苦了，妈妈用她本就不健壮的身子扛下了大部分，还好我也算争气。家，就是在一起，我是幸福的。&lt;/p&gt;
&lt;h3&gt;恋人相处&lt;/h3&gt;
&lt;p&gt;我们两个的感情也渐渐稳固，渐渐学会了相互包容和理解，吵架自然少了。一个很重要的心得是不要用男生的逻辑去思考问题，一加一不一定非要等于二的。首先，你需要认识到女生大多是很感性（换句话说就是讲道理是行不通的）的这一事实；然后，在某些时候虽然你不认同，但是也没必要反对，因为你不仅无法让对方认同，反而让事情变得更坏；之后，也许她会自己明白，也许不会明白，也许确实你自己不对只是自己没有意识到而已；总之，能够相互理解的时候都不会太坏。其实我俩之间，除了长辈反对引起的一些问题上，也没有什么矛盾了。&lt;/p&gt;
&lt;h3&gt;技术成长&lt;/h3&gt;
&lt;p&gt;技术上好像没什么大的成长了，Python 这个东西会的用的更熟悉了不会的因为没有机会用也还是不会，不过作为开发运维也够用了。大多数，感觉到自己在技术这条道路的上瓶颈时还是对专业理论基础知识的缺乏，数据结构，算法等等，很想还债，可惜一直没有这个精力。还是简单列举下吧：在又拍的运维平台已经初见模型，Celery 也用起来了，可惜没有等到实现自己的所有想法就离开了，开发也就告一段落；此外在又拍做了一个运维基础库，封装了日常的运维任务，避免日后的重复的劳动，后来在 Yottaa 也用同样的思路做了些东西，大大提高了工作效率；Docker 的应用也提到了日程，基本上我的职责范围内的东西全都容器化了，如 PHP，Django，Zabbix，MySQL，Redis， 踩了一些坑也收获颇多，Docker 本身并不复杂，但是受限于理论基础我没有能力研究其背后的底层技术，加上无法将该技术推进到生产环境，对其的研究也就随着离职告一段落，相信日后肯定还有机会深入研究下；AWS 一直以来是云计算的标杆，我在来了 Yottaa 之后也深度体验了一把，也明白了云上运维的价值，即构建一个运维支撑系统通过稳固的功能模块将业务逻辑与基础设施结合起来，当这些功能模块足够稳健，最终就可以打造一个自适应的系统，系统内的任何一个或者多个环节出问题都不会影响系统对外提供的服务，从这个角度看，我们还有很长的路要走；Yottaa 的技术栈也不是我短时间内能消化的，其中包括 AWS, OpenStack, Puppet, Jenkins, Varnish, Java, 0mq, Cassandra, Mongodb, Rabbitmq, Redis, Zabbix, Hadoop, Hbase, Ruby。&lt;/p&gt;
&lt;p&gt;##打分
80&lt;/p&gt;
&lt;p&gt;#展望 2015 #生活&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;结婚&lt;/li&gt;
&lt;li&gt;更多精力放在家上&lt;/li&gt;
&lt;li&gt;锻炼身体&lt;/li&gt;
&lt;li&gt;读十本关于成长的书&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;#工作&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对 Yottaa 的技术栈达到一个熟练的程度&lt;/li&gt;
&lt;li&gt;将运维平台打造成产品级的&lt;/li&gt;
&lt;li&gt;学习 Ruby 和 JavaScript&lt;/li&gt;
&lt;li&gt;理论基础培训&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;这篇博客在我的笔记草稿里保存好长时间，由于近期工作变动比较大，花了点时间整理出来，算是给 2014 年一个交代&lt;/em&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Bind基于DLZ实现智能DNS]]></title><description><![CDATA[简介 在我看来基于 Bind 的只能 DNS 方案主要包括两个部分：Geolocation 和 Dynamic Record。国内的业界对智能 DNS 的定位也无非这两点，但是我所理解的智能 DNS 是建立在这两条基础上的智能调度系统，比如我有三个负载能力不同的数据中心，DNS…]]></description><link>https://xdays.me/Bind基于dlz实现智能dns/</link><guid isPermaLink="false">https://xdays.me/Bind基于dlz实现智能dns/</guid><pubDate>Sun, 11 Jan 2015 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;在我看来基于 Bind 的只能 DNS 方案主要包括两个部分：Geolocation 和 Dynamic Record。国内的业界对智能 DNS 的定位也无非这两点，但是我所理解的智能 DNS 是建立在这两条基础上的智能调度系统，比如我有三个负载能力不同的数据中心，DNS 可以根据数据中心的 metrics（这里可能包括带宽，服务能力等）实现流量的调度，限于个人水平个人未在这个方向有所实践，这个话题留作以后讨论，所以本文只针对前两个问题。由于 Bind 本身的配置可运维性比较差，这就引出本文主要讨论的 DLZ。&lt;/p&gt;
&lt;h1&gt;原理&lt;/h1&gt;
&lt;p&gt;DLZ 实际上就是扩展了 Bind，将 Zonefle 的内容放到外部数据库里，然后给 Bind 配置查询语句从数据库里查询记录。当修改数据库里的记录信息的时候，无需重启 Bind，下次客户请求时直接就能返回新的记录了。另外，DLZ 本身不支持缓存，所以需要自己根据实际情况解决查询的问题。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 这里我以 CentOS7 上安装 dlz-mysql 模块为例。&lt;/p&gt;
&lt;h2&gt;安装依赖&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install mariadb-devel gcc wget patch make&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;下载源码&lt;/h2&gt;
&lt;p&gt;Bind9.8 之前的版本需要打 patch，具体可参考 DLZ 官方文档，Bind9.8 之后（包括 9.8）的版本已经集成 DLZ：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget ftp://ftp.isc.org/isc/bind9/9.10.1/bind-9.10.1.tar.gz
tar xzf bind-9.10.1.tar.gz
cd  bind-9.10.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;由于 CentOS7 目录结构上的变更，在编译 dlz-mysql 时会找不到库文件或者 head 文件，所以要做个软连接：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ln -s /usr/lib/mysql /usr/lib64/mysql
./configure --prefix /opt/bind --with-dlz-filesystem --with-dlz-mysql&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;编译&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;make&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;模型&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; DLZ 没有限制用户的数据模型，你可以根据业务逻辑定义模型，然后构造自己的查询语句即可。官方给出了建议的模型。&lt;/p&gt;
&lt;h2&gt;建模&lt;/h2&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Field&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Null&lt;/th&gt;
&lt;th&gt;Key&lt;/th&gt;
&lt;th&gt;Default&lt;/th&gt;
&lt;th&gt;Extra&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;zone&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;host&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;type&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;data&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ttl&lt;/td&gt;
&lt;td&gt;int(11)&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mx_priority&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;refresh&lt;/td&gt;
&lt;td&gt;int(11)&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;retry&lt;/td&gt;
&lt;td&gt;int(11)&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;expire&lt;/td&gt;
&lt;td&gt;int(11)&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;minimum&lt;/td&gt;
&lt;td&gt;int(11)&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;serial&lt;/td&gt;
&lt;td&gt;bigint(20)&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;resp_person&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;primary_ns&lt;/td&gt;
&lt;td&gt;text&lt;/td&gt;
&lt;td&gt;YES&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;td&gt;NULL&lt;/td&gt;
&lt;td&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;ul&gt;
&lt;li&gt;zone 区域&lt;/li&gt;
&lt;li&gt;host 记录名&lt;/li&gt;
&lt;li&gt;type 记录类型&lt;/li&gt;
&lt;li&gt;data 记录值&lt;/li&gt;
&lt;li&gt;ttl 缓存时间&lt;/li&gt;
&lt;li&gt;mx_priority mx 记录优先级&lt;/li&gt;
&lt;li&gt;refresh SOA 记录的刷新时间&lt;/li&gt;
&lt;li&gt;retry SOA 记录的重试时间&lt;/li&gt;
&lt;li&gt;expire SOA 记录的过期时间&lt;/li&gt;
&lt;li&gt;minimum SOA 记录的 minimum&lt;/li&gt;
&lt;li&gt;serial SOA 记录的序列号&lt;/li&gt;
&lt;li&gt;resp_person SOA 记录的序列号&lt;/li&gt;
&lt;li&gt;primary_ns &amp;#x3C;尚不明确这个字段的意义&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;建库建表&lt;/h2&gt;
&lt;p&gt;新建数据库：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;create database demo;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;新建 record 表：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CREATE TABLE IF NOT EXISTS `records` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `zone` varchar(255) NOT NULL,
  `host` varchar(255) NOT NULL,
  `type` enum(&apos;A&apos;,&apos;MX&apos;,&apos;CNAME&apos;,&apos;NS&apos;,&apos;SOA&apos;,&apos;PTR&apos;,&apos;TXT&apos;,&apos;AAAA&apos;,&apos;SVR&apos;,&apos;URL&apos;) NOT NULL,
  `data` varchar(255) NOT NULL,
  `ttl` int(11) NOT NULL,
  `mx_priority` int(11) DEFAULT NULL,
  `refresh` int(11) DEFAULT NULL,
  `retry` int(11) DEFAULT NULL,
  `expire` int(11) DEFAULT NULL,
  `minimum` int(11) DEFAULT NULL,
  `serial` bigint(20) DEFAULT NULL,
  `resp_person` varchar(64) DEFAULT NULL,
  `primary_ns` varchar(64) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `type` (`type`),
  KEY `host` (`host`),
  KEY `zone` (`zone`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;新建 acl 表：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;CREATE TABLE IF NOT EXISTS `acl` (
  `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
  `zone` varchar(255) NOT NULL,
  `client` varchar(255) NOT NULL,
  PRIMARY KEY (`id`),
  KEY `client` (`client`),
  KEY `zone` (`zone`)
) ENGINE=MyISAM  DEFAULT CHARSET=utf8 AUTO_INCREMENT=1;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;GeoIP&lt;/h2&gt;
&lt;p&gt;这块目前还没有那么灵活，基本上都是基于 acl 来实现的。虽然最新版的 bind 9.10 支持 maxmind 的 api 来做 Geo，但还是改写配置文件的方式。下面是一个示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;acl &quot;US&quot; {
     3.0.0.0/8;
     4.0.0.0/25;
     4.0.0.128/26;
     4.0.0.192/28;
     4.0.0.208/29;
     4.0.0.216/30;
     4.0.0.220/31;
};

view &quot;north_america&quot; {
      match-clients { US; CA; MX; };
      recursion no;
      zone &quot;foos.com&quot; {
            type master;
            file &quot;pri/foos-north-america.db&quot;;
      };
};

view &quot;other&quot; {
      match-clients { any; };
      recursion no;
      zone &quot;foos.com&quot; {
            type master;
            file &quot;pri/foos-other.db&quot;;
      };
};&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;该示例引用自&lt;a href=&quot;http://www.ip2location.com/tutorials/simple-geodns-using-bind-and-ip2location&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;但是我们可以通过 DLZ 实现 GeoIP，二次开发一个自己的 driver，然后在 driver 里根据 client ip，结合自己的业务系统实现真正的 Geo 以及智能业务调度。&lt;/p&gt;
&lt;h2&gt;Dynamic Record&lt;/h2&gt;
&lt;p&gt;DLZ 新定义了一个配置关键字 dlz，完整的配置项参考官方文档，这里给出简要说明：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dlz &quot;Mysql zone&quot; { //定义DLZ标识
   database &quot;mysql //database为dlz这个block唯一可指定的关键字，mysql表示使用mysql driver
   {host=localhost dbname=dns_data ssl=tRue} //连接数据库的信息
   {select zone from dns_records where zone = &apos;$zone$&apos;} //用于findzone调用，查询zone
   {select ttl, type, mx_priority, case when lower(type)=&apos;txt&apos; then concat(&apos;\&quot;&apos;, data, &apos;\&quot;&apos;)
        else data end from dns_records where zone = &apos;$zone$&apos; and host = &apos;$record$&apos;
        and not (type = &apos;SOA&apos; or type = &apos;NS&apos;)} //用于lookup调用，查询record
   {select ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum
        from dns_records where zone = &apos;$zone$&apos; and (type = &apos;SOA&apos; or type=&apos;NS&apos;)} //用于authority调用，查询SOA或者NS记录，注意这个配置是可选的，SOA和NS查询可以放到lookup调用里，具体见后文
   {select ttl, type, host, mx_priority, data, resp_person, serial, refresh, retry, expire,
        minimum from dns_records where zone = &apos;$zone$&apos; and not (type = &apos;SOA&apos; or type = &apos;NS&apos;)} //用于allnode调用，和接下来的allowzonexfr一起来提供AXFR查询，可选的配置项
   {select zone from xfr_table where zone = &apos;$zone$&apos; and client = &apos;$client$&apos;} //用于allowzonexfr()调用，用于查询客户端是否可发起AXFR查询，可选的配置项
   {update data_count set count = count + 1 where zone =&apos;$zone$&apos;}&quot;;
};&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 此配置为最新 Bind 版本的配置，如果是打 patch 的版本请将&lt;code class=&quot;language-text&quot;&gt;$&lt;/code&gt;换成&lt;code class=&quot;language-text&quot;&gt;%&lt;/code&gt;，以下的配置同样。&lt;/p&gt;
&lt;p&gt;这里也给出我的配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;logging {
    channel all {
        file &quot;/opt/bind/log/named.log&quot; versions 1;
        print-time yes;
        severity dynamic;
        print-category yes;
        print-severity yes;
    };

    category default { all; };
    category queries { all; };

};

options {
    directory &quot;/opt/bind/var/&quot;;
    listen-on-v6 { none; };
    listen-on { any; };
    pid-file &quot;/var/run/named.pid&quot;;
    recursion yes;
    allow-transfer {127.0.0.1;};
};

dlz &quot;mysql-dlz&quot; {
    database &quot;mysql
    {host=localhost dbname=demo ssl=false port=3306 user=root pass=thinkin}
    {select zone from records where zone = &apos;$zone$&apos; limit 1}
    {select ttl, type, mx_priority, case when lower(type)=&apos;txt&apos; then concat(&apos;\&quot;&apos;, data, &apos;\&quot;&apos;) when lower(type) = &apos;soa&apos; then concat_ws(&apos; &apos;, data, resp_person, serial, refresh, retry, expire, minimum) else data end from records where zone = &apos;$zone$&apos; and host = &apos;$record$&apos;}
    {}
    {select ttl, type, host, mx_priority, data from records where zone = &apos;$zone$&apos; and not (type = &apos;SOA&apos; or type = &apos;NS&apos;)}
    {select zone from acl where zone = &apos;$zone$&apos; and client = &apos;$client$&apos;}&quot;;
};

zone &quot;.&quot; IN {
    type hint;
    file &quot;named.root&quot;;
};

key &quot;rndc-key&quot; {
    algorithm hmac-md5;
        secret &quot;OdEg+tCn/bMe+/2vbJgQvQ==&quot;;
};

controls {
        inet 127.0.0.1 allow { localhost; } keys { &quot;rndc-key&quot;; };
};&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 这里的配置开启了递归解析且支持本机发起的 AXFR 请求。&lt;/p&gt;
&lt;h2&gt;根 zonefile&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget -SO /opt/bind/var/named.root http://www.internic.net/domain/named.root&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/opt/bind/sbin/named -n1 -c /opt/bind/etc/named.conf -d9 -g&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;测试&lt;/h1&gt;
&lt;h2&gt;导入数据&lt;/h2&gt;
&lt;p&gt;导入 records 数据：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;INSERT INTO demo.records (zone, host, type, data, ttl) VALUES (&apos;xdays.me&apos;, &apos;www&apos;, &apos;A&apos;, &apos;1.1.1.1&apos;, &apos;60&apos;);
INSERT INTO demo.records (zone, host, type, data, ttl) VALUES (&apos;xdays.me&apos;, &apos;cloud&apos;, &apos;A&apos;, &apos;2.2.2.2&apos;, &apos;60&apos;);
INSERT INTO demo.records (zone, host, type, data, ttl) VALUES (&apos;xdays.me&apos;, &apos;ns&apos;, &apos;A&apos;, &apos;3.3.3.3&apos;, &apos;60&apos;);
INSERT INTO demo.records (zone, host, type, data, ttl) VALUES (&apos;xdays.me&apos;, &apos;blog&apos;, &apos;CNAME&apos;, &apos;cloud.xdays.me.&apos;, &apos;60&apos;);
INSERT INTO demo.records (zone, host, type, data, ttl) VALUES (&apos;xdays.me&apos;, &apos;@&apos;, &apos;NS&apos;, &apos;ns.xdays.me.&apos;, &apos;60&apos;);
INSERT INTO demo.records (zone, host, type,  ttl, data,refresh, retry, expire, minimum, serial, resp_person) VALUES (&apos;xdays.me&apos;, &apos;@&apos;, &apos;SOA&apos;, &apos;60&apos;, &apos;ns&apos;, &apos;28800&apos;, &apos;14400&apos;, &apos;86400&apos;, &apos;86400&apos;, &apos;2012020809&apos;, &apos;admin&apos;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;导入 acl 数据：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;INSERT INTO demo.acl (zone, client) VALUES (&apos;xdays.me&apos;, &apos;127.0.0.1&apos;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;测试记录&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dig @127.0.0.1 www.xdays.me a
dig @127.0.0.1 blog.xdays.me a
dig @127.0.0.1 blog.xdays.me cname
dig @127.0.0.1 xdays.me ns
dig @127.0.0.1 www.xdays.me axfr&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;#参考&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置指令参考 &lt;a href=&quot;http://bind-dlz.sourceforge.net/mysql_driver.html&quot;&gt;DLZ 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;安装文档参考 &lt;a href=&quot;http://www.vfeelit.com/610.html&quot;&gt;这篇&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Bind 的 GeoIP 支持参考 &lt;a href=&quot;https://kb.isc.org/article/AA-01149/0/Using-the-GeoIP-Features-in-BIND-9.10.html&quot;&gt;这篇&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Puppet之API操作]]></title><description><![CDATA[背景 最近在做一个自动部署实例的项目，大致流程是首先调用 AWS 的 API 来生成实例，然后用 Puppet 来部署相关服务。但是由于 AWS 的 EIP 是可回收的，也就是说新起的实例可能会被分配到一个之前已经使用过 EIP，由于证书名称是根据 EIP…]]></description><link>https://xdays.me/Puppet之API操作/</link><guid isPermaLink="false">https://xdays.me/Puppet之API操作/</guid><pubDate>Wed, 31 Dec 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;最近在做一个自动部署实例的项目，大致流程是首先调用 AWS 的 API 来生成实例，然后用 Puppet 来部署相关服务。但是由于 AWS 的 EIP 是可回收的，也就是说新起的实例可能会被分配到一个之前已经使用过 EIP，由于证书名称是根据 EIP 来的，就会导致有对应的证书名称已经在 Puppet 上记录了，这样就会导致 Puppet 这个环节失败。鉴于如此，需要在给实例绑定上 EIP 之后远程清除下 Puppet 上对应的证书，这样就用到了 Puppet 的 API 操作。&lt;/p&gt;
&lt;h1&gt;基础&lt;/h1&gt;
&lt;p&gt;Puppet 支持 RESTful 的 API：master 端主要涉及 catalog，certificate，report, resource, file, node, status,和 fact；agent 端主要涉及 fact 和 run。关于这些资源的详细操作参考&lt;a href=&quot;https://docs.puppetlabs.com/guides/rest_api.html&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;关于 API 的另一方面就是安全方面，Puppet 用一个单独的文件（文件名由 rest_authconfig）来配置 API 的 ACL，具体 ACL 的语法如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;path [~] {/path/to/resource|regex}
[environment {list of environments}]
[method {list of methods}]
[auth[enthicated] {yes|no|on|off|any}]
[allow {hostname|certname|*}]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;path 为请求的 url&lt;/li&gt;
&lt;li&gt;environment 为环境，如 production&lt;/li&gt;
&lt;li&gt;method 为请求方法，包括 find, search, save 和 destroy&lt;/li&gt;
&lt;li&gt;auth 为是否需要认证，包括 yes, no 和 any(就是都可以)&lt;/li&gt;
&lt;li&gt;allow 为匹配 nodename，2.7.1 之后支持正则&lt;/li&gt;
&lt;li&gt;allow_ip 为匹配 ip 地址或者网段&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;服务端&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;path /certificate_status
environment production,stage
auth yes
method find, search, save, destroy
allow *&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;客户端&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -s --insecure --cert /var/lib/puppet/ssl/certs/test2.xdays.me.pem --key /var/lib/puppet/ssl/private_keys/test2.xdays.me.pem --cacert /var/lib/puppet/ssl/certs/ca.pem -H &quot;Accept: pson&quot; https://puppet.xdays.me:8140/stage/certificate_statuses/no_key | python -m json.tool&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -s --insecure  -X PUT --cert /var/lib/puppet/ssl/certs/test2.xdays.me.pem --key /var/lib/puppet/ssl/private_keys/test2.xdays.me.pem --cacert /var/lib/puppet/ssl/certs/ca.pem -H &quot;Content-Type: text/pson&quot; --data &apos;{&quot;desired_state&quot;:&quot;signed&quot;}&apos; https://puppet.xdays.me:8140/stage/certificate_status/test2.xdays.me&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -s -X DELETE --insecure --cert /var/lib/puppet/ssl/certs/test2.xdays.me.pem --key /var/lib/puppet/ssl/private_keys/test2.xdays.me.pem --cacert /var/lib/puppet/ssl/certs/ca.pem -H &quot;Accept: pson&quot; https://puppet.xdays.me:8140/stage/certificate_status/test2.xdays.me
&quot;Deleted for test2.xdays.me: Puppet::SSL::Certificate&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;扩展&lt;/h1&gt;
&lt;p&gt;基于上一小节的 curl 操作，可以用 Python 简单封装一个 Puppet 的 SDK 用于日常操作，目前我发现已经有人做了&lt;a href=&quot;https://github.com/daradib/pypuppet&quot;&gt;这个&lt;/a&gt;。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[God进程管理]]></title><description><![CDATA[功能 优点 配置即 ruby 代码，灵活 可管理后台进程 可动态加载配置 可根据进程消耗资源重启进程 丰富的通知功能，如邮件，campfire 等 支持 poll 和 event 两种检测模式 缺点 配置复杂，需要 ruby 背景 文档太少 配置 poll 模式： event…]]></description><link>https://xdays.me/进程管理god/</link><guid isPermaLink="false">https://xdays.me/进程管理god/</guid><pubDate>Sat, 18 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;功能&lt;/h1&gt;
&lt;p&gt;优点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置即 ruby 代码，灵活&lt;/li&gt;
&lt;li&gt;可管理后台进程&lt;/li&gt;
&lt;li&gt;可动态加载配置&lt;/li&gt;
&lt;li&gt;可根据进程消耗资源重启进程&lt;/li&gt;
&lt;li&gt;丰富的通知功能，如邮件，campfire 等&lt;/li&gt;
&lt;li&gt;支持 poll 和 event 两种检测模式&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置复杂，需要 ruby 背景&lt;/li&gt;
&lt;li&gt;文档太少&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;p&gt;poll 模式：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;RAILS_ROOT = &quot;/Users/tom/dev/gravatar2&quot;

%w{8200 8201 8202}.each do |port|
  God.watch do |w|
    w.name = &quot;gravatar2-mongrel-#{port}&quot;
    w.start = &quot;mongrel_rails start -c #{RAILS_ROOT} -p #{port} \
      -P #{RAILS_ROOT}/log/mongrel.#{port}.pid  -d&quot;
    w.stop = &quot;mongrel_rails stop -P #{RAILS_ROOT}/log/mongrel.#{port}.pid&quot;
    w.restart = &quot;mongrel_rails restart -P #{RAILS_ROOT}/log/mongrel.#{port}.pid&quot;
    w.pid_file = File.join(RAILS_ROOT, &quot;log/mongrel.#{port}.pid&quot;)
    w.behavior(:clean_pid_file)

    w.start_if do |start|
      start.condition(:process_running) do |c|
        c.interval = 5.seconds
        c.running = false
      end
    end

    w.restart_if do |restart|
      restart.condition(:memory_usage) do |c|
        c.above = 150.megabytes
        c.times = [3, 5] # 3 out of 5 intervals
      end

      restart.condition(:cpu_usage) do |c|
        c.above = 50.percent
        c.times = 5
      end
    end

    # lifecycle
    w.lifecycle do |on|
      on.condition(:flapping) do |c|
        c.to_state = [:start, :restart]
        c.times = 5
        c.within = 5.minute
        c.transition = :unmonitored
        c.retry_in = 10.minutes
        c.retry_times = 5
        c.retry_within = 2.hours
      end
    end
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;event 模式：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;RAILS_ROOT = &quot;/Users/tom/dev/gravatar2&quot;

God.watch do |w|
  w.name = &quot;local-3000&quot;

  w.start = &quot;mongrel_rails start -c #{RAILS_ROOT} -P #{RAILS_ROOT}/log/mongrel.pid -p 3000 -d&quot;
  w.stop = &quot;mongrel_rails stop -P #{RAILS_ROOT}/log/mongrel.pid&quot;
  w.restart = &quot;mongrel_rails restart -P #{RAILS_ROOT}/log/mongrel.pid&quot;

  w.pid_file = File.join(RAILS_ROOT, &quot;log/mongrel.pid&quot;)
  # clean pid files before start if necessary
  w.behavior(:clean_pid_file)

  # determine the state on startup
  w.transition(:init, { true =&gt; :up, false =&gt; :start }) do |on|
    on.condition(:process_running) do |c|
      c.running = true
    end
  end

  # determine when process has finished starting
  w.transition([:start, :restart], :up) do |on|
    on.condition(:process_running) do |c|
      c.running = true
    end

    # failsafe
    on.condition(:tries) do |c|
      c.times = 5
      c.transition = :start
    end
  end

  # start if process is not running
  w.transition(:up, :start) do |on|
    on.condition(:process_exits)
  end

  # restart if memory or cpu is too high
  w.transition(:up, :restart) do |on|
    on.condition(:memory_usage) do |c|
      c.interval = 20
      c.above = 50.megabytes
      c.times = [3, 5]
    end

    on.condition(:cpu_usage) do |c|
      c.interval = 10
      c.above = 10.percent
      c.times = [3, 5]
    end
  end

  # lifecycle
  w.lifecycle do |on|
    on.condition(:flapping) do |c|
      c.to_state = [:start, :restart]
      c.times = 5
      c.within = 5.minute
      c.transition = :unmonitored
      c.retry_in = 10.minutes
      c.retry_times = 5
      c.retry_within = 2.hours
    end
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;操作&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;god status 查看被监控进程状态
god start|stop|restart 启动关闭重启进程
god load 动态加载配置
god signal 给进程发信号
&amp;lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Monit进程管理]]></title><description><![CDATA[#功能
优点 性能高，占用内存少 邮件通知 HTTP 界面 检测系统性能参数 检测文件属性 检测服务状态 检测文件系统 检测远程主机 缺点 没有 API 准确性 配置复杂 配置 操作]]></description><link>https://xdays.me/进程管理之monit/</link><guid isPermaLink="false">https://xdays.me/进程管理之monit/</guid><pubDate>Sat, 18 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#功能
优点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;性能高，占用内存少&lt;/li&gt;
&lt;li&gt;邮件通知&lt;/li&gt;
&lt;li&gt;HTTP 界面&lt;/li&gt;
&lt;li&gt;检测系统性能参数&lt;/li&gt;
&lt;li&gt;检测文件属性&lt;/li&gt;
&lt;li&gt;检测服务状态&lt;/li&gt;
&lt;li&gt;检测文件系统&lt;/li&gt;
&lt;li&gt;检测远程主机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;没有 API&lt;/li&gt;
&lt;li&gt;准确性&lt;/li&gt;
&lt;li&gt;配置复杂&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;set daemon 60 # check services at 1-minute intervals
set logfile /var/log/monit.log
set pidfile /var/run/monit.pid
set idfile /var/.monit.id
set statefile /var/.monit.state
set mailserver smtp.xdays.me port 25
  username &quot;admin@xdays.me&quot; password &quot;password&quot;
  #using tlsv1
set mail-format { from: admin@xdays.me }
set alert easedays@gmail.com # receive all alerts

set httpd port 2812 and
    use address localhost
    allow localhost

check system cloud.xdays.me
  if loadavg (1min) &gt; 4 then alert
  if loadavg (5min) &gt; 2 then alert
  if memory usage &gt; 75% then alert
  if swap usage &gt; 25% then alert
  if cpu usage (user) &gt; 70% then alert
  if cpu usage (system) &gt; 30% then alert
  if cpu usage (wait) &gt; 20% then alert

check process nginx with pidfile /var/run/nginx.pid
  start program = &quot;/usr/sbin/service nginx start&quot;
  stop program = &quot;/usr/sbin/service nginx stop&quot;
  if cpu &gt; 60% for 2 cycles then alert
  if cpu &gt; 80% for 5 cycles then restart
  if totalmem &gt; 200.0 MB for 5 cycles then restart
  if children &gt; 250 then restart
  if loadavg(5min) greater than 10 for 8 cycles then stop
  if failed host www.xdays.me port 80 protocol http
    and request &quot;/&quot;
  then restart
  if failed port 443 type tcpssl protocol http
    with timeout 15 seconds
  then restart
  if 3 restarts within 5 cycles then timeout&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;操作&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;monit -t 检测配置文件语法
monit reload 重新加载配置文件
monit status 查看服务状态
monit start|stop|restart 启动和关闭服务
&amp;lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Supervisor进程管理]]></title><description><![CDATA[功能 优点 配置简单 管理精准 进程组管理 RPC 扩展 API 支持 FastCGI 进程管理 事件支持（如定时任务） 缺点 被管理进程必须前台运行 退出后会使被监管的进程也退出 配置 操作]]></description><link>https://xdays.me/进程管理supervisor/</link><guid isPermaLink="false">https://xdays.me/进程管理supervisor/</guid><pubDate>Sat, 18 Oct 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;功能&lt;/h1&gt;
&lt;p&gt;优点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;配置简单&lt;/li&gt;
&lt;li&gt;管理精准&lt;/li&gt;
&lt;li&gt;进程组管理&lt;/li&gt;
&lt;li&gt;RPC 扩展&lt;/li&gt;
&lt;li&gt;API 支持&lt;/li&gt;
&lt;li&gt;FastCGI 进程管理&lt;/li&gt;
&lt;li&gt;事件支持（如定时任务）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;缺点&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;被管理进程必须前台运行&lt;/li&gt;
&lt;li&gt;退出后会使被监管的进程也退出&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[unix_http_server]
file=/var/run/supervisor.sock
chmod=0700

[supervisord]
logfile=/var/log/supervisor/supervisord.log
pidfile=/var/run/supervisord.pid
childlogdir=/var/log/supervisor

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=unix:///var/run/supervisor.sock

[program:cow]
command=/web/root/bin/cow -rc=&quot;/web/root/etc/cow.conf&quot;
autostart=true
autorestart=true
redirect_stderr=true
stderr_logfile=NONE


[include]
files = /etc/supervisor/conf.d/*.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;操作&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;supervisorctl status 查看进程状态
supervisorctl reload 重启supervisord
supervisorctl start|stop|restart 启动关闭重启进程
&amp;lt;/pre&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[意料之外的情理之中]]></title><description><![CDATA[#改变
7…]]></description><link>https://xdays.me/意料之外的情理之中/</link><guid isPermaLink="false">https://xdays.me/意料之外的情理之中/</guid><pubDate>Sun, 24 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#改变
72 小时前我还和我女朋友在陪同学逛西湖，现在我在芍药居的一个合租房子里敲着这些字儿。当我拖着一个沉重的行李箱走出北京南的时候，瞬间被淹没在汹涌的人潮中，突然有一种不太好形容的（失落？密集恐惧症？反正是消极的）感觉，不再是三年前初生牛犊不怕虎，我知道自己来干嘛了，也知道会面对什么了。&lt;/p&gt;
&lt;p&gt;#为何
对于工作，每个人都有自己的衡量标准，在我看来，就是在发展和待遇间找到一个好的权衡点，不适合或者有更适合的就走，合适就留，然后踏踏实实做有价值的事情。关于生活，退居二线仍然是我希望的一种生活方式。说下离开杭州的理由：从工作上说应该毫无疑问，比 double 多的待遇，外企的环境，完败国内运维环境的技术；从生活上说也许很难，杭州环境优美生活节奏慢，北京环境差生活节奏快，但是要定居杭州挺难，优越的条件都建立在你有资本稳定下来，那么同样无法稳定下来，我就需要做个着眼未来的选择。综合工作和生活考虑，做出回北京这个对的决定，虽然它不一定是好的。&lt;/p&gt;
&lt;p&gt;#计划
因为拖延症，计划就成了最没用的东西，但是即便如此也不能放弃计划不是，所以简单列举下吧。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;去他的拖延症&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;跑步计划，囚徒健身&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;英语学习&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;研发方向&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;理论基础培训&lt;/li&gt;
&lt;li&gt;linux 深入&lt;/li&gt;
&lt;li&gt;写些项目&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;开发运维&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;python 高级方向&lt;/li&gt;
&lt;li&gt;javascript 熟练方向&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;云&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;aws&lt;/li&gt;
&lt;li&gt;openstack&lt;/li&gt;
&lt;li&gt;docker&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;目标应该越来越小，越来越高！&lt;/p&gt;
&lt;p&gt;#感谢
我不擅长感谢，因为感谢被用烂了。昨天晚上我和兄弟们吃完饭后，回来的路上遇见一个人找人帮忙搬下电视，那个人用一种奇怪的眼光拒绝了他，我恰好经过就帮他搬过去了，从他延伸里我看到了那种我相信的真正的感谢。所以还是要感谢的，感谢灿哥带给我这个挑战的机会，真诚地感谢。最后，我的她，也许我不需要感谢，因为我们是一起的，不分你我，你懂。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker详解]]></title><description><![CDATA[说明 本文档来自前段时间写的一个slide，由于 remark 没有很好的支持嵌入到 HTML 中，只能把 markdown 搬过来了。 Docker by 张向军 Agenda…]]></description><link>https://xdays.me/Docker详解/</link><guid isPermaLink="false">https://xdays.me/Docker详解/</guid><pubDate>Sat, 16 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;iframe width=&quot;100%&quot; height=&quot;500px&quot; frameborder=&quot;0&quot; src=&quot;https://x.xdays.me/slide/docker.html&quot;&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;strong&gt;说明&lt;/strong&gt; 本文档来自前段时间写的一个&lt;a href=&quot;https://x.xdays.me/slide/docker.html&quot;&gt;slide&lt;/a&gt;，由于 remark 没有很好的支持嵌入到 HTML 中，只能把 markdown 搬过来了。&lt;/p&gt;
&lt;h1&gt;Docker&lt;/h1&gt;
&lt;h4&gt;by 张向军&lt;/h4&gt;
&lt;hr&gt;
&lt;h1&gt;Agenda&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;##简介&lt;/li&gt;
&lt;li&gt;##概念&lt;/li&gt;
&lt;li&gt;##基础&lt;/li&gt;
&lt;li&gt;##高级&lt;/li&gt;
&lt;li&gt;##扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;简介&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;针对可移植的应用的简单轻量虚拟环境&lt;/li&gt;
&lt;li&gt;基于容器提供沙箱，基于 cgroup 和 namespace 做到资源的隔离&lt;/li&gt;
&lt;li&gt;快速，启动容器就是启动进程&lt;/li&gt;
&lt;li&gt;轻量，只需要应用运行的依赖&lt;/li&gt;
&lt;li&gt;容器即目录，故传输方便&lt;/li&gt;
&lt;li&gt;使用 aufs 或者 devicemapper 等技术作为存储引擎，节省空间&lt;/li&gt;
&lt;li&gt;仓库机制，可相互分享，搜索等&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;概念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;##cgroups&lt;/li&gt;
&lt;li&gt;##lxc&lt;/li&gt;
&lt;li&gt;##aufs&lt;/li&gt;
&lt;li&gt;##devicemapper&lt;/li&gt;
&lt;li&gt;##namespace&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;概念-cgroups&lt;/h1&gt;
&lt;p&gt;cgroups 全称 control groups，是 linux 内核提供的一种限制、记录和隔离进程组所使用物理资源的一种机制。在 2.6.24 之后的内核中都已经支持 cgroups。详细的介绍请参考&lt;a href=&quot;http://files.cnblogs.com/lisperl/cgroups%E4%BB%8B%E7%BB%8D.pdf&quot;&gt;cgroups 详解&lt;/a&gt;和&lt;a href=&quot;https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt&quot;&gt;cgroups 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;应用场景：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;进程隔离&lt;/li&gt;
&lt;li&gt;资源统计&lt;/li&gt;
&lt;li&gt;进程控制&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;基本概念：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;task，被 cgoups 管理的进程&lt;/li&gt;
&lt;li&gt;control group，分配资源的基本单位&lt;/li&gt;
&lt;li&gt;hierarchy，层级，也就是限制的继承关系&lt;/li&gt;
&lt;li&gt;subsystem，资源控制器&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;p&gt;#概念-lxc&lt;/p&gt;
&lt;p&gt;lxc 全称是 linux container，是基于 cgroups 和 chroot 等内核特性的一组工具，用于构建虚拟环境。通过一系列的命令行工具可以创建，修改，删除虚拟环境。具体用法可参考&lt;a href=&quot;http://manpages.ubuntu.com/manpages/lucid/man7/lxc.7.html&quot;&gt;ubuntu 官方文档&lt;/a&gt;和&lt;a href=&quot;https://linuxcontainers.org/&quot;&gt;LXC 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;#概念-aufs&lt;/p&gt;
&lt;p&gt;aufs 全称是 advance(another) union file system，是一种联合文件系统。这种文件系统最重要的一个特性就是有一个层的概念和复制时拷贝，可以做到当文件系统改变时只影响其中一层，其他层保持不变。举个例子，整个文件系统就像由一层一层的玻璃组成的，你从上往下看能看到所有的图案（如果上下层的玻璃完全重合则只能看见上层的玻璃对应的图案），而当你需要新增或者修改图案时就只能在最上层的玻璃上操作。具体的一些操作例子可参考&lt;a href=&quot;http://www.thegeekstuff.com/2013/05/linux-aufs/&quot;&gt;geekstuff 的 aufs 演示&lt;/a&gt;和&lt;a href=&quot;http://aufs.sourceforge.net/aufs3/man.html&quot;&gt;aufs 官方文档&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;#概念-devicemapper&lt;/p&gt;
&lt;p&gt;官方说，使用了 LVM 的镜像功能的高级变种作为一种存储引擎。简单来说，devicemapper 是内核的逻辑卷管理框架，它可以做到将多个设备的块映射到一个逻辑卷上，然后对外提供 IO 服务。具体可参考&lt;a href=&quot;http://www.ibm.com/developerworks/cn/linux/l-devmapper/&quot;&gt;Linux 内核中的 Device Mapper 机制&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;#概念-namespace&lt;/p&gt;
&lt;p&gt;内核级别的资源隔离方案，PID 和 Network 等不再是全局性的而是属于特定的 Namespace，每个 Namespace 对其他的 Namespace 都是透明的。具体可参考&lt;a href=&quot;http://www.cnblogs.com/lisperl/archive/2012/05/03/2480316.html&quot;&gt;Linux Namespaces 机制&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;基础&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;##安装&lt;/li&gt;
&lt;li&gt;##拉取&lt;/li&gt;
&lt;li&gt;##运行&lt;/li&gt;
&lt;li&gt;##提交&lt;/li&gt;
&lt;li&gt;##再运行&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;基础-安装&lt;/h1&gt;
&lt;h2&gt;依赖&lt;/h2&gt;
&lt;p&gt;内核需要 3.8 以上, ubuntu-12.04 以上，centos-6.5 最新内核&lt;/p&gt;
&lt;h2&gt;ubuntu&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -s https://get.docker.io/ubuntu/ | sudo sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;centos&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -ivh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
yum install -y docker-io&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;hr&gt;
&lt;h1&gt;基础-拉取&lt;/h1&gt;
&lt;h2&gt;命令&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker pull ubuntu&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解释&lt;/h2&gt;
&lt;p&gt;从 Docker 官方的 index 上拉取仓库&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; 其实拉取的过程就是复制的过程&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;基础-运行&lt;/h1&gt;
&lt;h2&gt;命令&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -i -t ubuntu /bin/bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解释&lt;/h2&gt;
&lt;p&gt;从 ubuntu 这个镜像运行一个 container，container 里的进程为 bash&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;基础-提交&lt;/h1&gt;
&lt;h2&gt;命令&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker  commit id user/name
docker push user/name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解释&lt;/h2&gt;
&lt;p&gt;在容器里执行一些改动之后，将这些改动提交到仓库里去，也就是添加了一个新的镜像；然后把这个新的镜像推送到 Docker 的 index 上去。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;基础-再运行&lt;/h1&gt;
&lt;h2&gt;命令&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker pull user/name
docker run -i -t user/name /bin/bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解释&lt;/h2&gt;
&lt;p&gt;再次从 index 上拉取镜像，然后从新的镜像启动 container。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;##Dockerfile&lt;/li&gt;
&lt;li&gt;##Link&lt;/li&gt;
&lt;li&gt;##端口映射&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;高级-Dockerfile-简介&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;描述了一个 image 应该是什么样的，然后通过 &lt;code class=&quot;language-text&quot;&gt;docker build&lt;/code&gt; 来生成 image&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级-Dockerfile-指令参考&lt;/h1&gt;
&lt;h2&gt;指令参考&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;FROM 当前镜像基于哪个镜像生成&lt;/li&gt;
&lt;li&gt;AUTHOR 镜像作者&lt;/li&gt;
&lt;li&gt;ADD 向镜像里添加文件&lt;/li&gt;
&lt;li&gt;RUN 运行一些安装和命令或者脚本&lt;/li&gt;
&lt;li&gt;EXPOSE 指定链接时暴漏给其他容器的端口&lt;/li&gt;
&lt;li&gt;CMD 启动容器时默认执行的命令&lt;/li&gt;
&lt;li&gt;ENTRYPOINT 启动容器时运行的程序&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;CMD 和 ENTRYPOINT 的区别&lt;/h2&gt;
&lt;p&gt;就是命令和选项的区别，ENTRYPOINT 是命令，CMD 是选项&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级-Dockerfile-演示&lt;/h1&gt;
&lt;h2&gt;演示&lt;/h2&gt;
&lt;h3&gt;命令&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker build -t image_name /path/to/dockerfile_dir&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;解释&lt;/h3&gt;
&lt;p&gt;通过指定 Dockerfile 所在路径，docker 自动构建 image&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级-link-简介&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;一种让 Container 之间相互通信更友好的方式，被链接的 container 的信息直接在其他 container 的环境变量里得以体现。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级-link-演示&lt;/h1&gt;
&lt;h2&gt;演示&lt;/h2&gt;
&lt;h3&gt;命令&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name redis redis
docker run -d --name consumer --link redis:redis ubuntu /bin/bash&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;解释&lt;/h3&gt;
&lt;p&gt;首先启动一个 redis 的 container，然后将该 container 链接到 consumer 这个 container 上，然后我们可以从这个容器里通过环境变量访问到 redis 的相关信息。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级-端口映射-简介&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;一种让 container 提供公网服务的技术，底层为 iptables 的 DNAT 技术实现。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;高级-端口映射-演示&lt;/h1&gt;
&lt;h2&gt;演示&lt;/h2&gt;
&lt;h3&gt;命令&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name redis -p 6379 redis&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;解释&lt;/h3&gt;
&lt;p&gt;将物理机的 6379 端口映射到 redis 这个 container 的 6379 端口上。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;扩展&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;##网络相关&lt;/li&gt;
&lt;li&gt;##开机启动&lt;/li&gt;
&lt;/ul&gt;
&lt;hr&gt;
&lt;h1&gt;扩展-网络相关-简介&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;传统上，Docker 的网络技术其实就是基于网桥和 iptables 的技术，0.11 版本引入 host 模式的网络模式，允许 container 完全共享物理机的网络，不再需要 iptables 做映射。&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;扩展-网络相关-演示&lt;/h1&gt;
&lt;h2&gt;演示&lt;/h2&gt;
&lt;h3&gt;命令&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -d --name redis --net host redis /sbin/ip addr&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;解释&lt;/h3&gt;
&lt;p&gt;直接使用物理机的网络&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;扩展-开机启动&lt;/h1&gt;
&lt;h2&gt;外部&lt;/h2&gt;
&lt;p&gt;也就是如何开机启动对应的容器，主要有两步操作：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;关闭 Docker 的自动启动特性&lt;code class=&quot;language-text&quot;&gt;-r=false&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;配合 upstart 或者 systemd 的配置文件，调用 Docker 命令来开机启动&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;内部&lt;/h2&gt;
&lt;p&gt;也就是如何在启动容器时再其内部自动启动进程。很遗憾，目前 Docker 容器和 systemd 还不兼容。目前我用的方案是 supervisor 来管理容器内的进程。详见&lt;a href=&quot;http://gitlab.widget-inc.com/xdays/docker-upops&quot;&gt;upops 项目的 Dockerfile&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;资源&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.docker.io/en/latest/&quot;&gt;Official Document&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.docker.io/docker-weekly-archives/&quot;&gt;Docker Weekly&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.dockerbook.com&quot;&gt;Docker Book&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://groups.google.com/forum/#!forum/docker-user&quot;&gt;User Group&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h1&gt;Q&amp;#x26;A&lt;/h1&gt;</content:encoded></item><item><title><![CDATA[Pelican和Github构建静态博客]]></title><description><![CDATA[#缘起
最近因为要换工作了，时间比较空闲，所以打算好好整理下自己的博客。想来博客写的越来越少也挺惭愧，好多东西都只停留在笔记的草稿阶段，没有写成博客，后续慢慢整理出来。回到正题，我开博客伊始一直用 wordpress（下文简称 WP…]]></description><link>https://xdays.me/Pelican和Github构建静态博客/</link><guid isPermaLink="false">https://xdays.me/Pelican和Github构建静态博客/</guid><pubDate>Fri, 15 Aug 2014 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;#缘起
最近因为要换工作了，时间比较空闲，所以打算好好整理下自己的博客。想来博客写的越来越少也挺惭愧，好多东西都只停留在笔记的草稿阶段，没有写成博客，后续慢慢整理出来。回到正题，我开博客伊始一直用 wordpress（下文简称 WP），有点自然不必多说，成熟稳定，功能全面，主题丰富；但是我最近渐渐在思考我真的需要它么，我的日常操作不过是当我的笔记草稿足以成型为一篇博客，我把它粘贴到 WP 的编辑框，选择下分类，打上标签，点击发布，仅此而已；为此还安装插件让 WP 支持直接在编辑器里贴 markdown；所以我需要的只不过是能够渲染 markdown，生成静态 html 即可，不需要 php，也不需要数据库；此外，博客自动发布也是我需要的一个功能。&lt;/p&gt;
&lt;p&gt;#计划
首先，选择静态博客生成器。目前 jekyll 的风头最大，但我没有选择他有两个原因：一是学习成本比较高，我只是想用你生成 html 你却让我学习那么多东西，不值得；二是我是 Python 党，我希望我用的工具能提升我的 Python 技能，嗯，这个也很重要。所以我选择用&lt;a href=&quot;http://getpelican.com&quot;&gt;Pelican&lt;/a&gt;，它足够简单，拿到就可以使用。&lt;/p&gt;
&lt;p&gt;然后，迁移。基本所有的静态博客项目都提供了导入的功能，尤其从 WP 这样如此流行的项目，但是&lt;code class=&quot;language-text&quot;&gt;pelican-import&lt;/code&gt;这个工具在字符处理有一些坑，这个后边会详细提到。&lt;/p&gt;
&lt;p&gt;再次，版本。既然所有的东西都是静态文本文件，那么自然而然想到可以用 Git 来管理所有 mardown 文本，托管在 Github。&lt;/p&gt;
&lt;p&gt;最后，自动发布。其实自动发布是个可有可无的功能，自己封装个脚本在写好 markdown 之后运行下脚本即可，成本和在 WP 上点击下发布相当，但是既然已经用上 Github 那何不好好用用 Github 的&lt;a href=&quot;https://developer.github.com/webhooks/&quot;&gt;Webhook&lt;/a&gt;呢，这样就可以在新博客提交到 Github 时触发一个动作，剩下的就是响应这个动作来做博客构建了。博客构建是有逻辑的，而我不想为这一个需求再引入其他 php 或者 python 应用，考虑到静态博客唯一需要的就是一个 Web 服务器，我决定用 Ningx+Lua 的模式来处理这个 Webhook。&lt;/p&gt;
&lt;p&gt;至此，所有需求都有了恰当的解决办法。&lt;/p&gt;
&lt;p&gt;#实施
##pelican ###安装
pip install pelican markdown&lt;/p&gt;
&lt;p&gt;###配置
pelican-quickstart&lt;/p&gt;
&lt;p&gt;###使用
pelican 的配置文件就是一个 python 代码文件，一般在博客根目录下的 pelicanconf.py，主要定义一些博客本身的元信息，具体配置项可参考&lt;a href=&quot;http://docs.getpelican.com/en/3.4.0/settings.html&quot;&gt;这里&lt;/a&gt;。content 目录为 markdown 文件存放目录，每篇博客一个文件，在每篇文件得开头写一些 meta 信息，指定标题，作者，分类，tag 和 slug 等信息。&lt;/p&gt;
&lt;p&gt;修改 pelicanconf.py，我的配置内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/usr/bin/env python
# -*- coding: utf-8 -*- #
from __future__ import unicode_literals

# Misc
AUTHOR = u&apos;xdays&apos;
SITENAME = u&apos;xdays&apos;
SITEURL = &apos;http://xdays.me&apos;
KEYWORD = &apos;架构，运维，开发, 生活随想&apos;
PATH = &apos;content&apos;
STATIC_PATHS = [&apos;wp-content&apos;]

# Time
TIMEZONE = &apos;Asia/Shanghai&apos;
DEFAULT_LANG = u&apos;zh&apos;

# Feed
FEED_ALL_ATOM = None
CATEGORY_FEED_ATOM = None
TRANSLATION_FEED_ATOM = None

# Menu
MENUITEMS = ((&apos;首页&apos;, SITEURL),)
DISPLAY_PAGES_ON_MENU = True
DISPLAY_CATEGORIES_ON_MENU = False

# Pagination
DEFAULT_PAGINATION = 20

# Output
DELETE_OUTPUT_DIRECTORY = True

# Disqus
DISQUS_SITENAME = &quot;xdays&quot;

# Github
GITHUB_USER = &apos;xdays&apos;
GITHUB_REPO_COUNT = 5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后生成博客：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pelican -s pelicanconf.py -t theme content&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意：&lt;code class=&quot;language-text&quot;&gt;-t&lt;/code&gt;可以指定主题路径&lt;/p&gt;
&lt;p&gt;##pelican-import
首先要导出 wordpress 的文章为 xml 文件，需要安装一个叫&lt;code class=&quot;language-text&quot;&gt;wordpress-importer&lt;/code&gt;的插件。&lt;/p&gt;
&lt;p&gt;安装&lt;code class=&quot;language-text&quot;&gt;pelican-import&lt;/code&gt;的依赖：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install python-lxml pandoc
pip install BeautifulSoup4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;导出 markdown 文件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pelican-import --wpfile wordpress.xml -m markdown -o content&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;下边开始说坑，在每个 markdown 文件有个 slug 的 meta 标记，这个标记是生成的 html 的文件名，但是由于 pelican-import 对字符集处理的不是太好，所以需要自己手动将 slug 进行一次 unquote，然后用 unquote 之后的字符串来命名文件，废话少说，上代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/usr/bin/env python
# -*- coding: utf-8 -*-

from urllib import unquote
import os
import sys

top = sys.argv[1]
out = sys.argv[2]
flist = sum([[os.path.join(base,file) for file in files] for base,dirs,files in os.walk(top)],[])

os.mkdir(out)

for i in flist:
    dirname = os.path.dirname(i)
    with open(i) as f:
        s = f.readlines()
        for l in s:
            if l.startswith(&apos;Slug&apos;):
                index = s.index(l)
                p = l.strip().split()
                filename = unquote(p[-1])
                p[-1] = filename + &apos;\n&apos;
                s[index]=&apos; &apos;.join(p)
                with open(&apos;%s/%s.md&apos;%(out, filename), &apos;w&apos;) as g:
                        g.write(&apos;&apos;.join(s))
                break&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这段代码接受两个参数：第一个是导出的 markdown 目录，第二个是处理后的 markdown 文件存放目录。&lt;/p&gt;
&lt;p&gt;##Github
将整个博客目录交给 Git 管理：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git init
git add .
git commit -m &apos;first owesome commit&apos;
git remote add origin git@github.com:xdays/xdays.me.git
git push -u origin master&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后配置 webhook，具体参考&lt;a href=&quot;https://developer.github.com/webhooks/&quot;&gt;Github 文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;##Nginx+Lua ###安装
安装过程涉及的环节比较多，也可以直接使用&lt;a href=&quot;http://openresty.org/&quot;&gt;openresty&lt;/a&gt;，下面脚本详细说明了安装过程：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install libpcre3-dev zlib1g-dev build-essential

cd ~
wget http://nginx.org/download/nginx-1.7.4.tar.gz
tar xzf nginx-1.7.4.tar.gz
wget http://luajit.org/download/LuaJIT-2.0.3.tar.gz
tar xzf LuaJIT-2.0.3.tar.gz
wget https://github.com/chaoslawful/lua-nginx-module/archive/v0.9.10.tar.gz
mv v0.9.10.tar.gz lua-nginx-module-0.9.10.tar.gz
tar xzf lua-nginx-module-0.9.10.tar.gz

cd ~/LuaJIT-2.0.3
make install PREFIX=/usr/local/xengine/luajit
cd ~/nginx-1.7.4
./configure --with-ld-opt=&quot;-Wl,-rpath,/usr/local/xengine/luajit/lib&quot; --with-http_stub_status_module --add-module=/root/lua-nginx-module-0.9.10/ --prefix=/usr/local/xengine/nginx
make -j2
make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;###配置
在博客的的 server 配置里添加如下配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    location /example-url {
        content_by_lua_file /path/to/genblog.lua;
    }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再上 lua 代码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;os.execute(&apos;export LANG=zh_CN.UTF-8 &amp;amp;&amp;amp; cd /blog/path &amp;amp;&amp;amp; pelican -s pelicanconf.py content/ -t theme/&apos;)
ngx.header.content_type = &quot;text/html&quot;
ngx.print(&apos;success\n&apos;)

return ngx.exit(ngx.HTTP_OK)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;###使用
对博客做一些修改，然后请求如下 url，看效果：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl localhost/example-url&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;返回&lt;code class=&quot;language-text&quot;&gt;success&lt;/code&gt;表示博客构建成功&lt;/p&gt;
&lt;p&gt;###联动&lt;/p&gt;
&lt;p&gt;最后就是给 Github 配置上上一小节配置的 webhook playload url 接口即可。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ansible状态管理]]></title><description><![CDATA[简介 就像所有服务器批量管理工具（puppet 有 DSL，salt 有 state）一样，ansible 也有自己的状态管理组件，叫做 playbook…]]></description><link>https://xdays.me/Ansible状态管理/</link><guid isPermaLink="false">https://xdays.me/Ansible状态管理/</guid><pubDate>Thu, 19 Jun 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;就像所有服务器批量管理工具（puppet 有 DSL，salt 有 state）一样，ansible 也有自己的状态管理组件，叫做 playbook。所有这些类似的概念的东西都是让你用一种更简单的语言（而不是用脚本）来描述你的服务应该是什么样子的，然后这些工具根据你的描述将服务器变成你希望的样子。有了这么一层抽象后，服务部署和配置就变得更加的跨平台了，也提高了可复用性。但请注意，playbook 不是万能的，因为 playbook 底层是在用模块来完成任务，因为模块有限，所以很多时候还是需要写 shell 脚本（ansible 提供了 script 模块）来完成。&lt;/p&gt;
&lt;p&gt;提前说明下要使用 ansible 的状态管理你需要学习哪些东西：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;YAML 语法，playbook 用到的语法很少，这部分学习成本很低；&lt;/li&gt;
&lt;li&gt;playbook 的基本指令，这是基础；&lt;/li&gt;
&lt;li&gt;模块的用法，这种重点；&lt;/li&gt;
&lt;li&gt;jinja2 语法，无论是在 playbook 还是在 template 里都支持 jinja2 语法，这是另一个重要的基础，关于 jina2 的语法不在本文范围内，具体参考&lt;a href=&quot;http://jinja.pocoo.org/&quot;&gt;官方文档&lt;/a&gt;。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;概念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;yaml，数据交换格式，类似 json 和 xml，但是比它们更具有可读性，通常用于作为程序的配置文件。ansible 的 playbook 配置使用 yaml 格式来表达。&lt;/li&gt;
&lt;li&gt;task，由模块来完成的一个单位任务，如修改文件或者启动服务&lt;/li&gt;
&lt;li&gt;play，一组 task 的集合，ansible 会自上而下执行&lt;/li&gt;
&lt;li&gt;handler，task 可以触发一定的事件，而处理该事件的 task 即为 handler&lt;/li&gt;
&lt;li&gt;host，应用 play 的主机范围&lt;/li&gt;
&lt;li&gt;user，在这些主机上以什么用户运行 playbook&lt;/li&gt;
&lt;li&gt;role，角色，一组 playbook 以及和其配合的元素（vars, files 等）的集合&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;示例&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
- hosts: webservers
  vars:
    http_port: 80
    max_clients: 200
  remote_user: root
  tasks:
  - name: ensure apache is at the latest version
    yum: pkg=httpd state=latest
  - name: write the apache config file
    template: src=/srv/httpd.j2 dest=/etc/httpd.conf
    notify:
    - restart apache
  - name: ensure apache is running
    service: name=httpd state=started
  handlers:
    - name: restart apache
      service: name=httpd state=restarted&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;YAML 快餐&lt;/h1&gt;
&lt;p&gt;playbook 是用 yaml 语法编写的，但你只需要了解如下几条简单的规则即可：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文档以&lt;code class=&quot;language-text&quot;&gt;---&lt;/code&gt;开头&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;-&lt;/code&gt;代表列表，也可以写成[a, b]&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;:&lt;/code&gt;代表字典，也可以写成{a: b}&lt;/li&gt;
&lt;li&gt;如果字符冲突用双引号把对应字符串引起来&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;指令&lt;/h1&gt;
&lt;h2&gt;host&lt;/h2&gt;
&lt;p&gt;定义 playbook 的执行主机范围，与命令模式下的 ansible 匹配规则一样。&lt;/p&gt;
&lt;h2&gt;remote_user&lt;/h2&gt;
&lt;p&gt;定义 playbook 的执行用户，执行任务也可以定义在任务级别，如：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  tasks:
    - name: test connection
      ping:
      remote_user: yourname
      sudo: yes&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意：也可以用 sudo 指令来说明所有或者部分任务以 sudo 方式执行&lt;/p&gt;
&lt;h2&gt;vars&lt;/h2&gt;
&lt;p&gt;定义变量&lt;/p&gt;
&lt;h2&gt;vars_files&lt;/h2&gt;
&lt;p&gt;定义变量文件&lt;/p&gt;
&lt;h2&gt;tasks&lt;/h2&gt;
&lt;h3&gt;功能&lt;/h3&gt;
&lt;p&gt;定义任务列表，由模块来执行完成&lt;/p&gt;
&lt;h3&gt;name&lt;/h3&gt;
&lt;p&gt;定义 playbook 或者 task 的名称&lt;/p&gt;
&lt;h3&gt;notify&lt;/h3&gt;
&lt;p&gt;任务执行结果如果是发生更改了的则触发定义在 handler 的任务执行&lt;/p&gt;
&lt;h2&gt;handlers&lt;/h2&gt;
&lt;p&gt;定义被触发的任务列表，由模块来执行完成&lt;/p&gt;
&lt;h2&gt;include&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;能包含的包括 task，handler 和 playbook&lt;/li&gt;
&lt;li&gt;可以在 include 的时候传递变量&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tasks:
  - include: wordpress.yml
    vars:
        remote_user: timmy
        some_list_variable:
          - alpha
          - beta
          - gamma&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;roles&lt;/h2&gt;
&lt;p&gt;定义主机对应的角色，角色是一组按照目录组合的配置，ansible 自动完成文件搜索，去找对应目录下的 main.yml 文件来执行，具体目录结构如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;defaults/ 默认的变量保存在这个目录下&lt;/li&gt;
&lt;li&gt;files/ 文件&lt;/li&gt;
&lt;li&gt;templates/ 模板&lt;/li&gt;
&lt;li&gt;tasks/ 任务&lt;/li&gt;
&lt;li&gt;handlers/ 处理器&lt;/li&gt;
&lt;li&gt;vars/ 变量&lt;/li&gt;
&lt;li&gt;meta/ 角色本身的信息，如通过 dependencies 指令指定依赖&lt;/li&gt;
&lt;li&gt;library/ 私有模块&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;另外，你也可以给 role 传递变量。&lt;/p&gt;
&lt;p&gt;这里重点说明下，role 是使 ansible 的状态管理可复用很重要的一个概念，很多时候你只需要在自己的 playbook 里引用下别人的 role 即可，大家写的 role 可以相互共享，相互参考。官方也提供了 ansible-galaxy 这个命令用于安装社区分享的 role，具体可参考&lt;a href=&quot;https://galaxy.ansible.com/&quot;&gt;Galaxy 官网&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;pre_task 和 post_task&lt;/h2&gt;
&lt;p&gt;在 role 被应用之前和之后执行的任务列表&lt;/p&gt;
&lt;h1&gt;变量&lt;/h1&gt;
&lt;p&gt;变量本来是个很简单的东西，但是变量在 Playbook 里是个很复杂的，其复杂的原因在于你不知道它从哪里来到哪里去了，下面我们也从这两个方面来剖析它。&lt;/p&gt;
&lt;h2&gt;从哪里来&lt;/h2&gt;
&lt;h3&gt;inventory&lt;/h3&gt;
&lt;p&gt;在 group 和 host 中都可以定义变量，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[atlanta]
host1 http_port=80 maxRequestsPerChild=808
host2 http_port=303 maxRequestsPerChild=909
[southeast:vars]
some_server=foo.southeast.example.com
halon_system_timeout=30
self_destruct_countdown=60
escape_pods=2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;vars 和 vars_files&lt;/h3&gt;
&lt;p&gt;在 playbook 的开头可以用这俩指令来定义一些初始变量，这个可以参考上文中的 playbook 的 demo&lt;/p&gt;
&lt;h3&gt;include&lt;/h3&gt;
&lt;p&gt;通过在 playbook 的 include 指令可以其他 task 的时候，可以给文件传递变量，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tasks:
  - include: wordpress.yml user=timmy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;roles&lt;/h3&gt;
&lt;p&gt;当给一个主机应用角色的时候可以传递变量，然后在角色内使用这些变量，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- hosts: webservers
  roles:
    - common
    - { role: foo_app_instance, dir: &apos;/opt/a&apos;,  port: 5000 }&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;facts&lt;/h3&gt;
&lt;p&gt;默认在每次执行 playbook 前都获取设备信息，所有这些信息都可以作为变量应用到 playbook 中，要查看这些变量可以执行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ansible cloud -m setup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;register&lt;/h3&gt;
&lt;p&gt;把任务的输出定义为变量，然后用于其他任务，示例如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;  tasks:
     - shell: /usr/bin/foo
       register: foo_result
       ignore_errors: True&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;内置变量&lt;/h3&gt;
&lt;p&gt;ansible 内置了一些变量以方便主机之间相互调用各自的变量。这些变量包括：&lt;br&gt;
*
hostvars 允许你访问另一个主机的变量，当然前提是 ansible 已经收集到这个主机的变量了：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;group_names 是当前主机所在的 group 列表&lt;/li&gt;
&lt;li&gt;groups 是所有 inventory 的 group 列表&lt;/li&gt;
&lt;li&gt;inventory_hostname 是在 inventory 里定义的主机名&lt;/li&gt;
&lt;li&gt;play_hosts 是当前的 playbook 范围内的主机列表&lt;/li&gt;
&lt;li&gt;inventory_dir 和 inventory_file 是定义 inventory 的目录和文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;命令行&lt;/h3&gt;
&lt;p&gt;在运行 playbook 的时候也可以传递一些变量供 playbook 使用，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ansible-playbook release.yml --extra-vars &quot;hosts=vipers user=starbuck&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;也可以从 json 文件里读取变量，示例如下；&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ansible-playbook main.yml -e &quot;@vars.json&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;用到哪里&lt;/h2&gt;
&lt;p&gt;所有变量都可以在 playbook 或者 jinja2 模板中通过&lt;code class=&quot;language-text&quot;&gt;{{ varname }}&lt;/code&gt;中使用。另外，当变量和 jinja2 的管道配合起来的时候能提供各种灵活的条件判断和变量处理。具体看下边两个例子。&lt;/p&gt;
&lt;p&gt;如果第一个任务执行失败了才会执行第二个任务，可以这么写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tasks:
  - shell: /usr/bin/foo
    register: result
    ignore_errors: True
  - debug: msg=&quot;it failed&quot;
    when: result|failed&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;去重一个列表，可以这么写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{{ list | uniq }}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;变量的优先级&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-e 命令行指定的最高&lt;/li&gt;
&lt;li&gt;inventory 文件定义的变量次之，其实 inventory 文件也分全局，group 级别的和 hosts 级别的变量定义&lt;/li&gt;
&lt;li&gt;fact 变量次之&lt;/li&gt;
&lt;li&gt;角色的 default 变量优先级最低&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;条件&lt;/h1&gt;
&lt;h2&gt;when&lt;/h2&gt;
&lt;p&gt;可用于 task，role 和 include，在满足条件时 task 才会被执行。至于 when 指令后跟的逻辑表达式也是标准的逻辑表达式，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tasks:
  - shell: echo &quot;only on Red Hat 6, derivatives, and later&quot;
    when: ansible_os_family == &quot;RedHat&quot; and ansible_lsb.major_release|int &gt;= 6
  - shell: echo &quot;This certainly is epic!&quot;
    when: epic is defined&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;循环&lt;/h1&gt;
&lt;h2&gt;标准遍历&lt;/h2&gt;
&lt;p&gt;用 with_items 可以遍历一个列表，注意这里只会遍历一层。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- name: add several users
  user: name={{ item }} state=present groups=wheel
  with_items:
     - testuser1
     - testuser2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;嵌套遍历&lt;/h2&gt;
&lt;p&gt;用 with_nested 可以遍历一个列表，注意这里会遍历多层，直到最内层。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- name: give users access to multiple databases
  mysql_user: name={{ item[0] }} priv={{ item[1] }}.*:ALL append_privs=yes password=foo
  with_nested:
    - [ &apos;alice&apos;, &apos;bob&apos;, &apos;eve&apos; ]
    - [ &apos;clientdb&apos;, &apos;employeedb&apos;, &apos;providerdb&apos; ]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;遍历字典&lt;/h2&gt;
&lt;p&gt;用 with_dict 可以遍历一个字典，用 key 和 value 来表示。示例如下：&lt;/p&gt;
&lt;p&gt;变量文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
users:
  alice:
    name: Alice Appleworth
    telephone: 123-456-7890
  bob:
    name: Bob Bananarama
    telephone: 987-654-3210&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;playbook 文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tasks:
  - name: Print phone records
    debug: msg=&quot;User {{ item.key }} is {{ item.value.name }} ({{ item.value.telephone }})&quot;
    with_dict: users&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;文件通配符循环&lt;/h2&gt;
&lt;p&gt;用 with_fileglob 可以获取本地文件列表。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    # copy each file over that matches the given pattern
    - copy: src={{ item }} dest=/etc/fooapp/ owner=root mode=600
      with_fileglob:
        - /playbooks/files/fooapp/*&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;对齐的列表&lt;/h2&gt;
&lt;p&gt;用 with_together 可以达到类似 python 里的 zip 函数的功能。示例如下：&lt;/p&gt;
&lt;p&gt;变量文件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
alpha: [ &apos;a&apos;, &apos;b&apos;, &apos;c&apos;, &apos;d&apos; ]
numbers:  [ 1, 2, 3, 4 ]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;playbook 文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tasks:
    - debug: msg=&quot;{{ item.0 }} and {{ item.1 }}&quot;
      with_together:
        - alpha
        - numbers&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;子元素循环&lt;/h2&gt;
&lt;p&gt;with_subelements 这个比较费解。&lt;/p&gt;
&lt;h2&gt;数字序列循环&lt;/h2&gt;
&lt;p&gt;可以通过 with_sequence 来生成一个数字序列，其参数包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;start 起始数字&lt;/li&gt;
&lt;li&gt;end 结束数字&lt;/li&gt;
&lt;li&gt;stride 步长&lt;/li&gt;
&lt;li&gt;count 个数&lt;/li&gt;
&lt;li&gt;format 输出的字符串&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;---
- hosts: all
  tasks:
    # create groups
    - group: name=evens state=present
    - group: name=odds state=present
    # create some test users
    - user: name={{ item }} state=present groups=evens
      with_sequence: start=0 end=32 format=testuser%02x
    # create a series of directories with even numbers for some reason
    - file: dest=/var/stuff/{{ item }} state=directory
      with_sequence: start=4 end=16 stride=2
    # a simpler way to use the sequence plugin
    # create 4 groups
    - group: name=group{{ item }} state=present
      with_sequence: count=4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;随机循环&lt;/h2&gt;
&lt;p&gt;通过 with_random_choice 从一个序列里随机取一个元素。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- debug: msg={{ item }}
  with_random_choice:
     - &quot;go through the door&quot;
     - &quot;drink from the goblet&quot;
     - &quot;press the red button&quot;
     - &quot;do nothing&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;until 循环&lt;/h2&gt;
&lt;p&gt;这种循环由三个指令完成：&lt;br&gt;
* until 是一个条件表达式，如果满足条件循环结束&lt;br&gt;
* retry 是重试的次数&lt;br&gt;
* delay 是延迟时间&lt;/p&gt;
&lt;p&gt;示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- action: shell /usr/bin/foo
  register: result
  until: result.stdout.find(&quot;all systems go&quot;) != -1
  retries: 5
  delay: 10&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;循环直到找到文件&lt;/h2&gt;
&lt;p&gt;与 with_items 类似，只是 with_first_found 找到列表里的第一个文件就会终止循环。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- name: INTERFACES | Create Ansible header for /etc/network/interfaces
  template: src={{ item }} dest=/etc/foo.conf
  with_first_found:
    - &quot;{{ansible_virtualization_type}}_foo.conf&quot;
    - &quot;default_foo.conf&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;循环一个 task 的输出&lt;/h2&gt;
&lt;p&gt;with_lines 指令后跟一个命令，ansible 会遍历命令的输出。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- name: Example of looping over a command result
  shell: /usr/bin/frobnicate {{ item }}
  with_lines: /usr/bin/frobnications_per_host --param {{ inventory_hostname }}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;带索引地循环列表&lt;/h2&gt;
&lt;p&gt;与 with_items 类似，with_indexed_items 会把列表索引和对应元素放到一个列表里。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- name: indexed loop demo
  debug: msg=&quot;at array position {{ item.0 }} there is a value {{ item.1 }}&quot;
  with_indexed_items: some_list&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;扁平化循环列表&lt;/h2&gt;
&lt;p&gt;with_flattened 会先拍扁一个列表，然后执行 with_items。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- name: flattened loop demo
  yum: name={{ item }} state=installed
  with_flattened:
  - [&apos;nc&apos;,&apos;git&apos;, [&apos;nmap&apos;, &apos;vim&apos;]]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配合 register 循环列表&lt;/h2&gt;
&lt;p&gt;register 注册一个变量后，可以配合 with_items 来遍历变量结果。示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;- shell: echo &quot;{{ item }}&quot;
  with_items:
    - one
    - two
  register: echo
- name: Fail if return code is not 0
  fail:
    msg: &quot;The command ({{ item.cmd }}) did not have a 0 return code&quot;
  when: item.rc != 0
  with_items: echo.results&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[OpenLDAP构建统一认证之基础概念]]></title><description><![CDATA[目录服务与关系数据库 目录数据库系统和关系数据库系统都是用来保存数据的，但是他们有两个主要的不同点： 数据结构，目录服务只有树形结构，不像关系数据库有复杂的数据结构。 查询速度与写入速度，目录服务适合查询，不适合写入。 基本概念 在浏览 LDAP…]]></description><link>https://xdays.me/OpenLDAP构建统一认证之基础概念/</link><guid isPermaLink="false">https://xdays.me/OpenLDAP构建统一认证之基础概念/</guid><pubDate>Thu, 15 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;目录服务与关系数据库&lt;/h1&gt;
&lt;p&gt;目录数据库系统和关系数据库系统都是用来保存数据的，但是他们有两个主要的不同点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;数据结构，目录服务只有树形结构，不像关系数据库有复杂的数据结构。&lt;/li&gt;
&lt;li&gt;查询速度与写入速度，目录服务适合查询，不适合写入。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;基本概念&lt;/h1&gt;
&lt;p&gt;在浏览 LDAP 相关文档时经常会遇见一些概念，下面是常见概念的简单解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;DIT，目录信息树，近似相当于一个表&lt;/li&gt;
&lt;li&gt;Entry，条目，也叫记录项&lt;/li&gt;
&lt;li&gt;DN，是无歧义标识一个条目的名字，如”cn=alair,dc=account,dc=xdays,dc=info”，相当于主键&lt;/li&gt;
&lt;li&gt;属性，一个条目可以有多个属性，常见的属性有 CN，O，OU，DC 等&lt;/li&gt;
&lt;li&gt;ObjectClass，对象类，决定了一个条目能具备哪些属性，以及属性对应值的类型&lt;/li&gt;
&lt;li&gt;Schema，Schema 是对象类的集合&lt;/li&gt;
&lt;li&gt;baseDN，基本 DN，baseDN 执行绑定查询时的根目录&lt;/li&gt;
&lt;li&gt;RootDN，根目录，也就是绑定了 OpenLDAProotDSE 这个类的条目。&lt;/li&gt;
&lt;li&gt;O，组织，是一个对象类，用于组织记录项&lt;/li&gt;
&lt;li&gt;OU，组织单元，也是一个对象类，用于组织记录项，比 O 小一个等级。&lt;/li&gt;
&lt;li&gt;RDN，RDN 是相对 DN，类比于相对路径&lt;/li&gt;
&lt;li&gt;CN，CN 是通用名称类似于别名，与 RDN 没有关系&lt;/li&gt;
&lt;li&gt;DC，域名成分&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;LDIF&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;LDIF 是 LDAP 的数据交换格式，就像 json，xml 等一样。其格式可以大体描述如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;第一行指定 LDIF 的版本号&lt;/li&gt;
&lt;li&gt;整个文件是以记录（record）来组织的，不同的记录间用空行分隔&lt;/li&gt;
&lt;li&gt;记录分为数据记录和操作记录，数据记录就是保存实际的数据的，而操作记录用于修改数据&lt;/li&gt;
&lt;li&gt;文件中非 ASCII 的数据存储这里不研究了&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;数据记录&lt;/h2&gt;
&lt;p&gt;数据记录很简单，就是一组属性值对，如果行太长可以以空格开头来续行，一个数据记录的实例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: ou=user,dc=xdays,dc=info
objectClass: organizationalUnit
ou: user
dn: ou=group,dc=xdays,dc=info
objectClass: organizationalUnit
ou: group
dn: ou=hosts,dc=xdays,dc=info
objectClass: organizationalUnit
ou: hosts&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;操作记录&lt;/h2&gt;
&lt;p&gt;操作记录稍复杂一点。一个操作记录是由一个或者多个操作组成的，每个操作以”-“开头的行隔开；可用的操作包括 add,
delete, replace 等操作。如下是一个操作记录的实例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: cn=config
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/certs/ldap.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/certs/ldap.key&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;参考资料&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://schnell18.iteye.com/blog/39208&quot;&gt;http://schnell18.iteye.com/blog/39208&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.csdn.net/wuyupengwoaini/article/details/12855927&quot;&gt;http://blog.csdn.net/wuyupengwoaini/article/details/12855927&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://yunfeng.blog.51cto.com/202525/281009&quot;&gt;http://yunfeng.blog.51cto.com/202525/281009&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[OpenLDAP构建统一认证之安装配置]]></title><description><![CDATA[安装 OpenLDAP ubuntu 确保本机有符合 FQDN 的主机名，因为安装程序会根据主机名提取域来作为 baseDN 安装过程中会提示设置管理员密码 centos 配置 OpenLDAP slapd.conf 和 cn=config 配置 slapd…]]></description><link>https://xdays.me/OpenLDAP构建统一认证之安装配置/</link><guid isPermaLink="false">https://xdays.me/OpenLDAP构建统一认证之安装配置/</guid><pubDate>Thu, 15 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装 OpenLDAP&lt;/h1&gt;
&lt;h2&gt;ubuntu&lt;/h2&gt;
&lt;p&gt;确保本机有符合 FQDN 的主机名，因为安装程序会根据主机名提取域来作为 baseDN&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install slapd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;安装过程中会提示设置管理员密码&lt;/p&gt;
&lt;h2&gt;centos&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install slapd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置 OpenLDAP&lt;/h1&gt;
&lt;h2&gt;slapd.conf 和 cn=config&lt;/h2&gt;
&lt;p&gt;配置 slapd 服务有两种方式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;slapd.conf 是传统方式，修改配置文件然后重启服务，centos 默认采用这种方式。&lt;/li&gt;
&lt;li&gt;cn=config 是新的配置方式，称之为 on-line configuration，ubuntu 默认采用这种方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置 TLS&lt;/h1&gt;
&lt;h2&gt;自签名证书&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir /etc/ldap/certs
openssl genrsa -out ldap.key 1024
openssl req -new -key ldap.key -out ldap.csr
openssl x509 -req -days 1095 -in ldap.csr -signkey ldap.key -out ldap.crt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;更新配置&lt;/h2&gt;
&lt;h3&gt;编写配置数据文件&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;dn: cn=config
replace: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/certs/ldap.crt
-
replace: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/certs/ldap.key&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;导入配置&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapmodify -Q -Y EXTERNAL -H ldapi:/// -f tls.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;修改启动选项&lt;/h2&gt;
&lt;p&gt;slapd 加上&lt;code class=&quot;language-text&quot;&gt;-h ldaps:///&lt;/code&gt;选项即可。&lt;/p&gt;
&lt;h1&gt;参考资料&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://my.oschina.net/5lei/blog/193484&quot;&gt;http://my.oschina.net/5lei/blog/193484&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://mosquito.blog.51cto.com/2973374/1098456&quot;&gt;http://mosquito.blog.51cto.com/2973374/1098456&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://bneijt.nl/blog/post/connecting-to-ldaps-with-self-signed-cert-using-python/&quot;&gt;http://bneijt.nl/blog/post/connecting-to-ldaps-with-self-signed-cert-using-python/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[OpenLDAP构建统一认证之管理工具]]></title><description><![CDATA[自带工具 注意： 如果服务器的 ssl 证书是自签名的，那么在客户端的 ldap.conf 文件加入一行，否则认证会不通过。 安装 ubuntu 执行： centos 执行： 使用 ldapsearch ldapsearch，搜索目录树，示例如下： 简单解释下选项的作用： -H…]]></description><link>https://xdays.me/OpenLDAP构建统一认证之管理工具/</link><guid isPermaLink="false">https://xdays.me/OpenLDAP构建统一认证之管理工具/</guid><pubDate>Thu, 15 May 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;自带工具&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 如果服务器的 ssl 证书是自签名的，那么在客户端的 ldap.conf 文件加入一行&lt;code class=&quot;language-text&quot;&gt;TLS_REQCERT never&lt;/code&gt;，否则认证会不通过。&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;ubuntu 执行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install -y ldap-utils&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;centos 执行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install -y openldap-clients&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;使用&lt;/h2&gt;
&lt;h3&gt;ldapsearch&lt;/h3&gt;
&lt;p&gt;ldapsearch，搜索目录树，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapsearch -v -x -H ldaps://example.com -D &quot;cn=admin,dc=example,dc=com&quot; -W -W -b &quot;dc=xdays,dc=info&quot; -LL&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;简单解释下选项的作用：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-H 指定服务器 url&lt;/li&gt;
&lt;li&gt;-x 使用简单认证&lt;/li&gt;
&lt;li&gt;-D 绑定的 DN&lt;/li&gt;
&lt;li&gt;-W 提示输入密码&lt;/li&gt;
&lt;li&gt;-b 指定搜索的 baseDN&lt;/li&gt;
&lt;li&gt;-LL 输出 LDIF 格式&lt;/li&gt;
&lt;li&gt;-v 显示详细信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;ldapadd&lt;/h3&gt;
&lt;p&gt;ldapadd，添加数据，要输入标准 LDIF 文件，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapadd -v -x -H ldaps://example.com -D &quot;cn=admin,dc=example,dc=com&quot; -W -f data.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;选项与 ldapsearch 类似， &lt;code class=&quot;language-text&quot;&gt;-f&lt;/code&gt; 指定文件路径&lt;/p&gt;
&lt;h3&gt;ldapdelete&lt;/h3&gt;
&lt;p&gt;ldapdelete，删除数据，要输入标准 LDIF 文件，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapdelete -v -x -H ldaps://example.com -D &quot;cn=admin,dc=example,dc=com&quot; -W -f data.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;ldapmodify&lt;/h3&gt;
&lt;p&gt;ldapdelete，修改数据，要输入标准 LDIF 文件，示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldapmodify -v -x -H ldaps://example.com -D &quot;cn=admin,dc=example,dc=com&quot; -W -f data.ldif&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;LAM&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;一个简单的 DLAP 账号管理工具，PHP 编写，配置写静态文件，安装简单方便。&lt;/p&gt;
&lt;h2&gt;安装&lt;/h2&gt;
&lt;p&gt;下载程序源码：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget -SO ldap-account-manager-4.5.tar.bz2 &quot;http://downloads.sourceforge.net/project/lam/LAM/4.5/ldap-account-manager-4.5.tar.bz2?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Flam%2F&amp;amp;ts=1400145174&amp;amp;use_mirror=jaist&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;解压放置 web 服务器目录下，修改权限（因为配置信息要写到文件里）：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tar xzf ldap-account-manager-4.5.tar.bz2 &amp;amp;&amp;amp; mv ldap-account-manager-4.5 /web/www/lam
chown -R www-data.www-data lam&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;php 与 web 服务器配置这里略过&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;首先，拷贝样本配置文件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd config
cp -a config.cfg_sample config.cfg
cp -a lam.conf_sample lam.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后，访问 web 界面，点击右上侧的 lam
configuration，默认密码是 lam。在 general
setting 里修改系统的 master 密码；在 server
profile 里配置要连接的 LDAP 服务器信息。这里有两点需要说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果服务器为 tls 加密的那么需要指定 ldaps://example.com&lt;/li&gt;
&lt;li&gt;在 general
setting 里要下载服务器的证书，下载完后保存，然后重启 php 进程。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后返回登陆界面，用 LDAP 的账号信息登陆系统，第一次登陆会提示你创建对应的 ou 等条目，创建完成后创建一个用户组，就可以添加账号了。&lt;/p&gt;
&lt;h2&gt;优化&lt;/h2&gt;
&lt;p&gt;默认 lam 用 cn 来作为 RDN，但是好多系统认证的时候都是找 uid，所以需要修改为 uid，具体配置在 tools 的 user
profile 里，修改 RDN identifier 为 uid 即可。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker打造开发环境]]></title><description><![CDATA[背景 我一直想要打造这样一个干净且高效的开发环境：干净指与开发隔离，不污染物理机，我已经讨厌重装系统了；高效是指自动化，我需要每次都安装一对依赖，修改一些配置文件等等繁琐的操作，而且自动化过程要快。最开始自己用 virtualbox…]]></description><link>https://xdays.me/Docker打造开发环境/</link><guid isPermaLink="false">https://xdays.me/Docker打造开发环境/</guid><pubDate>Tue, 08 Apr 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;我一直想要打造这样一个干净且高效的开发环境：干净指与开发隔离，不污染物理机，我已经讨厌重装系统了；高效是指自动化，我需要每次都安装一对依赖，修改一些配置文件等等繁琐的操作，而且自动化过程要快。最开始自己用 virtualbox 新建虚拟机然后用其自带的克隆功能复制出来；后来用 vagrant 配合一些配置工具能达到不错的效果，一个文件即可生成开发环境，这应该是主流了，但是这种方式有个缺点就是太慢；现在我自己用 docker+supervisor 摸索了一个更快的方案。&lt;/p&gt;
&lt;h1&gt;组件&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;supervisor，管理所有进程&lt;/li&gt;
&lt;li&gt;sshd，可以登陆到 container 里，修改代码调试代码&lt;/li&gt;
&lt;li&gt;app，实际跑的项目&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;具体运行流程如下： ​&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker -startup-&gt; 运行supervisor -&gt;管理(sshd，项目进程)
                  -&gt; dump出环境变量供远程ssh使用&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;组件配置&lt;/h1&gt;
&lt;h2&gt;supervisor&lt;/h2&gt;
&lt;p&gt;supervisor 的配置关键就是要让其前台运行，具体配置如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[inet_http_server]
port=0.0.0.0:9001
username=root
password=thinkin
​
[supervisord]
logfile=/tmp/supervisord.log
logfile_maxbytes=50MB
logfile_backups=2
loglevel=info
pidfile=/tmp/supervisord.pid
nodaemon=true
minfds=1024
minprocs=200
umask=022

[rpcinterface:supervisor]
supervisor.rpcinterface_factory = supervisor.rpcinterface:make_main_rpcinterface

[supervisorctl]
serverurl=http://127.0.0.1:9001
username=root
password=thinkin
history_file=~/.sc_history

[include]
files = /etc/supervisor.d/*.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;sshd&lt;/h2&gt;
&lt;p&gt;ssh 不需要额外配置，主要是添加上远程登陆需要的公钥信息：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mv ssh /root/.ssh
chmod 700 /root/.ssh &amp;amp;&amp;amp; chmod 600 /root/.ssh/*
chown -R root.root /root/.ssh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;关于 sshd 有两点需要说明： 1.
启动 container 时要加上-t 参数，不然无法远程登陆 2.
由于 ssh 无法获取远程的环境变量，这样 docker 依赖环境变量的 link 特性就无法使用，这样 django 的开发环境就没法在远程 ssh 后正常运行了。这里我的解决办法是在 container 启动的时候（封装启动脚本）dump 一份当前的环境变量到文件，然后 sshd 登陆到机器上去时 source 该文件，这样 ssh 就拥有了和本地一样的环境变量了。&lt;/p&gt;
&lt;h2&gt;app&lt;/h2&gt;
&lt;p&gt;这部分工作主要是编写 app 对应的 supervisor 配置文件，然后将 app 交由 supervisor 管理&lt;/p&gt;
&lt;h1&gt;Docker 配置&lt;/h1&gt;
&lt;h2&gt;Dockerfile&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;FROM ubuntu:china
MAINTAINER xdays &amp;lt;easedays@gmail.com&gt;

ADD script /tmp/script
RUN bash /tmp/script/setup.sh

EXPOSE 80
EXPOSE 9001
CMD startup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;初始化脚本 setup.sh&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/sh

apt-get update
apt-get install -y openssh-server python-pip wget libmysqlclient18 #安装一些包和依赖库

#sshd相关配置
mkdir /var/run/sshd
cd /tmp/script
mv ssh /root/.ssh
chmod 700 /root/.ssh &amp;amp;&amp;amp; chmod 600 /root/.ssh/*
chown -R root.root /root/.ssh

#supervisor相关配置
cd /tmp/script
mv supervisord.conf /etc/supervisord.conf
mv supervisor.d/ /etc/supervisor.d/

#封装下启动命令，脚本内容见下文
mv startup /usr/local/bin/

#下载项目依赖和项目代码
mkdir /web
wget -SO - http://url/to/upops-deps.tgz | tar xz -C /
wget -SO - http://url/to/upops-core.tgz | tar xz -C /web/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;启动脚本&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/sh

/usr/bin/env &gt; /root/.env
supervisord -c /etc/supervisord.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;启动命令&lt;/h2&gt;
&lt;p&gt;目前 docker 还不能支持给虚拟机绑定公网地址，所以所有端口还需要通过 docker 的端口映射来实现：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -t -d -p 80:80 -p 2022:22 --link mysql:db -v /web/:/web/ upops&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[虚拟机管理工具vagrant]]></title><description><![CDATA[简介 vagrant 是一个基于业界成熟的虚拟化技术打造可配置，可重新生成和可移植的工作环境的工具，一个配置文件完成所有状态定义。 特性 简单，一个配置文件搞定 可通过多种方式自定义虚拟机配置，如 shell 脚本，ansible…]]></description><link>https://xdays.me/虚拟机管理工具vagrant/</link><guid isPermaLink="false">https://xdays.me/虚拟机管理工具vagrant/</guid><pubDate>Sat, 08 Mar 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;vagrant 是一个基于业界成熟的虚拟化技术打造可配置，可重新生成和可移植的工作环境的工具，一个配置文件完成所有状态定义。&lt;/p&gt;
&lt;h1&gt;特性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;简单，一个配置文件搞定&lt;/li&gt;
&lt;li&gt;可通过多种方式自定义虚拟机配置，如 shell 脚本，ansible 等&lt;/li&gt;
&lt;li&gt;网络配置，支持私有，共有网络配置&lt;/li&gt;
&lt;li&gt;目录同步，保持 guest 和 host 文件同步，默认将当前目录映射到虚拟机的/vagrant 下&lt;/li&gt;
&lt;li&gt;多虚拟机支持，构建自己的集群测试环境&lt;/li&gt;
&lt;li&gt;多中虚拟技术支持，如 virtualbox，vmware，AWS 和 docker&lt;/li&gt;
&lt;li&gt;插件机制，扩展灵活&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;概念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;box 就是已经制作好的虚拟机，倒入后保存在~/vagrang.d 目录下，和标准的虚拟机区别就是加入了一些为支持 vagrant 管理的配置，如公钥&lt;/li&gt;
&lt;li&gt;Vagrantfile 描述和配置要创建的虚拟机的配置&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo apt-get install vagrant&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt; 最新的版本要到其官网下载&lt;/p&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;添加 box&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vagrant box add name url&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中，name 为 box 的名字，url 为 box 的路径可远程可本地&lt;/p&gt;
&lt;h2&gt;初始化环境&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vagrant init&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;生成默认的 Vagrantfile&lt;/p&gt;
&lt;h2&gt;修改配置文件 Vagrantfile&lt;/h2&gt;
&lt;p&gt;详细的配置参考&lt;a href=&quot;http://docs.vagrantup.com/v2/&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;单机配置&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Vagrant.configure(&quot;2&quot;) do |config|
  config.vm.box = &quot;base&quot; #定义此虚拟机是从哪个box生成
  config.vm.provision :shell, :path =&gt; &quot;bootstrap.sh&quot; #通过shell配置
  config.vm.network :forwarded_port, host: 8080, guest: 80 #端口映射
  config.vm.network &quot;private_network&quot;, ip: &quot;192.168.110.100&quot; #私有网络配置
  #awesome configuration goes here...
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;多机配置&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Vagrant.configure(&quot;2&quot;) do |config|
  config.vm.provision &quot;shell&quot;, inline: &quot;echo Hello&quot;
  config.vm.define &quot;web&quot; do |web|
    web.vm.box = &quot;apache&quot;
    #awesome configuration goes here...
  end
  config.vm.define &quot;db&quot; do |db|
    db.vm.box = &quot;mysql&quot;
    #awesome configuration goes here...
  end
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;开/关机 vagrant up/halt&lt;/li&gt;
&lt;li&gt;重启 vagrant reload&lt;/li&gt;
&lt;li&gt;状态 vagrant status&lt;/li&gt;
&lt;li&gt;登录 vagrant ssh&lt;/li&gt;
&lt;li&gt;销毁 vagrant destroy&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.vagrantup.com/v2/&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.vagrantbox.es/&quot;&gt;box 资源站&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.skoblenick.com/vagrant/creating-a-custom-box-from-scratch/&quot;&gt;如何制作 box 文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Zabbix监控Hadoop]]></title><description><![CDATA[基础概念 JMX JMX 就是 Java Management
Extentions，为 Java 程序提供管理功能的框架。看了几个介绍，感觉这个说明比较通俗易懂。一句话说就是 JMX…]]></description><link>https://xdays.me/Zabbix监控hadoop/</link><guid isPermaLink="false">https://xdays.me/Zabbix监控hadoop/</guid><pubDate>Thu, 06 Mar 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;基础概念&lt;/h1&gt;
&lt;h2&gt;JMX&lt;/h2&gt;
&lt;p&gt;JMX 就是 Java Management
Extentions，为 Java 程序提供管理功能的框架。看了几个介绍，感觉&lt;a href=&quot;http://www.blogjava.net/chengang/archive/2006/03/07/34061.html&quot;&gt;这个说明&lt;/a&gt;比较通俗易懂。一句话说就是 JMX 为你提供了一个通过特定协议管理应用程序的方案，而我们这里主要用其查询配置和监控数据的功能。&lt;/p&gt;
&lt;h2&gt;External Check&lt;/h2&gt;
&lt;p&gt;通过主动调用自定义脚本来获取监控数据，脚本的输出即为该监控项的监控值，这种方式有更强的定制化。因为下午在这里踩到了坑，走了不少弯路，所以这里要对配置方法做个特殊说明。配置监控项时选择 external
chek，然后在 key 这一栏要指定运行脚本和参数。下边说下 1.8 和 2.0 之后的版本在 key 配置上的不同：&lt;br&gt;
*
在 1.8 的版本里 key 的格式为&lt;code class=&quot;language-text&quot;&gt;scriptname[arg1 arg2 ...]&lt;/code&gt;，参数以空格，Zabbix 实际执行的命令是&lt;code class=&quot;language-text&quot;&gt;scriptname server_hostname arg1 arg2&lt;/code&gt;，详见&lt;a href=&quot;https://www.zabbix.com/documentation/1.8/manual/config/items#external_checks&quot;&gt;这里&lt;/a&gt;&lt;br&gt;
*
在 2.0 之后的版本 key 的格式为&lt;code class=&quot;language-text&quot;&gt;scriptname[arg1, arg2 ...]&lt;/code&gt;，参数以逗号分隔，Zabbix 实际执行的命令是&lt;code class=&quot;language-text&quot;&gt;scriptname arg1 arg2 ...&lt;/code&gt;，详见&lt;a href=&quot;https://www.zabbix.com/documentation/2.2/manual/config/items/itemtypes/external&quot;&gt;这里&lt;/a&gt;&lt;br&gt;
​&lt;br&gt;
所以，拿 1.8 的模板倒入到 2.0 之后的的 Zabbix
Server 是有问题的，这点需要特别注意。&lt;/p&gt;
&lt;h2&gt;Trapper&lt;/h2&gt;
&lt;p&gt;trapper 也是 Zabbix 的一种获取监控数据的方式。我们知道常见的方式有 agent，snmp 和 jmx，这些监控方式都是 Zabbix
Server 主动去问被监控设备要，而 trapper 是被动等着被监控设备把数据汇报（通过 zabbix_sender）上来，然后从汇报上来的数据中提取自己想要的。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;
如果被监控端提供了接口可供外界获取其运行数据（不太安全），那么可配合 external
check 调用脚本远程获取数据，然后再用 zabbix_sender 将获取的数据以 trapper 的形式发送给 Zabbix
Server，这样既可以保证客户端零配置，而且能获取任意想要监控的数据。逻辑图如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;zabbix server --&gt; external check--&gt;script --&gt; monitored device
script--&gt; zabbix_sender --&gt; zabbx server&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;​&lt;/p&gt;
&lt;h1&gt;配置过程&lt;/h1&gt;
&lt;ol&gt;
&lt;li&gt;下载监控 hadoop 需要的模板和外挂脚本，链接在&lt;a href=&quot;http://mikoomi.googlecode.com/svn/plugins/&quot;&gt;这里&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在本地，通过浏览器将两个模板导入 zabbix，&lt;strong&gt;注意&lt;/strong&gt;两个模板有重复的监控项，如果需要对同一个设备监控需要删掉重复的 hadoop
version 和 hadoop status 两个监控项&lt;/li&gt;
&lt;li&gt;在服务器端，将外挂脚本放到 zabbix 服务器的指定目录下，具体要看 zabbix_server.conf 的 ExternalScripts 这个配置项，一般如果是编译安装的默认应该位于/usr/local/zabbix/share/zabbix/externalscripts 目录下，也可修改配置文件自己指定，这里有两点需要注意：1)如果你的 bash 安装在/bin 下，那么所有的脚本要修改第一行为#!/bin/sh; 2)确保脚本有可执行权限，且要注意脚本执行用户（即 Zabbix
Server 的运行用户）具有所有的操作权限，如写文件等。&lt;/li&gt;
&lt;li&gt;修改 zabbix_server.conf 去掉 ExternalScripts 这行的注释，重启 zabbix_server&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.blogjava.net/chengang/archive/2006/03/07/34061.html&quot;&gt;JMX 简单解释&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zabbix.com/documentation/1.8/manual/config/items#external_checks&quot;&gt;1.8 的外部脚本探测&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zabbix.com/documentation/2.2/manual/config/items/itemtypes/external&quot;&gt;2.0 后的外部脚本探测&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://code.google.com/p/mikoomi/&quot;&gt;Zabbix 监控 Hadoop 的插件项目&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[IPython自动重新加载模块]]></title><description><![CDATA[问题 调试模块的时候需要不断修改代码，只有重新加载模块才可以看修改效果，而重新加载的方法有 reload 内置方法和重新运行解释器，这样都不是很方便，我希望修改代码能立刻生效。 解决 IPython 有个 autoreload…]]></description><link>https://xdays.me/Ipython自动重新加载模块/</link><guid isPermaLink="false">https://xdays.me/Ipython自动重新加载模块/</guid><pubDate>Sat, 18 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;问题&lt;/h1&gt;
&lt;p&gt;调试模块的时候需要不断修改代码，只有重新加载模块才可以看修改效果，而重新加载的方法有 reload 内置方法和重新运行解释器，这样都不是很方便，我希望修改代码能立刻生效。&lt;/p&gt;
&lt;h1&gt;解决&lt;/h1&gt;
&lt;p&gt;IPython 有个 autoreload 扩展，只需要开启扩展并定义扩展的模式即可。&lt;/p&gt;
&lt;h2&gt;开启扩展&lt;/h2&gt;
&lt;p&gt;默认的配置位于&lt;code class=&quot;language-text&quot;&gt;~/.config/ipython/profile_default/ipython_config.py&lt;/code&gt;，编辑该文件新增：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;c.InteractiveShellApp.extensions = [&apos;autoreload&apos;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;设定模式&lt;/h2&gt;
&lt;p&gt;编辑文件&lt;code class=&quot;language-text&quot;&gt;~/.config/ipython/profile_default/ipython_config.py&lt;/code&gt;，新增：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;c.TerminalIPythonApp.exec_lines = [&apos;%autoreload 2&apos;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样即可满足需求。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Docker初识]]></title><description><![CDATA[简介 如官方文档所说，docker 是一个自动将应用打包成轻量可移植自包涵的容器的引擎。开发者构建的应用可以一次构建全平台运行，包括本地开发机，生产环境，虚拟机和云等。目前处于开发阶段，不可用于生产环境。在你启动一条命令时 docker 会调用 lcx…]]></description><link>https://xdays.me/Docker初识/</link><guid isPermaLink="false">https://xdays.me/Docker初识/</guid><pubDate>Sun, 12 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;如官方文档所说，docker 是一个自动将应用打包成轻量可移植自包涵的容器的引擎。开发者构建的应用可以一次构建全平台运行，包括本地开发机，生产环境，虚拟机和云等。目前处于开发阶段，不可用于生产环境。在你启动一条命令时 docker 会调用 lcx 等其他一个组建为这条命令构建一个 container，包含了进程运行的所有资源。但是官方文档以说明，docker 处于开发阶段目前还不能用于生产环境。&lt;/p&gt;
&lt;h1&gt;特性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Go 语言编写&lt;/li&gt;
&lt;li&gt;基于 lxc 的进程级隔离，而 lxc 基于 cgroup，轻量级&lt;/li&gt;
&lt;li&gt;通过 cgroup 做到文件系统，网络和资源的隔离&lt;/li&gt;
&lt;li&gt;使用 aufs 文件系统存储，写时复制，相同数据只保存一份，节省空间&lt;/li&gt;
&lt;li&gt;源机制，可相互分享，搜索等&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;概念&lt;/h1&gt;
&lt;h2&gt;cgroups&lt;/h2&gt;
&lt;p&gt;cgroups 全称 control
groups，是 linux 内核提供的一种限制、记录和隔离进程组所使用物理资源的一种机制。在 2.6.24 之后的内核中都已经支持 cgroups。详细的介绍请参考&lt;a href=&quot;https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt&quot;&gt;cgroups 详解&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;lxc&lt;/h2&gt;
&lt;p&gt;lxc 全称是 linux
container，是基于 cgroups 和 chroot 等内核特性的一组工具，用于构建虚拟环境。通过一系列的命令行工具可以创建，修改，删除虚拟环境。具体用法可参考&lt;a href=&quot;http://www.unionfs.org/&quot;&gt;ubuntu 官方文档&lt;/a&gt;。&lt;/p&gt;
&lt;h2&gt;aufs&lt;/h2&gt;
&lt;p&gt;aufs 全称是 advance(another) union file
system，是一种联合文件系统。这种文件系统最重要的一个特性就是有一个层的概念和复制时拷贝，可以做到当文件系统改变时只影响其中一层，其他层保持不变。举个例子，整个文件系统就像由一层一层的玻璃组成的，你从上往下看能看到所有的图案（如果上下层的玻璃完全重合则只能看见上层的玻璃对应的图案），而当你需要新增或者修改图案时就只能在最上层的玻璃上操作。具体的一些操作例子可参考&lt;a href=&quot;http://aufs.sourceforge.net/aufs3/man.html&quot;&gt;geekstuff 的 aufs 演示&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; docker 要求内核在 3.8 以上，所以建议的安装系统为 ubuntu。&lt;/p&gt;
&lt;h2&gt;ubuntu&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;curl -s https://get.docker.io/ubuntu/ | sudo sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;centos&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;安装 epel rpm -ivh
&lt;a href=&quot;http://dl.fedoraproject.org/pub/epel/6/x86%5C_64/epel-release-6-8.noarch.rpm&quot;&gt;http://dl.fedoraproject.org/pub/epel/6/x86\_64/epel-release-6-8.noarch.rpm&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;安装 docker yum install -y docker-io&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动 service docker start chkconfig docker on&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;使用&lt;/h1&gt;
&lt;h2&gt;命令行&lt;/h2&gt;
&lt;h3&gt;获取 base image&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker pull ubuntu&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这条命令会从 docker index 上获取 ubuntu 镜像，它是运行其他进程的基础。&lt;/p&gt;
&lt;h3&gt;运行命令&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker run -i -t ubuntu yum install -y vim&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;提交改变&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker images
docker commit id user/name
docker push user/name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;再次运行&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;docker pull user/name
docker run -i -t image vim&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;em&gt;注意：&lt;/em&gt;
这里的再次运行是指你所构建的环境可以再其他任何平台上运行起来，不需要额外的配置，没有依赖。&lt;/p&gt;
&lt;h2&gt;Dockerfile&lt;/h2&gt;
&lt;p&gt;dockerfile 通过一些指令来描述了一个 image 的方方面面。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# Memcached
#
# VERSION       2.2
# use the ubuntu base image provided by dotCloud
FROM ubuntu
MAINTAINER Victor Coisne victor.coisne@dotcloud.com
# make sure the package repository is up to date
RUN echo &quot;deb http://archive.ubuntu.com/ubuntu precise main universe&quot; &gt; /etc/apt/sources.list
RUN apt-get update
# install memcached
RUN apt-get install -y memcached
# Launch memcached when launching the container
ENTRYPOINT [&quot;memcached&quot;]
# run memcached as the daemon user
USER daemon
# expose memcached port
EXPOSE 11211&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中的一些指令解释：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;FROM 指定此 image 的 base image&lt;/li&gt;
&lt;li&gt;MAINTAINER 指定 image 的维护者&lt;/li&gt;
&lt;li&gt;RUN 指定在当前的 image 下运行的命令，相当于&lt;code class=&quot;language-text&quot;&gt;docker run image command&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;ENTRYPOINT 指定在运行 image 时触发的命令&lt;/li&gt;
&lt;li&gt;USER 指定运行出发命令的用户名&lt;/li&gt;
&lt;li&gt;EXPOSE 指定对外提供的端口号&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.kernel.org/doc/Documentation/cgroups/cgroups.txt&quot;&gt;cgroup 的官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.unionfs.org/&quot;&gt;aufs 比 unionfs 好在哪里&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://aufs.sourceforge.net/aufs3/man.html&quot;&gt;aufs 的官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.docker.io/en/latest/&quot;&gt;docker 官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[回首2013和展望2014]]></title><description><![CDATA[回首 2013 回首 2013 年是我个人意义上定义的“第九年”。相比 201…]]></description><link>https://xdays.me/回首2013和展望2014/</link><guid isPermaLink="false">https://xdays.me/回首2013和展望2014/</guid><pubDate>Thu, 09 Jan 2014 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;回首 2013&lt;/h1&gt;
&lt;h2&gt;回首&lt;/h2&gt;
&lt;p&gt;2013 年是我个人意义上定义的“第九年”。相比 2012 年今年的变动比较大，有些在预料之中也有些在意料之外，也正是由于这些变动让自己内心也发生了变化，也不确定自己会变成什么样子。不管怎样既然回首过去就该好好总结下这一年，反思下这一年发生的好的与不好的。&lt;/p&gt;
&lt;h2&gt;流水帐&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;同往常一样，和我妈“艰难”的过了一个年&lt;/li&gt;
&lt;li&gt;长城，香山，杭州（西湖，龙井），世界公园，怀柔，朝阳公园，天坛，园博园&lt;/li&gt;
&lt;li&gt;丰杰离职&lt;/li&gt;
&lt;li&gt;和她相遇&lt;/li&gt;
&lt;li&gt;我离职&lt;/li&gt;
&lt;li&gt;入职又拍云&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;得失&lt;/h2&gt;
&lt;h2&gt;得&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;交了一个铁哥们，月月&lt;/li&gt;
&lt;li&gt;收了一个女朋友（准备说是我被她收了:D）&lt;/li&gt;
&lt;li&gt;学习能力和分析问题能力提升&lt;/li&gt;
&lt;li&gt;技术提升，熟练 Python，写了几个不咋样的程序，其他方面略过&lt;/li&gt;
&lt;li&gt;离开北京&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;失&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;和妈妈聊的少，因为压力大&lt;/li&gt;
&lt;li&gt;薪水没涨，反而稍跌&lt;/li&gt;
&lt;li&gt;北京的那个圈子&lt;/li&gt;
&lt;li&gt;健康，睡觉时间越来越晚&lt;/li&gt;
&lt;li&gt;读书少，一年才读了 9 本书&lt;/li&gt;
&lt;li&gt;初吻&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;体会&lt;/h2&gt;
&lt;h3&gt;离开北京&lt;/h3&gt;
&lt;p&gt;关于离开北京，有很多可说的。在我计划中 3-5 年北京迟早是要离开的，但是 9 月份妈妈的一个电话让我比计划中早的做出了决定，因为我没有想到妈妈如此着急，印象中她主要说愁我现在漂泊的状态，其实我心里明白没有家的感觉的日子对于我和她来说太漫长了。所以开始思考着如何稳定下来，第一当然是离开北京。我付出了很大的代价：因为女朋友刚去北京且交往不久，不可能和我一起离开北京，所以异地了；北京丰富的就业机会，两年的工作经验，每天都一心要求自己要成长，在北京找到一个各方面不错的工作不是件困难的事情；北京的圈子，这一点我多说一点，我在北京认识的人虽然不多，但我对这个圈子有特殊的感情，大家都是把在一个战壕里摸爬滚打过来的，有哪些人出去吃饭必须要背着笔记本每次吃饭总有一个人在处理故障其他人在骂着这苦逼的工作的呢？我有幸在蓝汛经历了一般工作不会有也许永远不会再有的工作氛围，这种氛围就是你的工作不仅仅是上传下达的冷冰冰的工作制度，还有关怀，友谊和信任这些比这份工作更更重要的东西，但是既然离开了过去了这段经历就珍藏吧。&lt;/p&gt;
&lt;h3&gt;感情&lt;/h3&gt;
&lt;p&gt;这是今年我最大的变化，24 岁的我恋爱了，我感恩于与她相遇相知相爱。首先，我觉得谢谢是个被用滥的词语，我始终坚持其本意的在使用这个词，现在我要把这两个字灌注满我的感情送给我的女朋友，亲爱的，谢谢你包容我，理解所做的决定。再来说说对感情中的自己吧，说起来是一个人的世界向两个人的世界的转变吧，其实不需要准备什么，一切都是自然而然。下班不再是傻愣愣的看着公交车上的人来人往；周末不再是一觉睡到下午起来接着敲电脑敲到睡觉；更重要的是心里踏实了。其次，一些吵闹的痛苦经历也让我明白，一段感情绝对不是“愿得一人心，白首不相离”那么简单的，无论是无理取闹还是确实自己做的不好，痛苦是实实在在的，你是逃不掉的，因为你爱了。最后，相信所有不好的都会过去，相信我们彼此都因为经历了这些不好的而有所反思，相信踏踏实实的爱。&lt;/p&gt;
&lt;h3&gt;钱&lt;/h3&gt;
&lt;p&gt;之前在我的价值观里好像看不到钱的位置，即使一直以来我也没有经济独立，但是缺钱并不代表要认为它重要。今年我对钱的问题有所转变，从不在我考虑范围内到开始考虑，甚至开始关心钱，但是钱依然不重要。这种转变源于我开始接受一些现实问题：眼下的，把妈妈和女朋友接到我身边，租房，衣食住行，材米油盐，还有长远的…
其实这些问题一直存在只是在我过于理想化的价值观里把他们忽略了，这是我的不对，是一种不负责任的表现。那种老是只是想要为妈妈做什么和相信一句满溢的“我爱你”能把现实问题甩出几个大街的想法是可笑的，还要理想主义？别闹了。&lt;/p&gt;
&lt;h3&gt;技术成长&lt;/h3&gt;
&lt;p&gt;这一年技术上的转变值得一提是终于开始以带着研发的思维做运维了，也在开发的道路上有所起步探索，写了几个 webapp 的东西，拥抱 DevOps 的大潮。其他的乏善可陈，简单列举下吧：搭建 MySQL 主从和主主，熟悉了 SQL 语句；因为 Node 去了解了 JavaScript 的基础语法，感觉坑真多；以 redis 作为存储来做海量数据的快速查询，后来就换成 mongodb 了；Salt 是 Python 界里能和 Puppet 抗衡的优秀工具，不知道他们什么时候能推出个类似 forge 的 repo 源，连更轻量的 ansible 都有 galexy 了，配置管理这块分享很重要；Vagrant 让我的测试环境走向正规化了，一个配置文件搞定环境；docker 是一个新星，变革虚拟化和云计算技术，有人说 container 是虚拟化的未来，后续会持续关注的。今年的技术关键词：ubuntu，python，hadoop，mapreduce，redis，mongodb，javascript，zabbix，trafficserver，docker 等。&lt;/p&gt;
&lt;h2&gt;打分&lt;/h2&gt;
&lt;p&gt;70&lt;/p&gt;
&lt;h1&gt;计划 2014&lt;/h1&gt;
&lt;h2&gt;生活&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;结束异地&lt;/li&gt;
&lt;li&gt;把妈妈接杭州来&lt;/li&gt;
&lt;li&gt;去杭州的 20 个地方&lt;/li&gt;
&lt;li&gt;胖一点，130 吧&lt;/li&gt;
&lt;li&gt;锻炼身体&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;工作&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;实现运维平台 ​&lt;/li&gt;
&lt;li&gt;完成计算机理论基础课程&lt;/li&gt;
&lt;li&gt;深入理解 Linux 系统 ​&lt;/li&gt;
&lt;li&gt;熟练 JavaScript&lt;/li&gt;
&lt;li&gt;学习 Golang&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Zabbix性能优化]]></title><description><![CDATA[概述 关于优化，我个人观点是这样的：首先，优化的前提是完善的监控，因为你有完善的监控才能发现确定问题所在，才能看到优化后的效果；然后，不要过度优化，时间很宝贵，视需求来决定优化的程度，够用即可；最后优化不是一件容易的事情，需要对方方面面有深入的理解。 性能评估 Zabbix…]]></description><link>https://xdays.me/Zabbix性能优化/</link><guid isPermaLink="false">https://xdays.me/Zabbix性能优化/</guid><pubDate>Thu, 12 Dec 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;概述&lt;/h1&gt;
&lt;p&gt;关于优化，我个人观点是这样的：首先，优化的前提是完善的监控，因为你有完善的监控才能发现确定问题所在，才能看到优化后的效果；然后，不要过度优化，时间很宝贵，视需求来决定优化的程度，够用即可；最后优化不是一件容易的事情，需要对方方面面有深入的理解。&lt;/p&gt;
&lt;h1&gt;性能评估&lt;/h1&gt;
&lt;p&gt;Zabbix 自带了对自身的监控，包括繁忙 worker 进程的比例，缓存使用情况等，也有相应的触发器。&lt;/p&gt;
&lt;h1&gt;配置调整&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#采集进程的数量，这个值是关键，当监控数目较多时需增大此值
StartPollers=100
#对不可达设备的采集进程数量，适当增加
StartPollersUnreachable=100
#缓存大小，用于存储主机，项目和触发器的数据
CacheSize=256M
#历史数据值缓存
ValueCacheSize=64M
#认为agent不可达的时间
Timeout=10
#数据库慢查询
LogSlowQueries=1000&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;吐槽：&lt;/strong&gt; 官方文档对配置文件的描述太简单了，只能知其然不能知其所以然。&lt;/p&gt;
&lt;p&gt;参考链接&lt;br&gt;
&lt;a href=&quot;http://www.slideshare.net/xsbr/alexei-vladishev-zabbixperformancetuning&quot;&gt;zabbix performance
tuning&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Zabbix自动发现]]></title><description><![CDATA[简介 通过近段时间对 Zabbix 的研究，我认为实现批量监控设备的方式有两种：一种是封装 API…]]></description><link>https://xdays.me/Zabbix自动发现/</link><guid isPermaLink="false">https://xdays.me/Zabbix自动发现/</guid><pubDate>Thu, 28 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;通过近段时间对 Zabbix 的研究，我认为实现批量监控设备的方式有两种：一种是封装 API，通过调用函数传递主机信息来新增设备；另一种是通过自动发现并新增设备。本文主要讨论自动发现，因为它功能强大且操作简单。自动发现可分为网络发现，自动注册和底层发现。一言以蔽之，通过自动发现你只需要配置一个网段和发现规则即可自动完成设备的监控。&lt;/p&gt;
&lt;h1&gt;底层发现&lt;/h1&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;底层发现的原理大致如下：当 Zabbix 被告知需要监控一台设备时，会主动去探测设备上一些信息来作为 item，然后可以为这些 item 创建 trigger 和 graph；目前这种去探测设备的常见方式有 agent 和 snmp 等；探测来的信息实际上是一个个 key，需要通过正则表达式来筛选，然后拿筛选后的 key 来获取实际想要的信息；item，trigger 和 graph 在发现里叫做 prototype，即原型。&lt;/p&gt;
&lt;h2&gt;配置流程&lt;/h2&gt;
&lt;p&gt;底层发现的创建流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入模板配置，点击 discovery&lt;/li&gt;
&lt;li&gt;点击 create discovery rule&lt;/li&gt;
&lt;li&gt;填写 discovery 的相关信息&lt;/li&gt;
&lt;li&gt;点击 items prototypes&lt;/li&gt;
&lt;li&gt;点击 trigger prototypes&lt;/li&gt;
&lt;li&gt;点击 graph prototypes&lt;/li&gt;
&lt;li&gt;检查配置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;
以上每个步骤的具体细节请参考&lt;a href=&quot;https://www.zabbix.com/documentation/2.2&quot;&gt;官方文档&lt;/a&gt;，我只写思路。&lt;/p&gt;
&lt;h2&gt;实例 1 通过 SNMP 自动发现 DiskIO&lt;/h2&gt;
&lt;p&gt;由于 Net-SNMP 已经包含了磁盘 IO 的相关信息，所以只需要添加一个模板即可，考参照&lt;a href=&quot;https://gist.github.com/xdays/7689567&quot;&gt;zabbix_snmp_linux_templates 模板&lt;/a&gt;学习。&lt;/p&gt;
&lt;h2&gt;实例 2 通过 agent 自动发现 DiskIO&lt;/h2&gt;
&lt;p&gt;由于 agent 目前仅包含基于设备（如/dev/sda1）的磁盘 IO 的信息，而却不支持对设备的自动发现（是的，vfs.fs.discovery 只能发现挂载点，不能发现设备），所以我们需要自己配置 UserParameter 来读取/proc/diskstats 来实现&lt;/p&gt;
&lt;h3&gt;zabbix_agentd.conf 配置&lt;/h3&gt;
&lt;p&gt;需要添加的配置如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# disk io not filesystem!
UserParameter=vfs.fs.io.read.ops[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$4}&apos;
UserParameter=vfs.fs.io.read.ms[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$7}&apos;
UserParameter=vfs.fs.io.write.ops[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$8}&apos;
UserParameter=vfs.fs.io.write.ms[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$11}&apos;
UserParameter=vfs.fs.io.active[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$12}&apos;
UserParameter=vfs.fs.io.ms[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$13}&apos;
UserParameter=vfs.fs.io.read.sectors[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$6}&apos;
UserParameter=vfs.fs.io.write.sectors[*],dev=`mount | grep &quot;$1 &quot; | awk &apos;{print $$1}&apos; | awk -F&apos;/&apos; &apos;{print $$3}&apos;` &amp;amp;&amp;amp; cat /proc/diskstats | grep $dev | head -1 | awk &apos;{print $$10}&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后添加&lt;a href=&quot;https://gist.github.com/xdays/7689550&quot;&gt;zabbix_agent_linux_templates 模板&lt;/a&gt;学习。&lt;/p&gt;
&lt;h1&gt;动作&lt;/h1&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;在介绍网络发现和自动注册前不得不先说下动作 action 这个概念，它是自动化监控的执行者。顾名思义，动作就是在一个事件发生的时候再满足一定条件下执行一系列的操作。比如在一个监控值的触发器被触发的时候发邮件告警（即告警），比如从一个网络中发现合法的设备时创建主机并关联相关模板（网络发现），再比如当一个 agent 向 server 汇报信息时，获取相关信息，然后创建主机并关联相关模板（自动注册）。&lt;/p&gt;
&lt;h2&gt;配置流程&lt;/h2&gt;
&lt;p&gt;动作的创建流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;进入 action 配置页面，选择事件源&lt;/li&gt;
&lt;li&gt;点击 create action&lt;/li&gt;
&lt;li&gt;填写名称等 action 描述信息&lt;/li&gt;
&lt;li&gt;创建执行条件&lt;/li&gt;
&lt;li&gt;创建操作动作&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 以上每个步骤的具体细节请参考官方文档，我只写思路。&lt;/p&gt;
&lt;h1&gt;网络发现&lt;/h1&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;Zabbix 通过一个 IP 地址范围和发现规则（如通过 agent 获取一个 key 或者通过 snmp 获取一个 OID）来发现合法的目标设备，如果满足条件则触发一个动作，来完成相关操作。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;坑：&lt;/strong&gt;
我实践中发现，网络发现设备后 action 只能创建 host 不能给 host 添加 interface，这样就导致不能给设备关联 SNMP 相关的模板。&lt;/p&gt;
&lt;h2&gt;配置流程&lt;/h2&gt;
&lt;p&gt;网络发现的配置流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;点击配置，进入 discovery 页面&lt;/li&gt;
&lt;li&gt;点击 create discovery rule&lt;/li&gt;
&lt;li&gt;填写相关信息&lt;/li&gt;
&lt;li&gt;按照 action 创建流程配置这个发现对应的 action&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 以上每个步骤的具体细节请参考官方文档，我只写思路。&lt;/p&gt;
&lt;h1&gt;自动注册&lt;/h1&gt;
&lt;h2&gt;原理&lt;/h2&gt;
&lt;p&gt;通过配置 zabbix_agentd.conf 指定 ServerActive 配置项让 agent 在启动的时候主动去向 server 汇报信息，具体汇报的信息由 HostMetadataItem 配置项指定，然后触发一个动作，来完成相关操作。&lt;/p&gt;
&lt;h2&gt;配置流程&lt;/h2&gt;
&lt;p&gt;自动注册配置流程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;配置 agent&lt;/li&gt;
&lt;li&gt;按照 action 创建流程配置这个发现对应的 action&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;https://www.zabbix.com/documentation/2.2&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Zabbix编译安装]]></title><description><![CDATA[安装依赖 由于自带的 PHP 版本为 5.1，而 Zabbix2.2 对 PHP 版本需要是不低于 5.3，故而卸载系统自带的版本安装 5.3： 下载解压 配置 安装主程序 配置 zabbix_server.conf 修改 zabbix server…]]></description><link>https://xdays.me/Zabbix编译安装/</link><guid isPermaLink="false">https://xdays.me/Zabbix编译安装/</guid><pubDate>Wed, 20 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;安装依赖&lt;/h1&gt;
&lt;p&gt;由于自带的 PHP 版本为 5.1，而 Zabbix2.2 对 PHP 版本需要是不低于 5.3，故而卸载系统自带的版本安装 5.3：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -e php-common php-cli php
yum install httpd yum install php53 php53-cli php53-common php53-pdo php53-mysql php53-gd php53-bcmath php53-xml php53-mbstring mysql mysql-server mysql-devel net-snmp net-snmp-utils net-snmp-devel&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;下载解压&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget -SO zabbix-2.2.0.tar.gz &quot;http://sourceforge.net/projects/zabbix/files/ZABBIX%20Latest%20Stable/2.2.0/zabbix-2.2.0.tar.gz/download&quot; &amp;amp;&amp;amp; tar xzf zabbix-2.2.0.tar.gz &amp;amp;&amp;amp; cd zabbix-2.2.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;./configure --enable-server --enable-agent --with-mysql --enable-ipv6 --with-net-snmp --with-libcurl --with-libxml2 --prefix=/usr/local/zabbix-2.2.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;安装主程序&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;make install
ln -s /usr/local/zabbix-2.2.0 /usr/local/zabbix&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置 zabbix_server.conf&lt;/h1&gt;
&lt;p&gt;修改 zabbix server 配置文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vim /usr/local/zabbix/etc/zabbix_server.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;LogFile=/tmp/zabbix_server.log
DBHost= ip
DBName=zabbix
DBUser=zabbix
DBPassword=passwd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;创建用户&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;groupadd zabbix
useradd -g zabbix -M -s /sbin/nologin zabbix&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd /usr/local/zabbix/sbin &amp;amp;&amp;amp; ./zabbix_server &amp;amp;&amp;amp; ./zabbix_agentd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;安装 fontend&lt;/h1&gt;
&lt;h2&gt;程序文件&lt;/h2&gt;
&lt;p&gt;cp -a frontend/php /user/local/zabbix-web&lt;/p&gt;
&lt;h2&gt;配置 Web 服务器&lt;/h2&gt;
&lt;p&gt;修改 zabbix 对应的配置文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vim /etc/httpd/conf.d/zabbix-web.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;
内容如下：
&lt;script src=&quot;https://gist.github.com/xdays/7564955.js&quot;&gt;&lt;/script&gt;
&lt;/p&gt;
然后重启apache
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;service httpd restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;Web 安装&lt;/h2&gt;
&lt;p&gt;访问&lt;a href=&quot;http://zabbix%5C_server/zabbix/%EF%BC%8C%E7%84%B6%E5%90%8E%E6%8C%89%E7%85%A7%E5%AE%89%E8%A3%85%E5%90%91%E5%AF%BC%E6%93%8D%E4%BD%9C%E5%8D%B3%E5%8F%AF%E3%80%82&quot;&gt;http://zabbix\_server/zabbix/，然后按照安装向导操作即可。&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Zabbix基本安装]]></title><description><![CDATA[简介 目前系统运维监控环节有 Cacti 和 Nagios 两大工具，分别用于监控中的作图和报警两个重要方面。而 Zabbix…]]></description><link>https://xdays.me/Zabbix基本安装/</link><guid isPermaLink="false">https://xdays.me/Zabbix基本安装/</guid><pubDate>Fri, 15 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;目前系统运维监控环节有 Cacti 和 Nagios 两大工具，分别用于监控中的作图和报警两个重要方面。而 Zabbix 可以集两工具的功能于一体并且具有一些额外的包括告警自动处理，资产管理等“福利”。官方称其为企业级的开源监控解决方案，其中含义可在学习研究中慢慢体会。&lt;/p&gt;
&lt;h1&gt;特性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;数据采集，支持 SNMP，IPMI，JMX 和 agent 等多种模式&lt;/li&gt;
&lt;li&gt;分析采集数据，问题探测&lt;/li&gt;
&lt;li&gt;可视化，可做成牛掰的大屏幕模式&lt;/li&gt;
&lt;li&gt;告警通知，自动处理&lt;/li&gt;
&lt;li&gt;模板机制，简化操作&lt;/li&gt;
&lt;li&gt;自动发现&lt;/li&gt;
&lt;li&gt;支持 proxy 模式，可做分布是监控&lt;/li&gt;
&lt;li&gt;资产管理&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装配置&lt;/h1&gt;
&lt;h2&gt;安装需求&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/11/zabbix_requirement.jpg&quot; alt=&quot;zabbix hardware
reuqirement&quot;&gt;&lt;/p&gt;
&lt;h2&gt;安装官方源&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -ivh http://repo.zabbix.com/zabbix/2.2/rhel/6/x86_64/zabbix-release-2.2-1.el6.noarch.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;安装 Zabbix 组件&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install zabbix-server-mysql zabbix-web-mysql zabbix-agent&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置数据库&lt;/h2&gt;
&lt;h3&gt;初始化数据库&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# mysql -uroot
mysql&gt; create database zabbix character set utf8;
mysql&gt; grant all privileges on zabbix.* to zabbix@localhost identified by &apos;zabbix&apos;;
mysql&gt; exit
# cd /usr/share/doc/zabbix-server-mysql-2.2.0/create
# mysql -uroot zabbix &amp;lt; schema.sql
# mysql -uroot zabbix &amp;lt; images.sql
# mysql -uroot zabbix &amp;lt; data.sql&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置 zabbix_server.conf&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# vi /etc/zabbix/zabbix_server.conf
DBHost=localhost
DBName=zabbix
DBUser=zabbix
DBPassword=zabbix&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;启动 Zabbix&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;service zabbix-server start
service zabbix-agent start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解决中文字体问题&lt;/h2&gt;
&lt;p&gt;虽然 zabbix 的国际化做的不错，但是其自带的 web 字体是不支持汉字的，这导致作图时所有文字均为方框。解决办法是从系统上找个中文字体，然后覆盖 zabbix 的字体。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cp font.ttf /etc/alternatives/zabbix-web-font&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;基本概念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;host groups,
主机逻辑组，包括主机和模板，主机组下的主机和模板没有任何关系；这个概念主要用于权限控制&lt;/li&gt;
&lt;li&gt;template 模板，一些可以应用到主机的条目的集合，也是为了方便管理
&lt;ul&gt;
&lt;li&gt;application, 应用，就是一组 item 的集合&lt;/li&gt;
&lt;li&gt;items, 项目，数据单元也是监控的基本单位&lt;/li&gt;
&lt;li&gt;triggers, 触发器，就是对获取到的数据的逻辑计算表达式，可触发告警&lt;/li&gt;
&lt;li&gt;graphs, 图形，即监控图&lt;/li&gt;
&lt;li&gt;screen, 筛选，可以把多个监控图拼到一块&lt;/li&gt;
&lt;li&gt;discovery rules, 自动发现规则&lt;/li&gt;
&lt;li&gt;web scenarios，web 探测场景&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;host,
一个待监控的网络设备，从其包含的元素可看出来 host 可以通过 template 生成，注意 host 里没有 screens
&lt;ul&gt;
&lt;li&gt;application&lt;/li&gt;
&lt;li&gt;items&lt;/li&gt;
&lt;li&gt;triggers&lt;/li&gt;
&lt;li&gt;graphs&lt;/li&gt;
&lt;li&gt;discovery&lt;/li&gt;
&lt;li&gt;web&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;maintenance, 维护阶段，维护阶段内有问题不告警&lt;/li&gt;
&lt;li&gt;event，事件，一些事情发生了，trigger 状态变化，自动发现发生&lt;/li&gt;
&lt;li&gt;action, 动作，预先定义的对事件的响应&lt;/li&gt;
&lt;li&gt;slide shows, 简报片显示，平滑展示定期刷新的图表&lt;/li&gt;
&lt;li&gt;maps，拓扑图绘制&lt;/li&gt;
&lt;li&gt;discovery, 自动发现规则&lt;/li&gt;
&lt;li&gt;it service.， IT 服务，SLA&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;
zabbix 对这些基本元素之间的管理定义的还不是很清楚，比如 template 里的 screens 的使用，这一点确实是其不足之处，这点还有待研究&lt;/p&gt;
&lt;h1&gt;Zabbix Style&lt;/h1&gt;
&lt;p&gt;Zabbix 的使用有很多要说的，熟练使用 Zabbix 配置监控的前提是你得懂得&lt;strong&gt;Zabbix
Style&lt;/strong&gt;，下面我基于我说下目前对这种 Style 的理解：首先，不同于 Cacti 为每种元素建立对应的模板（如图形模板，数据模板和主机模板），Zabbix 只用一种主机模板来整合所有的元素，一个主机模板会包括应用，监控项，触发器，图形，过滤，发现和 Web 元素，模板是 Zabbix 的核心之核心。所以配置监控项监控主机的流程基本上是定义模板，定义模板里的元素，将模板应用到主机；然后，对于监控数据的展示 Zabbix 有 screens，slide
shows，maps 和 IT
service 等多种方式来呈现；然后，由于 Zabbix 除了监控还有告警和自动处理的功能，告警就涉及 media
type 告警方式（短信，邮件等）的配置，自动处理就涉及动作的配置以便在事件发生的时候执行一系列的动作，这就是 action；此外，Zabbix 还有一个亮点是自动发现机制，比如自动发现你系统上的分区并采集其使用率，且完成画图等工作，这就是 discoverys；最后，资产管理也是 Zabbix 的一个附加功能，这就是 inventory。&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://www.zabbix.com/documentation/2.2/manual&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/jjmartres/Zabbix&quot;&gt;一些 zbbix 模板&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Proxy服务器-Trafficserver基础]]></title><description><![CDATA[简介 Apache Traffic
Server（简称 ATS）是新一代的缓存代理服务器，Yahoo 买下 Inktomi，经多年开发日渐成熟，2009 年将其贡献给 Apache 基金会作为 TLP。 特性 缓存，也是其最主要应用，功能和 Squid…]]></description><link>https://xdays.me/Proxy服务器-trafficserver基础/</link><guid isPermaLink="false">https://xdays.me/Proxy服务器-trafficserver基础/</guid><pubDate>Thu, 07 Nov 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Apache Traffic
Server（简称 ATS）是新一代的缓存代理服务器，Yahoo 买下 Inktomi，经多年开发日渐成熟，2009 年将其贡献给 Apache 基金会作为 TLP。&lt;/p&gt;
&lt;h1&gt;特性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;缓存，也是其最主要应用，功能和 Squid 一样；&lt;/li&gt;
&lt;li&gt;代理，服务器端做反向代理，负载均衡，功能和 nginx 等类似；&lt;/li&gt;
&lt;li&gt;快速，支持多核处理器，每秒并发支持到 3w；&lt;/li&gt;
&lt;li&gt;可扩展
&lt;ul&gt;
&lt;li&gt;插件机制使其内部可扩展&lt;/li&gt;
&lt;li&gt;通过多级缓存和 ICP 互联工作模式使其外部可扩展&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;**注意：**在技术领域里会经常看到这种新技术创造的革命，如 nginx&lt;/p&gt;
&lt;h1&gt;组件&lt;/h1&gt;
&lt;h2&gt;TrafficServer 缓存&lt;/h2&gt;
&lt;p&gt;通过告诉对象数据库来缓存，索引为 URL 和相关 header 头。可以根据 vary 存多份；存储很大和很小的文件；能容忍磁盘的任何失效，盘坏完了就切换为纯代理模式；可以对缓存分区，不同条件存到不同的分区，可用于混合存储。&lt;/p&gt;
&lt;h2&gt;RAM 缓存&lt;/h2&gt;
&lt;p&gt;顾名思义，内存缓存。&lt;/p&gt;
&lt;h2&gt;Host 数据库&lt;/h2&gt;
&lt;p&gt;用于保存链接源服务器的 DNS 记录，包括 DNS，HTTP 版本信息。&lt;/p&gt;
&lt;h2&gt;DNS 解析器&lt;/h2&gt;
&lt;p&gt;回源解析，可实现根据条件使用不同的 DNS 服务器。&lt;/p&gt;
&lt;h2&gt;TrafficServer 进程&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;traffic_server 是事务处理引擎&lt;/li&gt;
&lt;li&gt;traffic_manager 用来命令和控制 ATS 的进程，如配置，统计，集群管理和故障转移&lt;/li&gt;
&lt;li&gt;traffic_cop 监控 traffic_server 和 traffic_manager 健康状况，可重启这俩进程。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;h2&gt;安装依赖&lt;/h2&gt;
&lt;p&gt;对于 CentOS：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo yum install gcc gcc-c++ pkgconfig pcre-devel tcl-devel expat-devel openssl-devel perl-ExtUtils-MakeMaker libcap libcap-devel hwloc hwloc-devel autoconf automake libtool git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;对于 Ubuntu：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo apt-get install g++ make pkg-config libssl-dev tcl-dev libexpat1-dev libpcre3-dev libmodule-install-perl&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;获取源码&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone https://git-wip-us.apache.org/repos/asf/trafficserver.git&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置环境&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd trafficserver &amp;amp;&amp;amp; autoreconf -if &amp;amp;&amp;amp; ./configure --prefix=/usr/local/trafficserver&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;编译安装&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; sudo make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;启动&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd /usr/local/trafficserver/bin &amp;amp;&amp;amp; ./traffic_server start&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;p&gt;由于 ATS 配置文件采用模块化管理，所以文件数目很多，配置文件对应的功能如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;cache.config 控制如何存储对象&lt;/li&gt;
&lt;li&gt;congestion.config 拥塞控制&lt;/li&gt;
&lt;li&gt;hosting.config 为源站或者域名指定磁盘分区&lt;/li&gt;
&lt;li&gt;icp.config 配置 ICP 服务&lt;/li&gt;
&lt;li&gt;ip_allow.config 访问控制&lt;/li&gt;
&lt;li&gt;log_hosts.config 为特定源站单独写 log 文件&lt;/li&gt;
&lt;li&gt;log_xml.config 自定义日志文件格式&lt;/li&gt;
&lt;li&gt;parent.config 定义父缓存节点&lt;/li&gt;
&lt;li&gt;plugin.config 插件配置&lt;/li&gt;
&lt;li&gt;records.config 定义变量，可通过 traffic_line -x 设置&lt;/li&gt;
&lt;li&gt;remap.config URL 映射规则&lt;/li&gt;
&lt;li&gt;splitdns.config 自定义域名解析&lt;/li&gt;
&lt;li&gt;ssl_multicert.config 配置多 SSL 证书&lt;/li&gt;
&lt;li&gt;storage.config 配置所有缓存存储&lt;/li&gt;
&lt;li&gt;update.config 配置定时更新缓存&lt;/li&gt;
&lt;li&gt;volume.config 配置 volume&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;参考链接：&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ostatic.com/blog/guest-post-yahoos-cloud-team-open-sources-traffic-server&quot;&gt;概要介绍&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://trafficserver.readthedocs.org/en/latest/reference/configuration/index.en.html&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Ansible初探]]></title><description><![CDATA[简介 ansible 是一个自动化管理工具，它足够简单且足够强大来管理大批量设备。可用于配置系统，部署软件以及组合复杂任务。关于其来由可参考中文 FAQ 特性 无 agent 模式，push 模式，这一点与fabric…]]></description><link>https://xdays.me/Ansible初探/</link><guid isPermaLink="false">https://xdays.me/Ansible初探/</guid><pubDate>Thu, 31 Oct 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;ansible 是一个自动化管理工具，它足够简单且足够强大来管理大批量设备。可用于配置系统，部署软件以及组合复杂任务。关于其来由可参考&lt;a href=&quot;http://shzhangji.com/blog/2013/06/11/ansible-faq/&quot;&gt;中文 FAQ&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;特性&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;无 agent 模式，push 模式，这一点与&lt;a href=&quot;//fabric%E5%88%9D%E6%8E%A2/&quot;&gt;fabric&lt;/a&gt;有几分类似&lt;/li&gt;
&lt;li&gt;并发执行&lt;/li&gt;
&lt;li&gt;可用任何语言写扩展模块&lt;/li&gt;
&lt;li&gt;有类似&lt;a href=&quot;http://puppetlabs.com/&quot;&gt;Puppet&lt;/a&gt;（RAL）或者&lt;a href=&quot;http://saltstack.org/&quot;&gt;SaltStack&lt;/a&gt;（state）的 playbook&lt;/li&gt;
&lt;li&gt;灵活的匹配规则，通配符，正则&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;执行模型&lt;/h1&gt;
&lt;p&gt;如图所示： &lt;img src=&quot;/wp-content/uploads/2013/10/ansible_architecture.jpg&quot; alt=&quot;ansible
architecture&quot;&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;首先，你需要定义设备列表，即任务执行的范围&lt;/li&gt;
&lt;li&gt;然后，Ansible 能通过调用模块来在这些设备上执行任务&lt;/li&gt;
&lt;li&gt;此外，可以通过用 playbook 描述要执行的任务的逻辑，完成任务组合&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;Ansible 命令&lt;/h1&gt;
&lt;h2&gt;语法&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ansible &amp;lt;pattern_goes_here&gt; -m &amp;lt;module_name&gt; -a &amp;lt;arguments&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;选项&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;注意：通常选项也可以通过配置文件来配置&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-i 设备列表路径，注意可以通过这里制定一些动态路径，如数据库等&lt;/li&gt;
&lt;li&gt;-f 并行任务数&lt;/li&gt;
&lt;li&gt;—private-key 私钥路径&lt;/li&gt;
&lt;li&gt;-m 模块名&lt;/li&gt;
&lt;li&gt;-M 模块夹在路径&lt;/li&gt;
&lt;li&gt;-a 参数&lt;/li&gt;
&lt;li&gt;-k 登陆密码&lt;/li&gt;
&lt;li&gt;-K sudo 密码&lt;/li&gt;
&lt;li&gt;-t 输出结果保存路径&lt;/li&gt;
&lt;li&gt;-B 后台运行超时时间&lt;/li&gt;
&lt;li&gt;-P 调查后台程序时间&lt;/li&gt;
&lt;li&gt;-u 执行用户&lt;/li&gt;
&lt;li&gt;-U sudo 用户&lt;/li&gt;
&lt;li&gt;-l 限制设备范围&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;示例&lt;/h1&gt;
&lt;h2&gt;定义设备&lt;/h2&gt;
&lt;p&gt;vim /etc/ansible/hosts&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;local   ansible_ssh_host=localhost   ansible_connection=local
aliyun  ansible_ssh_host=cloud.xdays.me   ansible_ssh_private_key_file=~/.ssh/id_rsa​&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;执行命令&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ansible aliyun -a &apos;w&apos; #默认调用command模块&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;高级功能&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;Playbooks，暂时不作研究，详见官方文档;&lt;/li&gt;
&lt;li&gt;API，可以参考 AWX 结合 API 来做适合自己的运维平台&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ansibleworks.com/docs/&quot;&gt;官方文档&lt;/a&gt;
&lt;a href=&quot;http://shzhangji.com/blog/2013/06/11/ansible-faq/&quot;&gt;中文 FAQ&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[JavaScript基础语法]]></title><description><![CDATA[特点 解释型，基于原型（prototype）的面向对象高级语言； 应用广泛，常见但不仅限于 Web 开发，node.js日渐流行； 编写灵活，这是一把双刃剑 性能强大，非阻塞 开放，ECMAScript 规范 厂商扩展，看具体引擎实现 数据类型 字符串，Unicode 数字，6…]]></description><link>https://xdays.me/Javascript基础语法/</link><guid isPermaLink="false">https://xdays.me/Javascript基础语法/</guid><pubDate>Wed, 30 Oct 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;特点&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;解释型，基于原型（prototype）的面向对象高级语言；&lt;/li&gt;
&lt;li&gt;应用广泛，常见但不仅限于 Web 开发，&lt;a href=&quot;http://nodejs.org&quot;&gt;node.js&lt;/a&gt;日渐流行；&lt;/li&gt;
&lt;li&gt;编写灵活，这是一把双刃剑&lt;/li&gt;
&lt;li&gt;性能强大，非阻塞&lt;/li&gt;
&lt;li&gt;开放，ECMAScript 规范&lt;/li&gt;
&lt;li&gt;厂商扩展，看具体引擎实现&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;数据类型&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;字符串，Unicode&lt;/li&gt;
&lt;li&gt;数字，64 位二进制表示&lt;/li&gt;
&lt;li&gt;布尔，即 true 和 false&lt;/li&gt;
&lt;li&gt;null，实际上 null 不是一种数据类型，而是一个对象值。&lt;/li&gt;
&lt;li&gt;undefined&lt;/li&gt;
&lt;li&gt;对象，理解 JavaScript 的关键所在，键值对的集合，包括数组，函数，正则，日期等&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;操作符和表达式&lt;/h1&gt;
&lt;h2&gt;操作符&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;操作符列表如下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/10/operator.png&quot; alt=&quot;operator&quot;&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;操作符优先级，与其他语言类似，记住用括号显示表达优先级就可以了。&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;表达式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;原始表达式，如&lt;code class=&quot;language-text&quot;&gt;1.0&lt;/code&gt;就是表达式&lt;/li&gt;
&lt;li&gt;数组和对象初始化，如&lt;code class=&quot;language-text&quot;&gt;[1,2]&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;{&apos;foo&apos;: &apos;bar&apos;}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;函数定义，如&lt;code class=&quot;language-text&quot;&gt;function f() {}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;属性访问，如&lt;code class=&quot;language-text&quot;&gt;o.attr&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;调用，如&lt;code class=&quot;language-text&quot;&gt;f()&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;对象创建，如&lt;code class=&quot;language-text&quot;&gt;new Array&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;语句&lt;/h1&gt;
&lt;h2&gt;语句块&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;用&lt;code class=&quot;language-text&quot;&gt;{}&lt;/code&gt;将语句包含起来就是语句块&lt;/li&gt;
&lt;li&gt;语句块不会创建作用域&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;条件语句&lt;/h2&gt;
&lt;h3&gt;if&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;if (expression) {
    statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;if…else…&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;if (expression) {
    statement;
}
else {
    statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;if…else if…else&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;if (expression) {
    statement;
}
else if {
    statement;
}
else {
    statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;switch&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;swith () {
    case value1:
        statement;
    case value2:
        statement;
    default:
        statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;循环语句&lt;/h2&gt;
&lt;h3&gt;while&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;while (expression) {
    statement
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;do…while&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;do {
    statemnet
} while (expression)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;for&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;for (foo=0; foo&amp;lt;=10;foo++) {
    statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;for in&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;for (foo in obj) {
    statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;数组&lt;/h1&gt;
&lt;h2&gt;概述&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;数组是一种特殊的对象&lt;/li&gt;
&lt;li&gt;一组对象的有序集合&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;定义&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;var arr = [1, 2, 3];
var arr = new Array;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;数组的方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;join 连接&lt;/li&gt;
&lt;li&gt;reverse 反向&lt;/li&gt;
&lt;li&gt;sort 排序&lt;/li&gt;
&lt;li&gt;concat 拼接&lt;/li&gt;
&lt;li&gt;slice 切片&lt;/li&gt;
&lt;li&gt;splice 插入或删除&lt;/li&gt;
&lt;li&gt;push 和 pop 入栈和出栈&lt;/li&gt;
&lt;li&gt;unshift 和 shift 移位&lt;/li&gt;
&lt;li&gt;toString 和 toLocalSting 字符串表示&lt;/li&gt;
&lt;li&gt;forEach 遍历&lt;/li&gt;
&lt;li&gt;map 映射&lt;/li&gt;
&lt;li&gt;filter 过滤&lt;/li&gt;
&lt;li&gt;every 和 some 每一个和有些&lt;/li&gt;
&lt;li&gt;reduce 和 reduceRight 聚合&lt;/li&gt;
&lt;li&gt;indexOf 和 lastIndexOf 索引&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;函数&lt;/h1&gt;
&lt;h2&gt;概述&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;函数是一种特殊的对象，定义一组语句用于重复利用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;定义&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;var fun = function() {};
var fun = new Function(arg, body);
function name() {
    statement;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;对象&lt;/h1&gt;
&lt;h2&gt;概述&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;一组属性（包括值或者函数）的集合&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;定义&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;var obj = {&apos;foo&apos;: &apos;bar&apos;};
var obj = {&apos;method&apos;: fuction(){}};
var obj = new Object;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Bind搭建DNS服务系统]]></title><description><![CDATA[简介 Bind 是目前应用最广泛的 DNS 服务器软件，其主要包括服务器实现，解析器库实现和测试三个部分。 说明 本文仅讨论如何把 Bind 配置成一台 DNS 域名服务器，关于 DNS 协议的说明，请参考DNS 协议详解 安装 centos 其中 bind-chroot…]]></description><link>https://xdays.me/Bind搭建DNS服务系统/</link><guid isPermaLink="false">https://xdays.me/Bind搭建DNS服务系统/</guid><pubDate>Wed, 16 Oct 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Bind 是目前应用最广泛的 DNS 服务器软件，其主要包括服务器实现，解析器库实现和测试三个部分。&lt;/p&gt;
&lt;h1&gt;说明&lt;/h1&gt;
&lt;p&gt;本文仅讨论如何把 Bind 配置成一台 DNS 域名服务器，关于 DNS 协议的说明，请参考&lt;a href=&quot;dns%E5%8D%8F%E8%AE%AE%E8%AF%A6%E8%A7%A3.md&quot;&gt;DNS 协议详解&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;h2&gt;centos&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install bind bind-libs bind-utils bind-chroot&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;其中 bind-chroot 用于让 bind 运行于 chroot 模式下。&lt;/p&gt;
&lt;h2&gt;ubuntu&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install bind9 dnsutils&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;概述&lt;/h2&gt;
&lt;p&gt;bind 的配置文件为 named.conf，没有 chroot 时位于/etc/named.conf，chroot 时位于/var/named/chroot/etc/named.conf 下。配置文件由配置语句和注释组成。关于配置的详细说明可参考&lt;a href=&quot;http://www.oit.uci.edu/dcslib/bind/bind-9.2.1/Bv9ARM.html&quot;&gt;BIND
9 Administrator Reference
Manual&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;配置语句列表&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;acl 定义一个 IP 列表名，用于接入控制&lt;/li&gt;
&lt;li&gt;controls 宣告 rndc 使用的控制通道&lt;/li&gt;
&lt;li&gt;include 包含一个文件&lt;/li&gt;
&lt;li&gt;key 设置密钥信息，用于授权和认证配置中&lt;/li&gt;
&lt;li&gt;logging 设置日志服务器&lt;/li&gt;
&lt;li&gt;options 控制服务器的全局配置&lt;/li&gt;
&lt;li&gt;server 单服务器基础上配置&lt;/li&gt;
&lt;li&gt;trusted-keys 定义信任的 DNSSED 密匙&lt;/li&gt;
&lt;li&gt;view 定义视图&lt;/li&gt;
&lt;li&gt;zone 定义 zonefile&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;注释形式&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;C 语言风格&lt;/li&gt;
&lt;li&gt;C++风格&lt;/li&gt;
&lt;li&gt;Shell 风格&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;Zonefile&lt;/h2&gt;
&lt;h3&gt;TTL&lt;/h3&gt;
&lt;p&gt;zone 文件有三处控制 TTL 的地方，分别是：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;$TTL 是没有指定 TTL 的记录使用的缓存时间&lt;/li&gt;
&lt;li&gt;SOA 记录中的 TTL 是 NXDOMAIN 相应的缓存时间&lt;/li&gt;
&lt;li&gt;资源记录的第二个字段记录了本记录的缓存时间&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;SOA 记录&lt;/h3&gt;
&lt;p&gt;SOA 记录是 zone 文件里最复杂的记录类型了，所以单独说明下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$TTL 2d ; zone TTL default = 2 days or 172800 seconds
$ORIGIN example.com.
@      IN      SOA   ns.example.net. hostmaster.example.com. (
               2003080800 ; serial number
               1d12h      ; refresh =  1 day 12 hours
               15M        ; update retry = 15 minutes
               3W12h      ; expiry = 3 weeks + 12 hours
               2h20M      ; minimum = 2 hours + 20 minutes
               )&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;具体参考&lt;a href=&quot;http://www.zytrax.com/books/dns/ch8/soa.html&quot;&gt;这里&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;其他记录&lt;/h3&gt;
&lt;p&gt;记录格式为：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;名称 TTL 类 类型 具体信息（随类型变化而变化）&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;示例如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;www 360 IN A 192.168.1.1
@ 360 IN MX 90 mail.example.com
@ 360 IN NS ns.example.com&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;演示&lt;/h1&gt;
&lt;h2&gt;说明&lt;/h2&gt;
&lt;p&gt;本示例我将演示如何通过四台服务器搭建一个完整 DNS 系统，其中包括 root，com 和 info 的授权，xdays.com 和 xdays.me 的授权案，cache-only 域名解析服务器。&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;h3&gt;root&lt;/h3&gt;
&lt;p&gt;named.conf 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//


options {
 listen-on port 53 { any; };
 //listen-on-v6 port 53 { ::1; };
 directory  &quot;/var/named&quot;;
 dump-file  &quot;/var/named/data/cache_dump.db&quot;;
        statistics-file &quot;/var/named/data/named_stats.txt&quot;;
        memstatistics-file &quot;/var/named/data/named_mem_stats.txt&quot;;
 allow-query     { any; };
 recursion yes;


 //dnssec-enable yes;
 //dnssec-validation yes;
 dnssec-enable no;
 dnssec-validation no;
 dnssec-lookaside auto;


 /* Path to ISC DLV key */
 bindkeys-file &quot;/etc/named.iscdlv.key&quot;;


 managed-keys-directory &quot;/var/named/dynamic&quot;;
};


logging {
        channel default_debug {
                file &quot;data/named.run&quot;;
                severity dynamic;
        };
};


zone &quot;.&quot; IN {
 type master;
 file &quot;named.ca&quot;;
};


include &quot;/etc/named.rfc1912.zones&quot;;
include &quot;/etc/named.root.key&quot;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;named.ca 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$TTL 86400
@ IN SOA @ root (
 42 ; serial (d. adams)
 3H ; refresh
 15M ; retry
 1W ; expiry
 1D ) ; minimum


. 518400 IN NS xdays.root.net.
xdays.root.net. 3600000 IN A 192.168.110.100
info. 518400 IN NS ns.info.
ns.info. 3600000 IN A 192.168.110.101
com. 518400 IN NS ns.com.
ns.com. 3600000 IN A 192.168.110.101&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;info&lt;/h3&gt;
&lt;p&gt;named.conf 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//


options {
 listen-on port 53 { any; };
 //listen-on-v6 port 53 { ::1; };
 directory  &quot;/var/named&quot;;
 dump-file  &quot;/var/named/data/cache_dump.db&quot;;
        statistics-file &quot;/var/named/data/named_stats.txt&quot;;
        memstatistics-file &quot;/var/named/data/named_mem_stats.txt&quot;;
 allow-query     { any; };
 recursion yes;


 //dnssec-enable yes;
 //dnssec-validation yes;
 dnssec-enable no;
 dnssec-validation no;
 dnssec-lookaside auto;


 /* Path to ISC DLV key */
 bindkeys-file &quot;/etc/named.iscdlv.key&quot;;


 managed-keys-directory &quot;/var/named/dynamic&quot;;
};


logging {
        channel default_debug {
                file &quot;data/named.run&quot;;
                severity dynamic;
        };
};


zone &quot;.&quot; IN {
 type hint;
 file &quot;named.ca&quot;;
};


zone &quot;info.&quot; IN {
 type master;
 file &quot;info.zone&quot;;
};


zone &quot;com.&quot; IN {
 type master;
 file &quot;com.zone&quot;;
};


include &quot;/etc/named.rfc1912.zones&quot;;
include &quot;/etc/named.root.key&quot;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;named.ca 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;. 518400 IN NS xdays.root.net.
xdays.root.net. 3600000 IN A 192.168.110.100&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;info.zone 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$TTL 86400
@ IN SOA @ root (
 42 ; serial (d. adams)
 3H ; refresh
 15M ; retry
 1W ; expiry
 1D ) ; minimum


info. 518400 IN NS ns.info.
ns.info. 3600000 IN A 192.168.110.101
xdays.me. 518400 IN NS ns.xdays.me.
ns.xdays.me. 3600000 IN A 192.168.110.102&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;xdays.me&lt;/h3&gt;
&lt;p&gt;named.conf 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//


options {
 listen-on port 53 { any; };
 //listen-on-v6 port 53 { ::1; };
 directory  &quot;/var/named&quot;;
 dump-file  &quot;/var/named/data/cache_dump.db&quot;;
        statistics-file &quot;/var/named/data/named_stats.txt&quot;;
        memstatistics-file &quot;/var/named/data/named_mem_stats.txt&quot;;
 allow-query     { any; };
 recursion yes;


 //dnssec-enable yes;
 //dnssec-validation yes;
 dnssec-enable no;
 dnssec-validation no;
 dnssec-lookaside auto;


 /* Path to ISC DLV key */
 bindkeys-file &quot;/etc/named.iscdlv.key&quot;;


 managed-keys-directory &quot;/var/named/dynamic&quot;;
};


logging {
        channel default_debug {
                file &quot;data/named.run&quot;;
                severity dynamic;
        };
};


zone &quot;.&quot; IN {
 type hint;
 file &quot;named.ca&quot;;
};


zone &quot;xdays.me.&quot; IN {
 type master;
 file &quot;xdays.me.zone&quot;;
};


zone &quot;xdays.com.&quot; IN {
 type master;
 file &quot;xdays.com.zone&quot;;
};


include &quot;/etc/named.rfc1912.zones&quot;;
include &quot;/etc/named.root.key&quot;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;named.ca 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;. 518400 IN NS xdays.root.net.
xdays.root.net. 3600000 IN A 192.168.110.100&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;xdays.me.zone 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$TTL 86400
@ IN SOA @ root (
 42 ; serial (d. adams)
 3H ; refresh
 15M ; retry
 1W ; expiry
 1D ) ; minimum


xdays.me. 86400 IN NS ns.xdays.me.
ns.xdays.me. 360 IN A 192.168.110.101
www.xdays.me. 360 IN A 1.1.1.1
img.xdays.me. 360 IN A 2.2.2.2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;cache-only&lt;/h3&gt;
&lt;p&gt;named.conf 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;//
// named.conf
//
// Provided by Red Hat bind package to configure the ISC BIND named(8) DNS
// server as a caching only nameserver (as a localhost DNS resolver only).
//
// See /usr/share/doc/bind*/sample/ for example named configuration files.
//


options {
 listen-on port 53 { any; };
 listen-on-v6 port 53 { ::1; };
 directory  &quot;/var/named&quot;;
 dump-file  &quot;/var/named/data/cache_dump.db&quot;;
        statistics-file &quot;/var/named/data/named_stats.txt&quot;;
        memstatistics-file &quot;/var/named/data/named_mem_stats.txt&quot;;
 allow-query     { any; };
 recursion yes;


 //dnssec-enable yes;
 //dnssec-validation yes;
 dnssec-enable no;
 dnssec-validation no;
 dnssec-lookaside auto;


 /* Path to ISC DLV key */
 bindkeys-file &quot;/etc/named.iscdlv.key&quot;;


 managed-keys-directory &quot;/var/named/dynamic&quot;;
};


logging {
        channel default_debug {
                file &quot;data/named.run&quot;;
                severity dynamic;
        };
};


zone &quot;.&quot; IN {
 type hint;
 file &quot;named.ca&quot;;
};


include &quot;/etc/named.rfc1912.zones&quot;;
include &quot;/etc/named.root.key&quot;;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;named.ca 如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;. 518400 IN NS xdays.root.net.
xdays.root.net. 3600000 IN A 192.168.110.100&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;抓包信息&lt;/h2&gt;
&lt;h3&gt;标准域名解析&lt;/h3&gt;
&lt;p&gt;执行 dig &lt;a href=&quot;http://www.xdays.me%EF%BC%8C%E6%95%B0%E6%8D%AE%E5%8C%85%E5%A6%82%E4%B8%8B%EF%BC%9A&quot;&gt;www.xdays.me，数据包如下：&lt;/a&gt; &lt;img src=&quot;/wp-content/uploads/2013/10/dns-a.png&quot; alt=&quot;DNS A
Record&quot;&gt;&lt;/p&gt;
&lt;h3&gt;带 CNAME 域名解析&lt;/h3&gt;
&lt;p&gt;执行 dig img.xdays.me，数据包如下： &lt;img src=&quot;/wp-content/uploads/2013/10/dns-cname.png&quot; alt=&quot;DNS
A-CNAME&quot;&gt;
注意一点，如果 img.xdays.me 的 CNAME 记录是 img.xdays.com，而且这里俩域的授权是同一台，那么授权会把 CNAME 记录和 A 记录同时返回给本地域名解析服务器，数据包如下：
&lt;img src=&quot;/wp-content/uploads/2013/10/dns-cname-detail.png&quot; alt=&quot;DNS A-CNAME
detail&quot;&gt;&lt;/p&gt;
&lt;p&gt;注意：这里有个疑问尚未解决，在 CNAME 和 A 记录同时被返回之后，本地域名服务器又对 img.xdays.com 进行了一次递归解析，我不知道意义何在，如有结论请指教。经过请教这个过程称为&lt;strong&gt;DNS 重查&lt;/strong&gt;，也就是说即使你直接给我了 CNAME 和 A 记录，但是我无法验证你到底是不是 xdays.com 的授权，所以我要递归解析查询一次。&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.oit.uci.edu/dcslib/bind/bind-9.2.1/Bv9ARM.html&quot;&gt;BIND 9 Administrator Reference
Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.netwidget.net/books/apress/dns/&quot;&gt;Pro DNS and BIND&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[DNS协议详解]]></title><description><![CDATA[基本概念 树 树是一种数据结构，用来表达一种一对多的关系，一图胜千言。 tree 注意： 图选自《大话数据结构》 需要对树结构的几点说明： 根节点没有父节点，叶节点没有子节点 节点间不能有交叉 很多应用树结构的应用场景，如 linux…]]></description><link>https://xdays.me/DNS协议详解/</link><guid isPermaLink="false">https://xdays.me/DNS协议详解/</guid><pubDate>Mon, 14 Oct 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;基本概念&lt;/h1&gt;
&lt;h2&gt;树&lt;/h2&gt;
&lt;p&gt;树是一种数据结构，用来表达一种一对多的关系，一图胜千言。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/10/dns-tree.png&quot; alt=&quot;tree&quot;&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 图选自《大话数据结构》&lt;/p&gt;
&lt;p&gt;需要对树结构的几点说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;根节点没有父节点，叶节点没有子节点&lt;/li&gt;
&lt;li&gt;节点间不能有交叉&lt;/li&gt;
&lt;li&gt;很多应用树结构的应用场景，如 linux 目录结构等&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;域名&lt;/h2&gt;
&lt;p&gt;顾名思义，就是一个域的名字。其格式说明如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;以点分隔，每个字段最长 63 个字符，总长度最多 255 个字符（包括点）&lt;/li&gt;
&lt;li&gt;域名中可以使用任意的 ASCII 字符，但是有些自负需要转义（000 到 040,177 到 377 和不做分隔符的点）​&lt;/li&gt;
&lt;li&gt;域名既可以表示一个域也可以表示一个主机，其实可以表示主机是因为它就是子域的根节点，如 hp.com&lt;br&gt;
​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;域命名空间&lt;/h2&gt;
&lt;p&gt;用树结构表示出来的互联网所有域名数据就是域的命名空间。再来一张图说明下：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/10/dns-model.png&quot; alt=&quot;domain
namespace&quot;&gt;&lt;/p&gt;
&lt;p&gt;需要对命名空间有几点说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;命名空间的根是 root 用点来表示，严格来说所有的域名最后都有个点，因为都有所以省略了&lt;/li&gt;
&lt;li&gt;每个子树对应一个域&lt;/li&gt;
&lt;li&gt;把域名用点拆开，然后从右向左从明明空间从上向下就能找到对应的叶节点&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;资源记录&lt;/h2&gt;
&lt;p&gt;虽然归根结底 DNS 就是提供域名到 IP 的对应关系的服务，但是域名也分为不同的类型，比如授权服务器信息，邮件服务器信息等，下边我们列举下常见资源记录类型。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A ipv4 地址&lt;/li&gt;
&lt;li&gt;AAAA ipv6 地址&lt;/li&gt;
&lt;li&gt;NS 授权 DNS 地址&lt;/li&gt;
&lt;li&gt;MX 邮件服务器地址&lt;/li&gt;
&lt;li&gt;CNAME 别名记录&lt;/li&gt;
&lt;li&gt;PTR 反向解析记录&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;详细的介绍参考&lt;a href=&quot;http://www.zytrax.com/books/dns/ch8/&quot;&gt;DNS Resource
Records&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;区域&lt;/h2&gt;
&lt;p&gt;就是 zone 文件，有相应的 RFC 规范来定义 zone 文件如何记录相关资源。&lt;/p&gt;
&lt;h3&gt;域和区域的区别&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;域是一个模型概念，区域是一个配置上的概念&lt;/li&gt;
&lt;li&gt;域包含了一个或者多个区域&lt;/li&gt;
&lt;li&gt;没有授权的话域和区域包含的范围就一样了&lt;br&gt;
​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;授权&lt;/h2&gt;
&lt;p&gt;授权是 DNS 协议的核心概念，授权就是现实世界的明确分工，你需要管理的就是明确你手下的人的职责，然后能让需求方找到该找的人就可以了，也就是说如果有人问你请帮我写个脚本，你会告诉他你去找 bash 吧，他是专门写脚本的。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;一个域下的域名既可以授权给子域又可以不授权给子域直接自己管理&lt;/li&gt;
&lt;li&gt;授权下去之后，你就只需要管理授权信息就够了&lt;br&gt;
​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;反向解析&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;反向解析就是把 IP 地址树挂在 in-addr.arpa 节点下&lt;/li&gt;
&lt;li&gt;IP 地址反向写，因为高位 IP 地址应该位于树的上端，这样与域名的结构保持一致，如 192.168.1.0/24 这个地址段的记录对应的 zone 为 1.168.192.in-addr.arpa&lt;br&gt;
​&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;超时时间&lt;/h2&gt;
&lt;p&gt;超时时间（TTL）就是缓存的寿命，DNS 为了提高响应时间和缩短请求路径而创建了缓存机制，域名服务器在向外查询的时候先查询本机的缓存，没有命中才走正常的递归解析。&lt;/p&gt;
&lt;h2&gt;解析方法&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;解析器没有追踪的能力，所以不能通过解析器来来递归解析&lt;/li&gt;
&lt;li&gt;域名服务器通过查找最精确的域授权来发起递归解析请求，这样能保证查询路径最短&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;数据包&lt;/h1&gt;
&lt;h2&gt;请求包&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/10/dns-query.png&quot; alt=&quot;dns
request&quot;&gt;&lt;/p&gt;
&lt;h2&gt;响应包&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/10/dns-response-1.png&quot; alt=&quot;dns
response1&quot;&gt;&lt;br&gt;
&lt;img src=&quot;/wp-content/uploads/2013/10/dns-response-2.png&quot; alt=&quot;dns
response2&quot;&gt;&lt;/p&gt;
&lt;h1&gt;解析流程&lt;/h1&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/10/dns-procedure.gif&quot; alt=&quot;dns
procedure&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;用户电脑的解析器向 LDNS 发起域名解析请求，查询 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 的 IP 地址&lt;/li&gt;
&lt;li&gt;在缓存没有命中的情况下，LDNS 向根服务器查询 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 的 IP 地址&lt;/li&gt;
&lt;li&gt;根告诉 LDNS，我不知道 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 对应的 IP，但是我知道你可以问 com 域的授权 DNS，这个域归他管&lt;/li&gt;
&lt;li&gt;LDNS 向 com 的授权服务器问 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 对应的 IP 地址&lt;/li&gt;
&lt;li&gt;com 告诉 LDNS，我不知道 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 对应的 IP，但是我知道你可以问 google.com 域的授权 DNS，这个域归他管&lt;/li&gt;
&lt;li&gt;LDNS 向 google.com 的授权服务器问 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 对应的 IP 地址&lt;/li&gt;
&lt;li&gt;google.com 查询自己的 zone 文件，找到了 &lt;a href=&quot;http://www.google.com&quot;&gt;www.google.com&lt;/a&gt; 对应的 IP 地址，返回给 LDNS&lt;/li&gt;
&lt;li&gt;LDNS 本地缓存一份记录，把结果返回给用户电脑的解析器&lt;/li&gt;
&lt;/ol&gt;
&lt;h1&gt;解析方法&lt;/h1&gt;
&lt;h2&gt;递归解析&lt;/h2&gt;
&lt;p&gt;即 recursion，上小节详细分析的过程就是递归解析，特点是所有的任务都由 LDNS 完成，压力在 LDNS 上。&lt;/p&gt;
&lt;h2&gt;迭代解析&lt;/h2&gt;
&lt;p&gt;即 iteration，每个环节收到解析请求后，再从自身发起请求，就这这样一级一级的把请求转发下去，直到收到响应后再一级一级的把相应转发回来，因为不是目前主流的解析方式就不展开说了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[主流Linux版本自动化安装]]></title><description><![CDATA[概述 目前主流的发行版本（Redhat 和 Debian 系列）都有相应的自动化安装的工具：Redhat 有 kickstart，Debian 有 preseed…]]></description><link>https://xdays.me/主流linux版本自动化安装/</link><guid isPermaLink="false">https://xdays.me/主流linux版本自动化安装/</guid><pubDate>Sun, 11 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;概述&lt;/h1&gt;
&lt;p&gt;目前主流的发行版本（Redhat 和 Debian 系列）都有相应的自动化安装的工具：Redhat 有 kickstart，Debian 有 preseed。其作用都类似，通过预先生成或者写好的配置文件来配合系统安装程序，回答安装过程中需要交互问题来实现自动化安装。&lt;/p&gt;
&lt;h1&gt;自动化安装配置&lt;/h1&gt;
&lt;h2&gt;kickstart&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;所有的 ks 文件配置项参考&lt;a href=&quot;http://fedoraproject.org/wiki/Anaconda/Kickstart&quot;&gt;官方文档&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;在系统安装完成之后，/root/下会有一个 anaconda-ks.cfg 文件，此文件是根据手动安装时的配置生成的 ks 文件，可供下次使用&lt;/li&gt;
&lt;li&gt;如果手头没有 ks 文件可以通过“Kickstart Configurator
application”来创建一个，交互式图形界面工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; &lt;code class=&quot;language-text&quot;&gt;%post&lt;/code&gt;这个版块，可以写一些定制脚本。&lt;/p&gt;
&lt;h2&gt;preseed&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;对 debian 系的安装不太了解，没有找到相关配置项的详细说明，很遗憾&lt;/li&gt;
&lt;li&gt;debian 的&lt;a href=&quot;http://www.debian.org/releases/stable/amd64/apb.html.zh-cn&quot;&gt;自动化安装文档&lt;/a&gt;以及&lt;a href=&quot;http://www.debian.org/releases/wheezy/example-preseed.txt&quot;&gt;sample 文件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;ubuntu 的&lt;a href=&quot;https://help.ubuntu.com/lts/installation-guide/i386/appendix-preseed.html&quot;&gt;自动化安装文档&lt;/a&gt;以及&lt;a href=&quot;https://help.ubuntu.com/12.04/installation-guide/example-preseed.txt&quot;&gt;sample 文件&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt;
&lt;code class=&quot;language-text&quot;&gt;d-i preseed/late_command string&lt;/code&gt;这个版块，和 kickstart 的&lt;code class=&quot;language-text&quot;&gt;%post&lt;/code&gt;的类似，执行定制脚本的。&lt;/p&gt;
&lt;h1&gt;自动化安装规划&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;我觉得自动化安装系统和配置管理可以是自动化运维的两个子模块，相互独立。&lt;/li&gt;
&lt;li&gt;系统自动化安装后的初始化（如主机名，IP 地址，源设置等）等需要一个能提供相关 API 的核心信息库来配合：定制化脚本汇报给信息库信息，信息库记录反馈信息并且可以基于反馈信息返回定制脚本需要的信息。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Cobbler自动化安装Linux系统]]></title><description><![CDATA[简介 根据官方文档的定位，Cobbler 首要的是快速设置网络安装环境的 Linux 安装服务器；但其功能不限于此，它还可以管理配置，管理 DNS，HDCP，TFTP 和 rsync…]]></description><link>https://xdays.me/Cobbler自动化安装linux系统/</link><guid isPermaLink="false">https://xdays.me/Cobbler自动化安装linux系统/</guid><pubDate>Fri, 09 Aug 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;根据官方文档的定位，Cobbler 首要的是快速设置网络安装环境的 Linux 安装服务器；但其功能不限于此，它还可以管理配置，管理 DNS，HDCP，TFTP 和 rsync，软件包升级和电源管理等；个人感觉有些乱，作为一个开源项目明白自己想要解决什么问题并把这个问题解决到极致就够了。&lt;/p&gt;
&lt;h1&gt;说明&lt;/h1&gt;
&lt;p&gt;血与泪的经历：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cobbler2.2（来自 CentOS5.5）
安装 CentOS5.5 和 CentOS6.4 没有问题，安装 Ubuntu12.04 失败&lt;/li&gt;
&lt;li&gt;Cobbler2.4（来自 CentOS6.4）
安装 CentOS5.5 和 CentOS6.4 没有问题，安装 Ubuntu12.04 没问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;基本概念&lt;/h1&gt;
&lt;h2&gt;PXE 原理&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/08/pxe-flow.png&quot; alt=&quot;PXE原理&quot;&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;客户端发起 Discover 包，通过 flag 说明自身的 PXE 拓展信息；&lt;/li&gt;
&lt;li&gt;服务器响应 Offer 包，告知客户端下边去找哪台服务器；&lt;/li&gt;
&lt;li&gt;客户端发送 Request 包&lt;/li&gt;
&lt;li&gt;服务器发送 ACK 包&lt;/li&gt;
&lt;li&gt;客户端通过 TFTP 协议请求 pxelinux.0 等文件&lt;/li&gt;
&lt;li&gt;客户端加载并启动系统&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Cobbler 模型&lt;/h2&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/08/how-we-do.png&quot; alt=&quot;Cobbler模型&quot;&gt;&lt;/p&gt;
&lt;p&gt;这张图画出了 Cobbler 的模型，越往上的对象越基础越通用，自上而下不断的添加一些新的东西进来让其满足个性化的需求。这里我们需要重点关注的是 distro 和 profile 这两个概念。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;h2&gt;安装 EPEL 或者 rpmforge&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;CentOS5&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -ivh http://mirrors.yun-idc.com/epel/5/x86_64/epel-release-5-4.noarch.rpm #坑，此源安装的cobbler不可用
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.3-1.el5.rf.x86_64.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;CentOS6&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -ivh http://mirrors.yun-idc.com/epel/6/x86_64/epel-release-6-8.noarch.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装 Cobbler&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install -y dhcp cobbler cobbler-web&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;配置 Cobbler&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vim /etc/cobbler/settings&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;next-server: 本机IP
server: 本机IP
manage_dhcp: 1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置 Cobbler_web&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sed -i &apos;s/authn_denyall/authn_configfile/g&apos; /etc/cobbler/modules.conf
htdigest /etc/cobbler/users.digest &quot;Cobbler&quot; cobbler&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置 dhcp&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vim /etc/cobbler/dhcp.template&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;subnet 192.168.110.0 netmask 255.255.255.0 {
     option routers             192.168.110.1;
     option domain-name-servers 8.8.8.8;
     option subnet-mask         255.255.255.0;
     range dynamic-bootp        192.168.110.100 192.168.110.254;
     filename                   &quot;/pxelinux.0&quot;;
     default-lease-time         21600;
     max-lease-time             43200;
     next-server                $next_server;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置 xinetd&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vim /etc/xinet.d/{rsync,tftp}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;disable = no&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;检查并处理问题&lt;/h1&gt;
&lt;h2&gt;检查&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cobbler check&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;处理问题&lt;/h2&gt;
&lt;p&gt;一些根据提示就能解决的问题，这里不再赘述了。&lt;/p&gt;
&lt;h1&gt;导入版本&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;注意：目前可以在不折腾的情况下自动安装 CentOS 和 Ubuntu&lt;/strong&gt;&lt;/p&gt;
&lt;h2&gt;挂载镜像&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mount -t auto -o loop distro.iso /mnt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;导入版本&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cobbler import --path=/mnt --name=distro-name&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;同步配置&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cobbler sync&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://os.51cto.com/art/201109/288604.htm&quot;&gt;运维自动化之 Cobbler 系统安装详解&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://kerry.blog.51cto.com/172631/648430&quot;&gt;利用 Cobbler 批量布署 CentOS&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://www.cobblerd.org/manuals/2.4.0/&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[OAuth2.0]]></title><description><![CDATA[前言 OAuth 在展过程中变化非常大，1.0 的基础概念在 2.0 中完全不同了，整个模型也发生了翻天覆地的变化，这也给学习这门技术带来了困扰。好在 OAuth2.0 已经成为标准的RFC6749，我就跟着时代走学习 2.…]]></description><link>https://xdays.me/OAuth2-0/</link><guid isPermaLink="false">https://xdays.me/OAuth2-0/</guid><pubDate>Wed, 31 Jul 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;前言&lt;/h1&gt;
&lt;p&gt;OAuth 在展过程中变化非常大，1.0 的基础概念在 2.0 中完全不同了，整个模型也发生了翻天覆地的变化，这也给学习这门技术带来了困扰。好在 OAuth2.0 已经成为标准的&lt;a href=&quot;http://tools.ietf.org/html/rfc6749&quot; title=&quot;权威&quot;&gt;RFC6749&lt;/a&gt;，我就跟着时代走学习 2.0 吧！以下内容来自我学习过程对各种文档的总结，仅为个人理解。另外，1.0 的相关资料见参考链接。&lt;/p&gt;
&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;OAuth 是一种开放的授权标准，它解决的问题是如何更安全地让第三方应用访问用户的资源。随着开放平台等其他云计算形式的发展，OAuth 也成了做平台或者平台开发很重要的一项技能。&lt;/p&gt;
&lt;h1&gt;概念&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;角色
&lt;ul&gt;
&lt;li&gt;资源所有者（resource owner） 就是终端用户&lt;/li&gt;
&lt;li&gt;资源服务器（resource server） 资源托管的平台，如微博等&lt;/li&gt;
&lt;li&gt;客户端（client） 第三方应用，想要获取用户资源&lt;/li&gt;
&lt;li&gt;授权服务器（authorization server） 颁发授权信息的服务器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;授权许可
获取访问令牌的方式，2.0 版本定义了四种授权方式（授权码，隐式授权，资源所有者密码凭据和客户端凭据）&lt;/li&gt;
&lt;li&gt;访问令牌
代表应用程序可以获取资源的一个凭证，看到这个凭证资源服务器就给资源&lt;/li&gt;
&lt;li&gt;刷新令牌 用于延长访问令牌时间的令牌&lt;/li&gt;
&lt;li&gt;协议端点
一个服务的接口，客户端有自己的接口，授权服务器也有自己的接口&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;协议端点&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;授权端点 用于与资源所有者交互获取授权许可&lt;/li&gt;
&lt;li&gt;令牌端点 用于获取访问令牌&lt;/li&gt;
&lt;li&gt;重定向端点 用于授权服务器引导资源所有者的用户代理返回到客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;获取授权&lt;/h1&gt;
&lt;p&gt;前边提到目前规范中定义了四种获取授权的方式，我看了下目前主流的开放平台，授权码和隐式授权是目前主流的方式，所以我只针对这两种做总结，另外两种参见相关文档。&lt;/p&gt;
&lt;h2&gt;授权码&lt;/h2&gt;
&lt;h3&gt;流程图&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; +----------+
 | Resource |
 |   Owner  |
 |          |
 +----------+
      ^
      |
     (B)
 +----|-----+          Client Identifier      +---------------+
 |         -+----(A)-- &amp;amp; Redirection URI ----&gt;|               |
 |  User-   |                                 | Authorization |
 |  Agent  -+----(B)-- User authenticates ---&gt;|     Server    |
 |          |                                 |               |
 |         -+----(C)-- Authorization Code ---&amp;lt;|               |
 +-|----|---+                                 +---------------+
   |    |                                         ^      v
  (A)  (C)                                        |      |
   |    |                                         |      |
   ^    v                                         |      |
 +---------+                                      |      |
 |         |&gt;---(D)-- Authorization Code ---------&apos;      |
 |  Client |          &amp;amp; Redirection URI                  |
 |         |                                             |
 |         |&amp;lt;---(E)----- Access Token -------------------&apos;
 +---------+       (w/ Optional Refresh Token)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;详细过程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A
客户端通过向授权端点引导资源所有者的用户代理开始流程，请求以 GET 方式发起格式如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://foobar.com/authorize?
response_type=code&amp;amp; 期望的响应类型，code表示授权码
client_id=s6BhdRkqt3&amp;amp;state=xyz&amp;amp; 客户端id
redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb&amp;amp; 重定向URI
scope=scope_string&amp;amp; 访问请求的范围
state=int 用于防止跨站请求伪造&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;B
授权服务器通过用户代理（通常是浏览器）验证资源拥有者的身份，用户先登陆然后确认授权&lt;/li&gt;
&lt;li&gt;C
假设资源所有者许可访问，授权服务器使用之前（在请求时或客户端注册时）提供的重定向 URI 重定向用户代理回到客户端，响应 302 的 location 格式如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://client.example.com/cb?
code=SplxlOBeZQQYbYS6WxSbIA&amp;amp; 发放的授权令牌
state=int 用于防止跨站请求伪造&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;D
客户端通过包含上一步中收到的授权码从授权服务器的令牌端点请求访问令牌，请求以 POST 方式发起格式如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://foobbar.com/token?
grant_type=authorization_code&amp;amp; 授权类型
code=SplxlOBeZQQYbYS6WxSbIA&amp;amp; 授权令牌，用于请求访问令牌
redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb 重定向URI&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意：这里具体的实现要参考各个开放平台的文档，有的是直接将参数写在 URL 中，有的是在 POST 的 body 中&lt;/strong&gt;&lt;br&gt;
* E
授权服务器对客户端进行相关验证（身份，授权码，重定向 URI 等），通过则发放访问令牌和刷新令牌，响应 JSON 格式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
  &quot;access_token&quot;:&quot;2YotnFZFEjr1zCsicMWpAA&quot;, 访问令牌，这是最终要的
  &quot;token_type&quot;:&quot;example&quot;, 类型
  &quot;expires_in&quot;:3600, 寿命
  &quot;refresh_token&quot;:&quot;tGzv3JOkF0XG5Qx2TlKWIA&quot;, 刷新令牌
  &quot;example_parameter&quot;:&quot;example_value&quot; 额外参数
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;隐式授权&lt;/h2&gt;
&lt;h3&gt;流程图&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; +----------+
 | Resource |
 |  Owner   |
 |          |
 +----------+
      ^
      |
     (B)
 +----|-----+          Client Identifier     +---------------+
 |         -+----(A)-- &amp;amp; Redirection URI ---&gt;|               |
 |  User-   |                                | Authorization |
 |  Agent  -|----(B)-- User authenticates --&gt;|     Server    |
 |          |                                |               |
 |          |&amp;lt;---(C)--- Redirection URI ----&amp;lt;|               |
 |          |          with Access Token     +---------------+
 |          |            in Fragment
 |          |                                +---------------+
 |          |----(D)--- Redirection URI ----&gt;|   Web-Hosted  |
 |          |          without Fragment      |     Client    |
 |          |                                |    Resource   |
 |     (F)  |&amp;lt;---(E)------- Script ---------&amp;lt;|               |
 |          |                                +---------------+
 +-|--------+
   |    |
  (A)  (G) Access Token
   |    |
   ^    v
 +---------+
 |         |
 |  Client |
 |         |
 +---------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;详细过程&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;A
客户端通过向授权端点引导资源所有者的用户代理开始流程，请求以 GET 方式发起格式如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;https://foobar.com/authorize?
response_type=token&amp;amp; 期望的响应类型，token表示隐式授权
client_id=s6BhdRkqt3&amp;amp; 客户端id
redirect_uri=https%3A%2F%2Fclient%2Eexample%2Ecom%2Fcb&amp;amp; 重定向URI
scope=scope_string&amp;amp; 访问请求的范围
state=int 用于防止跨站请求伪造&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;B
授权服务器通过用户代理（通常是浏览器）验证资源拥有者的身份，用户先登陆然后确认授权&lt;/li&gt;
&lt;li&gt;C
假设资源所有者许可访问，授权服务器使用之前（在请求时或客户端注册时）提供的重定向 URI 重定向用户代理回到客户端，重定向 URI 在 URI 片段中包含访问令牌，响应 302 的 location 格式如下：&lt;/li&gt;
&lt;/ul&gt;
&lt;!-- --&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://example.com/cb?
access_token=2YotnFZFEjr1zCsicMWpAA&amp;amp; 访问令牌
token_type=example&amp;amp; 类型
expires_in=3600&amp;amp; 寿命
scope=scope_string&amp;amp; 访问请求范围
state=xyz&amp;amp; 用于防止跨站请求伪造&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;D 用户代理顺着重定向指示向 Web 托管的客户端资源发起请求&lt;/li&gt;
&lt;li&gt;E
Web 托管的客户端资源返回一个网页（通常是带有嵌入式脚本的 HTML 文档），该网页能够访问包含用户代理保留的片段的完整重定向 URI 并提取包含在片段中的访问令牌（和其他参数）&lt;/li&gt;
&lt;li&gt;F 用户代理在本地执行 Web 托管的客户端资源提供的提取访问令牌的脚本&lt;/li&gt;
&lt;li&gt;G 用户代理传送访问令牌给客户端&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;颁发访问令牌&lt;/h1&gt;
&lt;p&gt;授权服务器可以办法两种令牌：授权令牌和访问令牌。&lt;/p&gt;
&lt;p&gt;访问令牌结果是以 JSON 格式给出，具体如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;{
  &quot;access_token&quot;:&quot;2YotnFZFEjr1zCsicMWpAA&quot;,
  &quot;token_type&quot;:&quot;example&quot;,
  &quot;expires_in&quot;:3600,
  &quot;refresh_token&quot;:&quot;tGzv3JOkF0XG5Qx2TlKWIA&quot;,
  &quot;example_parameter&quot;:&quot;example_value&quot;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;具体参数可参考获取授权一节的相关介绍。&lt;/p&gt;
&lt;h1&gt;刷新访问令牌&lt;/h1&gt;
&lt;p&gt;刷新访问令牌是由客户端操作的，是在访问令牌过期以后通过刷新令牌来刷新访问令牌的操作，具体请求格式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;POST /token HTTP/1.1
Host: server.example.com
Authorization: Basic czZCaGRSa3F0MzpnWDFmQmF0M2JW
Content-Type: application/x-www-form-urlencoded
grant_type=refresh_token&amp;amp;refresh_token=tGzv3JOkF0XG5Qx2TlKWIA&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意：grant_type 必须设置为 refresh_token&lt;/strong&gt;&lt;/p&gt;
&lt;h1&gt;访问受保护资源&lt;/h1&gt;
&lt;p&gt;拿到访问令牌以后就可以带着令牌去问资源服务器要资源了，具体方式是在添加 Bearer 类型的 Authorization 报头，具体格式如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;GET /resource/1 HTTP/1.1
Host: example.com
Authorization: Bearer F_9.B5f-4.1JqM 这里就是访问令牌啦&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;h2&gt;OAuth1.0 相关&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;http://huoding.com/2010/10/10/8&quot; title=&quot;1.0的介绍&quot;&gt;OAuth 那些事儿&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://huoding.com/2011/11/08/126&quot; title=&quot;1.0到1.0a再到2.0的发展&quot;&gt;OAuth 的改变&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://hueniverse.com/oauth/guide/&quot; title=&quot;有生动的例子介绍该协议的实现机制&quot;&gt;The OAuth 1.0
Guide&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;OAuth2.0 相关&lt;/h2&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/jeansfish/RFC6749.zh-cn/blob/master/TableofContents.md&quot; title=&quot;权威&quot;&gt;RFC6749&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[fabric初探]]></title><description><![CDATA[简介 Fabric 是一个用于应用部署和系统管理的工具，它让基于 ssh 的的操作更灵活；你可以在本地或者远程批量执行一些命令，上传下载文件等。 优势 简单，没有架构，不需要理解 master/agent(puppet)啦，master/minion(saltstack…]]></description><link>https://xdays.me/Fabric初探/</link><guid isPermaLink="false">https://xdays.me/Fabric初探/</guid><pubDate>Mon, 10 Jun 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;Fabric 是一个用于应用部署和系统管理的工具，它让基于 ssh 的的操作更灵活；你可以在本地或者远程批量执行一些命令，上传下载文件等。&lt;/p&gt;
&lt;h1&gt;优势&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;简单，没有架构，不需要理解 master/agent(puppet)啦，master/minion(saltstack)啦相关的概念，当然任何一个工具都有自己的逻辑规则，相比其他工具 fabric 的学习成本要低很多；&lt;/li&gt;
&lt;li&gt;Pythonic，最小的执行单位---任务，就是基本的 python 函数，灵活性强；&lt;/li&gt;
&lt;li&gt;并行执行，尽管如此性能仍不及 M/S 模式的其他工具;&lt;/li&gt;
&lt;li&gt;可扩展，这是我认为最大的优势，你可以很轻松的在 fabric 之上构建自己的平台，如监控和部署等。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;由于 fabric 尚不完善，我个人建议直接从 github 获取最新的代码安装：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;git clone https://github.com/fabric/fabric.git
cd fabric/fabric
python setup.py install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;也可以通过 pip 安装&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;pip install fabric&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;程序逻辑&lt;/h1&gt;
&lt;h2&gt;环境字典&lt;/h2&gt;
&lt;p&gt;fabric 的配置，也可以说是环境变量，其中的变量影响了 fabric 的行为，比如要执行的设备列表，连接超时时间等。&lt;/p&gt;
&lt;h2&gt;设备列表&lt;/h2&gt;
&lt;p&gt;fabric 通过 host_string 来表示一个设备，host_string 的格式为：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;username@hostname:port&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;设备列表定义了待执行任务的设备，还有一个角色概念可以组织设备，例如将 web 服务定义为一个角色。&lt;/p&gt;
&lt;p&gt;设备列表示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;env.hosts= [&apos;username@hostname:port&apos;]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;设备角色示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;env.roledefs = {&apos;web&apos;: [&apos;web1&apos;, &apos;web2&apos;]}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;执行模型&lt;/h2&gt;
&lt;p&gt;fabric 在预先定义的设备上依次执行任务，你可以通过在定义任务或者命令行下分配任务，如一台设备应该执行那些任务，一个任务应该在那些设备上执行。&lt;/p&gt;
&lt;h1&gt;fab 命令&lt;/h1&gt;
&lt;h2&gt;命令语法&lt;/h2&gt;
&lt;p&gt;fabric 的命令行接口，负责解析 fabfile，和环境字典一样，也可以控制执行模型等。命令语法如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Usage: fab [options] &amp;lt;command&gt;[:arg1,arg2=val2,host=foo,hosts=&apos;h1;h2&apos;,...]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;常见参数&lt;/h2&gt;
&lt;p&gt;常见参数如下： * -l 察看定义的任务数 * -H 制定要运行任务的设备列表 *
— 后跟要在设备上执行的命令&lt;/p&gt;
&lt;h1&gt;示例&lt;/h1&gt;
&lt;h2&gt;本地执行&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;from fabric.api import run
def host_type():
    run(&apos;uname -s&apos;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;远程执行&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;from fabric.api import local, run, env
env.hosts = [&apos;host&apos;]
env.passwords = {&apos;host&apos;: &apos;pass&apos;}
def host_type():
    run(&apos;uname -s&apos;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;特性用法&lt;/h1&gt;
&lt;h2&gt;Gateway&lt;/h2&gt;
&lt;p&gt;需求驱动，这里有必要重点强调下 fabric 的 gateway 特性。假设一个场景：我要在 A 设备上运行 fabric 在 B 设备上执行命令，我们最常见的数据流是 A-&gt;B，但是如果 B 做了安全限制之允许 C 登陆 B，但是 C 又无法运行 fabric 怎么办？设想一下，假如数据流这么走 A-&gt;C-&gt;B，在 B 看来是 C 在操作自己所以允许执行，实际上是 A 告诉 C 去操作 B 又满足了我们的需求。是的，这就是 fabric 的 gateway 特性你之需要通过环境字典或者命令行方式制定 gateway 和对应的权限信息就可以实现了。
代码示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;from fabric.api import local, run, env
env.gateway = &apos;gateway&apos;
env.hosts = [&apos;host&apos;]
env.passwords = {&apos;host&apos;: &apos;pass&apos;, &apos;gateway&apos;:&apos;pass&apos;}
def host_type():
    run(&apos;uname -s&apos;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：fabric 目前还不够完美，在查找 host 或者 gateway 对应密码的两个函数（见 network.py）还不够灵活，所以我这里建议在设备列表和密码字典中都用完整的 host_string。&lt;/p&gt;
&lt;h1&gt;相关项目&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ansibleworks.com/&quot;&gt;fabric 的强化版 ansible&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;p&gt;&lt;a href=&quot;http://docs.fabfile.org/en/1.6/&quot;&gt;官方文档&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/fabric/fabric&quot;&gt;Github 主页&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python实现手机控制PC]]></title><description><![CDATA[背景 最初想法起因是这样的：晚上睡觉前看电视剧看困了就不想起来关电脑了，所以需要通过手机远程在 PC 上执行命令。 组件 服务端提供接受指令和下发指令的两个 API 手机端用 Qpython 写脚本向服务端提交指令 PC 端写一个小 daemon…]]></description><link>https://xdays.me/Python实现手机控制pc/</link><guid isPermaLink="false">https://xdays.me/Python实现手机控制pc/</guid><pubDate>Sat, 25 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;最初想法起因是这样的：晚上睡觉前看电视剧看困了就不想起来关电脑了，所以需要通过手机远程在 PC 上执行命令。&lt;/p&gt;
&lt;h1&gt;组件&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;服务端提供接受指令和下发指令的两个 API&lt;/li&gt;
&lt;li&gt;手机端用 Qpython 写脚本向服务端提交指令&lt;/li&gt;
&lt;li&gt;PC 端写一个小 daemon 程序，获取指令并在本机执行&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;代码&lt;/h1&gt;
&lt;h2&gt;服务端代码&lt;/h2&gt;
&lt;p&gt;以 Django 编写，后端用 redis 存储。&lt;/p&gt;
&lt;h3&gt;views.py&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;from django.http import Http404, HttpResponse
from django.shortcuts import render
from django.views.decorators.csrf import csrf_exempt, csrf_protect
from xbox.control.forms import order
from redis_cache import get_redis_connection
import time
import json

@csrf_exempt
def put_order(request): #用于接收浏览器发来指令的view函数
    flag = True
    date = time.strftime(&quot;%Y%m%d%H%M%S&quot;, time.localtime())
    if request.method == &apos;POST&apos;:
        con = get_redis_connection(&apos;default&apos;)
        form = order(request.POST)
        if form.is_valid():
            o = form.cleaned_data[&apos;o&apos;]
            con.set(&apos;0:&apos; + date, o) #0表示带下发指令
        else:
            flag = False
    else:
        flag = False
    return render(request, &apos;control.html&apos;, {&apos;f&apos;:order()})

@csrf_exempt
def json_order(request): #用于接收手机端发来指令的view函数
    flag = True
    date = time.strftime(&quot;%Y%m%d%H%M%S&quot;, time.localtime())
    if request.method == &apos;POST&apos;:
        con = get_redis_connection(&apos;default&apos;)
        print request.raw_post_data
        raw = json.loads(request.raw_post_data)
        con.set(&apos;0:&apos; + date, raw[&apos;o&apos;])
    else:
        flag = False
    return HttpResponse(flag)

def get_order(request):
    con = get_redis_connection(&apos;default&apos;)
    lo =  con.keys(&apos;0:*&apos;)
    if lo:
        o = con.get(lo[0])
        n = lo[0].replace(&apos;0&apos;, &apos;1&apos;, 1) #1表示已下发的历史命令
        con.rename(lo[0], n)
        return HttpResponse(o)
    else:
        return HttpResponse(&apos;echo None&apos;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;forms.py 和 control.html&lt;/h3&gt;
&lt;p&gt;略（用于通过浏览器下发指令）&lt;/p&gt;
&lt;h2&gt;手机端代码&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;import urllib2
import json

s = &apos;http://localhost:8000/control/json_order/&apos;
d = {u&apos;o&apos;:u&apos;touch /tmp/foobar.txt&apos;}
retval = urllib2.urlopen(s, data=json.dumps(d)).read()
print retval&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;PC 端代码&lt;/h2&gt;
&lt;h3&gt;PC 端 daemon.py&lt;/h3&gt;
&lt;p&gt;这个类写的简单明了，源代码请&lt;a href=&quot;http://www.jejik.com/articles/2007/02/a_simple_unix_linux_daemon_in_python/&quot; title=&quot;Daemon&quot;&gt;参考这里&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;daemon.py 代码如下：&lt;br&gt;
#!/usr/bin/env python&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;import sys, os, time, atexit
from signal import SIGTERM

class Daemon:
    &quot;&quot;&quot;
    A generic daemon class.

    Usage: subclass the Daemon class and override the run() method
    &quot;&quot;&quot;
    def __init__(self, pidfile, stdin=&apos;/dev/null&apos;, stdout=&apos;/dev/null&apos;, stderr=&apos;/dev/null&apos;):
        self.stdin = stdin
        self.stdout = stdout
        self.stderr = stderr
        self.pidfile = pidfile

    def daemonize(self):
        &quot;&quot;&quot;
        do the UNIX double-fork magic, see Stevens&apos; &quot;Advanced
        Programming in the UNIX Environment&quot; for details (ISBN 0201563177)
        http://www.erlenstar.demon.co.uk/unix/faq_2.html#SEC16
        &quot;&quot;&quot;
        try:
            pid = os.fork()
            if pid &gt; 0:
                # exit first parent
                sys.exit(0)
        except OSError, e:
            sys.stderr.write(&quot;fork #1 failed: %d (%s)n&quot; % (e.errno, e.strerror))
            sys.exit(1)

        # decouple from parent environment
        os.chdir(&quot;/&quot;)
        os.setsid()
        os.umask(0)

        # do second fork
        try:
            pid = os.fork()
            if pid &gt; 0:
                # exit from second parent
                sys.exit(0)
        except OSError, e:
            sys.stderr.write(&quot;fork #2 failed: %d (%s)n&quot; % (e.errno, e.strerror))
            sys.exit(1)

        # redirect standard file descriptors
        sys.stdout.flush()
        sys.stderr.flush()
        si = file(self.stdin, &apos;r&apos;)
        so = file(self.stdout, &apos;a+&apos;)
        se = file(self.stderr, &apos;a+&apos;, 0)
        os.dup2(si.fileno(), sys.stdin.fileno())
        os.dup2(so.fileno(), sys.stdout.fileno())
        os.dup2(se.fileno(), sys.stderr.fileno())

        # write pidfile
        atexit.register(self.delpid)
        pid = str(os.getpid())
        file(self.pidfile,&apos;w+&apos;).write(&quot;%sn&quot; % pid)

    def delpid(self):
        os.remove(self.pidfile)

    def start(self):
        &quot;&quot;&quot;
        Start the daemon
        &quot;&quot;&quot;
        # Check for a pidfile to see if the daemon already runs
        try:
            pf = file(self.pidfile,&apos;r&apos;)
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None

        if pid:
            message = &quot;pidfile %s already exist. Daemon already running?n&quot;
            sys.stderr.write(message % self.pidfile)
            sys.exit(1)

        # Start the daemon
        self.daemonize()
        self.run()

    def stop(self):
        &quot;&quot;&quot;
        Stop the daemon
        &quot;&quot;&quot;
        # Get the pid from the pidfile
        try:
            pf = file(self.pidfile,&apos;r&apos;)
            pid = int(pf.read().strip())
            pf.close()
        except IOError:
            pid = None

        if not pid:
            message = &quot;pidfile %s does not exist. Daemon not running?n&quot;
            sys.stderr.write(message % self.pidfile)
            return # not an error in a restart

        # Try killing the daemon process
        try:
            while 1:
                os.kill(pid, SIGTERM)
                time.sleep(0.1)
        except OSError, err:
            err = str(err)
            if err.find(&quot;No such process&quot;) &gt; 0:
                if os.path.exists(self.pidfile):
                    os.remove(self.pidfile)
            else:
                print str(err)
                sys.exit(1)

    def restart(self):
        &quot;&quot;&quot;
        Restart the daemon
        &quot;&quot;&quot;
        self.stop()
        self.start()

    def run(self):
        &quot;&quot;&quot;
        You should override this method when you subclass Daemon. It will be called after the process has been
        daemonized by start() or restart().
        &quot;&quot;&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;PC 端 control.py&lt;/h3&gt;
&lt;p&gt;control.py 代码如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/usr/bin/env python

import sys, time
import subprocess
import urllib
from daemon import Daemon

class MyDaemon(Daemon):
    def run(self):
        while True:
            order = urllib.urlopen(&apos;http://server-get-api/&apos;).read()
            subprocess.call(order, shell=True)
            time.sleep(30)

if __name__ == &quot;__main__&quot;:
    daemon = MyDaemon(&apos;/tmp/daemon-example.pid&apos;)
    if len(sys.argv) == 2:
        if &apos;start&apos; == sys.argv[1]:
            daemon.start()
        elif &apos;stop&apos; == sys.argv[1]:
            daemon.stop()
        elif &apos;restart&apos; == sys.argv[1]:
            daemon.restart()
        else:
            print &quot;Unknown command&quot;
            sys.exit(2)
        sys.exit(0)
    else:
        print &quot;usage: %s start|stop|restart&quot; % sys.argv[0]
        sys.exit(2)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Synergy一套鼠键管理多台机器]]></title><description><![CDATA[背景 前段时间购得一RaspberryPi,在一切初始化就绪后发现一个问题：同时操作笔记本和 Pi 的时候切换鼠标键盘非常不爽，不够简单（简单很重要）。所以就找到了synergy…]]></description><link>https://xdays.me/Synergy一套鼠键管理多台机器/</link><guid isPermaLink="false">https://xdays.me/Synergy一套鼠键管理多台机器/</guid><pubDate>Sun, 12 May 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;前段时间购得一&lt;a href=&quot;http://www.raspberrypi.org/&quot;&gt;RaspberryPi&lt;/a&gt;,在一切初始化就绪后发现一个问题：同时操作笔记本和 Pi 的时候切换鼠标键盘非常不爽，不够简单（简单很重要）。所以就找到了&lt;a href=&quot;http://synergy-foss.org/zh/&quot;&gt;synergy&lt;/a&gt;这个小软件，解决了问题。&lt;/p&gt;
&lt;h1&gt;功能&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;用一套鼠标键盘同时操作多台电脑，鼠标触及屏幕边缘就切换到另一台电脑；&lt;/li&gt;
&lt;li&gt;共享剪切板。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装配置&lt;/h1&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;debian/ubuntu 下用如下命令安装：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo apt-get install synergy&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;p&gt;样例配置如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;section: screens
        xdays-ThinkPad-E520:
        raspberrypi:
end
section: links
        xdays-ThinkPad-E520:
             right = raspberrypi
        raspberrypi:
             left = xdays-ThinkPad-E520
end&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;具体配置相关解释可参考 manpage&lt;/p&gt;
&lt;h1&gt;运行&lt;/h1&gt;
&lt;p&gt;客户端:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;synergyc -f ipaddress:port&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;服务端&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;synergys -f -c /path/to/configure&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;方案参考&lt;/h1&gt;
&lt;p&gt;由于 synergy 需要联网操作，目前我考虑网络方案如下：Pi 和笔记本用网线连接，Pi 作为 DHCP 服务器为笔记本分配固定地址，Pi 的默认网关指向该地址，笔记本做路由转发。这样一来，笔记本不需要做任何额外的操作(笔记本一直在为虚拟机做路由转发)，Pi 既和笔记本联网也可以有公网访问，所有问题都解决了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python写MapReduce]]></title><description><![CDATA[说明 本文以一个没有 Java 开发经验的运维角度从宏观上去理解 Hadoop 的云计算（也就是 MapReduce）框架模型的一些思想和运行流程；主要目的是在对 MapReduce 有一定了解后能用 Python 通过 streaming 工具来写 MapReduce…]]></description><link>https://xdays.me/Python通过streaming写mapreduce/</link><guid isPermaLink="false">https://xdays.me/Python通过streaming写mapreduce/</guid><pubDate>Sun, 17 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;说明&lt;/h1&gt;
&lt;p&gt;本文以一个没有 Java 开发经验的运维角度从宏观上去理解 Hadoop 的云计算（也就是 MapReduce）框架模型的一些思想和运行流程；主要目的是在对 MapReduce 有一定了解后能用 Python 通过 streaming 工具来写 MapReduce。&lt;/p&gt;
&lt;h1&gt;MapReduce 工作流程&lt;/h1&gt;
&lt;p&gt;如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2013/03/mapreduce_flow.png&quot; alt=&quot;MapReduce
Flow&quot;&gt;&lt;/p&gt;
&lt;p&gt;概括整个过程如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;客户端启动一个作业；&lt;/li&gt;
&lt;li&gt;客户端向 JobTracker 请求一个 job id；&lt;/li&gt;
&lt;li&gt;客户端将运行作业所需的资源复制到 HDFS 上；&lt;/li&gt;
&lt;li&gt;客户端将作业提交给 JobTracker；&lt;/li&gt;
&lt;li&gt;JobTracker 初始化作业对象，获取输入数据进行拆分作业；&lt;/li&gt;
&lt;li&gt;JobTracker 与 TaskTracker 保持心跳，将子作业下发给 TaskTracker；&lt;/li&gt;
&lt;li&gt;Tasktracker 从 HDFS 获取数据进行 MapTask 和 ReduceTask&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;具体的流程介绍可参考&lt;a href=&quot;http://weixiaolu.iteye.com/blog/1474172&quot;&gt;这篇文章&lt;/a&gt;或者《Hadoop 权威指南》&lt;/p&gt;
&lt;h1&gt;Shuffle 机制&lt;/h1&gt;
&lt;p&gt;Shuffle 意思是洗牌或搞乱，在整个 MapReduce 工作流程中 Shuffle 指的是 map 开始之后至 Reduce 完成之前的这个环节。理解其内部运行机制后，你会对那句形容 Shuffle 的话理解更深刻：排序是 Hadoop 的灵魂。&lt;/p&gt;
&lt;p&gt;具体 Shuffle 的介绍参考&lt;a href=&quot;http://langyu.iteye.com/blog/992916&quot;&gt;这篇文章&lt;/a&gt;，好文，作者分析的通俗易懂，这里鄙人表示感谢。&lt;/p&gt;
&lt;h1&gt;MapReduce 数据流&lt;/h1&gt;
&lt;p&gt;理解数据流对写 MapReduce 很重要。总结来说就是：数据始终以 key/value 形式从 input 流向 output，在 input 端 map 有相应的转换方式定义如何将数据转换为 key/value 形式（针对我们这里说的以行计的日志，Hadoop 会将行的偏移量作为 key，以一行的实际内容作为 value），中间的 Shuffle 阶段也是针对 key 进行一个排序，尽可能的减少磁盘 IO 和网络带宽，最后的 output 段，reduce 程序也是以 key/value 形式输出结果到 HDFS。&lt;/p&gt;
&lt;p&gt;具体数据流可大致参考&lt;a href=&quot;http://www.cnblogs.com/spork/archive/2010/01/11/1644342.html&quot;&gt;这篇文章&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;用 Streaming 写 MapReduce&lt;/h1&gt;
&lt;p&gt;这里我用 Python 来写 map 和 recduce 程序，其他语言也类似。&lt;/p&gt;
&lt;h2&gt;mapper.py&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/usr/bin/env python

import sys

hosts = [&apos;221.176.86.150&apos;, &apos;221.182.235.210&apos;, &apos;221.182.238.74&apos;]

for line in sys.stdin:
    line = line.strip()
    segs = line.split(&apos;|&apos;)
    if segs[1] in hosts:
        print &apos;%s;%s,%s&apos; % (segs[1], segs[2], 1)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;reducer.py&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/usr/bin/env python

from operator import itemgetter
import sys

current_key = None
current_vlaue = 0
key = None

for line in sys.stdin:
    line = line.strip()
    segs = line.split(&apos;,&apos;, 1)
    key = segs[0]
    value = segs[1]

    try:
        value = int(value)
    except ValueError:
        continue

    if current_key == key:
        current_value += value
    else:
        if current_key:
            print &apos;%s,%s&apos; % (current_key, current_value)
        current_key = key
        current_value= value

if current_key == key:
        print &apos;%s,%s&apos; % (current_key, current_value)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;运行命令&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hadoop jar
$HADOOP_HOME/contrib/streaming/hadoop-streaming-1.0.3.jar
-file /path/to/mapper.py -mapper /path/to/mapper.py
-file /path/to/reducer.py -reducer /path/to/reducer.py
-input  /hadoop/path/*.gz
-output /hadoop/output/
-jobconf stream.non.zero.exit.is.failure=false
-jobconf stream.recordreader.compression=gzip&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;说明：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;file 制定对应的 map 和 reduce 程序；&lt;/li&gt;
&lt;li&gt;input 制定 input 数据路径；&lt;/li&gt;
&lt;li&gt;output 制定 output 结果路径；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;stream.non.zero.exit.is.failure=false&lt;/code&gt;避免程序返回值不为 0 导致的任务失败；&lt;/li&gt;
&lt;li&gt;&lt;code class=&quot;language-text&quot;&gt;stream.recordreader.compression=gzip&lt;/code&gt;指明处理的数据为压缩格式。&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Markdown官方文档]]></title><description><![CDATA[说明 本文翻译自官方的英文文档，主要目的是个人学习 Markdown 语法和锻炼英语能力。 注意： 这篇文档本身就是用 Markdown 写的，你可以
在 URL 中添加.text 来查看源码. 概述 思想 Markdown…]]></description><link>https://xdays.me/Markdown官方文档/</link><guid isPermaLink="false">https://xdays.me/Markdown官方文档/</guid><pubDate>Sun, 10 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;说明&lt;/h1&gt;
&lt;p&gt;本文翻译自官方的英文文档，主要目的是个人学习 Markdown 语法和锻炼英语能力。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：&lt;/strong&gt; 这篇文档本身就是用 Markdown 写的，你可以
&lt;a href=&quot;http://daringfireball.net/projects/markdown/syntax.text&quot;&gt;在 URL 中添加.text 来查看源码&lt;/a&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;概述&lt;/h1&gt;
&lt;h2&gt;思想&lt;/h2&gt;
&lt;p&gt;Markdown 置力于尽可能的易读写。&lt;/p&gt;
&lt;p&gt;可读性是最终要的。一片用 Markdown 格式化的文档应该可以作为文本原样发布，不许要看上去已经被一些标签或者格式化指令标记。Markdown 的语法受目前已有的文本转 html 的过滤器影响—包括&lt;a href=&quot;http://docutils.sourceforge.net/mirror/setext.html&quot;&gt;Setext&lt;/a&gt;,
&lt;a href=&quot;http://www.aaronsw.com/2002/atx/&quot;&gt;atx&lt;/a&gt;,
&lt;a href=&quot;http://textism.com/tools/textile/&quot;&gt;Textile&lt;/a&gt;,
&lt;a href=&quot;http://docutils.sourceforge.net/rst.html&quot;&gt;reStructuredText&lt;/a&gt;,
&lt;a href=&quot;http://www.triptico.com/software/grutatxt.html&quot;&gt;Grutatext&lt;/a&gt;, and
&lt;a href=&quot;http://ettext.taint.org/doc/&quot;&gt;EtText&lt;/a&gt;—对 Markdown 语法影响最大的是 email 的文本格式&lt;/p&gt;
&lt;p&gt;Markdown 的语法是由标点符号组成，这些标点符号都是精心挑选的以便来表达他们本意。例如，围绕单词的型号看起啦就像是强调。列表看起来像是，哦，列表。甚至是块引用看起来就像是引用的文本，假设你曾经使用过邮件。&lt;/p&gt;
&lt;h2&gt;内联 HTML&lt;/h2&gt;
&lt;p&gt;Markdown 的语法是为了一个目的：用来&lt;em&gt;编写 web&lt;/em&gt;的一种格式。&lt;/p&gt;
&lt;p&gt;Markdown 不是 HTML 的替代品，也不像它。他的语法很少，仅对应于 HTML 的标签的子集。其重点不是制定一些更便捷的插入 HTML 标签的语法。在我看来，HTML 标签已经很容易插入了。Markdown 的重点在于更容易的读，写和编辑文章。HTML 是一种&lt;em&gt;发布&lt;/em&gt;格式；Markdown 是一种&lt;em&gt;编写&lt;/em&gt;格式。这样来看，Markdown 的语法仅用来解决可以用普通文本来传播的话题。&lt;/p&gt;
&lt;p&gt;对于任何不能用 Markdown 语法来解决的标记，你就用 HTML。不需要事先说你已经从 Markdown 转向了 HTML，或者划清界限；你就是在使用标签罢了。&lt;/p&gt;
&lt;p&gt;唯有一些限制是一些块级的 HTML 元素 — 例如&lt;code class=&quot;language-text&quot;&gt;&amp;lt;div&gt;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;lt;table&gt;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;lt;pre&gt;&lt;/code&gt;,
&lt;code class=&quot;language-text&quot;&gt;&amp;lt;p&gt;&lt;/code&gt;,等 —
必须和周围的内容以空行分开，另外块标签的开始和结束不能用空行或者 tab 来缩进。Markdown 足够聪明不会在 HTML 的块标签周围添加额外的（不想要的）&lt;code class=&quot;language-text&quot;&gt;&amp;lt;p&gt;&lt;/code&gt;标签。&lt;/p&gt;
&lt;p&gt;比如，在 Markdown 的文章里添加一个 HTML 表格：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;This is a regular paragraph.

&amp;lt;table&gt;
    &amp;lt;tr&gt;
        &amp;lt;td&gt;Foo&amp;lt;/td&gt;
    &amp;lt;/tr&gt;
&amp;lt;/table&gt;

This is another regular paragraph.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意观察 Markdown 的格式语法在 HTML 的块标签里并没有生效。比如，你不能在 HTML 块里添加&lt;code class=&quot;language-text&quot;&gt;*强调*&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;像&lt;code class=&quot;language-text&quot;&gt;&amp;lt;span&gt;&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;&amp;lt;cite&gt;&lt;/code&gt;, or
&lt;code class=&quot;language-text&quot;&gt;&amp;lt;del&gt;&lt;/code&gt;的 span 级的 HTML 标签可以在 Markdown 的任何段落，列表或者标题内使用。如果你乐意，你可以不用 Markdown 而使用 HTML 标签，例如相比 markdown 你可能更愿意使用 HTML 的&lt;code class=&quot;language-text&quot;&gt;&amp;lt;a&gt;&lt;/code&gt;
或者 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;img&gt;&lt;/code&gt;标签，这样完全可以。&lt;/p&gt;
&lt;p&gt;不像块级标签，Markdown 的语法 &lt;em&gt;可以&lt;/em&gt; 在 span 级标签内处理。&lt;/p&gt;
&lt;h2&gt;自动转意特殊字符&lt;/h2&gt;
&lt;p&gt;在 HTML 里，有两个字符需要特殊对待：&lt;code class=&quot;language-text&quot;&gt;&amp;lt;&lt;/code&gt; 和
&lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt;。小于号用来开始一个标签；与符号用来表示 HTML 实体。如果你想要使用他们本身，你需要转意为实体，如&lt;code class=&quot;language-text&quot;&gt;&amp;amp;lt;&lt;/code&gt;和&lt;code class=&quot;language-text&quot;&gt;&amp;amp;amp;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;与符号特别让网页作者痛苦。如果你想要写关于’AT&amp;#x26;T’，你需要写成’&lt;code class=&quot;language-text&quot;&gt;AT&amp;amp;amp;T&lt;/code&gt;‘。你甚至需要在 URL 中转义与符号。于是，你想要链接到：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://images.google.com/images?num=30&amp;amp;q=larry+bird&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;你需要将你&lt;code class=&quot;language-text&quot;&gt;href&lt;/code&gt;属性的 URL 编码成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;http://images.google.com/images?num=30&amp;amp;amp;q=larry+bird&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;不用多说了，这样很容易忘记，而且可能是编码良好的网页站点唯一的 HTML 验证错误。&lt;/p&gt;
&lt;p&gt;Markdown 允许你直接使用这些字符，它来帮你完成转意。如果你在一个 HTML 实体中使用与符号，他将保持不变；否则它将被翻译成&lt;code class=&quot;language-text&quot;&gt;&amp;amp;amp;&lt;/code&gt;。&lt;/p&gt;
&lt;p&gt;所以，如果你想在文章中包含一个版权图标，你可以直接写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;amp;copy;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Markdown 会保持原样。但是如果你写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;AT&amp;amp;T&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Markdown 会将其翻译成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;AT&amp;amp;amp;T&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;类似的，因为 Markdown 支持&lt;a href=&quot;#html&quot;&gt;行内 HTML&lt;/a&gt;，如果你使用尖括号作为 HTML 标签的分割符，Markdown 将把它们当作本意，但是如果你写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;4 &amp;lt; 5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Markdown 会将其翻译为：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;4 &amp;amp;lt; 5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但是，在 Markdown 的 span 和块级代码内，尖括号和与符号 &lt;em&gt;总是&lt;/em&gt;
自动被编码。这样就可以更方便的编写 HTML 代码。（相对的对于 HTML 来说，这是一个很恐怖的格式，因为在你每个示例代码的
&lt;code class=&quot;language-text&quot;&gt;&amp;lt;&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;&amp;amp;&lt;/code&gt; 都需要转义。）&lt;/p&gt;
&lt;hr&gt;
&lt;h1&gt;块元素&lt;/h1&gt;
&lt;h2&gt;段落和换行&lt;/h2&gt;
&lt;p&gt;段落是由空行分隔的一个或多个连贯的句子。（空行就是看上去一个空行 —
一行除了包含空格或者 tab 啥也没有的行就是空行。）正常情况下空行不能用空格或者 tab 缩进。&lt;/p&gt;
&lt;p&gt;“一个或者多个连贯的句子”这句话暗示了 Markdown 支持“硬嵌”文本段落。这和其他 text-to-HTML 的格式器有很大不同（包括 Movable
Type 的转换换行的选项），他们都将段落的每一次换行转化为&lt;code class=&quot;language-text&quot;&gt;&amp;lt;br /&gt;&lt;/code&gt;标签。&lt;/p&gt;
&lt;p&gt;当你在使用 Markdown&lt;em&gt;确实&lt;/em&gt;需要插入一个&lt;code class=&quot;language-text&quot;&gt;&amp;lt;br /&gt;&lt;/code&gt;标签时，你可以在行尾写两个或则更多个空格，然后回车。&lt;/p&gt;
&lt;p&gt;是的，插入&lt;code class=&quot;language-text&quot;&gt;&amp;lt;br /&gt;&lt;/code&gt;标签更费功夫些，但是简单通过换行插入对 Markdown 来说不行。当你用硬换行来格式化的时候，Markdown 的邮件风格的&lt;a href=&quot;#blockquote&quot;&gt;块引用&lt;/a&gt;和多段落的&lt;a href=&quot;#list&quot;&gt;列表&lt;/a&gt;工作的更好而且看起来更好。&lt;/p&gt;
&lt;h2&gt;标题&lt;/h2&gt;
&lt;p&gt;Markdown 支持两种分割的标题，&lt;a href=&quot;http://docutils.sourceforge.net/mirror/setext.html&quot;&gt;Setext&lt;/a&gt;和&lt;a href=&quot;http://www.aaronsw.com/2002/atx/&quot;&gt;atx&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;Setext 风格的标题用等于号（一级标题）或者减号（二级标题）。例如：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;This is an H1
=============

This is an H2
-------------&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Atx 风格的标题在开头使用 1-6 个#来表示 1-6 级标题。例如：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# This is an H1

## This is an H2

###### This is an H6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;是否关闭 atx 风格的标题是可选的。这纯粹是一种装饰，如果你觉得好看可以使用。关闭的#都不用和开头的在数目上匹配（开头的数目决定了标题的等级。）：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# This is an H1 #

## This is an H2 ##

### This is an H3 ######&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;块引用&lt;/h2&gt;
&lt;p&gt;Markdown 使用邮件风格的 &lt;code class=&quot;language-text&quot;&gt;&gt;&lt;/code&gt;
作为块引用。如果你熟悉邮件中的块引用，你也就知道如何在 Markdown 里创建一个块引用。在每一行前放一个
&lt;code class=&quot;language-text&quot;&gt;&gt;&lt;/code&gt;最好.&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
&gt; consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
&gt; Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.
&gt;
&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
&gt; id sem consectetuer libero luctus adipiscing.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Markdown 允许你懒一些,尽在每个段落的开头放一个 &lt;code class=&quot;language-text&quot;&gt;&gt;&lt;/code&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt; This is a blockquote with two paragraphs. Lorem ipsum dolor sit amet,
consectetuer adipiscing elit. Aliquam hendrerit mi posuere lectus.
Vestibulum enim wisi, viverra nec, fringilla in, laoreet vitae, risus.

&gt; Donec sit amet nisl. Aliquam semper ipsum sit amet velit. Suspendisse
id sem consectetuer libero luctus adipiscing.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;块引用可以通过添加额外的&lt;code class=&quot;language-text&quot;&gt;&gt;&lt;/code&gt;嵌套(例如,块中块)：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt; This is the first level of quoting.
&gt;
&gt; &gt; This is nested blockquote.
&gt;
&gt; Back to the first level.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;块引用中可以包含其他的 Markdown 标签，包括标题，列表和代码块：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&gt; ## This is a header.
&gt;
&gt; 1.   This is the first list item.
&gt; 2.   This is the second list item.
&gt;
&gt; Here&apos;s some example code:
&gt;
&gt;     return shell_exec(&quot;echo $input | $markdown_script&quot;);&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;任何主流的编辑器都可以很方便的编写邮件风格的引用。例如，通过 BBEdit，你可以从菜单中选择增加引用。&lt;/p&gt;
&lt;h2&gt;列表&lt;/h2&gt;
&lt;p&gt;Markdown 支持有序列表和无序列表。&lt;/p&gt;
&lt;p&gt;无序列表使用*,+和-作为列表生成器：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   Red
*   Green
*   Blue&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;等同于：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;+   Red
+   Green
+   Blue&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;和：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;-   Red
-   Green
-   Blue&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;有序列表使用数字生成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1.  Bird
2.  McHale
3.  Parish&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;有一点很重要需要指出，你所使用的数字和 Markdown 生成的 HTML 没有关联，上边生成的 HTML 是：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;ol&gt;
&amp;lt;li&gt;Bird&amp;lt;/li&gt;
&amp;lt;li&gt;McHale&amp;lt;/li&gt;
&amp;lt;li&gt;Parish&amp;lt;/li&gt;
&amp;lt;/ol&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;你也可以这么来写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1.  Bird
1.  McHale
1.  Parish&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;甚至这样：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;3. Bird
1. McHale
8. Parish&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;你会得到相同的输出。关键点是，只要你原因，你可以在你的 Markdown 列表内使用有序的数字，以便你源码的数字可以和生成的 HTML 的数字对应起来。如果你很懒，这也没必要。&lt;/p&gt;
&lt;p&gt;如果你真是很懒，你也应该以 1 开头。将来，Markdown 可能会支持从任意数字开始有序列表。&lt;/p&gt;
&lt;p&gt;列表生成器通常左对齐，但也有可能缩进三个空格。列表生成器必须后跟一个或者多个空格。&lt;/p&gt;
&lt;p&gt;为了更好看些，你可以让条目保持相同的缩进：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
    Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
    viverra nec, fringilla in, laoreet vitae, risus.
*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
    Suspendisse id sem consectetuer libero luctus adipiscing.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但是如果你很懒，你不需要：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
Aliquam hendrerit mi posuere lectus. Vestibulum enim wisi,
viverra nec, fringilla in, laoreet vitae, risus.
*   Donec sit amet nisl. Aliquam semper ipsum sit amet velit.
Suspendisse id sem consectetuer libero luctus adipiscing.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果条目由空行分开了，Markdown 会把他们嵌入&lt;code class=&quot;language-text&quot;&gt;&amp;lt;p&gt;&lt;/code&gt;标签中，例如：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   Bird
*   Magic&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;会变成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;ul&gt;
&amp;lt;li&gt;Bird&amp;lt;/li&gt;
&amp;lt;li&gt;Magic&amp;lt;/li&gt;
&amp;lt;/ul&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;但这样：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   Bird

*   Magic&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;会变成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;ul&gt;
&amp;lt;li&gt;&amp;lt;p&gt;Bird&amp;lt;/p&gt;&amp;lt;/li&gt;
&amp;lt;li&gt;&amp;lt;p&gt;Magic&amp;lt;/p&gt;&amp;lt;/li&gt;
&amp;lt;/ul&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;列条条目可能会包含多个段落，每个条目的子段扩至少要缩进 4 个空格或者一个 tab：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1.  This is a list item with two paragraphs. Lorem ipsum dolor
    sit amet, consectetuer adipiscing elit. Aliquam hendrerit
    mi posuere lectus.

    Vestibulum enim wisi, viverra nec, fringilla in, laoreet
    vitae, risus. Donec sit amet nisl. Aliquam semper ipsum
    sit amet velit.

2.  Suspendisse id sem consectetuer libero luctus adipiscing.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;缩进每一行看起来很漂亮，但是 Markdown 允许你懒惰：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   This is a list item with two paragraphs.

    This is the second paragraph in the list item. You&apos;re
only required to indent the first line. Lorem ipsum dolor
sit amet, consectetuer adipiscing elit.

*   Another item in the same list.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;要想把块引用放到列表里，块引用的 &lt;code class=&quot;language-text&quot;&gt;&gt;&lt;/code&gt; 分割符需要缩进：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   A list item with a blockquote:

    &gt; This is a blockquote
    &gt; inside a list item.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;想要把代码块放到列表中，代码块需要缩进&lt;em&gt;两次&lt;/em&gt;，也就是 8 个空格或者两个 tab：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;*   A list item with a code block:

        &amp;lt;code goes here&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;有时可能会触发一些有序列表，比如这样写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1986. What a great season.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;换句话说，有一些空格开头，后跟日期时间段。为避免这样，你可以转义时间段：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;1986. What a great season.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;代码块&lt;/h2&gt;
&lt;p&gt;预格式化代码块用于编写程序或者标记的源代码。代码段是字面意思直译，而非形成段落。Markdown 将代码段放到
&lt;code class=&quot;language-text&quot;&gt;&amp;lt;pre&gt;&lt;/code&gt; 和 &lt;code class=&quot;language-text&quot;&gt;&amp;lt;code&gt;&lt;/code&gt; 标签里。&lt;/p&gt;
&lt;p&gt;要生成代码块，只需要每行缩进至少 4 个空格或者 1 个 tab，例如这么写：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;This is a normal paragraph:

    This is a code block.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Markdown 将产生：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;p&gt;This is a normal paragraph:&amp;lt;/p&gt;

&amp;lt;pre&gt;&amp;lt;code&gt;This is a code block.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
代码块的每行的一级缩进，4个空格或者1个tab将会被删除，例如：

    Here is an example of AppleScript:

        tell application &quot;Foo&quot;
            beep
        end tell

将变成：

    &amp;lt;p&gt;Here is an example of AppleScript:&amp;lt;/p&gt;

    &amp;lt;pre&gt;&amp;lt;code&gt;tell application &quot;Foo&quot;
        beep
    end tell&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;代码块一直到没有缩进为止（或者文章的结束）&lt;/p&gt;
&lt;p&gt;在一个代码块中，与符号和尖括号会自动转换成 HTML 实体。这样就很容易在 Markdown 里包含示例 HTML 源码，只需要拷贝进来然后缩进，Markdown 会处理对与符号和尖括号的编码工作。比如，这样：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;    &amp;lt;div class=&quot;footer&quot;&gt;
        &amp;amp;copy; 2004 Foo Corporation
    &amp;lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;会变成：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;pre&gt;&amp;lt;code&gt;&amp;amp;lt;div class=&quot;footer&quot;&amp;amp;gt;
    &amp;amp;amp;copy; 2004 Foo Corporation
&amp;amp;lt;/div&amp;amp;gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;
标准的Markdown语法在代码块中不会被处理。比如星号就只是字面意义的星号。这意味着可以很容易的用Markdown写Markdown自己的语法。

水平线
------

你可以通过三个或者多个减号，星号或者下划线来生成一个平平线。如果你乐意，可以在星号和减号间加空格，下边都能生成水平线：

    * * *

    ***

    *****

    - - -

    ---------------------------------------

* * * * *

span元素
========

链接
----

Markdown支持两种链接的方式：*内联*和*参考*。

每种方式，链接文字都放于方括号内。

要添加一个链接，将一个用括号包含起来放在链接文本之后，链接文本用方括号扩起来。括号内是你想要链接的URL和可选的链接名称，链接名称用引号引起来。例如：

    This is [an example](http://example.com/ &quot;Title&quot;) inline link.

    [This link](http://example.net/) has no title attribute.

生成：

    &amp;lt;p&gt;This is &amp;lt;a href=&quot;http://example.com/&quot; title=&quot;Title&quot;&gt;
    an example&amp;lt;/a&gt; inline link.&amp;lt;/p&gt;

    &amp;lt;p&gt;&amp;lt;a href=&quot;http://example.net/&quot;&gt;This link&amp;lt;/a&gt; has no
    title attribute.&amp;lt;/p&gt;

如果你链接到同一服务器的本地资源，你可以使用相对路径：

    See my [About](/about/) page for details.

参考风格的链接使用另一个方括号，在这个方括号里你放一个标识这个链接的标签：

    This is [an example][id] reference-style link.

空格是可选的：

    This is [an example] [id] reference-style link.

再在同一篇文档里用一行像这样定义链接标签：

    [id]: http://example.com/  &quot;Optional Title Here&quot;

也就是：

-   方括号包含链接标识（缩进三个空格是可选的）;
-   后跟冒号；
-   后跟一个或者多个空格（tab）；
-   后跟链接URL
-   可选地后跟任意链接的属性，用单引号，双引号或者括号引起来

下边的链接定义方法都一样：

    [foo]: http://example.com/  &quot;Optional Title Here&quot;
    [foo]: http://example.com/  &apos;Optional Title Here&apos;
    [foo]: http://example.com/  (Optional Title Here)

**注意：** Markdown.pl 1.0.1发现bug，不能用但因号来引链接名称。

链接URL可以可选择的放到尖括号里：

    [id]: &amp;lt;http://example.com/&gt;  &quot;Optional Title Here&quot;

链接的属性可以换行写，但需要用额外的空格或者tab来缩进，对于长URL这样看起来更好：

    [id]: http://example.com/longish/path/to/resource/here
        &quot;Optional Title Here&quot;

定义链接只能被用于Markdown处理是来生成链接，最终将从你的生成的HTML中删除掉。

链接名称可能包含字符，数字，空格和标点符号，但是他们是大小写*不*敏感的。这两个链接：

    [link text][a]
    [link text][A]

是一回事。

*隐式链接名*技巧允许你不些链接名，这种情况下链接本身作为名称。使用空方括号来链接“Google”到google.com，你可以写：

    [Google][]

然后定义链接：

    [Google]: http://google.com/

因为链接名可能包含空格，这个技巧对多个单词的链接也生效：

    Visit [Daring Fireball][] for more information.

然后定义链接：

    [Daring Fireball]: http://daringfireball.net/

链接定义可以放到文档的任何部分。我倾向于将他们放到紧随使用他们的段落的下方。但是你可以随意将它们放到文档的最后，想脚注一样排序。

这是一个参考链接的例子：

    I get 10 times more traffic from [Google] [1] than from
    [Yahoo] [2] or [MSN] [3].

      [1]: http://google.com/        &quot;Google&quot;
      [2]: http://search.yahoo.com/  &quot;Yahoo Search&quot;
      [3]: http://search.msn.com/    &quot;MSN Search&quot;

使用隐式链接名技巧，你可以这样写：

    I get 10 times more traffic from [Google][] than from
    [Yahoo][] or [MSN][].

      [google]: http://google.com/        &quot;Google&quot;
      [yahoo]:  http://search.yahoo.com/  &quot;Yahoo Search&quot;
      [msn]:    http://search.msn.com/    &quot;MSN Search&quot;

两个例子最终都生成如下的HTML：

    &amp;lt;p&gt;I get 10 times more traffic from &amp;lt;a href=&quot;http://google.com/&quot;
    title=&quot;Google&quot;&gt;Google&amp;lt;/a&gt; than from
    &amp;lt;a href=&quot;http://search.yahoo.com/&quot; title=&quot;Yahoo Search&quot;&gt;Yahoo&amp;lt;/a&gt;
    or &amp;lt;a href=&quot;http://search.msn.com/&quot; title=&quot;MSN Search&quot;&gt;MSN&amp;lt;/a&gt;.&amp;lt;/p&gt;

为了对比一下，这里用Markdown的内联格式写了相同的段落：

    I get 10 times more traffic from [Google](http://google.com/ &quot;Google&quot;)
    than from [Yahoo](http://search.yahoo.com/ &quot;Yahoo Search&quot;) or
    [MSN](http://search.msn.com/ &quot;MSN Search&quot;).

重点不是使用参考样式的链接更容易写，而是写出的文档更具有可读性。对比上边的这个例子：用参考样式写的段落有81个字符，用内联样式的有176个字符，原生的HTML有234个字符，用原声的HTML要比标签用更多的字符。

使用参考样式的链接，一篇文章随着被浏览器解析更接近最终的输出。因为从段落中把相关标记的元信息提取出来，你就可以不中断行文回路的情况下增加链接。

强调
----

Markdown把星号(`*`)和下划线 (`_`)当作强调. 包含于`*`或者
`_`的文本都会被打上`&amp;lt;em&gt;`标签;
两个`*`或者`_`会被打上`&amp;lt;strong&gt;`标签。比如这样的输入：

    *single asterisks*

    _single underscores_

    **double asterisks**

    __double underscores__

会生成：

    &amp;lt;em&gt;single asterisks&amp;lt;/em&gt;

    &amp;lt;em&gt;single underscores&amp;lt;/em&gt;

    &amp;lt;strong&gt;double asterisks&amp;lt;/strong&gt;

    &amp;lt;strong&gt;double underscores&amp;lt;/strong&gt;

你可以使用任意的格式；唯一的限制是必须在一个强盗span里使用相同的字符。

强调可以用在单词中间：

    un*frigging*believable

但是如果你在`*`和`_`周围使用空格，他们将被当作星号和下划线。

要生成一个字面意思的星号或者下划线而不是左强调用，你可以转义：

    *this text is surrounded by literal asterisks*

代码
----

要之处一块代码，就把它放到反引号里（`` ` ``）。和预格式化代码块不一样，代码块标识正常段落里的代码，例如：

    Use the `printf()` function.

会输出：

    &amp;lt;p&gt;Use the &amp;lt;code&gt;printf()&amp;lt;/code&gt; function.&amp;lt;/p&gt;

要在代码里包含反引号，你可以使用多个反引号引起来这段代码：

    ``There is a literal backtick (`) here.``

会输出：

    &amp;lt;p&gt;&amp;lt;code&gt;There is a literal backtick (`) here.&amp;lt;/code&gt;&amp;lt;/p&gt;

包含代码的分割符可能包含空格，开始一个结束一个。这样你就可以在代码的开始或者结尾插入反引号：

    A single backtick in a code span: `` ` ``

    A backtick-delimited string in a code span: `` `foo` ``

将输出：

    &amp;lt;p&gt;A single backtick in a code span: &amp;lt;code&gt;`&amp;lt;/code&gt;&amp;lt;/p&gt;

    &amp;lt;p&gt;A backtick-delimited string in a code span: &amp;lt;code&gt;`foo`&amp;lt;/code&gt;&amp;lt;/p&gt;

在代码中，与符号和尖括号自动被编码为HTML实体，这样就可以很容易的嵌入HTML标签。Markdown将把如下：

    Please don&apos;t use any `&amp;lt;blink&gt;` tags.

变成：

    &amp;lt;p&gt;Please don&apos;t use any &amp;lt;code&gt;&amp;amp;lt;blink&amp;amp;gt;&amp;lt;/code&gt; tags.&amp;lt;/p&gt;

你可以这样写：

    `&amp;amp;#8212;` is the decimal-encoded equivalent of `&amp;amp;mdash;`.

来生成：

    &amp;lt;p&gt;&amp;lt;code&gt;&amp;amp;amp;#8212;&amp;lt;/code&gt; is the decimal-encoded
    equivalent of &amp;lt;code&gt;&amp;amp;amp;mdash;&amp;lt;/code&gt;.&amp;lt;/p&gt;

图片
----

不可否认，在普通文本格式里设计一个自然的表示图片的方式相当困难。

Markdown用表示链接相同的语法来表示图片，有两种方式：*内联*和*参考*。

内联图片语法如下所示：

    ![Alt text](/path/to/img.jpg)

    ![Alt text](/path/to/img.jpg &quot;Optional title&quot;)

就是说：

-   一个感叹号： `!`；
-   后跟方括号，内包含图片的alt文本；
-   后跟一对括号，包含图片的URL，和一个可选的名称，名称用单或者双引号引起来。

参考风格的图片语法是这样的：

    ![Alt text][id]

&quot;id&quot;是预先定义号的图片的参考。图片参考用和定义链接参考一样的语法来定义：

    [id]: url/to/image  &quot;Optional title attribute&quot;

写这篇文档时，Markdown没有制定图片尺寸的语法；如果这对你很重要，你可以使用HTML的`&amp;lt;img&gt;`标签。

* * * * *

杂项
====

自动链接
--------

Markdown支持一个自动为链接和邮件地址创建链接的技巧；只需要把链接或者邮件地址放到尖括号里。这意味着你想要战士实际的链接URL或者邮件地址，而且让它成为一个可点击的链接，你可以这样：

    &amp;lt;http://example.com/&gt;

Markdown会将其变成：

    &amp;lt;a href=&quot;http://example.com/&quot;&gt;http://example.com/&amp;lt;/a&gt;

针对邮件地址的自动链接也一样，此外，Markdown会进行随机数和编码工作来模糊你的邮件地址以防垃圾邮件，例如Markdown将把如下：

    &amp;lt;address@example.com&gt;

转变为：

    &amp;lt;a href=&quot;&amp;amp;#x6D;&amp;amp;#x61;i&amp;amp;#x6C;&amp;amp;#x74;&amp;amp;#x6F;:&amp;amp;#x61;&amp;amp;#x64;&amp;amp;#x64;&amp;amp;#x72;&amp;amp;#x65;
    &amp;amp;#115;&amp;amp;#115;&amp;amp;#64;&amp;amp;#101;&amp;amp;#120;&amp;amp;#x61;&amp;amp;#109;&amp;amp;#x70;&amp;amp;#x6C;e&amp;amp;#x2E;&amp;amp;#99;&amp;amp;#111;
    &amp;amp;#109;&quot;&gt;&amp;amp;#x61;&amp;amp;#x64;&amp;amp;#x64;&amp;amp;#x72;&amp;amp;#x65;&amp;amp;#115;&amp;amp;#115;&amp;amp;#64;&amp;amp;#101;&amp;amp;#120;&amp;amp;#x61;
    &amp;amp;#109;&amp;amp;#x70;&amp;amp;#x6C;e&amp;amp;#x2E;&amp;amp;#99;&amp;amp;#111;&amp;amp;#109;&amp;lt;/a&gt;

这在浏览器中将被解析为一个可点击的链接“address@example.com”

这一类的实体编码技巧确实可以愚弄很多，即使不是大多数地址收获机器人，但不能欺骗所有的。有总比没有强，但是这样发布的邮件地址最终也可能会收到垃圾邮件。

右斜线转义
----------

Markdown
允许你使用斜线转义一般文本字符，这些文本如果不转义将会在Markdown的格式化语法中有特殊意义。例如，你需要用星号包含一句话（不是HTML的`&amp;lt;em&gt;`标签），你可以在星号前使用斜线，像这样：

    *literal asterisks*

Markdown为下边的字符提供转义：

       backslash
    `   backtick
    *   asterisk
    _   underscore
    {}  curly braces
    []  square brackets
    ()  parentheses
    #   hash mark
    +   plus sign
    -   minus sign (hyphen)
    .   dot
    !   exclamation mark

[官方文档原文](http://daringfireball.net/projects/markdown/syntax &quot;markdown manual&quot;)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Hadoop集群搭建]]></title><description><![CDATA[简介 目前我对 hadoop 的认识主要是如下两点： 类似 raid 模式的存储系统，基于软件的容灾； 分布式计算，这个是其牛逼之处。 安装配置 新建用户并配置免密码登录 所有设备上都需要 hadoop 帐号。 配置 ssh 无密码登陆 以 hadoop…]]></description><link>https://xdays.me/Hadoop集群搭建/</link><guid isPermaLink="false">https://xdays.me/Hadoop集群搭建/</guid><pubDate>Sat, 09 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;目前我对 hadoop 的认识主要是如下两点：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;类似 raid 模式的存储系统，基于软件的容灾；&lt;/li&gt;
&lt;li&gt;分布式计算，这个是其牛逼之处。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;安装配置&lt;/h1&gt;
&lt;h2&gt;新建用户并配置免密码登录&lt;/h2&gt;
&lt;p&gt;所有设备上都需要 hadoop 帐号。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;useradd hadoop
passwd hadoop&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;配置 ssh 无密码登陆&lt;/p&gt;
&lt;p&gt;以 hadoop 用户执行如下命令:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;su - hadoop
cd
mkdir .ssh
ssh-keygen –t rsa
cd ~/.ssh
cp id_rsa.pub authorized_keys
scp authorized_keys ccos-m1:/home/hadoop/.ssh
scp authorized_keys ccos-m2:/home/hadoop/.ssh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;安装 JDK&lt;/h2&gt;
&lt;p&gt;JDK 在每台设备上都要安装。&lt;/p&gt;
&lt;p&gt;安装 rpm 包:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -ivh jdk-6u23-linux-amd64.rpm&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;编辑/etc/profile.d/java.sh，内容如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;export JAVA_HOME=/usr/java/jdk1.6.0_23
export JRE_HOME=$JAVA_HOME/jre
export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH
export PATH=$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
export HADOOP_HOME=/opt/hadoop
export PATH=$HADOOP_HOME/bin:$PATH&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;更改 hosts 文件&lt;/h2&gt;
&lt;p&gt;修改/etc/hosts 内容如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;192.168.110.100  centos5-m1
192.168.110.11 ccos-m1
192.168.110.12 ccos-m2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;解压 hadoop 程序&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;tar xzf hadoop-1.0.3.tar.gz -C /opt/
cd /opt/ &amp;amp;&amp;amp; ln -s hadoop-1.0.3 hadoop
chown hadoop:hadoop hadoop-1.0.3 -R&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;配置 hadoop&lt;/h2&gt;
&lt;h3&gt;修改运行环境&lt;/h3&gt;
&lt;p&gt;修改 conf/hadoop-env.sh 如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;export JAVA_HOME=/usr/java/jdk1.6.0_23&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;修改核心配置&lt;/h3&gt;
&lt;p&gt;修改 conf/core-site.xml:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&gt;
&amp;lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;configuration.xsl&quot;?&gt;

&amp;lt;!-- Put site-specific property overrides in this file. --&gt;

&amp;lt;configuration&gt;

&amp;lt;property&gt;
&amp;lt;name&gt;hadoop.tmp.dir&amp;lt;/name&gt;
&amp;lt;value&gt;/hadoop&amp;lt;/value&gt;
&amp;lt;description&gt;A base for other temporary directories.&amp;lt;/description&gt;
&amp;lt;/property&gt;

&amp;lt;property&gt;
&amp;lt;name&gt;fs.default.name&amp;lt;/name&gt;
&amp;lt;value&gt;hdfs://centos5-m1:9000&amp;lt;/value&gt;
&amp;lt;description&gt;The name of the default file system.  A URI whose
scheme and authority determine the FileSystem implementation.  The
uri&apos;s scheme determines the config property (fs.SCHEME.impl) naming
the FileSystem implementation class.  The uri&apos;s authority is used to
determine the host, port, etc. for a filesystem.&amp;lt;/description&gt;
&amp;lt;/property&gt;

&amp;lt;property&gt;
&amp;lt;name&gt;dfs.name.dir&amp;lt;/name&gt;
&amp;lt;value&gt;/hadoop/name&amp;lt;/value&gt;
&amp;lt;description&gt;Determines where on the local filesystem the DFS name node should store the name table. If this is a comma-delimited list of directories then the name table is replicated in all of the directories, for redundancy. &amp;lt;/description&gt;
&amp;lt;/property&gt;

&amp;lt;/configuration&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;修改 HDFS 配置&lt;/h3&gt;
&lt;p&gt;修改 conf/hdfs-site.xml:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&gt;
&amp;lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;configuration.xsl&quot;?&gt;

&amp;lt;!-- Put site-specific property overrides in this file. --&gt;

&amp;lt;configuration&gt;

&amp;lt;property&gt;
&amp;lt;name&gt;dfs.data.dir&amp;lt;/name&gt;
&amp;lt;value&gt;/hadoop/data&amp;lt;/value&gt;
&amp;lt;description&gt;Determines where on the local filesystem an DFS data node should store its blocks. If this is a comma-delimited list of directories, then data will be stored in all named directories, typically on different devices. Directories that do not exist are ignored.&amp;lt;/description&gt;
&amp;lt;/property&gt;

&amp;lt;property&gt;
&amp;lt;name&gt;dfs.replication&amp;lt;/name&gt;
&amp;lt;value&gt;2&amp;lt;/value&gt;
&amp;lt;description&gt;Default block replication. The actual number of replications can be specified when the file is created. The default is used if replication is not specified in create time.&amp;lt;/description&gt;
&amp;lt;/property&gt;

&amp;lt;/configuration&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;修改 MapReduce 配置&lt;/h3&gt;
&lt;p&gt;修改 conf/mapred-site.xml:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&gt;
&amp;lt;?xml-stylesheet type=&quot;text/xsl&quot; href=&quot;configuration.xsl&quot;?&gt;

&amp;lt;!-- Put site-specific property overrides in this file. --&gt;

&amp;lt;configuration&gt;

&amp;lt;property&gt;
&amp;lt;name&gt;mapred.job.tracker&amp;lt;/name&gt;
&amp;lt;value&gt;centos5-m1:9001&amp;lt;/value&gt;
&amp;lt;description&gt;The host and port that the MapReduce job tracker runs at. If &quot;local&quot;, then jobs are run in-process as a single map and reduce task.&amp;lt;/description&gt;
&amp;lt;/property&gt;

&amp;lt;/configuration&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;修改 masters 和 slaves&lt;/h2&gt;
&lt;p&gt;masters 内容如下:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;centos5-m1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;slaves 内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ccos-m1
ccos-m2&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;分发程序文件&lt;/h2&gt;
&lt;p&gt;拷贝包括 hadoop 程序和 hosts 这些文件；并在所有 datanode 上创建/hadoop/data 目录并指定 hadoop 用户组权限。&lt;/p&gt;
&lt;h2&gt;运行 hadoop&lt;/h2&gt;
&lt;h3&gt;格式化 HDFS&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;hadoop namenode -format&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;启动守护进程&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;start-all.sh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;查看运行的进程&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;jps&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;验证&lt;/h2&gt;
&lt;p&gt;namenode 地址：&lt;a href=&quot;http://centos5-m1:50070&quot;&gt;http://centos5-m1:50070&lt;/a&gt;
jobtracker 地址：&lt;a href=&quot;http://centos5-m1:50030&quot;&gt;http://centos5-m1:50030&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Python语言参考-简介]]></title><description><![CDATA[简介 本参考手册描述了 Python 语言，它本意并不是一篇教程。 尽管我努力做到尽可能的精确，除了语法和词法分析外我都用英语而不是标准的规范来阐述。这样应该让这篇文档对于普通读者来说更易读，但可能会产生歧义。所以，如果你来自火星，想通过此文档重新实现 Python…]]></description><link>https://xdays.me/Python语言参考-简介/</link><guid isPermaLink="false">https://xdays.me/Python语言参考-简介/</guid><pubDate>Fri, 08 Mar 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;本参考手册描述了 Python 语言，它本意并不是一篇教程。&lt;/p&gt;
&lt;p&gt;尽管我努力做到尽可能的精确，除了语法和词法分析外我都用英语而不是标准的规范来阐述。这样应该让这篇文档对于普通读者来说更易读，但可能会产生歧义。所以，如果你来自火星，想通过此文档重新实现 Python，你可能需要猜测一些东西或者实际上你最终可能实现一种完全不同的语言。另一方面，如果你使用 Python，想了解这门语言一个特定方面的准确定义，你应该能从这里找到。如果你想搞明白这门语言更正式的定义，你可能需要奉献你的时间或者发明一台克隆机器。&lt;/p&gt;
&lt;p&gt;在语言的参考手册里加入太多实现细节是非常危险的---|实现可能会变，同一语言的不同实现可能运行的完全不同。另一方面，目前广泛使用的只有一种 Python 实现（尽管存在其他实现），而且其特殊的模式值得一提特别是实现强加了一些限制。因此，你会看到一些“实现要点”散落于文档中。&lt;/p&gt;
&lt;p&gt;每种 Python 实现都有很多其自己的内置模块，这些在 Ptyhon 标准模块中有说明。一些和语言的定义有重大关系的内置模块会被提及。&lt;/p&gt;
&lt;h2&gt;替代品&lt;/h2&gt;
&lt;p&gt;尽管目前最流行的 Python 实现只有一种，但有一些其他人感兴趣的替代品。&lt;/p&gt;
&lt;p&gt;已知的实现包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Cpython
这是最初也是维护最好的 Python 实现，以 C 语言编写，新特性通常先出现在这里。&lt;/li&gt;
&lt;li&gt;Jython
Java 语言实现，这个版本可用于 Java 程序的脚本语言，或者用来借助 Java 类库创建 Java 程序。也可以用它给 Java 类写测试程序。更多信息可以访问 Jython 主页。&lt;/li&gt;
&lt;li&gt;Python for .NET
此版本使用 Cpython 实现，但是一个受管理的应用，它让.NET 类可供使用。出自 Brian
Lloyd 之手，更多信息访问 Python for .NET 主页&lt;/li&gt;
&lt;li&gt;IronPython Python for
.NET 的替代品，他是可以生成 IL 的完整 Python 实现，直接将 Python 代码编译为.NET 集合。由 Jim
Hugunin，Jython 创始人开发，跟多信息参考 IronPython 主页&lt;/li&gt;
&lt;li&gt;PyPy
完全用 Python 实现，它支持一些其他版本中没有的特性，如 stackless 支持和 Just
in
Time 编译器。项目的目标是通过语言自身来更容易地修改解释器（因为用 Python 编写），更多信息参考 PyPy 主页。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;每种实现都此文档描述的语言或多或少有些出入，或者引入了些标准文档中没有的信息。请参考特定实现的文档来看看你需要额外了解什么。&lt;/p&gt;
&lt;h2&gt;范式&lt;/h2&gt;
&lt;p&gt;语法和词法分析的描述使用了一种修改过的 BNF 语法范式。就是下面这种风格的定义：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;name      ::=  lc_letter (lc_letter | &quot;_&quot;)*
lc_letter ::=  &quot;a&quot;...&quot;z&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;第一行的意思是 name 是由一个 lc_letter 后跟零个或者多个 lc_letter 和下划线。一个 lc_letter 是 a 到 z 任意一个字符（这个规则实际上描述了此文档中语法和词法中定义的名称）。&lt;/p&gt;
&lt;p&gt;每个规则以一个名字（正是规则定义的名称）和::=开头。竖线用于分割多个可选值；这是此范式中最基本的绑定操作。*表示前面字符的零次或多次重复；类似的+表示一个或者多个重复；包含在[]中的字符表示出现零次或者一次（换句话说就是可选的）。*和+紧密结合；()用于分组。字符串用引号引起来。空格仅用作分隔标记。正常情况规则都写在一行，有多个可选值的规则可以以竖线开头写再多行里。&lt;/p&gt;
&lt;p&gt;在词法定义中，有两种约定：两个以三个点分割的字符意思是介于两者间的任意字符；尖括号中的短语给予要表示的字符以说明信息，例如用来表示控制符。&lt;/p&gt;
&lt;p&gt;尽管使用的范式几乎一样，但词法和语法的定义有很大不同：词法定义操作输入的单个字符上，而语法定义操作由词法分析产生的标记流上。下一章所有的 BNF 使用都是词法定义；接下来的章节中使用的都是语法定义。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[垂直互联网站点技术改造]]></title><description><![CDATA[背景 昨天看到Fenng在 Qcon 上的一个技术分享很有价值，遂写下自己的学习笔记，总结和反思。（有些东西只有总结了，反思了才算真的学会了） 问题 产品陈旧，可扩展性差，访问速度慢，信息架构混乱，UI/UX…]]></description><link>https://xdays.me/垂直互联网站点技术改造/</link><guid isPermaLink="false">https://xdays.me/垂直互联网站点技术改造/</guid><pubDate>Mon, 21 Jan 2013 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;背景&lt;/h1&gt;
&lt;p&gt;昨天看到&lt;a href=&quot;http://dbanotes.net/&quot;&gt;Fenng&lt;/a&gt;在 Qcon 上的一个技术分享很有价值，遂写下自己的学习笔记，总结和反思。（有些东西只有总结了，反思了才算真的学会了）&lt;/p&gt;
&lt;h1&gt;问题&lt;/h1&gt;
&lt;p&gt;产品陈旧，可扩展性差，访问速度慢，信息架构混乱，UI/UX 差等等。
首先明确自己所面临的问题。&lt;/p&gt;
&lt;h1&gt;解决&lt;/h1&gt;
&lt;h2&gt;阶段一&lt;/h2&gt;
&lt;p&gt;可用性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;充分利用开源程序，对于中小规模网站的可用性不是问题。&lt;/li&gt;
&lt;li&gt;可用性是是网站持续发展的前提，没有可用性其他的免谈。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;性能调优&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;考虑新程序的二次开发性，通过改造和改进来优化遗留程序而不是完全替换。同时避免&lt;a href=&quot;http://en.wikipedia.org/wiki/Not_invented_here&quot;&gt;NIH&lt;/a&gt;综合症。
团队建设 不影响用户&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;阶段二&lt;/h2&gt;
&lt;p&gt;信息架构&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;信息维度 URL，用户和搜索&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;代码重构&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;开发者/服务/API&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;数据挖掘&lt;/p&gt;
&lt;p&gt;团队建设&lt;/p&gt;
&lt;h2&gt;阶段三&lt;/h2&gt;
&lt;p&gt;UX 改进 新功能/新特性&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;需求驱动，用户需要什么，就做什么 团队建设&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;阶段四&lt;/h2&gt;
&lt;p&gt;UI 前端 SNS 化 产品延伸&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;文库和 App&lt;/li&gt;
&lt;li&gt;Mobile App，需求从哪里来，从数据挖掘来的 团队建设&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;总结&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;悄悄进村&lt;/li&gt;
&lt;li&gt;信息架构&lt;/li&gt;
&lt;li&gt;挑战用户习惯&lt;/li&gt;
&lt;li&gt;延伸&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;一点体会&lt;/h1&gt;
&lt;p&gt;对一个陈旧系统的改造的第一步并不是去改造，而是设法让其稳定下来，稳定是前提；改进是在不影响用户的前提下进行的，变革还是改造(进)需要评估，信息架构，SSO，搜索，数据挖掘这几个底层的改进很关键，奠定了以后扩展的基础和依据；底层的数据做好了，再来优化 UI 等上层的工作和扩展向移动应用等新的方向。
注意：以上为个人笔记，掺和了一些个人的体会，如对演讲感兴趣，链接见参考链接&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Not_invented_here&quot;&gt;NIH&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.infoq.com/cn/presentations/Vertical-Internet-reform&quot;&gt;infoq 垂直互联网站点的技术改造&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[RPM包制作]]></title><description><![CDATA[工厂简介 RPM 为 Redhat Package
Manager 缩写，是一个为 Redhat 系列 Linux 生产软件包的小工厂。其产品是 RPM 包，包含一些归档文件和 meta 信息;这些 meta…]]></description><link>https://xdays.me/RPM包制作/</link><guid isPermaLink="false">https://xdays.me/RPM包制作/</guid><pubDate>Fri, 07 Dec 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;工厂简介&lt;/h1&gt;
&lt;p&gt;RPM 为 Redhat Package
Manager 缩写，是一个为 Redhat 系列 Linux 生产软件包的小工厂。其产品是 RPM 包，包含一些归档文件和 meta 信息;这些 meta 信息用来记录如何安装和删除这些文件，一些帮助脚本，文件属性和描述行信息（如包依赖哪些包和被哪些包依赖）。整个 RPM 包的制作过程严格按照 SPEC 文件规范的执行，然后通过 rpmbuild 命令来解析 SPEC 文件生成对应的 RPM 包。&lt;/p&gt;
&lt;h1&gt;生产车间&lt;/h1&gt;
&lt;p&gt;制作 RPM 的工厂包括四个实体生产车间，也就是目录结构如下：rpmfactory/{SOURCES,BUILD,SPECS,RPMS,SRPMS}；SOURCES 是原材料车间用于存放程序的源代码，通常是以.tar.gz 后缀结尾的，且压缩前后的的文件名要符合 SPEC 文件的命令规则，通常是 name-version.tar.gz；BUILD 是生产车间，是临时目录，主要用于在 RPM 制作过程中生成临时文件，编译和链接都是在此目录下完成的；SPEC 是整个工厂的控制核心车间，所有 RPM 包的特性都是由次目录下的 spec 文件来控制的；RPMS 是成品车间，此目录下按架构存放对应的 rpm 包文件；SRPMS 是半成品车间，此目录下存放封装好的 srpm 文件，需要到目标系统上去生产然后安装的。此外有一个目录必须要提下，就是$BUILDROOT 目录，在 rpm 包的生产过程中除了编译和链接外也进行了安装，只是没有安装到系统中去，而是安装到了$BUILDROOT 目录下，此目录必须提供。&lt;/p&gt;
&lt;h1&gt;生产线流程&lt;/h1&gt;
&lt;p&gt;RPM 这家工厂虽不是很大，但自动化很高，简要说下这家工厂的生产线，源码包作为原材料被放到 SOURCES 目录下，首先解压源码包得到源码目录，如果需要就打上适当的 patch;然后传送至 BUILD 目录下开始生产主要进程一些配置和编译操作;接着生产完成，需要将中间临时产品安装，这里安装不是安装到系统上去，而是将$BUILDROOT 当作系统的根来安装这个临时产品；如果所有这些都通过就将成品写入 RPM 和 SRPM 文件，分别放到成品车间 RPMS 和半成品车间 SRPMS&lt;/p&gt;
&lt;h1&gt;厂规厂纪&lt;/h1&gt;
&lt;p&gt;一个高自动化的工厂肯定有一套完善的规范供每个车间执行，这就是 SPEC 文件的语法，其控制着 RPM 制作过程的方方面面，主要包含由一些 macro 构成的描述信息,
%prep, %build, %check, %install, %clean, %file 和%changelog,
最后还有 Scriptlets 脚本段（包括%pre 和%post，%preun 和%postun，%pretrans 和%posttrans）。&lt;/p&gt;
&lt;h2&gt;描述信息&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Name 软件名称&lt;/li&gt;
&lt;li&gt;Version 软件版本&lt;/li&gt;
&lt;li&gt;Release 软件分支&lt;/li&gt;
&lt;li&gt;Summary 一句话介绍&lt;/li&gt;
&lt;li&gt;Group 软件所属组&lt;/li&gt;
&lt;li&gt;License 软件产权&lt;/li&gt;
&lt;li&gt;URL 软件主页&lt;/li&gt;
&lt;li&gt;Source 源码位置&lt;/li&gt;
&lt;li&gt;Patch Patch 位置&lt;/li&gt;
&lt;li&gt;BuildArch 编译架构&lt;/li&gt;
&lt;li&gt;BuildRoot 安装目录,重要&lt;/li&gt;
&lt;li&gt;BuildRequires 编译依赖包&lt;/li&gt;
&lt;li&gt;Requires 安装依赖包&lt;/li&gt;
&lt;li&gt;%description 详细的介绍信息&lt;/li&gt;
&lt;li&gt;%define 用来定义和修改 macro 变量，macro 变量用%{macro}来引用&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装前处理%prep&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;%setup 便捷的解压 macro&lt;/li&gt;
&lt;li&gt;%patch 便捷的打 patch 工具&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;编译处理%build&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;%build 通常是./configure &amp;#x26;&amp;#x26; make&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;测试处理%check&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;%check 通常是 make test&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装阶段%install&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;%install
特别注意这个阶段是将编译好的软件安装到$BUILDROOT 下，通常是 make
DESTDIR=%{buildroot} install&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;清理阶段%clean&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;%clean 主要进程一些安装后的清理工作，比如清理 BUILD 目录下的临时文件&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;文件列表%file&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;此段主要设置安装到系统上的文件和目录的属性，注意所有安装到系统上的文件都要在此段声明，否则制作就不成功。&lt;/li&gt;
&lt;li&gt;%defattr(&lt;file permissions&gt;, &lt;user&gt;, &lt;group&gt;,
&lt;directory permissions&gt;)用来定义默认属性&lt;/li&gt;
&lt;li&gt;%config(noreplace) 用来制定配置，升级是不会被覆盖&lt;/li&gt;
&lt;li&gt;%attr(mode, user, group) 单独指定属性&lt;/li&gt;
&lt;li&gt;%doc 指定文件为帮助文档&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;改动日志%changelog&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;有特定格式来指定文件变动信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;脚本段 Scriptlets&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;%pre 和%post 用于安装前后指定的脚本&lt;/li&gt;
&lt;li&gt;%preun 和%postun 用于卸载前后执行的脚本&lt;/li&gt;
&lt;li&gt;%pretrans 和%posttrans 用于一个事务前后的操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;rpmbuild 用法&lt;/h1&gt;
&lt;h2&gt;编译选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-ba 构建二进制和源码包&lt;/li&gt;
&lt;li&gt;-bb 构建二进制包&lt;/li&gt;
&lt;li&gt;-bp 执行到%prep 段&lt;/li&gt;
&lt;li&gt;-bc 执行到%build 段&lt;/li&gt;
&lt;li&gt;-bi 执行到%install 段&lt;/li&gt;
&lt;li&gt;-bl 通过%file 进行列表检查&lt;/li&gt;
&lt;li&gt;-bs 构建源码包&lt;/li&gt;
&lt;li&gt;—sign 给软件包签名&lt;/li&gt;
&lt;li&gt;—rebuild 编译源码包并安装&lt;/li&gt;
&lt;li&gt;—showrc 查看配置文件内容&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;rpm 用法&lt;/h1&gt;
&lt;h2&gt;通用选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;—root 切换根目录&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;安装选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-i 安装&lt;/li&gt;
&lt;li&gt;-U 升级&lt;/li&gt;
&lt;li&gt;-F 存在才升级&lt;/li&gt;
&lt;li&gt;—force 相当与执行—replacepkgs, —replacefiles, and —oldpackage&lt;/li&gt;
&lt;li&gt;—test 测试&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;卸载选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-e 卸载&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;包选择选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-a 所有包&lt;/li&gt;
&lt;li&gt;-f 包含文件的包&lt;/li&gt;
&lt;li&gt;-p 查询一个未安装的包&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;包查询选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;—changelog 查询 changelog&lt;/li&gt;
&lt;li&gt;-c 查询配置文件&lt;/li&gt;
&lt;li&gt;-i 包信息&lt;/li&gt;
&lt;li&gt;-l 包含的文件&lt;/li&gt;
&lt;li&gt;—provides 包兼容性&lt;/li&gt;
&lt;li&gt;-R 包依赖&lt;/li&gt;
&lt;li&gt;—scripts 包脚本&lt;/li&gt;
&lt;li&gt;-s 包状态&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;验证选项&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;-V 验证包&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;重建数据库&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;—rebuilddb 重建 rpm 信息库&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;查看配置&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;—showrc 查看配置信息&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;参考链接&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://fedoraproject.org/wiki/How_to_create_an_RPM_package&quot;&gt;Fedora 制作教程&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://rdc.taobao.com/blog/cs/?p=43&quot;&gt;淘宝核心团队对 spec 介绍&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[学习方法的反思]]></title><description><![CDATA[给自己定的近期主要的学习计划如下： * 个人管理：时间管理《小强升职记》；知识管理《思维导图》 * Linux 基础命令总结《Linux in a nutshell》，整理成文档 * DNS 协议《Bind and DNS(第五版)》 * Web 方向《HTTP…]]></description><link>https://xdays.me/学习方法的反思/</link><guid isPermaLink="false">https://xdays.me/学习方法的反思/</guid><pubDate>Fri, 16 Nov 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;给自己定的近期主要的学习计划如下：&lt;br&gt;
* 个人管理：时间管理《小强升职记》；知识管理《思维导图》&lt;br&gt;
* Linux 基础命令总结《Linux in a nutshell》，整理成文档&lt;br&gt;
* DNS 协议《Bind and DNS(第五版)》&lt;br&gt;
* Web 方向《HTTP 权威指南》&lt;br&gt;
* 数据库方向《高性能 MySQL(第二版)》&lt;br&gt;
* Python 方向《《Python Essential Reference (4th Edition)》》&lt;/p&gt;
&lt;p&gt;虽都在进行，但感觉不到成果，没有太多的成就感，今天反思了下其中原因。我发现我在很多情况下就是仅在学习，例如，会结合 google 和《Linux
in a
nutshell》的对比自己整理一份所有常用命令的索引，然后对照 man 手册一一学习；会每天晚上 12 点到 1 点看一章《HTTP 权威指南》；会一页一页读《高性能 MySQL(第二版)》；其他尚未进行。但仔细向来我除了去理解知识本身其他什么也没有做。&lt;/p&gt;
&lt;p&gt;然而事实是，成就感来源于做成了什么。比如我虽然只用了 Python 很基础的一个 json 模块，解析调用公司管理系统的接口获取的 json 数据这么一个简单的脚本。虽然这里边没有用到什么高深的知识，却能给自己带来很大的快乐和满足感。
这就引出来一个问题，到底是深刻理解知识还是通过运用所学的知识做出一个给自己带来成就感的东西重要呢？或者举个更具体的例子，我在整理 Linux 常用命令的一个总结，我需要一个文档编写工具，于是就找到了 sphinx，这个东西很好很强大；但是连续上个周末和一个周的业余时间我都去学习 sphinx 的用法（包括 reST 用法，sphinx 一些扩展等等），至今也没完全搞明白，但是当初的整理 Linux 日常命令总结的计划却搁置了，以至于我很苦恼自己这周什么也没做出来，或者说因为我只是在接受知识，却没有什么成就感。&lt;/p&gt;
&lt;p&gt;其实我一直坚持一个观点：一种技术，在你没有了解其全貌的情况下去用它而导致用错了然后再去修正，然后按照这个过程继续下去所花费的时间和精力要比，你一开是就下功夫看透这种技术的全貌然后一路畅通的使用它所花的时间和精力要多。优点是少走弯路，因为你已经有技术背景全貌，但是这种学习的方式有个缺点就是在漫无目的的学习过程中可能会迷茫，慢慢的放弃了。前段时间学习 git 就是一个例子，本来是想用 git 做我写的一些 Python 脚本的版本控制，结果花了一晚上学习 git，结果到现在却没有用起来。&lt;/p&gt;
&lt;p&gt;再来看下另一种观点：先用起来（类似程序开发中的先让程序跑起来），即使用的不好甚至用错了，然后在这个过程中不断修改完善，即使修改后也没有那么完美。优点是那种立竿见影的成就感，缺点是会走弯路，会犯错误，会不完美。我今天就按找这个观点做了下，用我还没有熟练的 sphinx（仅熟悉基本的语法规则）编写了 Linux 日常命令的目录结构和第一个命令，然后用 git（仅了解寥寥几个命令）对 sphinx 文档项目做版本控制，虽很简单，但着实有点小成就感。&lt;/p&gt;
&lt;p&gt;所以，我想以后尽量克服自己的完美主义心态，用第二种观点来学习技术，也许那才是对的。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[rsync文件同步服务]]></title><description><![CDATA[简介 rsync 是一个文件同步工具，简单来说，它的功能就是在两个位置（可能是本地的两个目录或者本地目录和远程目录）之间拷贝文件；但是相比 cp 或者 scp 等命令，rsync…]]></description><link>https://xdays.me/Rsync文件同步服务/</link><guid isPermaLink="false">https://xdays.me/Rsync文件同步服务/</guid><pubDate>Wed, 17 Oct 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;简介&lt;/h3&gt;
&lt;p&gt;rsync 是一个文件同步工具，简单来说，它的功能就是在两个位置（可能是本地的两个目录或者本地目录和远程目录）之间拷贝文件；但是相比 cp 或者 scp 等命令，rsync 优势在于其强大的增量拷贝（高效）和过滤条件（灵活）上。&lt;/p&gt;
&lt;h3&gt;功能特点&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;支持特殊文件，文件常见属性的拷贝&lt;/li&gt;
&lt;li&gt;可以借助常见的 ssh，rsh 等来传输&lt;/li&gt;
&lt;li&gt;强大的过滤机制&lt;/li&gt;
&lt;li&gt;通过著名的 delta-transfer 算法来实现高效传输&lt;/li&gt;
&lt;li&gt;基于服务的匿名和认证传输&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;客户端使用&lt;/h3&gt;
&lt;h4&gt;运行模式&lt;/h4&gt;
&lt;h5&gt;本地模式&lt;/h5&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rsync [OPTION...] SRC... [DEST]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果源和目标都是本地路径则和 cp 类似。&lt;/p&gt;
&lt;h5&gt;shell 模式&lt;/h5&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Pull: rsync [OPTION...] [USER@]HOST:SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST:DEST&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通过 shell 连接时在主机名和路径之间用一个”:“，用户名可选。&lt;/p&gt;
&lt;h5&gt;daemon 模式&lt;/h5&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Pull: rsync [OPTION...] [USER@]HOST::SRC... [DEST] 或者 rsync [OPTION...] rsync://[USER@]HOST[:PORT]/SRC... [DEST]
Push: rsync [OPTION...] SRC... [USER@]HOST::DEST 或者 rsync [OPTION...] SRC... rsync://[USER@]HOST[:PORT]/DEST&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;通过 daemon 模式（daemon 配置参照最后一部分）连接时在主机和路径之间用两个”:“，用户名可选。&lt;/p&gt;
&lt;h5&gt;混合模式&lt;/h5&gt;
&lt;p&gt;这里混合模式指的通过 shell 模式来使用 daemon 模式的一些特性。只要制定外部 shell 即可。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rsync -av --rsh=ssh host::module /dest&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;命令行选项&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; -v, --verbose 增强可读性
 -q, --quiet 忽略非错误信息
 --no-motd 忽略daemon模式的MOTD信息 (see manpage caveat)
 -c, --checksum 基于checksum校验，而非mod-time和size
 -a, --archive 归档模式，和-rlptgoD (不要使用 -H,-A,-X)参数相同
 --no-OPTION 关闭一些显式的OPTION (比如 --no-D)
 -r, --recursive 递归目录
 -R, --relative 使用相对路径
 --no-implied-dirs 不发送制定目录的属性，避免在目标使用--relative删除连接重新传输文件，
 -b, --backup 备份 (查看 --suffix &amp;amp; --backup-dir)
 --backup-dir=DIR 基于DIR来创建备份的目录结构
 --suffix=SUFFIX 制定备份的后最 (default ~ w/o --backup-dir)
 -u, --update 跳过接受端较新的文件
 --inplace 直接在文件上更新(SEE MAN PAGE)
 --append 直接追加文件
 --append-verify 和--append很像, 只是用文件的较旧的那部份做checksum
 -d, --dirs 仅传输文件而非递归
 -l, --links 将软链接当作软链接来拷贝
 -L, --copy-links 拷贝链接对应的文件或者目录而非链接本身
 --copy-unsafe-links 仅不安全的链接才被拷贝
 --safe-links 忽略那些链接到目录树外的链接
 -k, --copy-dirlinks 将链接翻译成其链接的目录
 -K, --keep-dirlinks 将目录链接在接收端转换成目录
 -H, --hard-links 保留硬链接
 -p, --perms 保留权限
 -E, --executability 保留文件的可执行性
 --chmod=CHMOD 改变文件或者目录的权限
 -A, --acls 保留ACLs (implies --perms)
 -X, --xattrs 保留扩展属性
 -o, --owner 保留所有者(super-user only)
 -g, --group 保留组
 --devices 保留设备文件 (super-user only)
 --specials 保留特殊文件
 -D 和 --devices --specials一样
 -t, --times 保留修改时间
 -O, --omit-dir-times 在--times选项里忽略目录的时间
 --super 允许接受方执行那个一些超级用户的活动
 --fake-super 通过xattrs来存储和回复权限
 -S, --sparse 高效处理稀疏文件
 -n, --dry-run 只运行，不做改变
 -W, --whole-file 拷贝整个文件(without delta-xfer algorithm)
 -x, --one-file-system 不跨越文件系统
 -B, --block-size=SIZE 强制指定checksum的块大小
 -e, --rsh=COMMAND 指定要使用的远程shell
 --rsync-path=PROGRAM 指定远程要运行的rsync路径
 --existing 如果接收端不存在文件就不创建
 --ignore-existing 如果接收端存在就不更新文件
 --remove-source-files 发送端删除已经同步的文件 (non-dirs)
 --del an alias for --delete-during
 --delete 删除接收端上在发送端不存在的文件
 --delete-before 接收端在发送前删除，而不是发送过程中
 --delete-during 接收端在发送过程中删除
 --delete-delay 在发送过程中寻找文件，在发送完成后删除
 --delete-after 接收端在发送完成后删除
 --delete-excluded 在接收端删除排除的文件
 --ignore-errors 即使有I/O错误也删除
 --force 即使目录不是空的也删除
 --max-delete=NUM 最多删除文件的数目
 --max-size=SIZE 最大传输文件的大小
 --min-size=SIZE 最小传输文件的大小
 --partial 保持部分传输的文件
 --partial-dir=DIR 制定部分传输文件的存放目录
 --delay-updates 先传输，最后再更新，保持原子性
 -m, --prune-empty-dirs 接收端删除空目录
 --numeric-ids 接收端不要将uid/gid映射为用户名和组名
 --timeout=SECONDS 设置I/O超时时间，s为单位
 --contimeout=SECONDS 设置链接服务端的时间
 -I, --ignore-times 即使mtime和size都相同也不跳过
 --size-only 只要大小相同就跳过
 --modify-window=NUM 比对时间时制定精确范围，范围内都认为时间相同
 -T, --temp-dir=DIR 指定创建临时文件的目录
 -y, --fuzzy 文件在接收端不存在的情况下，在当前目录下寻找一个基础文件，以加快传输
 --compare-dest=DIR 接收端除了和发送端对比还和这里指定的目录对比，适合备份上次备份改变的文件
 --copy-dest=DIR 和--compare-dest类似，只是接收端会用本地拷贝来复制那些未改变的文件
 --link-dest=DIR 和--compare-dest类似，只是接收端会建立那些未改变文件的硬链接
 -z, --compress 传输过程中压缩
 --compress-level=NUM 指定压缩等级
 --skip-compress=LIST 不压缩指定后缀的文件
 -C, --cvs-exclude 以CSV的方式自动忽略文件
 -f, --filter=RULE 新增一个file-filtering规则
 -F same as --filter=&apos;dir-merge /.rsync-filter&apos; repeated: --filter=&apos;- .rsync-filter&apos;
 --exclude=PATTERN 排除规则PATTERN
 --exclude-from=FILE 从文件中读取排除规则
 --include=PATTERN 不要排除指定规则的文件
 --include-from=FILE 从文件中读取包含的规则
 --files-from=FILE 从文件中读取文件列表
 -0, --from0 all *-from/filter files are delimited by 0s
 -s, --protect-args 参数不许要空格分割; only wildcard special-chars
 --address=ADDRESS 绑定监听的地址
 --port=PORT 制定端口号
 --sockopts=OPTIONS 制定TCP选项
 --blocking-io 在远程shell中使用blocking I/O
 --stats 给出文件统计信息
 -8, --8-bit-output 输出时不对高位字符转义
 -h, --human-readable 以易于阅读的方式打印数字
 --progress 显示传输进度
 -P same as --partial --progress
 -i, --itemize-changes 打印更新的总结信息
 --out-format=FORMAT 以特定的格式打印更新信息
 --log-file=FILE 日志文件
 --log-file-format=FMT 日志文件格式
 --password-file=FILE 密码文件
 --list-only 仅列出文件
 --bwlimit=KBPS 限制带宽; KBytes per second
 --write-batch=FILE 将批量更新写入文件
 --only-write-batch=FILE 和 --write-batch类似 but w/o updating destination
 --read-batch=FILE 从文件中读取批量更新任务
 --protocol=NUM 使用旧版本的协议
 --iconv=CONVERT_SPEC 要求文件名字符转义
 -4, --ipv4 prefer IPv4
 -6, --ipv6 prefer IPv6
 --version 打印帮助信息
(-h) --help 打印这个帮组信息 (-h 仅在单独使用时与 --help 同意)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;常见用法&lt;/h4&gt;
&lt;p&gt;归档模式备份&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rsync -Cavz . localhost:backup&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;镜像服务器站点&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rsync -az -e ssh --delete local/path remotehost:/remote/path&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;服务端配置&lt;/h3&gt;
&lt;h4&gt;命令选项&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Usage: rsync --daemon [OPTION]...
 --address=ADDRESS 绑定地址
 --bwlimit=KBPS 限速; KBytes per second
 --config=FILE 指定配置文件，默认是/etc/rsyncd.conf
 --no-detach 不跑后台
 --port=PORT 监听端口
 --log-file=FILE 日志文件路径
 --log-file-format=FMT 日志格式
 --sockopts=OPTIONS 指定TCP选项
 -v, --verbose 增强可读性
 -4, --ipv4 prefer IPv4
 -6, --ipv6 prefer IPv6
 --help show this help screen&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;配置选项&lt;/h4&gt;
&lt;h5&gt;全局选项&lt;/h5&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;motd file 提示信息文件
log file 日志文件路径
pid file 进程文件路径
port 绑定端口
address 绑定地址
socket options 指定TCP选项&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h5&gt;模块选项&lt;/h5&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;comment 注释信息
path 模块对应路径
use chroot 使用chroot
max connections 最大连接数
max verbosity 服务端的详细程度
lock file lock文件路径
read only 是否允许上传
write only 是否允许下载
list 是否显示列表
uid 指定用户uid
gid 制定用户gid
filter 制定过滤器
exclude 排除
exclude from 从文件内容中排除
include 包含
include from 从文件内容中包含
incoming chmod 修改上传权限
outgoing chmod 修改下载权限
auth users 用户名
secrets file 密码文件
strict modes 严格模式
host allow 允许主机列表
host deny 拒绝主机列表
ignore errors 忽略I/O错误
ignore nonreadable 忽略不可读的文件
transfer logging 记录文件传输日志
log format 日志格式
timeout I/O超时时间
refuse options 指定拒绝选项
dont compress 指定不压缩文件
pre-xfer exec, post-xfer exec 指定在文件传输前后执行的命令&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;配置示例&lt;/h4&gt;
&lt;p&gt;编辑配置文件 vim /etc/rsyncd.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;motd file = /etc/rsyncd.motd
uid=root
gid=root
use chroot=no
log file=/var/log/rsyncd.log
pid file=/var/run/rsyncd.pid
lock file=/var/run/rsyncd.lock
[rsyncd]
max connections=36
path=/root
comment = vmachine1 backup
ignore errors = yes
read only = no
secrets file = /etc/rsyncd.secrets
hosts allow = 192.168.110.0/24
hosts deny = *&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;然后启动 rsync&lt;/p&gt;
&lt;p&gt;rsync —daemon&lt;/p&gt;</content:encoded></item><item><title><![CDATA[FreeMind思维导图]]></title><description><![CDATA[简介 FreeMind 是款简单易用的思维导图软件，因以 java…]]></description><link>https://xdays.me/Freemind思维导图/</link><guid isPermaLink="false">https://xdays.me/Freemind思维导图/</guid><pubDate>Sun, 23 Sep 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;简介&lt;/h3&gt;
&lt;p&gt;FreeMind 是款简单易用的思维导图软件，因以 java 编写而跨平台。个人其认为其优点在于操作简单，上手快，且功能强大。另外，我认为拿它来做我目前需要的“思维导图”和“知识管理”两个需求都能做到了。&lt;/p&gt;
&lt;h3&gt;应用领域&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;项目管理，包括子项目以及时间控制&lt;/li&gt;
&lt;li&gt;工作空间，组织文件，可执行文件和信息&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;个人知识管理&lt;/strong&gt;，有效记录知识点，以及知识点之间的关系&lt;/li&gt;
&lt;li&gt;写作和头脑风暴，记录写作进度和想法，&lt;/li&gt;
&lt;li&gt;维护小数据库，弱点是查询功能若&lt;/li&gt;
&lt;li&gt;网络收藏夹管理&lt;/li&gt;
&lt;li&gt;此外，我还用它来做&lt;strong&gt;程序逻辑设计和数据库表设计&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;特性列表&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;文本格式化，基本格式化，多行节点，富文本支持(html)，注释&lt;/li&gt;
&lt;li&gt;节点管理，增删改以及格式化节点，以及给节点添加云图&lt;/li&gt;
&lt;li&gt;添加超链接，可以链接到网路或者文件系统&lt;/li&gt;
&lt;li&gt;添加图标，记录状态&lt;/li&gt;
&lt;li&gt;搜索&lt;/li&gt;
&lt;li&gt;多节点选择&lt;/li&gt;
&lt;li&gt;拖拽&lt;/li&gt;
&lt;li&gt;复制粘贴以及移动&lt;/li&gt;
&lt;li&gt;聚合和展开&lt;/li&gt;
&lt;li&gt;切换，滚动，放大缩小导图&lt;/li&gt;
&lt;li&gt;恢复重做&lt;/li&gt;
&lt;li&gt;导出为 HTML，PDF，图片等&lt;/li&gt;
&lt;li&gt;导入文件结构，IE 收藏夹，MindManager 导图，Word 或者 Outlook&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意：以上列表参考自 FreeMind 的官方文档，肯有意思的是这个文档也是用 FreeMind 写的，可以通过 help-&gt;Document 来访问&lt;/p&gt;
&lt;h3&gt;参考链接&lt;/h3&gt;
&lt;p&gt;官方主页：&lt;a href=&quot;http://freemind.sourceforge.net/wiki/index.php/Main_Page&quot;&gt;http://freemind.sourceforge.net/wiki/index.php/Main_Page&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Xmind 主页：&lt;a href=&quot;http://www.xmind.net/&quot;&gt;http://www.xmind.net/&lt;/a&gt; （另一个看着很强大的软件，但是目前 FreeMind 已经能满足需求，所以留待以后研究了）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux网卡绑定]]></title><description><![CDATA[简介 端口绑定就是将多个物理网卡绑定为一个逻辑网卡；根据模式不同可以网卡绑定的作用可分为提升吞吐量和热备份两个主要作用，一般都是提升吞吐量。另外需要 bonding 内核模块的支持。 配置 挂载模块 修改模块挂载配置文件 vim /etc/modprobe.conf…]]></description><link>https://xdays.me/Linux-网卡绑定/</link><guid isPermaLink="false">https://xdays.me/Linux-网卡绑定/</guid><pubDate>Mon, 03 Sep 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;简介&lt;/h3&gt;
&lt;p&gt;端口绑定就是将多个物理网卡绑定为一个逻辑网卡；根据模式不同可以网卡绑定的作用可分为提升吞吐量和热备份两个主要作用，一般都是提升吞吐量。另外需要 bonding 内核模块的支持。&lt;/p&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;h4&gt;挂载模块&lt;/h4&gt;
&lt;p&gt;修改模块挂载配置文件 vim /etc/modprobe.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;alias bond0 bonding
options bond0 mode=balance-alb miimon=100 use_carrier=0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;修改网卡参数&lt;/h4&gt;
&lt;p&gt;添加 bond0 配置 vim /etc/sysconfig/network-script/ifcfg-bond0&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;DEVICE=bond0
USERCTL=no
BOOTPROTO=none
ONBOOT=yes
IPADDR=192.168.110.2
NETWORK=192.168.110.0
NETMASK=255.255.255.0
GATEWAY=192.168.110.1&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;添加 slave 配置 vim /etc/sysconfig/network-script/ifcfg-eth1&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;DEVICE=eth1
USERCTL=no
ONBOOT=yes
MASTER=bond0
SLAVE=yes
BOOTPROTO=none&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;重启网络&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;service network restart&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;参考链接&lt;/h3&gt;
&lt;p&gt;官方文档，内容全面，特别有用：&lt;a href=&quot;http://www.kernel.org/doc/Documentation/networking/bonding.txt&quot;&gt;http://www.kernel.org/doc/Documentation/networking/bonding.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Mini 文档：&lt;a href=&quot;http://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/Documentation/networking/bonding.txt&quot;&gt;http://www.kernel.org/pub/linux/kernel/people/marcelo/linux-2.4/Documentation/networking/bonding.txt&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;一点感想&lt;/p&gt;
&lt;p&gt;基础的东西越全面越好，上层应用的技术够用就行，过多的纠结于实战技术的细节往往影响事情的效率；具体来说，我不需要看完常常的官方文档，因为实际上不会用到所有的参数，需要的时候去查就好了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[NFS文件共享服务器]]></title><description><![CDATA[基础概念 运行流程 NFS 主要用于 Linux 系统间的文件共享，其方便之处在于 client 只要权限足够可以直接通过挂载的方式使用 server 端的目录，通过网络读写数据。NFS 是通过几个独立的 daemons 来实现的，例如其中 rpc.nfsd 用于验证身份，rpc…]]></description><link>https://xdays.me/NFS文件共享服务器/</link><guid isPermaLink="false">https://xdays.me/NFS文件共享服务器/</guid><pubDate>Tue, 21 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;基础概念&lt;/h3&gt;
&lt;h4&gt;运行流程&lt;/h4&gt;
&lt;p&gt;NFS 主要用于 Linux 系统间的文件共享，其方便之处在于 client 只要权限足够可以直接通过挂载的方式使用 server 端的目录，通过网络读写数据。NFS 是通过几个独立的 daemons 来实现的，例如其中 rpc.nfsd 用于验证身份，rpc.mountd 负责管理文件系统，rpc.lockd 用于锁定文件防止写冲突，rpc.statd 用于检查一致性。他们启动后选取小于 1024 的随机端口来监听，这就造成客户端无法了解服务端监听哪些端口的问题？所以 NFS 的运行依赖于 portmap，portmap 启动后会监听 111 端口，NFS 各个服务器启动后需要向 portmap 注册自己的监听端口，这样当客户端要请求响应服务时先向 portmap 请求响应服务的端口，然后再去请求响应的服务&lt;/p&gt;
&lt;h4&gt;权限问题&lt;/h4&gt;
&lt;p&gt;分以下几种情况讨论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;当 client 与 server 有完全相同的帐号和组（包括 UID），client 在 server 端拥有相应帐号的权限&lt;/li&gt;
&lt;li&gt;当 client 与 server 的用户 UID 相同时，client 可以拥有以服务器端相同 UID 的权限，这可能会造成问题&lt;/li&gt;
&lt;li&gt;当 server 上并不存在 client 的 UID，server 端会把 client 的用户看作是一个匿名帐号，如 Centos 用 nfsnobody&lt;/li&gt;
&lt;li&gt;当 client 以 root 用户访问 server，默认 server 会把 root 用户改成匿名用户的权限&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这样看来一个 client 用户要对 NFS 文件系统有些的权限要满足以下三个条件：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;通过 NFS 本身的验证&lt;/li&gt;
&lt;li&gt;在 NFS 配置中对文件系统有些的权限&lt;/li&gt;
&lt;li&gt;实际文件系统对响应的用户有些的权限&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;p&gt;一般系统默认都会安装，用如下命令查询下是否安装&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;rpm -q nfs-utils portmap&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;如果没有安装，yum 安装&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install -y nfs-utils portmap&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;p&gt;NFS 的配置文件在/etc/exports，其格式如下&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/full/path host1(option) host2(option)
 开放目录绝对路径 主机（选项） 主机（选项）&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;主机限定形式：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;完整 ip 或网段&lt;/li&gt;
&lt;li&gt;hostname，并且 hostname 中可以加通配符，如*或?&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;各选项及解释如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;rw 读写权限&lt;/li&gt;
&lt;li&gt;ro 只读权限&lt;/li&gt;
&lt;li&gt;async 异步写入，先存于内存中&lt;/li&gt;
&lt;li&gt;sync 同步写入，直接写盘&lt;/li&gt;
&lt;li&gt;root_squash 将 root 映射为普通用户&lt;/li&gt;
&lt;li&gt;no_root_squash 是 root 就拥有 root 的权限，不映射&lt;/li&gt;
&lt;li&gt;all_squash 映射所有用户到普通帐号&lt;/li&gt;
&lt;li&gt;anonuid/anongid 指定匿名用户的 UID 和 GID&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;客户端操作&lt;/h3&gt;
&lt;p&gt;查看一个主机开放的 NFS 文件系统:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;showmount -e hostip&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;像挂载普通文件系统一样挂载 NFS 文件系统：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mount -t nfs -o *(options) hostip:/remote/path /local/path&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;注：如果 server 挂了，client 无法直接用 umount 卸载掉相应的文件系统，这时候要给 umount 加-f 参数强制卸载。&lt;/strong&gt;&lt;/p&gt;
&lt;h3&gt;双击热备方案&lt;/h3&gt;
&lt;h4&gt;实现功能&lt;/h4&gt;
&lt;p&gt;两台 NFS
server，相互作同步备份（对一台 server 写入的文件会立刻同步到另一台上），如果一台 server 挂了，马上切换到另一台上，也就是可以在两台 server 之间切换&lt;/p&gt;
&lt;h4&gt;设计思路&lt;/h4&gt;
&lt;p&gt;主要包括如下要素：&lt;/p&gt;
&lt;p&gt;所有时间要有 timestamp&lt;br&gt;
通过 nmap 定期来判定 server 是不是已经宕机了，如果端口关闭就表示宕机&lt;br&gt;
脚本要能判断当前使用的是那台 sever，从而推断出下一台 server 是谁&lt;br&gt;
如果一台 server 宕机，马上切换到另一个&lt;br&gt;
循环不断的做这个检查，脚本运行时间保持大约 1 分钟（小于 1 分钟）&lt;br&gt;
将脚本写入 crontab，并且将 output 重定向到日志中&lt;/p&gt;
&lt;h4&gt;nfs_v1.sh&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/sh
#
#date
nfs1=192.168.60.66
nfs2=192.168.60.88
x=1
sdir=/nfsdata #set the server path
#cdir=/mnt #set the client path
cdir=/var/www/html #set the client path
if [ -z `mount | grep nfsdata | cut -d &quot;:&quot; -f1` ]
then
    echo &quot;no nfs file system mounted, just mount one!&quot;
    [ -n &quot;`nmap -p2049 $nfs1 | grep open`&quot; ] &amp;amp;&amp;amp; `mount -t nfs -o nolock $nfs1:$sdir $cdir` || `mount -t nfs -o nolock $nfs2:$sdir $cdir`
else
    while [ $x -le 15 ]
    do
        current=`mount | grep nfsdata | cut -d &quot;:&quot; -f1` #get current nfs server for alter between two server
        #echo current nfs server is $current
        [ $nfs1 == $current ] &amp;amp;&amp;amp; next=$nfs2 || next=$nfs1 #set next nfs server according to current
        #echo next nfs server is $next
        if [ -n &quot;`nmap -p2049 $current | grep open`&quot; ]
        then
            echo -n `date`
            echo &quot; $current is ok!&quot;
        elif [ -n &quot;`nmap -p2049 $next | grep open`&quot; ]
        then
            echo -n `date`
            echo &quot; $current is down!&quot;
            echo `date` stop http service
            #/sbin/service httpd stop &gt; /root/service.log
            killall httpd
            umount -f $cdir
            echo -n `date`
            echo &quot; umount nfs server successfully!&quot;
            mount -t nfs -o nolock $next:$sdir $cdir
            echo `date` start http service
            #/sbin/service httpd start &gt; /root/service.log
            /usr/sbin/httpd
            echo -n `date`
            echo &quot; change nfs server successfully!&quot;
        else
            echo -n `date`
            echo &quot; server is down!!&quot;
        fi
        #echo sleep 3 seconds!
        sleep 3
        x=$(( $x + 1 ))
    done
fi
#date&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;nfs_v2.sh&lt;/h4&gt;
&lt;p&gt;这个版本脚本对当前服务器的目录结构有要求，也就是挂载点必须以 NFS
sever 的 IP 地址命名，因为挂载点和软链接的 source 之间存在一定的关联性。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/sh
#
#date
nfs1=192.168.60.66
nfs2=192.168.60.88
x=1
sdir=/nfsdata #set the server path
#cdir=/mnt #set the client path
cdir=/var/www/html #set the client path
cdir1=/$nfs1 #set the client path
cdir2=/$nfs2 #set the client path
#if nfses are not mounted and nfs servers are alive just mount them
[ -z `mount | grep $nfs1 | cut -d &quot;:&quot; -f1` ] &amp;amp;&amp;amp; [ -n &quot;`nmap -p2049 $nfs1 | grep open`&quot; ] &amp;amp;&amp;amp; `mount -t nfs -o nolock $nfs1:$sdir $cdi
r1`
[ -z `mount | grep $nfs2 | cut -d &quot;:&quot; -f1` ] &amp;amp;&amp;amp; [ -n &quot;`nmap -p2049 $nfs1 | grep open`&quot; ] &amp;amp;&amp;amp; `mount -t nfs -o nolock $nfs2:$sdir $cdi
r2`
while [ $x -le 150 ]
do
    current=`ls -l /var/www/html | cut -d &quot;/&quot; -f5` #get current nfs server for alter between two server
    #echo current nfs server is $current
    [ $nfs1 == $current ] &amp;amp;&amp;amp; next=$nfs2 || next=$nfs1 #set next nfs server according to current
    #echo next nfs server is $next
    if [ -n &quot;`nmap -p2049 $current | grep open`&quot; ]
    then
        echo -n `date`
        echo &quot; $current is ok!&quot;
    elif [ -n &quot;`nmap -p2049 $next | grep open`&quot; ]
    then
        echo -n `date`
        echo &quot; $current is down!&quot;
        unlink $cdir &amp;amp;&amp;amp; echo -n `date` ; echo &quot; umount nfs server successfully!&quot;
        ln -s /$next $cdir &amp;amp;&amp;amp; echo -n `date`; echo &quot; change nfs server successfully!&quot;
    else
        echo -n `date`
        echo &quot; server is down!!&quot;
    fi
    #echo sleep 3 seconds!
    sleep 3
    x=$(( $x + 1 ))
done
#date&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[VPN-基于pptp的编译安装]]></title><description><![CDATA[安装依赖 安装 ppp 下载源码 下载 pptpd 编译安装 解压 修改头文件 vim /usr/local/src/pptpd-1.3.4/plugins/patchlevel.h，将
#define VERSION “2.4.3” 改为 #define VERSION “…]]></description><link>https://xdays.me/VPN-基于pptp的编译安装/</link><guid isPermaLink="false">https://xdays.me/VPN-基于pptp的编译安装/</guid><pubDate>Mon, 20 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;安装依赖&lt;/h3&gt;
&lt;h4&gt;安装 ppp&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install ppp -y&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;下载源码&lt;/h3&gt;
&lt;h4&gt;下载 pptpd&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget -SO /usr/local/src/pptpd-1.3.4.tar.gz http://sourceforge.net/projects/poptop/files/pptpd/pptpd-1.3.4/pptpd-1.3.4.tar.gz/download&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;编译安装&lt;/h3&gt;
&lt;h4&gt;解压&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd /usr/local/src;tar xzf pptpd-1.3.4.tar.gz&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改头文件 vim /usr/local/src/pptpd-1.3.4/plugins/patchlevel.h，将
#define VERSION “2.4.3” 改为 #define VERSION “2.4.5”&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意：此处如果不修改，pptpd 的插件会报错，版本不一致&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;配置编译安装&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd pptpd-1.3.4;./configure --prefix=/usr/local/pptpd &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置&lt;/h3&gt;
&lt;h4&gt;下载配置文件 sample&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;wget -SO /etc/pptpd.conf http://poptop.sourceforge.net/dox/pptpd.conf.txt
wget -SO /etc/ppp/options.pptpd http://poptop.sourceforge.net/dox/options.pptpd.txt
wget -SO /etc/ppp/chap-secrets http://poptop.sourceforge.net/dox/chap-secrets.txt&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;修改配置文件 vim /etc/pptpd.conf&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;localip 192.168.1.1 #本地接口ip地址
remoteip 192.168.1.234-238,192.168.1.245 #分配给远端接口的ip地址&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;vim /etc/ppp/options.pptpd&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ms-dns 8.8.8.8 #DNS地址
ms-dns 8.8.4.4&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;vim /etc/ppp/chap-secrets&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;xdays pptpd %%%%% * #验证密码&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;启动服务&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/usr/local/pptpd/sbin/pptpd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Blog与wiki的区别]]></title><description><![CDATA[…]]></description><link>https://xdays.me/Blog与wiki的区别/</link><guid isPermaLink="false">https://xdays.me/Blog与wiki的区别/</guid><pubDate>Sat, 11 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我从《你的知识需要管理》中了解到，个人知识管理的环节可以包括：学习-&gt;保存-&gt;共享-&gt;使用-&gt;创新；个人认为共享，使用和创新三个环节都可能出发另一个学习的过程（我一直没有好的流程图软件来表达这种流程关系），这样形成一个良性循环。而对于我这样一个没有记忆力的人来说，保存环节就特别重要。&lt;/p&gt;
&lt;p&gt;对于保存知识，我目前有 blog，wiki 和 note 三种方式；我建立这个博客的初衷是记录点滴生活，学习总结和技术分享交流；后来在工作之后接触 wiki 又搭建了个&lt;a href=&quot;http://wiki.xdays.me&quot; title=&quot;xdays&amp;#x27; wiki&quot;&gt;wiki 系统&lt;/a&gt;来组织自己的知识，希望最终能构建一个自己的知识库，这其实也有些盲从，所以有半年之久也没有更新博客了；笔记软件主要是 Eernote 和有道云笔记，主要用在学习的环节，完全是一个中间过程。最近在思考自己的成长，首先思考的用来保存知识的工具选择，blog 和 wiki 的本质区别在哪里，google&amp;#x26;百度了一番，总结如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;blog 强调个人思想，是个个性化的东西；wiki 强调组织多人协作，主题和编写规范都要遵循严格的规则（不这样肯定乱套了）。说到这一点，我建立自己的&lt;a href=&quot;http://wiki.xdays.me&quot; title=&quot;xdays&amp;#x27; wiki&quot;&gt;wiki 系统&lt;/a&gt;就是盲从 wiki 整齐的规范这一点，多人考虑出的规范肯定比一个人合理。&lt;/li&gt;
&lt;li&gt;blog 基于时间线呈现，主题只是一个组织的工具；wiki 基于主题呈现，时间只是一个追踪的工具。&lt;/li&gt;
&lt;li&gt;blog 是一种一对多的关系，wiki 是多对多的关系，这点与第一点有些重复了，不过我这里指的是交流方面。&lt;/li&gt;
&lt;li&gt;相同点主要是：两者展示的单元都是 page；目前组织 page 的方式也基本相同，blog 主要是标签和分类，wiki 主要是 namespace 和分类目录。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;这样说来，wiki 并不适合个人用，或者说 blog 和 wiki 对于个人来说择其一即可。接下来，我将停止更新&lt;a href=&quot;http://wiki.xdays.me&quot; title=&quot;xdays&amp;#x27; wiki&quot;&gt;wiki 系统&lt;/a&gt;，然后将这段时间积累的一些东西迁移到 blog 上来，也算是复习下这段时间学到的东西。&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.converstations.com/2008/10/hey-blog-coac-1.html&quot;&gt;http://www.converstations.com/2008/10/hey-blog-coac-1.html&lt;/a&gt;
从多角度说明两者不同，图文并茂&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://colleenp.blogspot.com/2007/07/difference-between-wiki-and-blog%5C_7696.html&quot;&gt;http://colleenp.blogspot.com/2007/07/difference-between-wiki-and-blog\_7696.html&lt;/a&gt;
一句话概括两者区别&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.answers.com/Q/What%5C_is%5C_the%5C_difference%5C_between%5C_a%5C_blog%5C_and%5C_a%5C_wiki&quot;&gt;http://wiki.answers.com/Q/What\_is\_the\_difference\_between\_a\_blog\_and\_a\_wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.chinaret.com/user/topic%5C_view.aspx?id=e2ed9d5d-5f0b-4a8a-9eb5-8b12e677a327&quot;&gt;http://www.chinaret.com/user/topic\_view.aspx?id=e2ed9d5d-5f0b-4a8a-9eb5-8b12e677a327&lt;/a&gt;
表格对 blog，wiki 和 bbs 三者的区别&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.youtube.com/watch?v=-dnL00TdmLY&amp;#x26;feature=player%5C_embedded&quot;&gt;http://www.youtube.com/watch?v=-dnL00TdmLY&amp;#x26;feature=player\_embedded&lt;/a&gt;
非常有趣的讲解 wiki 的本质的视频，需翻墙&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;最后再补充一句，百度真垃圾！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[个人知识管理的思考]]></title><description><![CDATA[概述 最近在思考的一些关于工作和个人技术成长的一些事情: 个人知识体系框架构建，也就是需要学习什么 获取知识的途径，也就是怎么学习，自学掌握方法或者培训 知识整合后的保存，主要是博客和 wiki 之间的区别和联系 个人知识体系框架 目前的 1.0 版本如下： [caption…]]></description><link>https://xdays.me/个人知识管理的思考/</link><guid isPermaLink="false">https://xdays.me/个人知识管理的思考/</guid><pubDate>Wed, 08 Aug 2012 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;最近在思考的一些关于工作和个人技术成长的一些事情:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;个人知识体系框架构建，也就是需要学习什么&lt;/li&gt;
&lt;li&gt;获取知识的途径，也就是怎么学习，自学掌握方法或者培训&lt;/li&gt;
&lt;li&gt;知识整合后的保存，主要是博客和 wiki 之间的区别和联系&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;个人知识体系框架&lt;/h3&gt;
&lt;p&gt;目前的 1.0 版本如下：&lt;/p&gt;
&lt;p&gt;[caption id=“attachment_663” align=“aligncenter”
width=“430”]&lt;img src=&quot;/wp-content/uploads/2012/08/Dev_Ops_Framework_v1.0.png&quot; alt=&quot;Dev_Ops_Framework&quot; title=&quot;Dev_Ops_Framework_v1.0&quot;&gt;](/wp-content/uploads/2012/08/Dev_Ops_Framework_v1.0.png)
Dev_Ops_Framework[/caption]&lt;/p&gt;
&lt;h3&gt;获取知识的途径&lt;/h3&gt;
&lt;p&gt;时间是很宝贵的，也是目前“挥霍”最严重的。首先研究下时间管理，GTD，PKM 等；然后如何高效的获取知识，还有改考虑下培训（培训还是自学，培训什么呢）的事情。&lt;/p&gt;
&lt;h3&gt;保存整合后的知识&lt;/h3&gt;
&lt;p&gt;研究下 blog 和 wiki 的本质区别，然后分别依据各自的特性去按照框架组织和保存知识；笔记在知识保存过程中的作用，是过程还是结果呢？&lt;/p&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;这些东西都不是太成体系，具体关键词可以包括：知识体系框架，DevOps，GTD，PKM，培训，blog&amp;#x26;wiki，笔记。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[怎样成为一名黑客]]></title><description><![CDATA[为什么是这篇文档？ 作为 Jargon
File 的编辑和其他有关类似文化的文档的作者，我经常收到一些热衷于网络的新手的邮件，他们在邮件中经常问道：“我如何才能成为一个神秘的黑客？”我发现自 1996 年以来好像没有任何 FAQ…]]></description><link>https://xdays.me/怎样成为一名黑客/</link><guid isPermaLink="false">https://xdays.me/怎样成为一名黑客/</guid><pubDate>Fri, 30 Dec 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;为什么是这篇文档？&lt;/h3&gt;
&lt;p&gt;作为 Jargon
File 的编辑和其他有关类似文化的文档的作者，我经常收到一些热衷于网络的新手的邮件，他们在邮件中经常问道：“我如何才能成为一个神秘的黑客？”我发现自 1996 年以来好像没有任何 FAQ 或者文档来回答这个非常重要的问题，所以我写了这篇文档。很多黑客认为这篇文档描述准确，我也认为确实如此。尽管如此，我并不是说它就是有关这一主题的权威，如果你不喜欢你在这里读到内容那就写下你的观点。&lt;/p&gt;
&lt;p&gt;如果你仅仅离线读到是这篇文档一个片段，最新版本可以在这里找到&lt;a href=&quot;http://catb.org/%5C~esr/faqs/hacker-howto.html&quot;&gt;http://catb.org/\~esr/faqs/hacker-howto.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注意：在这篇文档的最后有一个 FAQ 的列表，在你给我发邮件询问问题之前确保你已经仔细阅读了这部份内容。&lt;/p&gt;
&lt;p&gt;这篇文档已经被翻译成下多种语言版本：阿拉伯语、白俄罗斯、中文（简体）、丹麦语、荷兰语、爱沙尼亚、德国、希腊意大利希伯来语、挪威语,葡萄牙语(巴西),罗马尼亚的西班牙语,土耳其语和瑞典语。注意尽管这篇文档不断更新，这些版本可能有不同程度的过期。&lt;/p&gt;
&lt;p&gt;妆点这篇文档的那个图标，有五个点在九个方格里，叫做滑翔机。它有简单的样式，这种样式包含数年来令黑客们痴迷的一种叫做 Life 的数学模拟的特征。我觉得它是黑客的直观象征。简单说来，首先增加一些神秘的色彩，但也开启了一扇复杂逻辑世界的大门，你可以从这里了解更多关于滑翔机象征的内容。&lt;/p&gt;
&lt;h3&gt;黑客是什么？&lt;/h3&gt;
&lt;p&gt;在 Jargon
File 里包含很多关于黑客的定义，大多数都和熟练的技术和解决问题超越限制的之士有关。如果你真的想知道如何成为一名黑客，这两点很重要。&lt;/p&gt;
&lt;p&gt;曾经有一个社区，崇尚共享主义文化，由专家级程序员和网络奇才组成，这个社区的历史可以追溯到几十年前的分时小型机和 ARPAnet 实验项目。崇尚这种文化的成员正事黑客的起源。黑客们构建了因特网，黑客们造就了 Unix 系统，黑客们使新闻组得以运行，黑客们构建了互联网。如果你是这一文化的一部份，如果你为这种文化作出过贡献，那么其他成员会知道你，称你为黑客，你就是一个黑客。&lt;/p&gt;
&lt;p&gt;黑客的观念不仅仅局限于软件黑客文化。很多人将黑客精神应用到像电子或者音乐领域，你可以在任何科学和艺术的最高领域发现他的身影。软件黑客在其他领域里发现了这种相似的精神也会称他们为黑客，而且一些人认为黑客文化独立于黑客的致力于的媒介。但是这篇文档接下来要讨论的是软件黑客的技能和观点，这些起源于黑客文化的传统。&lt;/p&gt;
&lt;p&gt;还有另一个群体自豪的自称为黑客，但实际上不是。这些人（多数事青少年）以入侵计算机系统或者截获电话系统为乐。真正的黑客称他们为骇客也不想和他们有一点关系。真正的黑客认为骇客事懒惰的，不负责任的，不聪明的，是一群不能因为有能力破坏安全而被称之为黑客的群体，就像能发动汽车并不代表就是汽车工程师一样。不幸的是，许多记者，作者被愚弄来用黑客描述骇客，这将无休止的另黑客不悦。&lt;/p&gt;
&lt;p&gt;黑客与骇客最大的不同是：黑客创造，骇客破坏。&lt;/p&gt;
&lt;p&gt;如果你想成为一名黑客，继续读下去。如果你想成为已经骇客，去读 alt.2600 新闻组然后在你发现自己没有自己想象的那么聪明之后做好蹲 5 到 10 年监狱的准备。这就是所有我想告诉骇客的。&lt;/p&gt;
&lt;h3&gt;黑客的态度&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;这个世界充满了等待去解决的有趣的问题&lt;/li&gt;
&lt;li&gt;同一个问题不需要被解决两次&lt;/li&gt;
&lt;li&gt;拒绝枯燥乏味的工作&lt;/li&gt;
&lt;li&gt;向往自由&lt;/li&gt;
&lt;li&gt;态度不是能力的替代品&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;黑客们解决问题创造新事物，他们相信自由和自愿的互帮互助。要想成为一名黑客，你必须自己有这种态度。而要想有这样一种态度，你必须信仰这种态度。&lt;/p&gt;
&lt;p&gt;但如果你把培养黑客态度当作一种在这种文化中被接收的方式，你就误解了要点。成为一个信仰这些观点的人对你很重要，因为这样能帮助你学习并且保持积极主动。就像所有创造性艺术一样，成为大师的最有效的方式就是模仿大师们的思想，不仅仅从智力上也要从感情上模仿。&lt;/p&gt;
&lt;p&gt;或者就像下面这首禅师所说的：&lt;br&gt;
沿着这样一条路线：&lt;br&gt;
发现大师&lt;br&gt;
追随大师&lt;br&gt;
与大师同行&lt;br&gt;
品透大师&lt;br&gt;
成为大师&lt;/p&gt;
&lt;p&gt;所以，如果你想成为一名黑客，重复下面的事情知道你相信它们：&lt;/p&gt;
&lt;h4&gt;1. 这个世界充满了等待去解决的有趣的问题&lt;/h4&gt;
&lt;p&gt;做一名黑客非常有趣，但这种有趣来源于艰辛的努力。努力激发动力。成功的运动员从他们锻炼身体超越自身的极限中获取动力。同样地，要做一名黑客，你必须能从解决问题的过程中获得快乐，磨练技能，锻炼智力。&lt;/p&gt;
&lt;p&gt;如果你觉得这样并非理所当然，要做一名黑客你应该如此。否则，你的黑客动力可能会被性，金钱或者社会虚名所阻碍。&lt;/p&gt;
&lt;p&gt;（你必须能在你的学习能力范围内培养一种信念，就是尽管你可能不具备解决一个问题所需要的所有东西，如果你从其中的一部份学起，你将能够学会处理接下来的一小部分，这样下去你就能解决掉问题）&lt;/p&gt;
&lt;h4&gt;2. 同一个问题不需要被解决两次&lt;/h4&gt;
&lt;p&gt;创造性的大脑是宝贵的，有限的资源。既然有那么多有趣的问题等待被解决，它们不应该被浪费在重复发明轮子之上。&lt;/p&gt;
&lt;p&gt;要想做一名黑客，你要知道其他黑客思考的时间是宝贵的。所以当你分享信息，解决问题并且给出解决办法以便其他黑客解决新的问题而不是总是重复处理旧问题时要有一种道德上的使命感。&lt;/p&gt;
&lt;p&gt;注意，同一个问题不需要被解决两次并不是说你必须将现有的解决办法奉为信条，或者说对于给定的问题只有一种正确的解决办法。通常情况下，面对一个以前从未碰到的问题，我们能从问题的第一个解决办法中学到很多。相信自己可以做的更好是很好也很必要的，而人工技术，制度上的屏障这些阻止了好的解决办法被重新利用从而促使人们不得不重新发明轮子就不好了。&lt;/p&gt;
&lt;p&gt;你不必认为你有义务贡献你的所有创造性的产出，尽管这么做的黑客能赢得其他黑客的尊重。出售自己的成果换取食物，租房或者买计算机也是和黑客价值观一致的。用你的黑客技能养家糊口，甚至发家也是理所当然的，只要你在做这些事情的时候不要忘记你对你的艺术和你的黑客伙伴们的忠诚。&lt;/p&gt;
&lt;h4&gt;3. 拒绝枯燥乏味的工作&lt;/h4&gt;
&lt;p&gt;黑客（更通俗说，富有创造力的人们）绝不该被重复性的苦差困扰，因为如果正他们就不能做只有他们能做的事情，解决新问题。这种浪费会危害到所有人。因此枯燥和苦差不仅仅事令人不悦，更是一种罪恶。&lt;/p&gt;
&lt;p&gt;作为黑客，你应该相信是该尽最大可能的自动化那些枯燥的小事，这不仅为你也为其他所有人（特别是其他的黑客们）。&lt;/p&gt;
&lt;p&gt;（关于这一点有个明显的例外。黑客们有时候在他们看来重复和枯燥的事情来进行脑力休息，或者为了获取一种通过其他方法无法获取技能或者特殊的经验。但是这也因人而异，每一个能思考的人都不应该强迫陷入令自己苦恼的境地。）&lt;/p&gt;
&lt;h4&gt;4. 向往自由&lt;/h4&gt;
&lt;p&gt;黑客们天性反对独裁，任何能对你发号施令的人都可能阻止你去解决令你着迷的问题。而且按照独裁着思路，你会发现一些特别愚昧的理由。所以独裁思维一经发现，必须反抗，以免其压迫你和其他黑客。&lt;/p&gt;
&lt;p&gt;（这并不等同于反对所有权威。儿童需要被监护，罪犯需要被关押。黑客需要接受一些权威来在最短段时间内得到他需要的。但这也是有限的，有意识的权衡，个人屈服权威是不应该接受的。）&lt;/p&gt;
&lt;p&gt;独裁主义者喜欢审查和保密。他们不相信志愿的合作和信息共享，他们只相信他们控制的合作。因此作为黑客，你需要培养一种对审查，保密以及使用武力或者欺骗方式压迫有能力人的做法怀有一种本能的敌意。并且你要愿意为这种信仰斗争。&lt;/p&gt;
&lt;h4&gt;5. 态度不是能力的替代品&lt;/h4&gt;
&lt;p&gt;要想成为一名黑客，你必须培养这些态度。但是仅仅复制一种态度你不会成为黑客，也不能让你成为一名运动员冠军或者摇滚明星。成为一名黑客需要智力，实践，奉献精神和汗水。&lt;/p&gt;
&lt;p&gt;所以你要学会怀疑，尊重每一种能力。黑客从来不会让装腔做势者浪费他们的时间，但是他们尊重能力，特别是黑客能力，不过任何能力都是有价值的。只有少数人掌握的技能固然是好的，而那些涉及智力，实践和专注的技能当然最好。&lt;/p&gt;
&lt;p&gt;如果你尊重能力，你会享受锻炼这种能力的喜悦。辛勤工作和奉献精神会变成很有热情的事情而不仅仅是苦差。这种态度对成为一名黑客至关重要。&lt;/p&gt;
&lt;h3&gt;基础黑客技能&lt;/h3&gt;
&lt;p&gt;黑客技能固然重要，但是技能更加重要。态度不能取代能力。在你梦想让其他黑客称你黑客之前你需要具备一些基本的技能。&lt;/p&gt;
&lt;p&gt;这些技能随着新技术产生的新技能而淘汰了旧的而不断变化。例如，过去包括用机器语言编程，直到最近才包含 HTML。但有一点非常明确，接下来提到的技能一直包含在内。&lt;/p&gt;
&lt;h4&gt;1. 学习如何编程&lt;/h4&gt;
&lt;p&gt;理所当然，这是最基本的黑客技能。如果你一门编程语言也不了解的话，我建议你从 Python 开始。它设计精良，文档全面，对初学者非常友好。尽管是一门很好的初学者语言，它却不仅仅是一个玩偶，Python 非常灵活强大并且适合做大项目。我曾写过一篇&lt;a href=&quot;http://www.linuxjournal.com/article.php?sid=3882&quot; title=&quot;evaluation of python&quot;&gt;Python 评价&lt;/a&gt;，从 Python 的&lt;a href=&quot;http://www.python.org&quot; title=&quot;python offical site&quot;&gt;官方网站&lt;/a&gt;上能找到许多指导文档。&lt;/p&gt;
&lt;p&gt;我过去常常推荐 Java 作为最早学习的一门编程语言，但是这篇&lt;a href=&quot;http://www.crosstalkonline.org/storage/issue-archives/2008/200801/200801-Dewar.pdf&quot; title=&quot;Where Are the Software Engineers of Tomorrow?&quot;&gt;评论文章&lt;/a&gt;改变了我的观点（从这篇文章搜索 The
Pitfalls of Java as a First Programming
Language）。正如他们讽刺到的，一个黑客不能像五金店的管道工一样紧紧按照方法解决问题；你必须要知道各个组件真正做了什么。现在我认为最好先学习 C 或者 Lisp，然后在学 Java。&lt;/p&gt;
&lt;p&gt;这里还有一个更为普遍的观点，如果一门编程语言为你做的太多，那么它可能是对于生产环境是很好的工具但同时却不适合用来学习。不仅仅编程语言有这样的问题，网络应用开发框架像 RubyOnRails，CakePHP，Django 一样能让表面上理解更容易，却让你在遇到困难问题，或者寻求跟好的解决办法时难于处理。&lt;/p&gt;
&lt;p&gt;当你正式开始编程时，你必须学习 C 语言，Unix 系统的核心语言。C++和 C 语言非常接近，如果你学会了一个另一个也就不难了。这两种语言都不适合作为你第一学习的编程语言。实际上，你越避免使用 C 语言你的生产效率越高。&lt;/p&gt;
&lt;p&gt;C 非常高效，节省你的机器资源。不幸的是，C 需要你手工做一些底层的资源（如内存）的管理才能如此高效。这些底层代码非常复杂切 bug 多多，会占用你大量时间来调试代码。现在机器的性能都足够强大，这或许是一个不太好的折衷。更明智的做法是采用一门对机器来说并不算高效但是对人来说更高效的语言，比如 Python。&lt;/p&gt;
&lt;p&gt;其他对黑客来说比较重要的语言是 Perl 和 LISP。Perl 因其实用性值得一学；它在动态网页和系统管理中广泛应用，因此即使你从来不写 Perl 程序至少你要能读懂它。许多人像我建议你用 Python 一样在使用 Perl，来在那些并不需要特别高效的场合下避免使用 C。你需要看懂他们的代码。&lt;/p&gt;
&lt;p&gt;LISP 值得一学另有原因，当你最终学会它时你会得到意义深远的启蒙。这种经验将使你在以后成为一个更好的程序员，即使你很少使用 LISP 这门语言本身。（你可以从编写或者修改 Emacs 编辑器的编辑模式或者 GIMP 的 Script-Fu 插件中很容易的对 LISP 有个初步的认识）&lt;/p&gt;
&lt;p&gt;最好是你能把 Python，C/C++，Java，Perl 和 LISP 这五门语言都学会。他们除了是一门黑客语言之外，还代表了编程的不同方法，每种编程语言都以不同的方式让你受益。&lt;/p&gt;
&lt;p&gt;但是要注意仅仅靠累加语言你是不能达到黑客技能水平，甚至连一个程序员的水平都到达不了，你需要脱离编程语言从更高的角度思考编程问题。想要成为一名真正的黑客，你要锻炼通过联系文档和你的知识来学习一门新的编程语言的能力，这就意味着你要学习几门完全不同的语言。&lt;/p&gt;
&lt;p&gt;我无法在这里就如何编程给予指导，这是一项非常复杂的技能。但是我可以告诉你书和培训课程是做不到的，可能所有的黑客都是自学。你可以从书上学到编程语言的一些特性，但是将知识转化技能的思想只能从实践中获得，阅读代码和写代码最为有效。&lt;/p&gt;
&lt;p&gt;Peter
Norvig，Google 的顶级黑客以及关于人工智能的广泛使用的教材的联合作者，写过一篇很好的文章叫&lt;a href=&quot;http://norvig.com/21-days.html&quot; title=&quot;Teach Yourself Programming in Ten Years&quot;&gt;用十年自学编程&lt;/a&gt;他的学习编程的方法很值得关注。&lt;/p&gt;
&lt;p&gt;学习编程就像学习写文字一样。最好的学习方法就是读一些大师写的东西，写一些自己的东西，再读一些，再写一些，再读一些，再写一些…重复这个过程直到你的文笔能有一种你自己的力量和优势。&lt;/p&gt;
&lt;p&gt;找代码阅读过去是件很困难的事情，因为很少有大型的的程序代码供初出茅庐的黑客阅读和思考。现在情况已经完全转变了，开源软件，编程工具和操作系统（都由黑客缔造）广泛使用。这也引出了我接下来的话题…&lt;/p&gt;
&lt;h4&gt;2. 从开源的 UNIX 系统中选取一个，学习使用和运行它&lt;/h4&gt;
&lt;p&gt;我假设你拥有一台个人电脑或者可以接触到一台（稍等一下来理解这句话的意思，黑客文化起源于那个计算机非常昂贵，个人是买不起的时代）。任何新手想要获取黑客技能要经历的一个最重要的是获取一个 Linux 系统，或者 BSD-UNIX 家族中的的一个，或者 Solaris，把它安装的个人电脑上。&lt;/p&gt;
&lt;p&gt;是的，世界上出了 Unix 还有其他的操作系统，但是他们是以二级制方式发行，你无法阅读到源代码，进而你也无法修改它。用装有 windows 系统或者其他闭源系统的机器上学习黑客技能就像穿着注塑学习跳舞。&lt;/p&gt;
&lt;p&gt;在 Mac OS
X 下学习是可以的，但是只有系统的一部分被开源。你会经常撞墙，而且你要闭源培养一些依赖苹果专利代码的坏习惯，如果你能专注于 Unix 系统下的一些高级特性，你会学到很多有用的东西。&lt;/p&gt;
&lt;p&gt;Unix 是伴随因特网诞生的操作系统。但你不需要知道 Unix 也可以学习如何使用因特网，不学习 Unix 你却无法成为一名因特网黑客。因此，今天的黑客文化都是以 Unix 为中心的（这并不是完全正确，一些老时代的黑客们并不认同这一点，但 Unix 和因特网之间的共生关系已经足够紧密，以致微软也无法郑重的否认）。&lt;/p&gt;
&lt;p&gt;因此，启动一个 Unix，可以像我一样使用 Linux 或者还有其他的选择（是的，你可以在一台机器上安装 Linux 和 windows 双系统），学习它，使用它，修补它。使用它和因特网交流。阅读代码，修改代码。你会找到比任何 windows 系统中拥有的更好的编程工具（包括 C，Lisp，Python 和 Perl），当你作为一名大师级的黑客回首时你会发现你获取笔记想想更多的乐趣，汲取更多的知识。&lt;/p&gt;
&lt;p&gt;想要了解更多关于 Unix 的信息，看 &lt;a href=&quot;http://catb.org/%7Eesr/faqs/loginataka.html&quot;&gt;The
Loginataka&lt;/a&gt;
，你可能还想看一下 &lt;a href=&quot;http://catb.org/%7Eesr/writings/taoup/&quot;&gt;The Art Of Unix
Programming&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;要获取一个 Linux，阅读下 &lt;a href=&quot;http://www.linux.org/&quot;&gt;Linux Online&lt;/a&gt;
这个网站，你可以从那里下载或者找到一个能帮助你安装系统的用户组。&lt;/p&gt;
&lt;p&gt;在写这篇 HOWTO 的最初十年里我说从一个使用者观点来看，所有的发行版本都是一样的，但是在 2006-2007 年间，最好的选择集中在 Ubuntu 上。虽然其他的发行版也有自己的优点，Ubuntu 是目前也一直是对于新手最好的选择。&lt;/p&gt;
&lt;p&gt;你可以从 &lt;a href=&quot;http://www.bsd.org/&quot;&gt;www.bsd.org&lt;/a&gt;找到关于 BSD 的资源。&lt;/p&gt;
&lt;p&gt;一个小试牛刀的好办法是从 Linux 爱好者成为 LiveCD，一种完全从 CD 启动系统而不对硬盘座任何修改的的镜像启动系统。这样会很慢，因为光驱本来就很慢。但这是不做任何修改仅仅看一下的一种方式。&lt;/p&gt;
&lt;p&gt;我曾经写过一篇初级读物&lt;a href=&quot;http://en.tldp.org/HOWTO/Unix-and-Internet-Fundamentals-HOWTO/index.html&quot;&gt;basics of Unix and the
Internet&lt;/a&gt;
。&lt;/p&gt;
&lt;p&gt;我过去常常建议新手单独安装一个 Linux 或者 BSD。现在的安装程序已经足够友好，即使是个新手，你自己也可以完成。尽管如此，我还是建议和本地用户组取得联系，请求帮组，这样无害，而是让安装过程更顺利。&lt;/p&gt;
&lt;h4&gt;4. 学习如何使用万维网和 HTML&lt;/h4&gt;
&lt;p&gt;在黑客文化中创造的很多东西都在默默的发挥着他们的作用，帮助工厂，办公室和大学正常运转，这些对非黑客的生活似乎没有什么影响。网页是一个很大的例外，这个巨大耀眼的黑客工具正在改变整个世界，甚至政客们也这么认为。单就这个理由（当然还有其他理由）你就应该学会如何制作网页。&lt;/p&gt;
&lt;p&gt;这不仅仅意味着学习如何使用浏览器（任何人都可以这么做），而是学习如何写 HTML，网页标记语言。如果你不知道如何编程，写 HTML 会培养一些你帮助你学习编程的习惯。因此给自己建立一个主页。试着坚持使用 XHTML，相比传统的 HTML 它是更干净的学习语言（网上有一篇很好的初学者指南：&lt;a href=&quot;http://htmldog.com/&quot; title=&quot;htmldog&quot;&gt;这里&lt;/a&gt;）&lt;/p&gt;
&lt;p&gt;但是光有一个自己的主页还不足以让你成为一名黑客。网络上有很多网页，大多数都是没有意义的，没有任何内容的，华而不实的垃圾，吸引你但仍然是垃圾的页面。（更多关于这方面的信息参考
&lt;a href=&quot;http://catb.org/%7Eesr/html-hell.html&quot;&gt;The HTML Hell Page&lt;/a&gt;）。&lt;/p&gt;
&lt;p&gt;要想值得一读，你的页面必修有内容，必须有趣或者对其他黑客来说有用。这也引出了我接下来谈论的主题…&lt;/p&gt;
&lt;h4&gt;4. 如果你英语不好，就好好学它&lt;/h4&gt;
&lt;p&gt;我自己作为一个说英语的美国人，挺不情愿这样建议，担心这样会被认作一种文化歧视。但是一些说其他语言者强烈希望我这么指出英语是黑客文化和因特网的工作语言。要在黑客社区内活动你需要掌握这门语言。&lt;/p&gt;
&lt;p&gt;回到 1991 年，据我了解许多把英语作为第二语言的黑客也使用英语来技术交流，即使他们说共同的母语。据我了解到的报道英语比其他语言的技术词汇多，因此对于工作来说是更好的工具。也因为同样的原因，以英语写的技术书籍的翻译通常都让人不满意（如果有的话）。&lt;/p&gt;
&lt;p&gt;Linus
Torvalds，一个芬兰人，用英语来注释他的代码（显然对他来说不是凑巧）。他熟练的英语技能在他募集一个世界范围的 Linux 开发者社区起到很大的作用。这是一个值得学习的榜样。&lt;/p&gt;
&lt;p&gt;对于本地说英语者来说，这并不代表你有作为黑客足够的语言技能。如果你写的东西有歧义或者很多拼写错误，许多黑客（包括我自己）会忽略你。尽管写的粗心并不能代表思考的粗心，我们发现两者有很强的关联性，粗心思考者对我们来说无用。如果你无法写的流畅，就学习。&lt;/p&gt;
&lt;h3&gt;黑客文化中的地位&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;写开源软件&lt;/li&gt;
&lt;li&gt;帮助测试和调试开源软件&lt;/li&gt;
&lt;li&gt;发布有用的信息&lt;/li&gt;
&lt;li&gt;帮助保持基础设施运行&lt;/li&gt;
&lt;li&gt;为黑客文化本身服务&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;像其他非盈利文化一样，黑客王国因声望而运转。你尝试解决有兴趣的问题，但是他们有多有趣，你的解决办法是够好，是由你的技术同仁或者前辈来评判的。&lt;/p&gt;
&lt;p&gt;相应的，当你玩黑客这场游戏时，你通过其他黑客对你技能的评价来获取分数（这也是在其他黑客都称你为黑客之前你不是一个真正的黑客的原因）。这一事实也变得模糊，一方面原因是通常黑客被认为是一种隐士工作，另一个原因是自负和外界评价对个人东西有影响的黑客文化禁忌。&lt;/p&gt;
&lt;p&gt;特别的，黑客王国被人类学家成为奉献文化。你要获取地位和声誉，不是靠支配其他人，也不是打扮漂亮，也不是拥有其他人没有的东西，而是把东西奉献出来。具体的，奉献你的时间，你的创造力和你技能的成果。&lt;/p&gt;
&lt;p&gt;你可以做一下五件事情来赢得黑客的尊重：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;h4&gt;写开源软件&lt;/h4&gt;
&lt;div&gt;
&lt;p&gt;首先（也是最主要最传统的方式）就是写其他黑客认为很有用且很有意思的程序，并且将代码公布给黑客社区使用。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;（我们过去常常把这些作品成为自由软件，但是这样称呼困扰了那些不明确自由为何以的人，现在大多数时候我们称之为开源软件）&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;有些人曾编写了大型且功能强大程序，这些程序能满足大众的需求的人，并且他们将这些程序公之于众以至于现在为每个人所用，他们是黑客文化所尊敬的英雄。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;但是这里有个历史上的小插曲，尽管黑客们把他们之中开源软件开发者奉为我们的社区中最强大的核心，20 世纪 90 年代中期，黑客们的主要工作都集中在闭源软件上。在 1996 年我写这篇 HOWTO 第一个版本时，这依然是事实。在 1997 年以后，开源软件进入主流，事情才开始改变。今天“黑客社区”和“开源软件开发者”已经是对同一种文化和人群的描述，但是应该知道事情并不是总是如此。（更多信息参考&lt;a href=&quot;http://catb.org/~esr/faqs/hacker-howto.html#history&quot;&gt;这里&lt;/a&gt;）&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;帮助测试和调试开源软件&lt;/h4&gt;
&lt;div&gt;
&lt;p&gt;同样包括支持和调试开源软件的人们。在这个不完美的世界里，我们不可避免地在调试阶段花费大量开发时间。这也是为什么从开源软件开发者的思想告诉你的杰出的测试者（他们能清楚的描述问题的现象，集中问题，在临时的版本中能容忍 bug 存在，并且愿意做一些例行的诊断工作）是很重要的。尽管他们之中有些人能判断在哪个测试阶段是延长的，哪个是令人筋疲力尽的噩梦，哪个只是一个有益的小麻烦。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;如果你是一个新人，试着寻找一个你感兴趣的处于开发阶段的程序，做一名测试员。从测试程序，到排错，再到帮助修改他们，这是一个自然的过程。用这种方式你会学到很多，并且还会积累人品（^^）以后别人也会帮助你的。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;发布有用的信息&lt;/h4&gt;
&lt;div&gt;
&lt;p&gt;你可以做的另一件好事是搜集过滤有用的和有趣的信息整理成网页或者 FAQ，而且让这些信息可以获取到。主流技术的 FAQs 的维护者们同样得到开源开发者的尊重。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;帮助保持基础设施运行&lt;/h4&gt;
&lt;div&gt;
&lt;p&gt;黑客文化（和互联网工程开发等等）都是由志愿者维护的，为保持它正常运转有很多必须但是乏味的工作要做，如管理邮件列表，缓和新闻组，维护大型软件的归档库，开发 RFCs 文档和其他技术标准。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;做这些事情的人也会得到很多尊重，因为人人都知道这些工作会耗掉很多时间但是没有玩弄代码有趣，做这些事情体现了牺牲精神。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h4&gt;为黑客文化本身服务&lt;/h4&gt;
&lt;div&gt;
&lt;p&gt;最后，你可以服务和传播文化文本（比如通过写如何成为黑客的准确的入门文档，呵呵！），这还不是你该去做的直到你呆了一段时间并对以上四件事情非常了解了。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;事实上，黑客文化没有领导者，但它确实有英雄和部族长老和历史学家和发言人。当你在战壕里呆的时间够长了，你就会成长为其中一员。注意：黑客并不完全信任部族长老，所以享有这这名誉挺危险的。并不是为这样一个荣誉去努力，你需要自己评估自己的位置去享有，然后保持谦虚和亲切。&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;黑客和呆子的关系&lt;/h3&gt;
&lt;p&gt;恰恰与传言想法，要成为一名黑客你不需要成为一个书呆子。那不会有帮助，但是很多黑客实际上确实是书呆子。缺乏社交生活能让你专注于真正重要的事情，例如思考和 hacking（这个词只可意会不可言传）。&lt;/p&gt;
&lt;p&gt;因此，很多黑客因“极客”这个标签而自豪，&lt;/p&gt;
&lt;p&gt;这是声明他们独立于正常的社交期望的一种方式（也包括对通常伴随极客的科幻小说和策略游戏的嗜好）。19 世纪 90 年代，呆子通常用于指这种方式，那时候书呆子是一种稍微轻蔑语而极客是更难听的。2000 年以后它们发生了转变，只要在美国的流行文化里发生了。而且现在甚至在非专业技术人群中也盛行了一种“极客自豪”文化。&lt;/p&gt;
&lt;p&gt;如果你能足够专注于黑客而且还有有生活，那很好。现在这样相比 19 世纪 70 年代我还是一个新手的时候已经很容易了；现在主流文化对于技术书呆子已经很友好了。很多开始逐渐意识到黑客是高质量的爱人和配偶。&lt;/p&gt;
&lt;p&gt;如果你因为没有生活而被黑客文化所吸引，那也可以-至少你的专注力没有问题。兴许将来你也会有自己的生活。&lt;/p&gt;
&lt;h3&gt;风格要点&lt;/h3&gt;
&lt;p&gt;然后，要成为一名黑客，你需要有一些黑客习惯。当你离开电脑时你也有一些能帮助你培养习惯的事情可做。这些事不能取代黑客行为但是许多黑客会做，他们感觉这些事情和黑客精神的本质有基础关联。&lt;/p&gt;
&lt;p&gt;学好书写自己的本地语言。尽管存在程序员都不会写作这样一个偏见，令人惊讶的是很多黑客（包括我所认识的最杰出的黑客们）都是很好的写手。&lt;/p&gt;
&lt;p&gt;阅读科幻小说，参加科幻小说约会（一个很好的遇见黑客的机会）&lt;/p&gt;
&lt;p&gt;学习武术。武术作为对自律的训练同样是黑客们需要做的。黑客中最流行的形式莫过于亚洲的空手道，比如跆拳道，各种形式的空手道，功夫，合气道或者柔术。西方的剑术和压手的刀术也有很多追随者。手枪射击在被认为合法的地方也很流行。最黑客化的武术是那些着重于心智训练，放松意识，和控制，而不是原始力量，运动竞技或者体力消耗。&lt;/p&gt;
&lt;p&gt;研究一种真正的思想自律。常年来倍受黑客欢迎的是禅（很重要的是你不需要信仰一种宗教或者放弃你所信仰的宗教也能受益于禅），其他的形式可能也可以，但是谨慎选择那些不需要你相信疯狂的事物的形式。&lt;/p&gt;
&lt;p&gt;培养耳朵对音乐的欣赏能力。学习欣赏古怪风格的音乐。学习演奏一些英语乐器，或者学习演唱。&lt;/p&gt;
&lt;p&gt;培养对双关语和文字游戏的欣赏能力。&lt;/p&gt;
&lt;p&gt;这些事情你做的越多，你拥有的黑客元素越多。对于真正的黑客，玩乐和工作，科学和艺术之间的界限逐渐消失，或者汇聚成更高形式的创新玩乐。另外，不要拘泥于狭窄的技能面。尽管大多数的程序员以程序员自居，他们也能胜任其他相关的领域---通常包括系统管理员，网页设计和 PC 硬件故障处理。一个做系统管理员的黑客，也可能很擅长脚本编程和网页设计。黑客们做事不会半途而废，既然开始依稀那个技能那就把它做得相当好。&lt;/p&gt;
&lt;p&gt;最后，一下是不要做的事情：&lt;/p&gt;
&lt;p&gt;不要使用愚昧浮夸的 ID 或者网名。&lt;/p&gt;
&lt;p&gt;不要陷入用户组（或者其他任何地方）的口角里。&lt;/p&gt;
&lt;p&gt;不要自称网络朋克，也不要把时间浪费到那些自称是的人身上。&lt;/p&gt;
&lt;p&gt;不要发表或者邮件任何带有拼写错误和语法错误文字。&lt;/p&gt;
&lt;p&gt;以上这些事情你做了只会给你带来的嘲讽的声誉。隐藏你的真实身份骇客们，盗版软件者和其他低劣形式的幼稚愚蠢行为。黑客们不会做这些，他们因他们的所为自豪，而且希望这与他们的真实名字关联。所以如果你有口实请丢弃。在黑客文化中这样只会证明你是一个失败者。&lt;/p&gt;
&lt;h3&gt;历史记录：黑客，自由软件，开源软件&lt;/h3&gt;
&lt;p&gt;自从我在 1996 年写下这篇 howto 的时候以来，围绕这篇 howto 的环境已经和今天大相近庭。简单描述下这些改变可能帮助一些人澄清黑客社区中对开源，自由软件和 Linux 的混淆。如果你对这部分不好奇，你可以直接跳过阅读 FAQ 和名词解释。&lt;/p&gt;
&lt;p&gt;我在这里描述的黑客精神和社区远早于 1990 年 Linux 的浮现；我在 1976 年左右参与其中，它的根源可以追溯到 19 世纪 60 年代。但是在 Linux 之前，大多数的黑客文化是在版权系统或者少数准实验系统上进行的，像 MIT 的 ITS，它从来没有在他最初的学术环境之外被部署过。尽管早期有一些对改变这种情况的尝试（前 Linux），他们的影响往好了说也是很边缘化的，并且只限于专门的忠实支持者，而这些人在黑客团体中都是极少数的，更别提通常来说的软件软件大行业了。&lt;/p&gt;
&lt;p&gt;现在所谓的开源可以追溯到和黑客社区诞生的时候，但是直到 1985 年它是一种没有被命名的民间行为而不是一种带有理论和宣言的有意识的运动。这个事前阶段在 1985 年被理查德斯托曼终结，他给它了一个名字---自由软件。但是他的命名同样也是一种声明；他赋予自由软件标签以思想，这是当时的黑客社区还没有接受的。这样就导致自由软件被黑客社区里的大量的少数派（特别是和 BSD
Unix 有关系的那部分人）高声拒绝，而被剩下下的大多数人（包括我）认真使用，默默的保留下来。&lt;/p&gt;
&lt;p&gt;尽管保留下来，理查德斯托曼的举着开源软件的旗帜来引导黑客社区的声明到 19 世纪 90 年代中期一直受阻。这种情况被 Linux 的崛起而挑战了。Linux 给开源软件开发一个温暖的家。许多以我们目前成为开源名义发起的项目都由版权限制的 Unix 迁移到了 Linux。围绕 Linux 的社区爆炸式的增长，变得壮大也脱离了早起的 Linux 黑客文化。理查德斯托曼断然尝试将所有这些活动收编如自由软件运动，但是却被爆炸增长的多样的 Linux 社区和他们的公共发起人 Linus
Torvalds 所挫败。Torvalds 因为别无选择继续使用自由软件条款，但是对外公开拒绝理查德斯托曼的思想。许多年轻的黑客追随者这种举措。&lt;/p&gt;
&lt;p&gt;在 1996 年，当我第一次发表我的这篇黑客 HOWTO 时，黑客社区很迅速的围绕着 Linux 和另一些很方便的开源操作系统（尤其那些出身于 BSD
Unix 系统的）重组。社区关于我们大多数人用数十年在闭源的操作系统上开发闭源软件的记忆还没有褪去，但是这一事实依然成为一段逝去历史的一部分了；黑客们普遍开始以他们加入开源项目如 Linux 或者 Apache 来证明自己是黑客了。&lt;/p&gt;
&lt;p&gt;但是开源软件一词尚未合并，在 1998 年之前也不会了。当真正合并了，黑客社区大多数会在接下来的 6 个月接收它；例外之处就是少数人思想上依附于自由软件。自从 1998 年以来，特别是 2003 年以来，用开源软件开发来鉴别黑客行为已经很接近了。现在区别这些分类基本没有意义了，而且将来也不会改变。&lt;/p&gt;
&lt;p&gt;这些值得记住，但是，事情也并不总是如此。&lt;/p&gt;
&lt;p&gt;注意：翻译本文仅为锻炼个人翻译能力和理解黑客文化之用，很多言辞由于水平有限翻译不慎恰当，其间参考&lt;a href=&quot;http://blog.csdn.net/tianyiyang/article/details/2026312&quot;&gt;这篇译文&lt;/a&gt;数次，感谢译文作者，请请不要转载本译文免得误人子弟。&lt;/p&gt;
&lt;p&gt;英文原文：&lt;a href=&quot;http://www.catb.org/esr/faqs/hacker-howto.html&quot;&gt;http://www.catb.org/esr/faqs/hacker-howto.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SSH技巧汇总]]></title><description><![CDATA[自动登录 简介 最近苦于 linux 下没有像 SecureCRT 这样便捷的虚拟终端软件，打算利用下这个 ssh…]]></description><link>https://xdays.me/SSH-技巧汇总/</link><guid isPermaLink="false">https://xdays.me/SSH-技巧汇总/</guid><pubDate>Fri, 12 Aug 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;自动登录&lt;/h1&gt;
&lt;h2&gt;简介&lt;/h2&gt;
&lt;p&gt;最近苦于 linux 下没有像 SecureCRT 这样便捷的虚拟终端软件，打算利用下这个 ssh 自动登录功能。流程说起来也简单，就是先把公钥和密钥分别保存到服务器和客户端，客户端登录只需要指定对应服务器的密钥就可以自动登录到服务器。&lt;/p&gt;
&lt;h2&gt;配置&lt;/h2&gt;
&lt;p&gt;这里只列举自动登录到多台服务器的配置过程，对于单台同样适用。&lt;/p&gt;
&lt;h3&gt;生成密钥&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;$ ssh-keygen  -t rsa
nter file in which to save the key
(/home/lifeix/.ssh/id_rsa): /home/lifeix/.ssh/id_rsa_192.168.60.66
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/lifeix/.ssh/id_rsa_192.168.60.66.
Your public key has been saved in /home/lifeix/.ssh/id_rsa_192.168.60.66.pub&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;添加公钥到服务器&lt;/h3&gt;
&lt;p&gt;执行命令&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ssh-copy-id root@remote-host&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;建立 alias 别名 在.bashrc 添加一行：&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;alias c1=&apos;ssh -i /home/lifeix/.ssh/id_rsa_192.168.60.66 root@192.168.60.66&apos;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;ubuntu 系统下 ssh 缓慢&lt;/h1&gt;
&lt;p&gt;编辑/etc/ssh/ssh_config 添加一行配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;GSSAPIAuthentication no&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Python基础语法]]></title><description><![CDATA[特点： 简单易学；自由开源；高级解释型语言；可移植性；面向对象；可扩展；可嵌入；广泛的库支持。 Note:
简单易学却又无比强大，似乎不太符合逻辑。但不管怎么着，就像只有与一个人打交道才能了解一个人一样，既然选择了 python…]]></description><link>https://xdays.me/Python简明教程/</link><guid isPermaLink="false">https://xdays.me/Python简明教程/</guid><pubDate>Fri, 05 Aug 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;特点：&lt;/h3&gt;
&lt;p&gt;简单易学；自由开源；高级解释型语言；可移植性；面向对象；可扩展；可嵌入；广泛的库支持。&lt;/p&gt;
&lt;p&gt;Note:
简单易学却又无比强大，似乎不太符合逻辑。但不管怎么着，就像只有与一个人打交道才能了解一个人一样，既然选择了 python，那就在学和用中去体会这门语言的特点吧。&lt;/p&gt;
&lt;h3&gt;基础：&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;字面常量( literal constants )，其值不可改变，就代表它自己。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;数值类型，有四种类型：整数，长整数，浮点数和复数。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字符串&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;引号：单双引号意义一样；三引号可以指定跨行字符串，而且可以穿插单双引号。&lt;/li&gt;
&lt;li&gt;转义字符：在一些字符前加 back slash 可以构造特殊含义的字符。&lt;/li&gt;
&lt;li&gt;纯字符串，如果在字符串放在引号中前加 r 或 R 则是纯字符串，不转义。&lt;/li&gt;
&lt;li&gt;不可修改，字符串不可修改。&lt;/li&gt;
&lt;li&gt;字符串连接，自动连接两个相邻的字符串。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;变量&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;定义，内存中的一个片段，给它来个名字，就是变量。&lt;/li&gt;
&lt;li&gt;命名规则，有字母，数字和下划线组成，不能以数字开头，区分大小写。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;强制缩进，python 要求强制缩进&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;操作符和表达式&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;操作符
&lt;ol&gt;
&lt;li&gt;操作符及用法，&lt;a href=&quot;http://www.ibiblio.org/swaroopch/byteofpython/read/operators.html#id3055069&quot;&gt;http://www.ibiblio.org/swaroopch/byteofpython/read/operators.html#id3055069&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;操作符优先级，&lt;a href=&quot;http://www.ibiblio.org/swaroopch/byteofpython/read/operator-precedence.html#id3056064&quot;&gt;http://www.ibiblio.org/swaroopch/byteofpython/read/operator-precedence.html#id3056064&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;表达式由操作数和操作符组成&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;流控制&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;if 语句，if expr: … elif expr: … else: …&lt;/li&gt;
&lt;li&gt;while 语句，while expr: … else: …&lt;/li&gt;
&lt;li&gt;for 语句，for expr: … else: …&lt;/li&gt;
&lt;li&gt;break 语句，用于循环中来中断循环，跳出循环来执行下面的语句。&lt;/li&gt;
&lt;li&gt;continue 语句，跳过当前的这一次循环，继续下次循环。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;函数&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;含义，就是一小段预定义的程序，可以在其他地方调用它，代码重用的方式之一。&lt;/li&gt;
&lt;li&gt;函数参数，传递给函数的变量，函数内部可以处理这些变量。&lt;/li&gt;
&lt;li&gt;局部变量，在函数内部定义的变量只在函数内生效，函数执行完，变量对应的内存释放，即使函数内外的变量名一样；如果需要更改函数之外的变量用 global 声。&lt;/li&gt;
&lt;li&gt;默认参数值，在定义形参的时候给它指定个值，这个值就是默认值。&lt;/li&gt;
&lt;li&gt;关键字参数，直接通过关键值来给参数指定值，其优势在于可以不管参数顺序直接通过关键字来传递参数，这实际上是一种字典数据结构。&lt;/li&gt;
&lt;li&gt;函数返回值由 return 来指定，pass 表示没有语句执行。&lt;/li&gt;
&lt;li&gt;DocStrings，是在函数中加入文档说明，便于以后理解。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;模块&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;含义，代码重用的另一种方式，重用其他一系列的函数或变量，注意其他程序文件扩展名必须是 py。&lt;/li&gt;
&lt;li&gt;为了执行的高效，通常将 py 文件编译为字节码文件，扩展名是 pyc。&lt;/li&gt;
&lt;li&gt;尽量避免使用 from … import … 因为可能会导致重名。&lt;/li&gt;
&lt;li&gt;__name__变量用于判断模块是自己运行还是被其他程序调用执行。&lt;/li&gt;
&lt;li&gt;其实模块就是一个程序，只是它自有定义部分没有执行部分。&lt;/li&gt;
&lt;li&gt;dir 方法可以列出当前模块中定义的所有标识符，包括变量和函数&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;数据结构&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;含义，组织数据的方式。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;列表（list）用于有序的存放一组项目；格式如下[,]；用 list[n]来检索 list 中的值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;元组（tuple）和列表的区别是元组不可修改。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;通过元组来传递变量，print 语句要输出多个变量时，通常先把他们放到元组中再传递给 print。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;字典（dictionary）就像一个地址本，用关键值来获取对应的值。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;序列（sequence），包括列表，元组和字符串;通过索引操作获取序列中的项目；通过切片（slice）操作符来获取序列的部分项目。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;参考（reference）类似链接，变量仅是对象的连接，修改了对象所有链接到该对象的变量都会改变，所以直接赋值有时候会有问题，解决方法是用切片操作符来复制对象。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;面向对象编程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;术语&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;类和对象，类创建了一种新的类型，对象是类的一个实例。&lt;/li&gt;
&lt;li&gt;区域，在一个类或实例中的变量叫区域，又分两种类变量和实例变量。&lt;/li&gt;
&lt;li&gt;方法，在一个类中的函数叫方法。&lt;/li&gt;
&lt;li&gt;属性，区域和方法的统称。&lt;/li&gt;
&lt;li&gt;创建类，class name: …&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;self，类的方法与普通函数的区别是类的方法第一个参数是 self，这个特别的参数是指对象本身。这也是类或者对象的方法和函数的中重要区别。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;__init__方法和__del__方法，两个特殊的方法，一个是在创建对象时执行，一个是对象释放前执行。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;继承，代码重用的另一种方式&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;父类称为超类(superclass)或者基本类(base
class)，子类称为派生类（deruved class）或者子类(subclass)&lt;/li&gt;
&lt;li&gt;就是父类和子类的关系，修改父类的属性子类也会跟随改变，但修改子类的属性不会影响到父类和其他子类。&lt;/li&gt;
&lt;li&gt;创建类的时候声明继承关系，class subclass_name(superclass ): …
  这里在子类定义时后跟一个父类的 tuple。&lt;/li&gt;
&lt;li&gt;Python 不会自动调用 baseclass 的__init__方法，你需要手动通过 self 变量调用它。&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;多态，一个子类在任何需要父类的场合（比如子类定义的方法需要调用父类的方法时）都可以被替换成父类，也就是子类的对象可以被当作父类的对象，这种现象叫多态。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Input 和 Output&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;文件，初始化一个文件实例，然后调用文件类的相关方法来操作文件，最后用 close()关闭文件。&lt;/li&gt;
&lt;li&gt;print 语句中可以通过最后加“,”来去掉最后默认添加的换行符。&lt;/li&gt;
&lt;li&gt;pickle 或者 cpickle 用来将对象“存储”到文件中和从文件中“取存储”。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;异常&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;异常发生在程序出错的情况。&lt;/li&gt;
&lt;li&gt;用 try … except 语句来处理异常。&lt;/li&gt;
&lt;li&gt;用 raise 引发异常，但要注意要指明异常或错误的类名称和对象，可以引发的错误和异常是 Error 和 Exception 类直接或间接导出的类。&lt;/li&gt;
&lt;li&gt;用 try … finally 来处理发生异常后要执行的操作。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;标准库&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;得参考官方库手册来学习了。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;其他&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;特殊方法&lt;/li&gt;
&lt;li&gt;即使单语句块也最好使用缩进格式。&lt;/li&gt;
&lt;li&gt;定义函数时通过*收集所有多余参数到列表中，如 funame(arg1,
*agrs)，如果是**责多余的参数会被认为是键值对。&lt;/li&gt;
&lt;li&gt;exec 用来执行字符串中的 python 语句，eval 用来计算字符串中的表达式的值。&lt;/li&gt;
&lt;li&gt;assert 断言，如果断言不成立就会触发异常。&lt;/li&gt;
&lt;li&gt;repr 用来获取对象的规范字符串表示。&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Principle&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;writing a single logical line in a single physical line only&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Centos5搭建Exmail邮件系统]]></title><description><![CDATA[邮件系统运行原理 mail-architecture MUA，MTA 和 MDA MUA 叫邮件用户代理，是客户端软件负责与用户交互，接受用户指令；MTA 是邮件传输代理，负责判断邮件取向，如果目的地是自己就直接交给 MDA 处理，如果是其他 MTA 则用 SMTP…]]></description><link>https://xdays.me/CentOS5搭建exmail邮件系统/</link><guid isPermaLink="false">https://xdays.me/CentOS5搭建exmail邮件系统/</guid><pubDate>Tue, 02 Aug 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;邮件系统运行原理&lt;/h3&gt;
&lt;h4&gt;&lt;a href=&quot;/wp-content/uploads/2011/08/mail-architecture.gif&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2011/08/mail-architecture.gif&quot; alt=&quot;mail-architecture&quot; title=&quot;mail-architecture&quot;&gt;&lt;/a&gt;&lt;/h4&gt;
&lt;h4&gt;MUA，MTA 和 MDA&lt;/h4&gt;
&lt;p&gt;MUA 叫邮件用户代理，是客户端软件负责与用户交互，接受用户指令；MTA 是邮件传输代理，负责判断邮件取向，如果目的地是自己就直接交给 MDA 处理，如果是其他 MTA 则用 SMTP 转发邮件；MDA 是邮件投递代理，负责将目的地是本机的邮件投放到相应用户的邮箱中，将不是本机的邮件通过 MTA 发送给其他的主机，在这个过程中可以执行邮件过滤和自动回复等操作。&lt;/p&gt;
&lt;h4&gt;传送流程&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;用户写明邮件发件人 A 和收件人 B，标题以及正文内容点发送，邮件便发送到 A 自己的 MTA 上，进入 MTA 的队列中&lt;/li&gt;
&lt;li&gt;如果邮件收件人 B 属于用户自己的 MTA 则直接通过 MDA 投放到收件人 B 相应的邮箱里去&lt;/li&gt;
&lt;li&gt;如果是收件人 B 属于其他的 MTA，则发件人 A 的 MTA 开始转发（relay）流程，通过 SMTP 发送给下一台 MTA，当然这个过程需要经过下一台 MTA 的许可（通过 IP 地址限制）或者认证（用户名密码）&lt;/li&gt;
&lt;li&gt;最后收件人的 MTA 收到邮件后，通过 MDA 放到收件人的邮箱里，等待收件人查看和下载&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;Extmail 简介&lt;/h3&gt;
&lt;p&gt;Extmail 是一套基于开源软件的邮件系统解决方案。其主要特点有支持 STMP 和 POP 统一用数据库认证及 ESTMP，支持 1G 大邮件，web 界面，病毒过滤和内容过滤，图形化日志分析，spam 过滤，别名和多域等特点，目前应用广泛。&lt;/p&gt;
&lt;h3&gt;Extmail 系统结构&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;功能模块 功能模块 2 功能模块 2
操作系统（OS） CentOS 5.3 CentOS 和 RHEL 是一样的，而且升级免费
Web 服务器 Apache 2.2.x CentOS 自带
数据库/目录服务 MySQL 5.0.X CentO 自带
邮件传输代理（MTA） postfix-2.6.2 使用最新版本 2.6.2
邮件投递代理（MDA） maildrop 2.0.x 支持过滤和强大功能
Web 帐户管理后台 ExtMan 1.0 支持无限域名、无限用户
WebMail 系统 ExtMail 1.1.0 支持多语言、全部模板化，功能基本齐全
日志分析及显示 mailgraph_ext ExtMan 中已经包含了
其他数据认证库 Courier Authlb 0.62 负责 courier-imap,maildrop 的认证
SMTP 认证库 Cyrus SASL 2.1.x 标准的 SASL 实现库，可以支持 Courier authlib
内容过滤器 Amavisd-new 2.6.4 Content-Filter 软件，支持与 Camav/SA 的挂接
内容级别的反垃圾邮件工具 SpamAssassin-3.2.5 著名的 SA，可以支持大量规则
防病毒软件（Anti-Virus） ClamAV 0.95.2 最热门的开源杀毒软件
SMTP 阶段反垃圾邮件工具 Spam Locker 0.99 基于 SMTP 行为识别的 Antispam 软件，大量可选插件
高效的反垃圾邮件工具 Dspam-3.8 高精确度的、智能的过滤功能&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意：ExtMail 很好的实现了统一认证，SMTP 认证和 POP 认证统一通过 Courier-Authlib 提供的 authdaemon 认证，只是 STMP 需要透过 cyrus-sasl 连接到 authdaemon 来认证。&lt;/p&gt;
&lt;h3&gt;Extmail 安装配置&lt;/h3&gt;
&lt;h4&gt;EMOS 安装盘&lt;/h4&gt;
&lt;p&gt;EMOS 是继承了 Extmail 的 centos 系统安装盘，安装后有命令行的图形界面的配置向导，默认点回车就可以，但是不利于理解 Extmail 的运行机制。&lt;/p&gt;
&lt;p&gt;参考链接：&lt;a href=&quot;http://linzhibin824.blog.163.com/blog/static/7355771020103515222334/&quot;&gt;http://linzhibin824.blog.163.com/blog/static/7355771020103515222334/&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;手工 yum 方式安装&lt;/h4&gt;
&lt;p&gt;官方给的 wiki 里有详细的配置方法，唯一需要注意的细心配置，可能落下一条命令整个系统就无法跑起来，所以要细心细心在细心！！&lt;/p&gt;
&lt;p&gt;官方文档：&lt;a href=&quot;http://wiki.extmail.org/extmail_solution_for_linux_centos-5&quot;&gt;http://wiki.extmail.org/extmail_solution_for_linux_centos-5&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[vim技巧汇总]]></title><description><![CDATA[移动 注意 w 和 W 的区别：word 是字母数字和下划线组成，而 WORD 是空格分隔的；跳过一个 IP 时可以用 W。 ^跳到第一个非空字符，g_跳到最后一个非空字符 在一个很长的行内移动，gj 移动到下个可视行，其他组合类似 命令行参数，比如定位到 40 行就写+4…]]></description><link>https://xdays.me/VIM技巧汇总/</link><guid isPermaLink="false">https://xdays.me/VIM技巧汇总/</guid><pubDate>Thu, 28 Jul 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;移动&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;注意 w 和 W 的区别：word 是字母数字和下划线组成，而 WORD 是空格分隔的；跳过一个 IP 时可以用 W。&lt;/li&gt;
&lt;li&gt;^跳到第一个非空字符，g_跳到最后一个非空字符&lt;/li&gt;
&lt;li&gt;在一个很长的行内移动，gj 移动到下个可视行，其他组合类似&lt;/li&gt;
&lt;li&gt;命令行参数，比如定位到 40 行就写+40&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;修改&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;r!command 可将命令输出插入进来&lt;/li&gt;
&lt;li&gt;.可以重复上次对文件做修改的命令&lt;/li&gt;
&lt;li&gt;ayy 将行存入命令寄存器中&lt;/li&gt;
&lt;li&gt;录制宏 q 后跟宏名称，最后以 q 结束&lt;/li&gt;
&lt;li&gt;设置&lt;code class=&quot;language-text&quot;&gt;:vnoremap &amp;lt; &amp;lt;gv&lt;/code&gt;可一多次块缩进&lt;/li&gt;
&lt;li&gt;指令 K 可以跳出当前字符的 man 手册，也可以定制查询命令&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;编码技巧&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;通过 ctrl+{A|X}来来加减数字&lt;/li&gt;
&lt;li&gt;~可改变字符大小写&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;外观&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;-p 可以将文件以标签形式打开&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;取消备份功能或备份到特定目录&lt;/h1&gt;
&lt;p&gt;windows 下编辑软件个目录下的_vimrc 文件，在最后添加 set
nobackup 可取消自动备份，添加 set
backupdir=$VIMbackup 即可自动备份到特定目录；Linux 下编辑家目录下的.vim/.vimrc 添加对应选项即可。&lt;/p&gt;
&lt;h1&gt;我的 gvim 配置文件&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;&quot; ---- Global Setting ----
&quot; set pwd dirs
let g:Source=&quot;&quot;
&quot; set color style
colo torte
&quot; hide toolbar menu
set guioptions-=T
set guioptions-=m
&quot; turn off autobackup
set nu nobackup
&quot; change pwd to path of current file
set autochdir
&quot; setting for python
set ts=8 et sw=4 sts=4
&quot; setting for encode
&quot; set encoding=utf-8
set fileencodings=utf-8,chinese,latin-1
if has(&quot;win32&quot;)
set fileencoding=chinese
else
set fileencoding=utf-8
endif
&quot; ---- end of Global Setting ----

&quot; ---- Plugin Settings ----
&quot; shortcut for NERDTree
&quot; map  :NERDTreeMirror
&quot; map  :NERDTreeToggle
&quot; ---- end of Plugin Settin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[VPN-基于OpenVPN构建]]></title><description><![CDATA[简介 openvpn 是一种 ssl
vpn。它最大的优势是构建在 tcp 或 udp，所以可以穿越 proxy，nat，firewalls；此外还可以向 client 端推送 ip 地址，路由和一些关于连接的选项。 安装 安装依赖库 安装 openvpn…]]></description><link>https://xdays.me/VPN-基于openvpn构建/</link><guid isPermaLink="false">https://xdays.me/VPN-基于openvpn构建/</guid><pubDate>Thu, 14 Jul 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;简介&lt;/h3&gt;
&lt;p&gt;openvpn 是一种 ssl
vpn。它最大的优势是构建在 tcp 或 udp，所以可以穿越 proxy，nat，firewalls；此外还可以向 client 端推送 ip 地址，路由和一些关于连接的选项。&lt;/p&gt;
&lt;h3&gt;安装&lt;/h3&gt;
&lt;h4&gt;安装依赖库&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;yum install gcc openssl-devel
cd /usr/local/src
wget http://www.oberhumer.com/opensource/lzo/download/lzo-2.04.tar.gz
tar xzvf lzo-2.04.tar.gz
cd lzo-2.04
./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make check &amp;amp;&amp;amp; make test &amp;amp;&amp;amp; make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;安装 openvpn&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;cd /usr/local/src
wget http://swupdate.openvpn.net/community/releases/openvpn-2.1.4.zip
unzip openvpn-2.1.4/zip
cd openvpn-2.1.4
./configure &amp;amp;&amp;amp; make &amp;amp;&amp;amp; make install&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;生成证书&lt;/h3&gt;
&lt;h4&gt;生成工具&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;mkdir -p /etc/openvpn
mv /usr/local/src/openvpn-2.1.4/easy-rsa/ /etc/openvpn/
chmod a+x /etc/openvpn/easy-rsa/2.0/*
cd /etc/openvpn/easy-rsa/2.0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;编辑变量文件&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vi  /etc/openvpn/easy-rsa/2.0/vars
export KEY_COUNTRY=&quot;CN&quot;
export KEY_PROVINCE=&quot;BJ&quot;
export KEY_CITY=&quot;BJ&quot;
export KEY_ORG=&quot;www.xdays.me&quot;
export KEY_EMAIL=&quot;xdays@xdays.me&quot;
source /etc/openvpn/easy-rsa/2.0/vars&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;生成 cert&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;./clean-all
./build-ca 一串回车，建立root ca
./build-key-server server 一串回车 两个yes，建立server ca
./build-key client1 一串回车两个yes，建立client1 ca
./build-key client2 一串回车两个yes，建立client2 ca
./build-dh&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意：./build-key client1
命令建立三个文件，client 端需要 ca.crt，client1.crt 和 client1.key&lt;/p&gt;
&lt;h3&gt;配置 openvpn&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;vi  /etc/openvpn/server.conf&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;桥接方式配置&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;port 443
proto tcp
dev tun
status /var/log/openvpn/servertcp.log
management localhost 7505
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
#server dhcp pool
server 10.9.9.0 255.255.255.0
ifconfig-pool-persist servertcplist.txt
#duplicate-cn
#push &quot;dhcp-option DNS 8.8.8.8&quot;
#push &quot;redirect-gateway&quot;
#push route
push &quot;route 192.168.61.0 255.255.255.0&quot;
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;路由模式配置&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;port 443
proto tcp
dev tun
status /var/log/openvpn/servertcp.log
management localhost 7505
ca ca.crt
cert server.crt
key server.key
dh dh1024.pem
client-to-client
#server dhcp pool
server 10.9.9.0 255.255.255.0
ifconfig-pool-persist servertcplist.txt
#duplicate-cn
#push dns
push &quot;dhcp-option DNS 8.8.8.8&quot;
#push default gateway
push &quot;redirect-gateway&quot;
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再修改 server 端 iptables 做 nat：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;client 端配置&lt;/h3&gt;
&lt;p&gt;windows 安装 OpenVPN
GUI 默认安装到 C 盘，将 server 端生成的 ca.crt，client1.crt 和 client1.key 三个文件拷到 openvpn 安装目录下的 config 目录下，再新建文件 client.ovpn，内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;client
port 443
proto tcp
dev tun
remote 192.168.60.66 443
resolv-retry infinite
nobind
ca ca.crt
cert client1.crt
key client1.key
keepalive 10 120
comp-lzo
persist-key
persist-tun
verb 3&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[将笔记本打造成无线AP]]></title><description><![CDATA[这月的流量包月在前 10 天就用完了，没有网的日子好难熬。今天突然冒出一个想法：手机支持 wifi，笔记本有无线网卡，能不能把笔记本模拟成无线 AP，通过笔记本走 IP 网络？Google…]]></description><link>https://xdays.me/将笔记本打造成无线ap/</link><guid isPermaLink="false">https://xdays.me/将笔记本打造成无线ap/</guid><pubDate>Sat, 28 May 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;这月的流量包月在前 10 天就用完了，没有网的日子好难熬。今天突然冒出一个想法：手机支持 wifi，笔记本有无线网卡，能不能把笔记本模拟成无线 AP，通过笔记本走 IP 网络？Google 了下找到了如下方法，经本人实验成功，欣喜之情难以言表，哈哈！&lt;/p&gt;
&lt;p&gt;以下为转帖原文：&lt;a href=&quot;http://tech.chinawin.net/laptop/article-47e9.html&quot;&gt;Windows
7 无线 AP 网络&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;如果你的系统是 Windows
7 操作系统，刚好你的&lt;a href=&quot;http://www.chinawin.net/tag/bijibendiannao/&quot;&gt;笔记本电脑&lt;/a&gt;无线网卡硬件又支持，那么你就可以简单的组建起一个无线 AP 网络，实现共享上网。&lt;/p&gt;
&lt;p&gt;具备以上两个前提条件之后，你将会在“计算机-属性-设备管理器-网络适配器”里面看到有一项“Microsoft
Virtual WiFi Miniport Adapter”，那么在“控制面板网络和
Internet 网络连接”里头也会看到有一个名字为“无线网络连接 2”的连接，这个连接正是使用了 Microsoft
Virtual WiFi Miniport Adapter 硬件。&lt;/p&gt;
&lt;p&gt;点击“开始-所有程序-附件-命令提示符”右键点击“以管理员身份运行”，DOS 窗口执行如下两条指令，即可将无线 AP 网络开启：&lt;/p&gt;
&lt;p&gt;netsh wlan set hostednetwork mode=allow ssid=Windows7AP key=password&lt;br&gt;
netsh wlan start hostednetwork&lt;/p&gt;
&lt;p&gt;这个 Wi-Fi 无线网络的名字为 Windows7AP，密码是 password；指令中这两参数可以自行更改。&lt;/p&gt;
&lt;p&gt;再将你的“本地连接”右键-“属性”-“共享”、在“Internet 连接共享”框框那打勾，选择“无线网络连接 2”。意思为要将你的有线网卡的互联网上网功能，通过无线网络 Windows7AP 共享出去。&lt;/p&gt;
&lt;p&gt;之后，你就可以用另外的笔记本电脑、各种支持 Wi-Fi 的手机、iPad、iPod
Touch、iPhone、PSP 等等搜索到这个无线网络，输入密码，就可以 share 上网啦。&lt;/p&gt;
&lt;p&gt;Microsoft Virtual WiFi Miniport
Adapter 是微软 Windows7 最新支持的一个功能，目前只能通过 DOS 指令来开启，但是已经令我感到很欣喜。适合经常出差的伙伴，又或者有一大堆
Wi-Fi 电子设备的机迷们，不用你随身携带一台无线路由器，就可以实现互联网共享。&lt;/p&gt;
&lt;p&gt;我更喜欢将这两条指令做成一个.bat 批处理文件，瞬间加载，实现 Wi-Fi 网络的快速启动。&lt;/p&gt;
&lt;p&gt;Microsoft Virtual WiFi Miniport Adapter，一如谷歌 Android
2.2“冻酸奶”支持的 3G 无线 AP 般前卫。&lt;/p&gt;
&lt;hr&gt;</content:encoded></item><item><title><![CDATA[博客更换自制主题]]></title><description><![CDATA[近来受找工作困扰没有心思学习，决定全新制作自己的博客主题。找到一篇基础的教程WordPress…]]></description><link>https://xdays.me/博客更换自制主题/</link><guid isPermaLink="false">https://xdays.me/博客更换自制主题/</guid><pubDate>Sun, 01 May 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;近来受找工作困扰没有心思学习，决定全新制作自己的博客主题。找到一篇基础的教程&lt;a href=&quot;http://fairyfish.net/series/wordpress-theme-tutorials/&quot;&gt;WordPress
主题教程&lt;/a&gt;，虽内容有些老了但还是很有参考价值的，起码搞清了整个博客中层是怎么运作的，底层的函数调用太过复杂，一时半会是没精力学习了。&lt;/p&gt;
&lt;p&gt;说下总体想法：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;核心功能就是以最简单的方式显示日志&lt;/li&gt;
&lt;li&gt;侧边栏仅保留了分类目录和日历&lt;/li&gt;
&lt;li&gt;页面仅有 index，single，search 和 category 四个&lt;/li&gt;
&lt;li&gt;得意之处是通过制定 margin 为负数实现了顶部的 logo&lt;/li&gt;
&lt;li&gt;通过自定义 pre 标签的 css 实现代码高亮&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然肯定还有很多 bug 或不足之处有待发现。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VPN-基于pptp配置及问题]]></title><description><![CDATA[先说下应用场景：学校里是用硬件集中认证的的方式来控制学生公寓上网的，如果不通过认证仅能通过 IP 访问校园网的资源。原先的应对方案是在机房（无需通过认证即可访问外网）用 squid 假设 proxy…]]></description><link>https://xdays.me/VPN-基于pptp配置及问题/</link><guid isPermaLink="false">https://xdays.me/VPN-基于pptp配置及问题/</guid><pubDate>Sat, 16 Apr 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;先说下应用场景：学校里是用硬件集中认证的的方式来控制学生公寓上网的，如果不通过认证仅能通过 IP 访问校园网的资源。原先的应对方案是在机房（无需通过认证即可访问外网）用 squid 假设 proxy 服务器，既然是代理限制也很明显，有些不支持代理的应用就不能用了，比如一些游戏和网络电视等。自接触 VPN 以来感受其强大特性，宿舍通过拨 VPN 到机房网络，既然已经属于机房的网络了访问外网也就不是问题了。&lt;/p&gt;
&lt;p&gt;实施步骤：&lt;/p&gt;
&lt;p&gt;1）目前优先选取的是 pptp
VPN，因为它配置简单，况且仅需要几个连接，对性能也没什么要求。&lt;/p&gt;
&lt;p&gt;2）配置步骤见另一篇文章&lt;a href=&quot;/vpn-%E5%9F%BA%E4%BA%8Epptp%E7%9A%84%E7%AE%80%E5%8D%95%E9%85%8D%E7%BD%AE.html&quot;&gt;VPN-基于 pptp 的简单配置&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;拓扑图如下：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2011/03/pptpd-vpn-top.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2011/03/pptpd-vpn-top.jpg&quot; alt=&quot;pptpd-vpn-top&quot; title=&quot;pptpd-vpn-top&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;出现的问题：&lt;/p&gt;
&lt;p&gt;按照上述步骤配置完成，客户端可以拨到 VPN
Server 获取地址，但仅可以访问部分网站，校园网内的网站可以，百度谷歌可以，新浪人人等不可以。&lt;/p&gt;
&lt;p&gt;自己的尝试：因为之前用的是 proxy，这次就想到把 proxy 和 VPN 结合起来，不让 VPN
Server 去执行 nat 而仅仅是做为代理用，下面是测试结果&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;不拨 VPN 直接用 proxy 可以正常访问外网&lt;/li&gt;
&lt;li&gt;拨 VPN 不用 proxy 可以访问部分网站&lt;/li&gt;
&lt;li&gt;拨 VPN，然后去掉 Server 的 nat 功能，用 proxy，仅能访问部分网站，貌似 proxy 在 VPN 没有起作用&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;这个问题比较困扰我，前后总共也得折腾了三四天了，关于 pptp 协议原理的介绍也都很含糊，只好作罢，留待以后继续研究了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[非常经典的iptables配置脚本]]></title><description><![CDATA[花了一下午和一晚上通过http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html这篇文档深入学习了 iptables…]]></description><link>https://xdays.me/非常经典的iptables配置脚本/</link><guid isPermaLink="false">https://xdays.me/非常经典的iptables配置脚本/</guid><pubDate>Sun, 10 Apr 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;花了一下午和一晚上通过&lt;a href=&quot;http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html&quot;&gt;http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html&lt;/a&gt;这篇文档深入学习了 iptables 这一有力的包过滤系统，文档最后作者提供了一个脚本来配置 iptables，我觉得这个脚本的结构设计的相当棒，这里转载过来并附上自己的理解共以后参考。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#!/bin/sh

#

# rc.firewall - Initial SIMPLE IP Firewall script for Linux 2.4.x and iptables

#

# Copyright (C) 2001  Oskar Andreasson &amp;lt;bluefluxATkoffeinDOTnet&gt;

#

# This program is free software; you can redistribute it and/or modify

# it under the terms of the GNU General Public License as published by

# the Free Software Foundation; version 2 of the License.

#

# This program is distributed in the hope that it will be useful,

# but WITHOUT ANY WARRANTY; without even the implied warranty of

# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the

# GNU General Public License for more details.

#

# You should have received a copy of the GNU General Public License

# along with this program or from the site that you downloaded it

# from; if not, write to the Free Software Foundation, Inc., 59 Temple

# Place, Suite 330, Boston, MA  02111-1307   USA

#

###########################################################################

#

# 1. Configuration options.

#

#

# 1.1 Internet Configuration.

#定义网络参数变量

#

INET_IP=&quot;194.236.50.155&quot;

INET_IFACE=&quot;eth0&quot;

INET_BROADCAST=&quot;194.236.50.255&quot;

#

# 1.1.1 DHCP

#

#

# 1.1.2  PPPoE

#

#

# 1.2 Local Area Network configuration.

#

# your LAN&apos;s IP range and localhost IP. /24 means to only use the first 24

# bits of the 32 bit IP address. the same as netmask 255.255.255.0

#

LAN_IP=&quot;192.168.0.2&quot;

LAN_IP_RANGE=&quot;192.168.0.0/16&quot;

LAN_IFACE=&quot;eth1&quot;

#

# 1.3 DMZ Configuration.

#

#

# 1.4 Localhost Configuration.

#

LO_IFACE=&quot;lo&quot;

LO_IP=&quot;127.0.0.1&quot;

#

# 1.5 IPTables Configuration.

#

IPTABLES=&quot;/usr/sbin/iptables&quot;

#

# 1.6 Other Configuration.

#

###########################################################################

#

# 2. Module loading.

#加载模块

#

#

# Needed to initially load modules

#

/sbin/depmod -a

#

# 2.1 Required modules

#

/sbin/modprobe ip_tables

/sbin/modprobe ip_conntrack

/sbin/modprobe iptable_filter

/sbin/modprobe iptable_mangle

/sbin/modprobe iptable_nat

/sbin/modprobe ipt_LOG

/sbin/modprobe ipt_limit

/sbin/modprobe ipt_state

#

# 2.2 Non-Required modules

#

#/sbin/modprobe ipt_owner

#/sbin/modprobe ipt_REJECT

#/sbin/modprobe ipt_MASQUERADE

#/sbin/modprobe ip_conntrack_ftp

#/sbin/modprobe ip_conntrack_irc

#/sbin/modprobe ip_nat_ftp

#/sbin/modprobe ip_nat_irc

###########################################################################

#

# 3. /proc set up.

#设置/proc参数开启转发功能，主要用于nat

#

#

# 3.1 Required proc configuration

#

echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_forward

#

# 3.2 Non-Required proc configuration

#

#echo &quot;1&quot; &gt; /proc/sys/net/ipv4/conf/all/rp_filter

#echo &quot;1&quot; &gt; /proc/sys/net/ipv4/conf/all/proxy_arp

#echo &quot;1&quot; &gt; /proc/sys/net/ipv4/ip_dynaddr

###########################################################################

#

# 4. rules set up

#开始配置具体的规则.

#

######

# 4.1 Filter table

#

#

# 4.1.1 Set policies

#

$IPTABLES -P INPUT DROP

$IPTABLES -P OUTPUT DROP

$IPTABLES -P FORWARD DROP

#

# 4.1.2 Create userspecified chains

#作者的总体思路是先写好自定义的链，然后再后续的系统预定义链中调用，类似函数的概

#念

#

# Create chain for bad tcp packets

#

$IPTABLES -N bad_tcp_packets

#

# Create separate chains for ICMP, TCP and UDP to traverse

#

$IPTABLES -N allowed

$IPTABLES -N tcp_packets

$IPTABLES -N udp_packets

$IPTABLES -N icmp_packets

#

# 4.1.3 Create content in userspecified chains

#

#

# bad_tcp_packets chain

#拒绝或者记录不正常的数据包

#

$IPTABLES -A bad_tcp_packets -p tcp --tcp-flags SYN,ACK SYN,ACK

-m state --state NEW -j REJECT --reject-with tcp-reset

#拒绝带有SYN和ACK标记的状态为NEW的包并返回错误信息

$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j LOG

--log-prefix &quot;New not syn:&quot;

#不是SYN标记但是状态时NEW的数据包并记录日志

$IPTABLES -A bad_tcp_packets -p tcp ! --syn -m state --state NEW -j DROP

#拒绝不是SYN标记但是状态时NEW的数据包并记录日志

#

# allowed chain

#允许特定的数据包

#

$IPTABLES -A allowed -p TCP --syn -j ACCEPT

#允许带有SYN标记的数据包

$IPTABLES -A allowed -p TCP -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许状态为ESTABLISH和RELATED的数据包

$IPTABLES -A allowed -p TCP -j DROP

#拒绝其他所有的数据包

#

# TCP rules

#

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 21 -j allowed

#允许访问ftp服务

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 22 -j allowed

#允许访问ssh服务

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 80 -j allowed

#允许访问www服务

$IPTABLES -A tcp_packets -p TCP -s 0/0 --dport 113 -j allowed

#允许访问IRC服务

#

# UDP ports

#

#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 53 -j ACCEPT

#允许DNS服务

#$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 123 -j ACCEPT

#允许ntp服务

$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 2074 -j ACCEPT

#允许多媒体服务

$IPTABLES -A udp_packets -p UDP -s 0/0 --destination-port 4000 -j ACCEPT

#允许ICQ服务

#

# In Microsoft Networks you will be swamped by broadcasts. These lines

# will prevent them from showing up in the logs.

#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d $INET_BROADCAST

#--destination-port 135:139 -j DROP

#拒绝微软的netbios的广播服务

#

# If we get DHCP requests from the Outside of our network, our logs will

# be swamped as well. This rule will block them from getting logged.

#

#$IPTABLES -A udp_packets -p UDP -i $INET_IFACE -d 255.255.255.255

#--destination-port 67:68 -j DROP

#拒绝DHCP服务

#

# ICMP rules

#

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 8 -j ACCEPT

#允许8类ICMP服务

$IPTABLES -A icmp_packets -p ICMP -s 0/0 --icmp-type 11 -j ACCEPT

#允许11类ICMP服务

#

# 4.1.4 INPUT chain

#

#

# Bad TCP packets we don&apos;t want.

#

$IPTABLES -A INPUT -p tcp -j bad_tcp_packets

#检查是否是坏包

#

# Rules for special networks not part of the Internet

#

$IPTABLES -A INPUT -p ALL -i $LAN_IFACE -s $LAN_IP_RANGE -j ACCEPT

#来自内部网络的包一律允许通过

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LO_IP -j ACCEPT

#来自本地的包一律通过

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $LAN_IP -j ACCEPT

$IPTABLES -A INPUT -p ALL -i $LO_IFACE -s $INET_IP -j ACCEPT

#

# Special rule for DHCP requests from LAN, which are not caught properly

# otherwise.

#

$IPTABLES -A INPUT -p UDP -i $LAN_IFACE --dport 67 --sport 68 -j ACCEPT

#允许DHCP服务

#

# Rules for incoming packets from the internet.

#

$IPTABLES -A INPUT -p ALL -d $INET_IP -m state --state ESTABLISHED,RELATED

-j ACCEPT

#允许外部过来的响应本地请求或者和本地已有连接有关系的包

$IPTABLES -A INPUT -p TCP -i $INET_IFACE -j tcp_packets

#TCP包由对应链处理

$IPTABLES -A INPUT -p UDP -i $INET_IFACE -j udp_packets

#UDP包由对应链处理

$IPTABLES -A INPUT -p ICMP -i $INET_IFACE -j icmp_packets

#ICMP包由对应链处理

#

# If you have a Microsoft Network on the outside of your firewall, you may

# also get flooded by Multicasts. We drop them so we do not get flooded by

# logs

#

#$IPTABLES -A INPUT -i $INET_IFACE -d 224.0.0.0/8 -j DROP

#拒绝组播包

#

# Log weird packets that don&apos;t match the above.

#

$IPTABLES -A INPUT -m limit --limit 3/minute --limit-burst 3 -j LOG

--log-level DEBUG --log-prefix &quot;IPT INPUT packet died: &quot;

#如果包与上述规则均不匹配则写入日志

#

# 4.1.5 FORWARD chain

#

#

# Bad TCP packets we don&apos;t want

#

$IPTABLES -A FORWARD -p tcp -j bad_tcp_packets

#先检查是否是坏包

#

# Accept the packets we actually want to forward

#

$IPTABLES -A FORWARD -i $LAN_IFACE -j ACCEPT

#允许由本地发来的包被转发

$IPTABLES -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT

#允许ESTABLISHED,RELATED状态的包转发

#

# Log weird packets that don&apos;t match the above.

#

$IPTABLES -A FORWARD -m limit --limit 3/minute --limit-burst 3 -j LOG

--log-level DEBUG --log-prefix &quot;IPT FORWARD packet died: &quot;

#如果包与上述规则均不匹配则写入日志

#

# 4.1.6 OUTPUT chain

#

#

# Bad TCP packets we don&apos;t want.

#

$IPTABLES -A OUTPUT -p tcp -j bad_tcp_packets

#先检查是否是坏包

#

# Special OUTPUT rules to decide which IP&apos;s to allow.

#

$IPTABLES -A OUTPUT -p ALL -s $LO_IP -j ACCEPT

#允许所有包通过

$IPTABLES -A OUTPUT -p ALL -s $LAN_IP -j ACCEPT

$IPTABLES -A OUTPUT -p ALL -s $INET_IP -j ACCEPT

#

# Log weird packets that don&apos;t match the above.

#

$IPTABLES -A OUTPUT -m limit --limit 3/minute --limit-burst 3 -j LOG

--log-level DEBUG --log-prefix &quot;IPT OUTPUT packet died: &quot;

#如果包与上述规则均不匹配则写入日志

######

# 4.2 nat table

#

#

# 4.2.1 Set policies

#

#

# 4.2.2 Create user specified chains

#

#

# 4.2.3 Create content in user specified chains

#

#

# 4.2.4  PREROUTING chain

#

#

# 4.2.5  POSTROUTING chain

#

#

# Enable simple IP Forwarding and Network Address Translation

#

$IPTABLES -t nat -A POSTROUTING -o $INET_IFACE -j SNAT --to-source $INET_IP

#对所有沿外网口出去的包执行SNAT

#

# 4.2.6 OUTPUT chain

#

######

# 4.3 mangle table

#

#

# 4.3.1 Set policies

#

#

# 4.3.2 Create user specified chains

#

#

# 4.3.3 Create content in user specified chains

#

#

# 4.3.4  PREROUTING chain

#

#

# 4.3.5 INPUT chain

#

#

# 4.3.6 FORWARD chain

#

#

# 4.3.7 OUTPUT chain

#

#

# 4.3.8  POSTROUTING chain

#

##本脚本来自http:

#www.faqs.org/docs/iptables/index.html&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[我的初次北京之旅]]></title><description><![CDATA[3 月 28 号 周一 之前投了华讯网络后再群里问相关评价，好像几个发言的都对华讯的印象不好，于是我也有些灰心不报希望了。没想到这天接到电话，说让我周二去面试，我说因为在山东周二赶不到能不能换个时间，那边说那就要周四了，我说好的，然后确认了下面试地点大体在北京。 3 月 2…]]></description><link>https://xdays.me/我的初次北京之旅/</link><guid isPermaLink="false">https://xdays.me/我的初次北京之旅/</guid><pubDate>Sun, 03 Apr 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;3 月 28 号 周一&lt;/p&gt;
&lt;p&gt;之前投了华讯网络后再群里问相关评价，好像几个发言的都对华讯的印象不好，于是我也有些灰心不报希望了。没想到这天接到电话，说让我周二去面试，我说因为在山东周二赶不到能不能换个时间，那边说那就要周四了，我说好的，然后确认了下面试地点大体在北京。&lt;/p&gt;
&lt;p&gt;3 月 29 号 周二&lt;/p&gt;
&lt;p&gt;上午去了机房收拾一下材料，推荐表和成绩单等，拿去图书馆复印了两份。下午约上海龙和我一起去买当天的火车票，没座。然后去美食街买了双鞋就回学校了。晚上九点半开始出发，打的去火车站，和司机简单聊了两句，记得他说：“就业第一站就去北京啊”。火车很挤，站了一路，很累。&lt;/p&gt;
&lt;p&gt;3 月 30 号 周三&lt;/p&gt;
&lt;p&gt;早上五点半到达北京站，出了火车站回头看了看，拍了张照片，纪念下第一次北漂。随人流涌向地铁，买票钻进了地下，有两条车道看了半天确定了方向，因为很早地铁里没有几个人，感觉地铁就是公交和火车的结合。从地铁二号线到西直门站转地铁四号线，到魏公村站下车，出来看到了北理的大门，沿着天桥绕到路的那一侧走进北理大门。&lt;/p&gt;
&lt;p&gt;因为事先已经与瑛和赖约好了，我按指定的路线走到了北理的体育场，拨了赖的电话，第一次没有接，第二次接了让我在那等他。到了他们住宾馆，三人间的，我刷牙洗脸。看到瑛的短信，打电话告诉他已经到了。瑛来我们的房间，大家一起去吃饭。京工风味食堂可以用钱打票再买菜，瑛教给我怎么买。买好菜我放她对面，赖在我旁边，瑛过来坐在赖对面随手拉过自己的碟子，我有些不是滋味，但是表面上一点表情没有，我想应该有些事情。饭后我回去睡觉，他们继续参加复试。中午我醒来，他们也回来了，叫我一块去吃饭，我不饿也因为早上的细节不想去就借口不饿说不去了。饭后，瑛给我带了饭。下午瑛要去北大清华转转，我想去但是没说，她问我我欣然接受，吃了几个丸子一起去了。&lt;/p&gt;
&lt;p&gt;地铁四号线过了三四站的样子到了北大东门，进门看身份证。在北大图书馆前各照了张像，因为也不知道路线就没有目的地向右走，走到一个长廊，没路，瑛直接在前面翻过栏爬上一段小土坡，我紧随。眼前一条湖，我第一印象不会是未名湖吧？两人沿着湖边小路围着湖走，在一个石碑前牌照。看到一块石碑，好几个人在那照相，走进一看上面刻着“未名湖”。给瑛照了一张，我突然想和她合照，请一位大叔帮忙，瑛说一块照？我应着，照完我看了一眼，照的不好，自己很尴尬。继续往前走，有一条石船还有一条石鱼。还有一座挺好的塔，刚才查了下叫博雅塔，塔底下看到了一只可爱的小松鼠。继续漫无目的的逛，记得还有百年大讲堂，瑛说累了就坐在一长椅上歇息一会。她给同学打电话问如何去清华，开始去清华。走出北大门一段，瑛说买点水吧，我愧疚自己呆子一个连买水都没想起来，终于走到了清华西门。门卫看身份证，说不让山东山西的进让同学来领进去，瑛有些生气但还是打电话给同学，见了就跟同学说歧视，我也有不满，但是没她那么强烈，她很要强。同学带着大体从西北走向了东南，没有一点华丽，很朴素，领导的办公室像是一宅院，门卫不让进去，就只在门口合影。到了据她同学说清华的标志性建筑，名字记不住了，一大一小的门，一人照了一张像。清华有两个南门，东边的南门叫北门，我们在东门合影，然后送我们到地铁，应该是地铁 13 号线。&lt;/p&gt;
&lt;p&gt;坐上地铁，瑛说起上午面试的四杆机构什么的回答的有些二，说是回学校问问学长，西直门站转四号线到魏公村回北理。瑛给学长打电话，忘记过了多长时间，回来很难过，说不应该说联系了导师，听着挺严重，看着她很难受。大家开始劝她，我愣着，想想我才真二，不会安慰人。她哭了，就我俩没吃饭，我叫她去吃饭，不去，民带我去小市场买饭，我随便买了些。回来她不哭了但依然很难过，赖和伟安慰她，逗她开心，我依然愣着。她没吃饭，我也没吃。叫了其他几个人开始打牌，够级，我啃了几口瑛中午买的火烧，没有味不咸，中间我劝她吃饭他不吃，喝了一袋我买的核桃奶。虽然我打牌，但心思不再打牌上。中间借故让瑛帮我抓牌，我指导她打牌，牌好，头客。大约十点多我去准备周四的面试，虽然我还不确定周四是否安排面试。十一点多瑛发短信说她回去了，还说不好意思，自己丢人了，我也表达了一下我的二，说自己嘴笨。&lt;/p&gt;
&lt;p&gt;3 月 31 号 周四&lt;/p&gt;
&lt;p&gt;三人间住四个人，赖和民的床并起来我睡中间，不平，铺了一张毛毯，盖了两张和我的羽绒服。第二天醒来他们去看成绩，我起的晚没吃饭。打电话给公司，公司说周四没有安排面试，一面需要安排到下周。挂了电话我一想应该争取一下这周面试，也骂自己脑袋反应迟钝需要再打电话。打了三遍终于打通，简单说了下自己的想法，那边说技术经理不在没法面试，就此谢过挂了电话。不久华讯来电话通知我周五下午两点面试，兴奋高兴。中午和民去吃饭，遇见了瑛，赖和伟，瑛依然坐在赖对面，我依然有些不是滋味。买了俩馒头和些菜低着头吃着，饭后送餐具看到瑛一碗面基本上没吃，说了句吃那么少，没有回应。下午问了下他们网吧地点去上网，地铁到人大正对门看见一网吧，不料门上写装修停业，不甘心沿着胡同往里走五十米看见网字，走近确实是一网吧。查公司相关的资料，期间瑛短信问我干吗去了，回上网。下午五点多坐地铁回来，瑛发短信问要不要带饭，回不用自己去吃。一碗面九块，饭后回宾馆，民和波说回校，瑛也要回了。瑛打电话说今天回去，给师哥买了东西，先放我们房间，我下去提，告诉她跟他们一块回去吧，拿的包多有个照应，给她要了手机，因为我手机老重启怕耽误事。瑛收拾好来我们房间，给我手机，我给她倒杯子水，送她下楼，同行的有十人，我也放心。回房间，开电视，洗了衬衫，准备面试。赖从水立方回来，伟随后也回来，他本来去女子学院找同学，结果女子学校晚上八点关门了。睡前瑛给我发短信，内容忘了，大致说已经上车让我周五面试加油。&lt;/p&gt;
&lt;p&gt;4 月 1 号 周五&lt;/p&gt;
&lt;p&gt;起的晚，没吃早饭。赖和伟去问复试结果，我整理材料，洗头。伟回来，说过了，没刷人，赖给师姐买东西不和我们一块吃饭了。吃饭时伟给我一块肉，我很感谢，虽然勉强吃下去。饭后分道扬镳，他回宾馆我向银泰中心出发了。走在路上打电话给赖说留他床上一袋核桃奶和饼干，回答说带走了并说谢谢。&lt;/p&gt;
&lt;p&gt;坐四号线到西单转一号线，一姐姐看我背着带思科标志的纪念包，问我是不是思科的，我解释自己是参加了思科网络技术学院，聊了些别的，恰好她也去银泰中心，只是她去 B 座我去 C 座，她去办离职手续，中间好像还提及她公司也在招技术，建议我去面试，公司名字和地点我都没记住，惭愧，还说考了 CCNP 工作更好找些，出了国贸站道别，说声再见，这姐姐带人很和蔼。&lt;/p&gt;
&lt;p&gt;不到一点就到了银泰中心，大厅好 C 座是哪个在周围随便转了一圈，风大挺冷，记得好像看见了央视的大楼，想拍张照片，心思不在上面就折回去了银泰 C 座。向前台确认下华讯是不是在二十九层，就去找电梯了，按照提示大厅的电梯都是通向双数楼层的，搞不明白就问保安，保安无表情的告诉去地下一层坐电梯，下去走进电梯里问另一位哥去二十九层是不是这个电梯，他说这是去下下层的我现在理解也就是地下二层的，出了电梯告诉我去里面电梯坐，终于顺利到达二十九层，出电梯看到的就是华讯的标志，舒一口气终于找到了。进门自我介绍，接待要了我带的材料，复印了就业推荐表，给我一份题，限时四十五分钟完成，没有一道和网络相关的，涉及很基础的 java，高数和服务器的知识，逻辑题做出来一道，其他的全部空白。接下来是面试，接待引导我到“宋”房间，像是一个会议室，大约十分钟一位女士进来，针对建立问了些问题，包括从哪了解到的招聘信息，家庭情况，就业倾向，从哪里来。进行到这气氛有些尴尬，那位女士问一句我答一句，然后冷场，我感觉不妙，但是无力挽回。记得她说中间说专程赶来成本很高，多投几家。时间不长，女士表示面试结束，临走又说让我多投几家，我有些惶恐，应了一声就走了出来。把原先计划去七楼看看思科中国的计划忘的一干二净，感觉自己与这幢华丽的大楼格格不入，想要马上逃离，马上逃离。&lt;/p&gt;
&lt;p&gt;走出银泰中心，坐上一号线给杰打电话想去他那住一晚上，回应说他临时住的地方挤让我帮他去东八间房租房，我才发现地铁方向坐反了，先来折回去了三元桥站，风很大，冷。需要做九六七公交，在站牌等了半个多小时，没有车来。心灰意冷，发短信告诉杰我先回北理宾馆了，不去打扰他了。坐十号线到海淀黄庄转四号线到魏公村，回到了北理。去食堂买了点饭，和几个香蕉奔宾馆去了，结果宾馆没有房间了，问今天还会不会有房间，给了电话，让晚些打电话咨询。提着饭回到食堂，吃掉后愣了一会儿。出去找网吧，找到网吧二字却没找到网吧入口，于是打算去上次去的人大那边。下地铁四号线，一站到达人大东门，出来天色已黑，感觉眼前情景不熟悉，自己走错路了，拿出快没电的手机打开 GPS，发现自己转向了。杰来电话，说下班了，我解释下还是需要去他那住的原因，他跟我指引路线，我听不明白，告诉他我去北大东门等他好了。到了北大东门，没敢出站，已经转向，带上耳机放首轻音乐，一只盯着地铁路线图看。累了，找个座位坐下等，杰走了过来，一起出了地铁。坐公交，记得也坐了挺长一段距离，又走了很长一段距离终于到达。穿过一个小卖铺，里面是两排地下室样子的屋子，具体是一层还是两层忘记了，当时只是跟着杰走。进了房间，进了房间和他舍友打了声招呼，狭小的屋子估计半间房子吧，放了两张上下铺的床，还有一张桌子，一张椅子，没有其他的空间了，看样子从来没打扫过。杰掏出笔记本让我上网，开了两个网页，他舍友玩游戏喊卡，我就关掉了。两位舍友很能抽烟，吐痰也到处乱吐。屋子里没信号，拿着的俩手机都没有了信号，杰和她女朋友打电话都要穿上衣服出去打。记得睡前杰说想考 RHCE 和 RHCA，我也有这个打算，这样睡去了。&lt;/p&gt;
&lt;p&gt;4 月 2 号 周六&lt;/p&gt;
&lt;p&gt;杰九点左右上班，六点半就要起床，我要把师哥的 CCIE 证书交给他女朋友然后回校就跟他一块起床了，路上杰给买了俩火烧一杯豆浆，我喝了豆浆火烧提着没吃，路上的人都走的特别快，大家好像都在赶时间，坐公交，挤，到北大东门坐地铁四号线，我们在海淀黄庄分别，他转了十号线，我继续前行去人大门口的网吧。给姐发短信表明给她证书然后回校，姐是师哥女朋友，她让我这么称呼她。他说让我等她消息，然后去一号线的现在记不清的一站等她。觉得没事做索性就去天安门看看，于是到了西单转一号线去了天安门，刚看到天安门和依稀
模糊的我认为是人民英雄纪念碑，正要牌照，被两路人挡住，这时姐说她没事了去找我问我在哪，回答天安门，电话里她的意思是我跑的太远了，果然等了他四五十分钟，其间在地铁里咪了一会。等姐来，交证书，简单聊了两句，她连口罩也没摘，没看清什么样。她还说我那么小，我明白是说我稚嫩，我故意回答瘦小，其实我听懂了。完事我直奔火车站买票，心情异常沮丧，想要马上逃离这个城市。买票，下午四点半开凌晨一点半到淄博，无座，吸取上次教训就花十块钱买了个马扎。&lt;/p&gt;
&lt;p&gt;在车站等车，掏出手机听了会音乐，快没电了，就收起来了。孤独，累，难受我想找人诉说，给瑛和丰发短信，和丰简单几句指导彼此都不容易便结束了，想和瑛聊会，问心里乱七八糟，想和她聊聊，她欣然同意。只聊了一个话题，梦想，她说通过自己的努力找份工作让父母安享晚年，我说我希望每天过的快乐，之后我说我见到了北京的另一面，看到了杰的住所，瑛只是在安慰我，可是我总感觉她很客气，有意保持距离，于是聊天也就此罢了。我希望是聊天是什么样子呢？我他妈的自己也不知道。中间有一妇女带一小孩，我想都没想给了一块钱，完事之后才感觉自己有多二了，二的可笑，后来来了一个无手男人和一个无脚的男人我都没给钱，还有一个白胖的穿着开了当的裤子的小伙管我要吃的，我给了俩蛋黄派，过会他吃完把包装袋又送了回来，我们目光对视，我心里没底，现在也没想明白为什么他不把垃圾丢到垃圾箱却送到我这，还是因为我又二了一把？&lt;/p&gt;
&lt;p&gt;熬到四点半上车，北京是始发站，上车的特别多，很快坐满了，我掏出马扎坐下，拿马扎时书包掉下来砸到了睡觉的一个乘客，看他生气的表情我连声道歉。旁边坐了六个人讲标准英语，其中四个肯定是老外，另两个不得而知，他们说的我听不懂，仅寥寥几个词听懂了，有一句是一个小哥说七月二号去内蒙古，好像是。还有一滕州的爷们聊驾校的黑，说自己怎么给教练送烟什么的。窗户上除了水雾，一外国姐姐用手划了脚丫印，他们还吃了很多喝了红酒。整整一天，仅喝了一瓶营养快线吃了几个蛋黄派。很庆幸买了马扎，这趟返程还不算辛苦。&lt;/p&gt;
&lt;p&gt;4 月 3 号 周日&lt;/p&gt;
&lt;p&gt;火车在济南东站听了近一个小时后终于开了，我知道下一站是淄博，我的目的地，我挪到车门口的厕所旁上了趟厕所，咪了一会。一点半左右我下了火车来到这家网吧，要了瓶可乐，写下了这些。&lt;/p&gt;
&lt;p&gt;也算是给自己的初次北京之旅来个交代，这其中掺杂的各种滋味我还要细细体会，慢慢体会…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-HSRP-VRRP-GLBP]]></title><description><![CDATA[冗余概述 冗余概念 默认网关冗余 参考拓扑 传统冗余技术 代理 ARP 和 ICMP 重定向 IRDP（ICMP redirect discovery protocol） 常用冗余技术 HSRP（hort standby routing protocol）热备份路由协议 VRRP…]]></description><link>https://xdays.me/CCNP-hsrp-vrrp-glbp/</link><guid isPermaLink="false">https://xdays.me/CCNP-hsrp-vrrp-glbp/</guid><pubDate>Sat, 26 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;冗余概述&lt;/li&gt;
&lt;li&gt;冗余概念&lt;/li&gt;
&lt;li&gt;默认网关冗余&lt;/li&gt;
&lt;li&gt;参考拓扑&lt;/li&gt;
&lt;li&gt;传统冗余技术
&lt;ul&gt;
&lt;li&gt;代理 ARP 和 ICMP 重定向&lt;/li&gt;
&lt;li&gt;IRDP（ICMP redirect discovery protocol）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;常用冗余技术
&lt;ul&gt;
&lt;li&gt;HSRP（hort standby routing protocol）热备份路由协议&lt;/li&gt;
&lt;li&gt;VRRP（virtual router redundancy protocol）虚拟路由器冗余协议&lt;/li&gt;
&lt;li&gt;GLBP（gateway load balance protocol）网关负载均衡协议&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;冗余概述&lt;/h3&gt;
&lt;p&gt;提高网络可靠性的方法是冗余，而冗余又可以分为链路冗余，设备冗余和模块冗余。模块上的冗余是底层硬件的问题只需要了解一些概念就好；更常用的是在设备之间运行一些冗余协议，网关可以在设备故障时自动切换到其他设备，并且这个过程对用户来说是透明的。&lt;/p&gt;
&lt;h3&gt;冗余概念&lt;/h3&gt;
&lt;p&gt;RPR 和 RPR+：路由处理器冗余，切换时间比较慢，分别是 2-4min 和 30-60s&lt;/p&gt;
&lt;p&gt;SSO：状态化切换切换速度快，不会造成用户流量中断。&lt;/p&gt;
&lt;p&gt;带 SSO 的 NSF：带状态化切换的不间断转发&lt;/p&gt;
&lt;h3&gt;默认网关冗余&lt;/h3&gt;
&lt;p&gt;在网关冗余的概念上让我们深入的理解交换的概念，交换是个二层概念，也就是说我发帧的时候只关心 mac 地址。&lt;/p&gt;
&lt;h3&gt;参考拓扑&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2011/03/hsrp-vrrp-glbp-top.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2011/03/hsrp-vrrp-glbp-top.jpg&quot; alt=&quot;hsrp-vrrp-glbp-top&quot; title=&quot;hsrp-vrrp-glbp-top&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;一些传统的冗余技术&lt;/h3&gt;
&lt;h4&gt;代理 ARP 和 ICMP 重定向&lt;/h4&gt;
&lt;p&gt;参照上图来解释 proxy-arp，前提是主机 R2 没有配网关地址。当 R2 要访问 R1 的环回口 lo
0 时会发送 arp 请求，交换机 S3 和 S4 收到 arp 请求发现自己有到达目的网段的路由，则都以自己的 mac 地址响应 R2，R2 会采纳最后接收的响应（假设是 S4）来填充 arp 表（这也是 arp 欺骗的关键所在），这样 R2 要到达 1.1.1.1 根据 arp 表封装二层地址，而 S4 在 R2 和 lo
0
之间转发数据，而主机完全感觉不到。这样优势是配置简单，路由器接口默认开启 proxy-arp，但问题是不能即使切换，因为当下联接口 down 了，arp 表的老化时间是 4h，那么终端要等待 4h 才能切换网关。如果上联链路 down 了，由于动态路由协议重新收敛，到达 1.1.1.1 的数据包会转发给 S3，这样 S4 会发送 ICMP 重定向报文给主机让其直接发送数据给 S3，可以直接切换。&lt;/p&gt;
&lt;h4&gt;IRDP（ICMP redirect discovery protocol）&lt;/h4&gt;
&lt;p&gt;路由器定期发送 hello 包，因为在每台终端设备上都要有配置来监听 hello 包，所以一般不会用。&lt;/p&gt;
&lt;h3&gt;常用的冗余协议&lt;/h3&gt;
&lt;h4&gt;HSRP（hort standby routing protocol）热备份路由协议&lt;/h4&gt;
&lt;p&gt;虚拟地址&lt;/p&gt;
&lt;p&gt;因为要在多台路由器之间切换，而且 ip 和 mac 地址不能改变，那么就需要指定一个虚拟的 ip 和 mac 地址来作为终端的下一跳，这里称之为 vip 和 vmac。vip 手工指定，位于同一网段即可，而 vmac 是自动生成 0000.0c07.ac&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;goup-id（组号）&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;执行过程&lt;/p&gt;
&lt;p&gt;通过将一组路由器划分到一个组中，然后从中选出一个活动路由器来作为网关，也就是只有活动路由器去相应终端对虚拟的 ARP 请求然后接收目的地址是虚拟 mac 的帧，如果活动路由器 down 了那么其他路由器会接替成为活动路由器，而且这个切换过程是透明的，只有少部分包丢失。&lt;/p&gt;
&lt;p&gt;路由器状态&lt;/p&gt;
&lt;p&gt;开启 HSRP 协议的路由器通过协商来决定谁是活动路由器谁是备份路由器，在这个协商的过程中路由器要经历 6 个状态最终达到稳定状态，具体状态及行为如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;路由器状态 行为
初始状态（init） 开启接口就进入这个状态
学习状态（learn） 不知道虚拟 ip 也没有收到 hello 包
监听状态（listen） 学习到虚拟 ip 但是还没选出活动路由器和备份路由器
发言状态（speak） 定期发送 hello 包，参与选举
备用状态（standby） 活动路由器的继任者，并发送 hello 包
活动状态（active） 响应虚拟 ip 和虚拟 mac 并转发，定期发 hello 包&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;增强特性&lt;/p&gt;
&lt;p&gt;抢占：开启抢占功能，可以通过修改路由器的优先级以把活动路由器的角色抢占过来。&lt;/p&gt;
&lt;p&gt;追踪：如果路由器的上行链路 down 了，而路由器在本地接口还继续发送 hello 包这样就是占着活动路由器的角色但是干不了活，而追踪可以跟踪某个或者某些接口当其在 down 下来以后路由器自动把自己的优先级降低以让其他路由器抢占活动路由器的角色。这时就要注意要让追踪工作就要配合抢占和优先级来配置。&lt;/p&gt;
&lt;p&gt;多组实现相互备份&lt;/p&gt;
&lt;p&gt;让一台路由器参与到多个组中，而且在不同组中担任不同的角色，这样可以实现相互备份。&lt;/p&gt;
&lt;h4&gt;VRRP（virtual router redundancy protocol）虚拟路由器冗余协议&lt;/h4&gt;
&lt;p&gt;因为 HSRP 是思科私有协议，就需要 VRRP 这样的业界标准提供多厂商的支持，两者的原理功能类似。&lt;/p&gt;
&lt;p&gt;因为 VRRP 基本上与 HSRP 类似，这里只列举不同之处：&lt;/p&gt;
&lt;p&gt;1）类比于 active 和 standby，VRRP 中有 master 和 backup 状态&lt;/p&gt;
&lt;p&gt;2）可以使用接口的 ip 作为 vip，因为二层转发只看 mac 地址&lt;/p&gt;
&lt;p&gt;3）只有 master 发 hello 包，周期为 1s，所以切换速度快&lt;/p&gt;
&lt;p&gt;4）没有 track，所以上行链路 down 了就发 ICMP 重定向&lt;/p&gt;
&lt;p&gt;5）hello 包组播地址：224.0.0.18&lt;/p&gt;
&lt;h4&gt;GLBP（gateway load balance protocol）网关负载均衡协议&lt;/h4&gt;
&lt;p&gt;基本概述&lt;/p&gt;
&lt;p&gt;与 HSRP 和 VRRP 不同之处是，前两种协议处于备份状态下的路由器都不能参与到转发工作中来，这样设备不能得到充分的利用，而 GLBP 可以让所有在一个组中的路由器都参与进来，而且其中的一台设备 down 了不会对终端用户造成影响，从整体上说 GLBP 是最有的解决方案。&lt;/p&gt;
&lt;p&gt;执行过程&lt;/p&gt;
&lt;p&gt;首先从所有在一个 GLBP 组中的路由器选举出来一个活动路由器称之为 AVG（活动虚拟网关），其他的路由器作为 AVF（活动虚拟转发器）。然后 AVG 给 AVF 分配虚拟的 mac 地址，只有 AVG 可以响应终端对虚拟网关地址的请求，并且根据一定算法来把 AVF 的虚拟 mac 地址响应给终端。二层交换只看 mac 地址，也就是说一个 ip 可以对应多个 mac 地址，这样就实现了冗余和负载均衡。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-Switch-Security]]></title><description><![CDATA[交换机安全的知识框架 MAC 层的攻击及解决方案 MAC 扩散 解决方案 Vlan 层攻击及解决方案 vlan 跳跃攻击 解决方案 vlan 流量控制 Pvlan 部署 隔离端口 欺骗攻击 DHCP 欺骗（DHCP spoofing） 解决方案 盗地址 解决方案 ARP…]]></description><link>https://xdays.me/CCNP-switch-security/</link><guid isPermaLink="false">https://xdays.me/CCNP-switch-security/</guid><pubDate>Sat, 26 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;交换机安全的知识框架
&lt;ul&gt;
&lt;li&gt;MAC 层的攻击及解决方案&lt;/li&gt;
&lt;li&gt;MAC 扩散&lt;/li&gt;
&lt;li&gt;解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Vlan 层攻击及解决方案
&lt;ul&gt;
&lt;li&gt;vlan 跳跃攻击&lt;/li&gt;
&lt;li&gt;解决方案&lt;/li&gt;
&lt;li&gt;vlan 流量控制&lt;/li&gt;
&lt;li&gt;Pvlan 部署&lt;/li&gt;
&lt;li&gt;隔离端口&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;欺骗攻击
&lt;ul&gt;
&lt;li&gt;DHCP 欺骗（DHCP spoofing）&lt;/li&gt;
&lt;li&gt;解决方案&lt;/li&gt;
&lt;li&gt;盗地址&lt;/li&gt;
&lt;li&gt;解决方案&lt;/li&gt;
&lt;li&gt;ARP 欺骗&lt;/li&gt;
&lt;li&gt;解决方案&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;交换机安全的知识框架&lt;/h3&gt;
&lt;table border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td colspan=&quot;2&quot; width=&quot;253&quot; valign=&quot;top&quot;&gt;
威胁类型
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
应对措施
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;2&quot; width=&quot;253&quot; valign=&quot;top&quot;&gt;
MAC层攻击
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
端口安全（基于mac允许和拒绝，阻止单播扩散）
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;3&quot; width=&quot;111&quot; valign=&quot;top&quot;&gt;
vlan攻击
&lt;/td&gt;
&lt;td width=&quot;142&quot; valign=&quot;top&quot;&gt;
vlan跳跃
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
所有非trunk置于access
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;142&quot; valign=&quot;top&quot;&gt;
vlan流量控制
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
RACL，VACL和PACL
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;142&quot; valign=&quot;top&quot;&gt;
Pvlan和隔离端口
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
限制相同网段主机之间访问
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td rowspan=&quot;3&quot; width=&quot;111&quot; valign=&quot;top&quot;&gt;
spoofing（欺骗）攻击
&lt;/td&gt;
&lt;td width=&quot;142&quot; valign=&quot;top&quot;&gt;
DHCP spoofing
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
DHCP snoop（监听）
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;142&quot; valign=&quot;top&quot;&gt;
盗地址
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
IPSG（ip source guard）源防护结合DHCP snoop
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td width=&quot;142&quot; valign=&quot;top&quot;&gt;
arp spoofing
&lt;/td&gt;
&lt;td width=&quot;315&quot; valign=&quot;top&quot;&gt;
DAI动态ARP检测结合DHCP snoop
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
 
&lt;h3&gt;MAC 层的攻击及解决方案&lt;/h3&gt;
&lt;h4&gt;MAC 扩散&lt;/h4&gt;
&lt;p&gt;主机更改 MAC 地址发送大量帧，交换机的 CAM 表被填充满了就会泛洪接下来接收到的帧，这样就影响了网络的性能。&lt;/p&gt;
&lt;h4&gt;解决方案&lt;/h4&gt;
&lt;p&gt;端口安全：包括限制方法和违规行为两方面的内容；限制方法包括允许特定数量的 mac 地址的数据通过和如何学习这些 MAC 地址（静态配置和 sticky 粘滞）；当超过时则发生违规，违规包括关闭（也就是 err-disable 状态），限制（发送 SNMP 警告信息）和保护。&lt;/p&gt;
&lt;p&gt;基于 mac 阻止流量：显示的配置命令组织特定 MAC 地址的帧通过接口。&lt;/p&gt;
&lt;p&gt;阻止单播帧扩散：不需要从配有端口安全的端口扩散出单播帧，所以通过命令显示丢弃。&lt;/p&gt;
&lt;h3&gt;vlan 攻击及解决方案&lt;/h3&gt;
&lt;h4&gt;vlan 跳跃攻击&lt;/h4&gt;
&lt;p&gt;1）通过发送 DTP 报文和交换机建立 trunk，非法主机能看到发往不同 vlan 的流量。&lt;/p&gt;
&lt;p&gt;2）给帧打两层标签，并且两层标签的 vlan 不同，交换机去掉第一层标签后会把帧发往另一个 vlan。&lt;/p&gt;
&lt;h4&gt;解决方案&lt;/h4&gt;
&lt;p&gt;避免建立 trunk 的机会因为实现 vlan 跳跃都用到了 trunk 链路，所以务必把 trunk 端口之外的端口配成 access 端口。&lt;/p&gt;
&lt;h4&gt;vlan 流量控制&lt;/h4&gt;
&lt;p&gt;有三种控制表可以应用于 vlan：RACL 是传统访问控制表；VACL 可以控制通过 SVI 的流量，除了转发和丢弃外还可以重定向以用作监控流量，具体见配置实验部分。&lt;/p&gt;
&lt;h4&gt;Pvlan 部署&lt;/h4&gt;
&lt;p&gt;Pvlan 可以更灵活的控制接入端口之间的流量，可以做到同在一个网段内的终端那些可以相互访问，哪些不能相互访问的关系。由于现在没有支持 Pvlan 的设备，此部分略去。&lt;/p&gt;
&lt;h4&gt;隔离端口&lt;/h4&gt;
&lt;p&gt;隔离端口实现了 Pvlan 的一个功能就是，让同在一个网段的终端之间不能互访，可以通过命令达到要求。&lt;/p&gt;
&lt;h3&gt;欺骗攻击&lt;/h3&gt;
&lt;h4&gt;DHCP 欺骗（DHCP spoofing）&lt;/h4&gt;
&lt;p&gt;因为配置有自动获取地址的终端会采纳先接收到的 DHCP 响应报文（offer），而且这个过程没有什么验证机制。那么非法接入的 DHCP 服务器就可以随意的分配地址扰乱正常网络的进行，这中攻击叫 DHCP 欺骗。&lt;/p&gt;
&lt;h4&gt;解决方案&lt;/h4&gt;
&lt;p&gt;采用 DHCP
snoop 窥探技术，基本原理是：在交换机上设置信任端口和非信任端口，信任端口可以收发 DHCP 报文，而非信任端口仅仅能接收 DHCP 请求报文丢弃其他的；可以在非信任端口上配置限制流量，防止发生 DOS 攻击；交换机建立 DHCP 绑定表，记录的 IP，MAC，端口，vlan 信息等信息。&lt;/p&gt;
&lt;h4&gt;盗地址&lt;/h4&gt;
&lt;p&gt;如果仅开启了 DHCP
snoop 特性，那么如果非法主机直接填地址而不通过 DHCP 获取仍然可以访问网络。&lt;/p&gt;
&lt;h4&gt;解决方案&lt;/h4&gt;
&lt;p&gt;结合 HDCP snoop 窥探，IPSG（ip source
guard，ip 源防护）可以通过拿主机的二层和三层地址和 HDCP 绑定表对比来决定是否转发流量。&lt;/p&gt;
&lt;h4&gt;ARP 欺骗&lt;/h4&gt;
&lt;p&gt;主机总是把最后一次接受的 ARP 信息加入到自己的 ARP 表中，这是产生 ARP 欺骗的根本原因。参考下图，非法主机 C 通过发送 ARP 让主机 A 和 B 的 ARP 表中相互之间的三层地址对应的 MAC 地址指向 C 的 MAC 地址，这成为中间人攻击。&lt;/p&gt;
&lt;h4&gt;解决方案&lt;/h4&gt;
&lt;p&gt;DAI（dynamic arp inspection，动态 ARP 检测）结合 DHCP
snoop，其原理是：配置信任端口和非信任端口，非信任端口不能发出 request，心热端口可以收发 ARP 报文；收到数据包和 DHCP 绑定表对比，一致则为合法流量转发，否则属于违规采取相应的措施；可以在非信任端口上配置限制流量，防止发生 DOS 攻击。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-VLAN]]></title><description><![CDATA[VLAN（虚拟局域网） VLAN 概述 VLAN-id 范围 VLAN trunk（中继） VLAN trunk（中继）概述 封装类型 协商模式 native vlan（本征 vlan） VTP（vlan 中继协议） VTP 概述 VTP 的工作模式 VLAN…]]></description><link>https://xdays.me/CCNP-vlan/</link><guid isPermaLink="false">https://xdays.me/CCNP-vlan/</guid><pubDate>Tue, 22 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;VLAN（虚拟局域网）
&lt;ul&gt;
&lt;li&gt;VLAN 概述&lt;/li&gt;
&lt;li&gt;VLAN-id 范围&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VLAN trunk（中继）
&lt;ul&gt;
&lt;li&gt;VLAN trunk（中继）概述&lt;/li&gt;
&lt;li&gt;封装类型&lt;/li&gt;
&lt;li&gt;协商模式&lt;/li&gt;
&lt;li&gt;native vlan（本征 vlan）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VTP（vlan 中继协议）
&lt;ul&gt;
&lt;li&gt;VTP 概述&lt;/li&gt;
&lt;li&gt;VTP 的工作模式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;VLAN 间路由&lt;/li&gt;
&lt;li&gt;小特性&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;VLAN（虚拟局域网）&lt;/h3&gt;
&lt;h4&gt;VLAN 概述&lt;/h4&gt;
&lt;p&gt;虚拟局域网就是在物理网段上划分逻辑网段，一般是基于接口划分，它可以任意组合接口成为一个网段。由于不同的逻辑子网之间不能通信，VLAN 就分割广播域，安全性提高；可以把任意接口划分到任意 VLAN，这样增加了网络的灵活性；管理方便，易于维护。&lt;/p&gt;
&lt;h4&gt;VLAN-id 范围&lt;/h4&gt;
&lt;p&gt;VLAN 的范围为 0-4095，具体分配如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;范围 用途
0 和 4095 系统保留
1 所有接口默认所属的 vlan
2-1001 正常使用 vlan
1002-1005 保留给特殊网络使用（令牌网等）
1006-4094 扩展 vlan&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意：扩展 vlan 只能在部分机型上配置，而且交换机必须处在 VTP 的透明模式下才可以。&lt;/p&gt;
&lt;h3&gt;VLAN trunk（中继）&lt;/h3&gt;
&lt;h4&gt;VLAN trunk（中继）概述&lt;/h4&gt;
&lt;p&gt;当在一条链路上承载多个 vlan 的数据是，这条链路就是 trunk 链路。关于 trunk 链路有两方面重要内容：封装和协商模式。&lt;/p&gt;
&lt;h4&gt;封装类型&lt;/h4&gt;
&lt;p&gt;封装主要有 ISL 和 802.1Q，ISL 是思科专有协议，它是在以太网帧的外面继续封装，添加 30 个字节的信息；802.1Q 是开放协议，它是在帧内部打上一个 4 字节的标签，分别是 2 字节以太网标识，3 位的优先级，1 位的 token-ring 标记，和 12 位的 vlan-id。&lt;/p&gt;
&lt;h4&gt;协商模式&lt;/h4&gt;
&lt;p&gt;交换机接口通过 DTP 协议来协商建立 trunk 链路，链路的模式以及其工作状态如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;模式 特点
access 无条件 access 模式，不发也不收
trunk 无条件 trunk 模式，既发又收
dynamic auto 只发送不接收
dynamic desirable 既发送又接收
nonegotiate 无条件 trunk 模式，既不发也不收&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;而当两交换机工作在这几种模式下最终达到的状态如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;access trunk auto desirable
access access * access access
trunk * trunk trunk trunk
auto access trunk access trunk
desirable access trunk trunk trunk&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意打*表示不建议这样配置。&lt;/p&gt;
&lt;h4&gt;native vlan（本征 vlan）&lt;/h4&gt;
&lt;p&gt;就是通过 trunk 链路却不打标签的 vlan，当交换机收到不打标签的 vlan 时就发给本征 vlan，所以 trunk 链路两边的接口的本征 vlan 必须一致，否则不能正常通信。&lt;/p&gt;
&lt;h3&gt;VTP（vlan 中继协议）&lt;/h3&gt;
&lt;h4&gt;VTP 概述&lt;/h4&gt;
&lt;p&gt;相当于是 vlan 分发协议，只在一台交换机（vtp
server）上配置 vlan 信息，然后哦通过 vtp 协议发给其他交换机，最终所有在 vtp 域内的交换机的 vlan 信息一致（透明模式交换机例外）。关于 vtp 需要注意一下几点：1）vtp 工作的前提是链路必须工作在 trunk 模式下；vtp 的域名和密码必须一致；3）server 和 client 都跟着配置版本号大的学习 vlan 信息，并且会丢弃自己的信息，所以配置 vtp 要慎重。&lt;/p&gt;
&lt;h4&gt;VTP 的工作模式&lt;/h4&gt;
&lt;p&gt;vtp 有三种工作模式，名称及状态如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;模式 特点
server 增删改 vlan 信息，发送转发 vlan 信息，同步 vlan，信息保存于 NVRAM
client 发送和转发 vlan 信息，同步 vlan 信息，不保存
transparent（透明） 不同步，不发送自己的 vlan，只转发收到的，信息保存于 NVRAM&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;VLAN 间路由&lt;/h3&gt;
&lt;p&gt;vlan 间路由主要有三种方式：&lt;/p&gt;
&lt;p&gt;1）三层交换：交换机通过开启 SVI 接口和路由功能来转发（CEF 方式）不同 vlan 之间的流量。&lt;/p&gt;
&lt;p&gt;2）交换机路由接口：因为三层交换机的每一个接口都可以配成路由接口，这样交换机就可以看作是一台路由器。&lt;/p&gt;
&lt;p&gt;3）单臂路由（route on a
stick）：通过给路由器配置子接口以承载不同 vlan 之间的流量，再加上路由器的路由功能实现 vlan 间的转发，需要注意的是：与路由器建立 trunk 链路的交换机上要有相应的 vlan，否则 vlan 间不能通信。&lt;/p&gt;
&lt;h3&gt;小特性&lt;/h3&gt;
&lt;p&gt;1）ARP 表的老化时间是 300s&lt;/p&gt;
&lt;p&gt;2）在 trunk 链路配置 vtp pruning 可以过滤不必要的流量通过交换机。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-STP]]></title><description><![CDATA[注：本文档中桥和交换机为同义词，终端与主机为同义词，仅个人习惯而已。 STP 基本概述 基本概念 网桥 ID（BID） 开销（cost） 网桥协议数据单元（BPDU） 端口角色 端口状态 计时器（timer） 选举的标准 执行的过程 拓扑变更 STP 的衍生版本 PVST…]]></description><link>https://xdays.me/CCNP-stp/</link><guid isPermaLink="false">https://xdays.me/CCNP-stp/</guid><pubDate>Sun, 20 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;注：本文档中桥和交换机为同义词，终端与主机为同义词，仅个人习惯而已。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;STP
&lt;ul&gt;
&lt;li&gt;基本概述&lt;/li&gt;
&lt;li&gt;基本概念
&lt;ul&gt;
&lt;li&gt;网桥 ID（BID）&lt;/li&gt;
&lt;li&gt;开销（cost）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;网桥协议数据单元（BPDU）&lt;/li&gt;
&lt;li&gt;端口角色&lt;/li&gt;
&lt;li&gt;端口状态&lt;/li&gt;
&lt;li&gt;计时器（timer）&lt;/li&gt;
&lt;li&gt;选举的标准&lt;/li&gt;
&lt;li&gt;执行的过程&lt;/li&gt;
&lt;li&gt;拓扑变更&lt;/li&gt;
&lt;li&gt;STP 的衍生版本&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PVST+（per-vlan STP 中的 RID）&lt;/li&gt;
&lt;li&gt;RSTP（Rapid STP 快速生成树）
&lt;ul&gt;
&lt;li&gt;端口角色&lt;/li&gt;
&lt;li&gt;端口状态&lt;/li&gt;
&lt;li&gt;BPDU 中对 flag 的拓展&lt;/li&gt;
&lt;li&gt;分段收敛&lt;/li&gt;
&lt;li&gt;keep-alive 机制&lt;/li&gt;
&lt;li&gt;拓扑更改&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;RPVST+（per-vlan RSTP）&lt;/li&gt;
&lt;li&gt;MST（Multiple STP，多生成树）
&lt;ul&gt;
&lt;li&gt;基本特征&lt;/li&gt;
&lt;li&gt;RID 的再次扩展&lt;/li&gt;
&lt;li&gt;MST 区域&lt;/li&gt;
&lt;li&gt;MST 和 CST 共存&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;STP 增强特性
&lt;ul&gt;
&lt;li&gt;加快收敛的特性&lt;/li&gt;
&lt;li&gt;BPDU 保护特性&lt;/li&gt;
&lt;li&gt;STP 上避免环路&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;STP（spanning tree protocol）&lt;/h3&gt;
&lt;h4&gt;基本概述&lt;/h4&gt;
&lt;p&gt;增加网络可靠性的方法就是提供冗余链路，然而如果没有有效的措施冗余就会造成环路。三层上的动态路由协议采用诸如水平分割，路由毒化等措施来避免环路，而二层上的环路主要是靠 STP（spanning
tree
protocol）来完成的。从总体上来说 STP 通过把一些端口置为阻塞状态最终要达到的一种如下图所示的状态。整个网络有一个根，然后向外发散构造的树状网络。此外由于从基本的 STP 向外扩展了很多衍生版本，使 STP 比较复杂。&lt;/p&gt;
&lt;h4&gt;基本概念&lt;/h4&gt;
&lt;p&gt;网桥 ID（BID）&lt;/p&gt;
&lt;p&gt;对于网络中的所有交换机都要有一个唯一的标识，功能类似于 OSPF 中的 RID。BID 由优先级（priority，2 字节）和 mac 地址（6 字节）两部分组成。&lt;/p&gt;
&lt;p&gt;开销（cost）&lt;/p&gt;
&lt;p&gt;因为 STP 要选最佳路径，所以 cost 确定到达根桥的最优路径。相应规定如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;链路速度 开销
10G 2
1G 4
100M 19
10M 100&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;网桥协议数据单元（BPDU）&lt;/h4&gt;
&lt;p&gt;STP 的消息格式解释如下图所示：&lt;/p&gt;
&lt;h4&gt;端口角色&lt;/h4&gt;
&lt;p&gt;因为最终 STP 要阻塞掉一些端口，端口角色就是来区分阻塞端口和正常转发端口。各种端口角色以及行为如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;端口角色 行为
根端口 除根桥以外的所有交换机到达根桥的最优端口
指定端口 每条链路上只能有一个指定端口，这句话也是 STP 核心
非指定端口 那些需要阻塞的端口&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;端口状态&lt;/h4&gt;
&lt;p&gt;为确保网络的稳定性，端口不能在角色之间直接切换，这样就定义了端口状态来缓冲这个过程。端口状态及其行为如下表所示：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;端口状态 行为
监听 仅接受 BPDU，执行选举过程
学习 接受 BPDU，并且学习 mac 地址
转发 接受 BPDU，转发数据
阻塞 仅接受 BPDU
禁用 不参与 STP&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;计时器（timer）&lt;/h4&gt;
&lt;p&gt;STP 定义的在各种端口状态停留的时间也就是计时器如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;计时器 时间
Hello 时间 根桥发送 BPDU 的时间
失效时间 保存配置 BPDU 的最大时间
转发延迟 接口在监听和学习状态停留的时间&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;选举的标准&lt;/h4&gt;
&lt;p&gt;从选举根桥到选举根接口再到选举指定接口 STP 一直遵循着同一个标准，按照如下顺序依次判定：1）最低的根桥 ID；2）最低的到达根桥的路径开销；3）最低的发送方的桥 ID；4）最低的端口优先级；5）最低的端口 ID。&lt;/p&gt;
&lt;h4&gt;执行的过程&lt;/h4&gt;
&lt;p&gt;启动后各交换机都认为自己是根桥，当收到更优的 BPDU（RID 更小）时更改自己发送的 BPDU 的 RID；选举出根桥以后所有交换机确定到达根桥开销最小的端口作为根端口；所有网段上选举一个指定端口，根桥上的所有端口都是指定端口（designate
port，DP），因为与之相连的都是根端口；把所有剩余的端口 block 掉，设为非指定端口（NDP），这样网络就收敛了。&lt;/p&gt;
&lt;h4&gt;拓扑变更&lt;/h4&gt;
&lt;p&gt;当网络中链路出现中断以后，交换机会从自己的根接口发送 TC 置位的 BPDU，然后收到 BPDU 的交换机回复确认继续在自己的根接口上发出 TC 置位的 BPDU，直到到达根桥，根桥会修改配置 BPDU 以通知拓扑变更，持续时间为 35s，当其他交换机收到根桥发来的 TC
BPDU 后会将 CAM 寿命设为转发延迟（15s）以求快速更新地址表（经讨论认为，35s+15s 这恰好重新经历了一个 STP 收敛过程！）。&lt;/p&gt;
&lt;h4&gt;STP 的衍生版本&lt;/h4&gt;
&lt;p&gt;STP 有很多衍生版本，其名称以及对应的 IEEE 协议如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 对应标准
CST 802.1d
RSTP 802.1w
PVST+ p-vlan 802.1d
RPVST+ p-vlan 802.1w
MSTP 802.1s&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;PVST+（per-vlan STP 中的 RID）&lt;/h3&gt;
&lt;p&gt;因为 CST 是在所有 vlan 运行一个 STP 实例，而 PVST 是在每一个 vlan 独立运行一个实例，这样就可以在多条链路上实现负载均衡，有效利用带宽。但是可能一台交换机可能同时收到多个 vlan 的 BPDU，如何区分这些 BPDU 呢？这时就要对原先的 RID 进行拓展，从 2 个字节的优先级中拿出 12 位作为扩展 ID 来标志 vlan-id，这就是 PVST 和 CST 的区别。&lt;/p&gt;
&lt;h3&gt;RSTP（Rapid STP 快速生成树）&lt;/h3&gt;
&lt;h4&gt;端口角色&lt;/h4&gt;
&lt;p&gt;根端口（RP）和指定端口（DP）：与 STP 一致&lt;/p&gt;
&lt;p&gt;替代端口（alternative
port，AP）：两台交换机的 BPDU 比，次优的端口（发送次优 BPDU 的端口）作为替代端口；替代端口能在根端口失效的时候成为根端口。。&lt;/p&gt;
&lt;p&gt;备份端口（backup
port）：同一台交换机上发送次优 BPDU 的端口作为备份端口（这种情况很少出现，如两个接口接到了 hub 上）&lt;/p&gt;
&lt;h4&gt;端口状态&lt;/h4&gt;
&lt;p&gt;RSTP 把 STP 中的禁用，阻塞和监听都归为丢弃（discarding）状态，保留学习和转发状态，这样就缩短了过渡的时间。&lt;/p&gt;
&lt;h4&gt;BPDU 中对 flag 的拓展&lt;/h4&gt;
&lt;p&gt;STP 中只用了 flag 中的 2 位（TC 和 TCA），现在 RSTP 对其作了扩展，具体如下图所示：&lt;/p&gt;
&lt;h4&gt;分段收敛&lt;/h4&gt;
&lt;p&gt;当交换机收到 proposal 置位的 BPDU 时就把所有其他接口置为 sync（同步，就是都 block 掉）状态，然后判断自己的端口角色，然后再向其他交换机发送 proposal 的 BPDU，继续这个过程。这是 RSTP 的核心内容，也是快速收敛的根源。&lt;/p&gt;
&lt;h4&gt;keep-alive 机制&lt;/h4&gt;
&lt;p&gt;每台交换机都向相邻交换机以 hello 时间为周期发送 BPDU，当 3 倍于 hello 时间没有收到对方的 BPDU 就认为拓扑更改了，这样检测链路故障的速度更快。&lt;/p&gt;
&lt;h4&gt;拓扑更改&lt;/h4&gt;
&lt;p&gt;当拓扑发生更改是，交换机除了向根发送 BPDU 外也向其他交换机发送 BPDU，目的就是让大家尽快知道拓扑已经发生更改，以提高收敛速度。&lt;/p&gt;
&lt;h3&gt;RPVST+（per-vlan RSTP）&lt;/h3&gt;
&lt;p&gt;就是在每个 vlan 中运行一个 RSTP。&lt;/p&gt;
&lt;h3&gt;MST（Multiple STP，多生成树）&lt;/h3&gt;
&lt;h4&gt;基本特征&lt;/h4&gt;
&lt;p&gt;CST 是在所有 vlan 中运行一个 STP，PVST 是在每个 vlan 中运行个 STP，而 MST 就是这两种协议的折衷。MST 是将多个 vlan 映射到一个 STP 实例上，不仅能在多条链路上执行复杂均衡而且还能有效利用资源。此外 MST 还向后兼容，可以与其他版本的 STP 共存。&lt;/p&gt;
&lt;h4&gt;RID 的再次扩展&lt;/h4&gt;
&lt;p&gt;因为将多个 vlan 映射到一个实例上，那么 vlan-id 就不重要了，而 RID 的扩展 id 就变成了实例（instance）号，以此区分不同的实例。&lt;/p&gt;
&lt;h4&gt;MST 区域&lt;/h4&gt;
&lt;p&gt;具有相同 MST 配置的一系列交换机构成了 MST 区域，这里的配置包括了配置名称，配置版本号和 vlan 实例的映射关系三部分。&lt;/p&gt;
&lt;h4&gt;MST 和 CST 共存&lt;/h4&gt;
&lt;p&gt;共存时我们可以把 MST 的 IST（也就是 MSTI0，MST 的实例 0）当成一台虚拟的交换机，在外界看来它就是一台交换机。&lt;/p&gt;
&lt;h3&gt;STP 的增强特性&lt;/h3&gt;
&lt;h4&gt;加快收敛的特性&lt;/h4&gt;
&lt;p&gt;portfast&lt;/p&gt;
&lt;p&gt;由于接入层直接连终端，不会产生环路，所以配置 portfast 的端口启动后直接过渡到转发状态而不经过监听和学习。&lt;/p&gt;
&lt;p&gt;uplinkfast&lt;/p&gt;
&lt;p&gt;当交换机的上联链路 down 了，交换机能能直接把阻塞端口至于转发状态而不经过监听和学习，从而加快收敛速度。配置了 uplinkfast 的交换机为了防止自己变成根需要做如下修改：1）将自己的优先级改成 49152；2）到达根桥开销在原先基础增加 3000；3）标识 uplinkfast 开启。&lt;/p&gt;
&lt;p&gt;backbonefast&lt;/p&gt;
&lt;p&gt;（此处待插入图片后添加说明）&lt;/p&gt;
&lt;p&gt;下面是对三种 fast 的总结：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;特性 配置位置 节约时间
portfast 接入交换机 30s
uplinkfast 接入交换机 30s
backbonefast 所有交换机 20s&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;实验配置通过实验来验证三种特性：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2011/03/stp-feathers.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2011/03/stp-feathers.jpg&quot; alt=&quot;stp-feathers&quot; title=&quot;stp-feathers&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw1#sh spanning-tree

VLAN1 is executing the ieee compatible Spanning Tree protocol

Bridge Identifier has priority 32768, sysid 1, address 000d.29cf.1b80

Configured hello time 2, max age 20, forward delay 15

We are the root of the spanning tree

Topology change flag not set, detected flag not set

Number of topology changes 7 last change occurred 00:03:17 ago

from FastEthernet0/2

Times:  hold 1, topology change 35, notification 2

hello 2, max age 20, forward delay 15

Timers: hello 1, topology change 0, notification 0, aging 300

Port 1 (FastEthernet0/1) of VLAN1 is forwarding

Port path cost 19, Port priority 128, Port Identifier 128.1.

Designated root has priority 32769, address 000d.29cf.1b80

Designated bridge has priority 32769, address 000d.29cf.1b80

Designated port id is 128.1, designated path cost 0

Timers: message age 0, forward delay 0, hold 0

Number of transitions to forwarding state: 1

BPDU: sent 1519, received 9

Port 2 (FastEthernet0/2) of VLAN1 is forwarding

Port path cost 19, Port priority 128, Port Identifier 128.2.

Designated root has priority 32769, address 000d.29cf.1b80

Designated bridge has priority 32769, address 000d.29cf.1b80

Designated port id is 128.2, designated path cost 0

Timers: message age 0, forward delay 0, hold 0

Number of transitions to forwarding state: 1

BPDU: sent 188, received 0

sw2#sh span

VLAN0001

Spanning tree enabled protocol ieee

Root ID    Priority    32769

Address     000d.29cf.1b80

Cost        19

Port        1 (FastEthernet0/1)

Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)

Address     000d.6548.c900

Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Aging Time 300

Interface        Role Sts Cost      Prio.Nbr Type

---------------- ---- --- --------- -------- --------------------------------

Fa0/1            Root FWD 19        128.1    P2p

Fa0/2            Desg FWD 19        128.2    P2p

sw3#sh span

VLAN0001

Spanning tree enabled protocol ieee

Root ID    Priority    32769

Address     000d.29cf.1b80

Cost        19

Port        1 (FastEthernet0/1)

Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Bridge ID  Priority    32769  (priority 32768 sys-id-ext 1)

Address     0011.9234.7e80

Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Aging Time 300

Interface        Role Sts Cost      Prio.Nbr Type

---------------- ---- --- --------- -------- --------------------------------

Fa0/1            Root FWD 19        128.1    P2p

Fa0/2            Altn BLK 19        128.2    P2p&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;portfast 特性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）不开启 portfast 的变化&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw3#

00:25:39: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to up

00:25:40: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to down

sw3#

00:25:40: set portid: VLAN0001 Fa0/3: new port id 8003

00:25:40: STP: VLAN0001 Fa0/3 -&gt; listening

sw3#

00:25:41: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to up

sw3#

00:25:55: STP: VLAN0001 Fa0/3 -&gt; learning

sw3#

00:26:10: STP: VLAN0001 sent Topology Change Notice on Fa0/1

00:26:10: STP: VLAN0001 Fa0/3 -&gt; forwarding&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;计算时间差正好是 30s&lt;/p&gt;
&lt;p&gt;2）开启 portfast 的变化&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw3(config-if)#no shut

sw3(config-if)#

00:29:38: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to down

sw3(config-if)#

00:29:40: %LINK-3-UPDOWN: Interface FastEthernet0/3, changed state to up

00:29:41: set portid: VLAN0001 Fa0/3: new port id 8003

00:29:41: STP: VLAN0001 Fa0/3 -&gt;jump to forwarding from blocking

sw3(config-if)#

00:29:42: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/3, changed state to up&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;uplinkfast 特性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）不开启 uplinkfast 特性&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw3(config)#int f0/1

sw3(config-if)#shut

sw3(config-if)#

00:31:17: STP: VLAN0001 new root port Fa0/2, cost 38

00:31:17: STP: VLAN0001 Fa0/2 -&gt; listening

sw3(config-if)#

00:31:19: %LINK-5-CHANGED: Interface FastEthernet0/1, changed state to administratively down

sw3(config-if)#

00:31:19: STP: VLAN0001 sent Topology Change Notice on Fa0/2

sw3(config-if)#

00:31:20: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/1, changed state to down

sw3(config-if)#

00:31:32: STP: VLAN0001 Fa0/2 -&gt; learning

sw3(config-if)#

00:31:47: STP: VLAN0001 sent Topology Change Notice on Fa0/2

00:31:47: STP: VLAN0001 Fa0/2 -&gt; forwarding&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2）开启 uplinkfast 特性&lt;/p&gt;
&lt;p&gt;开启后变化&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw3(config)#spanning-tree uplinkfast

sw3(config)#

00:35:29: setting bridge id (which=1) prio 49153 prio cfg 49152 sysid 1 (on) id C001.0011.9234.7e80
（优先级变成49152）

sw3#sh spanning-tree

VLAN0001

Spanning tree enabled protocol ieee

Root ID    Priority    32769

Address     000d.29cf.1b80

Cost        3038

Port        2 (FastEthernet0/2)

Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Bridge ID  Priority    49153  (priority 49152 sys-id-ext 1)

Address     0011.9234.7e80

Hello Time   2 sec  Max Age 20 sec  Forward Delay 15 sec

Aging Time 300

Uplinkfast enabled

Interface        Role Sts Cost      Prio.Nbr Type

---------------- ---- --- --------- -------- --------------------------------

Fa0/2            Root FWD 3019      128.2    P2p

Fa0/3            Desg FWD 3100      128.3    Edge Shr

注意观察三处的变化。

sw3(config)#int f0/1

sw3(config-if)#shut

sw3(config-if)#

00:40:15: STP: VLAN0001 new root port Fa0/2, cost 3038

00:40:15: %SPANTREE_FAST-7-PORT_FWD_UPLINK: VLAN0001 FastEthernet0/2 moved to Forwarding (UplinkFast).

sw3(config-if)#

00:40:17: %LINK-5-CHANGED: Interface FastEthernet0/1, changed state to administratively down

sw3(config-if)#

00:40:17: STP: VLAN0001 sent Topology Change Notice on Fa0/2

sw3(config-if)#

00:40:18: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/1, changed state to down&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;可以看到 F0/2 直接进入转发状态不经过 30s 延迟了。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;backbonefast 特性&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;1）不开启 backbonefast 特性&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw3#

01:56:48: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

sw3#收到次优的root BPDU

01:56:50: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

sw3#

01:56:52: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

sw3#

01:56:54: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

sw3#

01:56:56: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

sw3#

01:56:58: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

sw3#

01:57:00: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

01:57:00: STP: VLAN0001 Fa0/2 -&gt; listening超时之后进入listening状态

sw3#

01:57:01: STP: VLAN0001 Topology Change rcvd on Fa0/2

01:57:01: STP: VLAN0001 sent Topology Change Notice on Fa0/1

sw3#

01:57:15: STP: VLAN0001 Fa0/2 -&gt; learning

sw3#

01:57:30: STP: VLAN0001 sent Topology Change Notice on Fa0/1

01:57:30: STP: VLAN0001 Fa0/2 -&gt; forwarding

sw3#&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2）开启 backbonefast 特性&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sw3#（没有超时过程，直接进入listening）

02:03:32: STP: VLAN0001 heard root 32769-000d.6548.c900 on Fa0/2

02:03:32: STP: VLAN0001 Fa0/2 -&gt; listening

02:03:33: STP: VLAN0001 Topology Change rcvd on Fa0/2

02:03:33: STP: VLAN0001 sent Topology Change Notice on Fa0/1

sw3#

02:03:47: STP: VLAN0001 Fa0/2 -&gt; learning

sw3#

02:04:02: STP: VLAN0001 sent Topology Change Notice on Fa0/1

02:04:02: STP: VLAN0001 Fa0/2 -&gt; forwarding&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;BPDU 的保护特性&lt;/h4&gt;
&lt;p&gt;基本原理&lt;/p&gt;
&lt;p&gt;BPDU
guard：当从 portfast 接口收到 BPDU 时交换机将接口置于 err-disable 的状态，相当于关闭状态，全局启动。&lt;/p&gt;
&lt;p&gt;BPDU
filter：这个尤其要注意接口模式和全局模式下配置的不同之处：接口模式下配就不发送任何 BPDU 且丢弃任何接受到的 BPDU；全局模式下配如果收到 BPDU 就将相应接口改回正常的 STP 操作。&lt;/p&gt;
&lt;p&gt;Root
guard：当交换机收到更好的 BPDU 时将相应的接口置于 inconsistent 状态，相当于监听状态，经过一定时间自动恢复。&lt;/p&gt;
&lt;p&gt;实验配置&lt;/p&gt;
&lt;p&gt;1）BPDU guard 特性&lt;/p&gt;
&lt;p&gt;在 S1 上配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;S1(config)#int f0/23

S1(config-if)#spanning-tree portfast

S1(config-if)#spanning-tree bpduguard enable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;把 S2 连接到 S1 上&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;00:06:45: %LINK-3-UPDOWN: Interface FastEthernet0/24, changed state to up

S1#

00:06:46: set portid: VLAN0001 Fa0/24: new port id 8018

00:06:46: STP: VLAN0001 Fa0/24 -&gt; listening

00:06:47: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/24, changed state to up

S1#

00:06:48: %SPANTREE-2-BLOCK_BPDUGUARD: Received BPDU on port FastEthernet0/24 with BPDU Guard enabled. Disabling port.

S1#

00:06:48: %PM-4-ERR_DISABLE: bpduguard error detected on Fa0/24, putting Fa0/24 in err-disable state

00:06:49: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/24, changed state to down

S1#&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2）BPDU filter 特性&lt;/p&gt;
&lt;p&gt;在 S1 上配置&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;S1(config)#int f0/23

S1(config-if)#spanning-tree portfast

S1(config-if)#spanning-tree bpdufilter enable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;把 S2 连接到 S1 上，如下提示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;S1#

00:09:14: %LINK-3-UPDOWN: Interface FastEthernet0/24, changed state to up

00:09:15: set portid: VLAN0001 Fa0/24: new port id 8018

00:09:15: STP: VLAN0001 Fa0/24 -&gt; listening

S1#

00:09:16: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/24, changed state to up

S1#

00:09:30: STP: VLAN0001 Fa0/24 -&gt; learning

S1#

00:09:45: STP: VLAN0001 sent Topology Change Notice on Fa0/2

00:09:45: STP: VLAN0001 Fa0/24 -&gt; forwarding可以进入正常的转发状态&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;3）root guard 特性&lt;/p&gt;
&lt;p&gt;在 S1 上配置&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;S1(config)#int f0/24

S1(config-if)#spanning-tree guard root&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;把 S3 接到 S1 上，如下提示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;00:14:23: %LINK-3-UPDOWN: Interface FastEthernet0/24, changed state to up

S1#

00:14:25: set portid: VLAN0001 Fa0/24: new port id 8018

00:14:25: STP: VLAN0001 Fa0/24 -&gt; listening

00:14:26: %LINEPROTO-5-UPDOWN: Line protocol on Interface FastEthernet0/24, changed state to up

S1#

00:14:26: STP: VLAN0001 heard root 32769-000d.29cf.1b80 on Fa0/24

00:14:26:     supersedes 32769-000d.6548.c900

00:14:26: %SPANTREE-2-ROOTGUARD_BLOCK: Root guard blocking port FastEthernet0/24 on VLAN0001.

S1#

00:14:26: STP: VLAN0001 Fa0/24 -&gt; blocking

00:14:27: STP: VLAN0001 heard root 32769-000d.29cf.1b80 on Fa0/24

00:14:27:     supersedes 32769-000d.6548.c90&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;STP 上避免环路&lt;/h4&gt;
&lt;p&gt;有 loopguard 和 udld 两种方式，避免单向故障造成的环路。（烦了，不想总结了，待定吧）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-Redistribute]]></title><description><![CDATA[基本特征 管理距离 种子度量值（seed metric） 重分布命令 前缀列表（prefix list） 分发列表（distribute list） 路由映射表（route map…]]></description><link>https://xdays.me/CCNP-redistribute/</link><guid isPermaLink="false">https://xdays.me/CCNP-redistribute/</guid><pubDate>Fri, 18 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;基本特征&lt;/li&gt;
&lt;li&gt;管理距离&lt;/li&gt;
&lt;li&gt;种子度量值（seed metric）&lt;/li&gt;
&lt;li&gt;重分布命令&lt;/li&gt;
&lt;li&gt;前缀列表（prefix list）&lt;/li&gt;
&lt;li&gt;分发列表（distribute list）&lt;/li&gt;
&lt;li&gt;路由映射表（route map）&lt;/li&gt;
&lt;li&gt;列表总结&lt;/li&gt;
&lt;li&gt;两点双向重分布问题&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;基本特征&lt;/h3&gt;
&lt;p&gt;随着网络的扩展，一个网络中可能要运行多种网络协议。要让运行不同网络协议的路由器之间获悉各自的路由信息，就要在边界路由器上执行重定向，就是两种路由协议相互导入各自的路由条目。需要考虑的因素包括不同路由协议的管理距离以及度量值不同，以及如何控制重分布的路由条目等。&lt;/p&gt;
&lt;h3&gt;管理距离&lt;/h3&gt;
&lt;p&gt;不同路由协议的管理距离如下表所示：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;路由协议 管理距离
直连接口 0
送出接口的静态路由 0
下一跳的静态路由 1
EIGRP 汇总路由 5
外部 BGP 20
内部 EIGRP 90
OSPF 110
IS-IS 115
RIP 120
外部网关协议（EGP） 140
按需路由协议（ODR） 160
外部 EIGRP 170
内部 BGP 200
未知 255&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;种子度量值（seed metric）&lt;/h3&gt;
&lt;p&gt;当在不同路由协议之间执行重分布时，重分布而来的路由在新的路由协议中要有一个新的度量值基数，这个度量值如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;重分布到该路由协议中 种子度量值
RIP 对于静态和直连路由为 1，其他的为无穷大
IGRP/EIGRP 对于静态和直连路由为 1，其他的为无穷大
OSPF 20，类型为 E2
IS-IS 0
BGP IGP 的度量值&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意：除了默认的度量值外还有两种方法修改充分发的度量值：1）在配置重分布时带上 metric 参数；2）在进程模式下执行 default-metric 命令。&lt;/p&gt;
&lt;h3&gt;重分布命令&lt;/h3&gt;
&lt;p&gt;重分布命令统一用 redistribute，只是在参数上有区别。需要注意的是：1）重分布到 RIP 一定要制定 metric 值，要不然重分布不成功；2）EIGRP 也要指定 metric 值，而且 EIGRP 有五个 metric 需要按提示分别制定，建议取值为 1500，100，255，1，1500；3）OSPF 默认不会重分布子网，所以执行重分布时必家参数 subnets&lt;/p&gt;
&lt;h3&gt;前缀列表（prefix list）&lt;/h3&gt;
&lt;p&gt;前缀列表也属于一种控制列表，只是这种控制类表不能用来控制数据表而是控制路由。但与防控控制表相比前缀列表可以更精准的控制路由，具体用法如下举例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ip prefix-list 1 permit 2.2.2.0/24 掩码为24位

ip prefix-list 1 permit 2.2.2.0/24  le 32  掩码为24-32位

ip prefix-list 1 permit 2.2.2.0/24  ge 26  掩码为26-32位

ip prefix-list 1 permit 2.2.2.0/24  gr 26 le 30  掩码为26-30位

ip prefix-list 1 permit 0.0.0.0/0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;分发列表（distribute list）&lt;/h3&gt;
&lt;p&gt;分发列表是控制重分布路由的方式之一，它是通过调用访问控制表来限制发往某个接口或者针对某种路由协议的路由。两种限制方式的不同之处在于：限制接口是在出方向上过滤掉路由，使其发不出去，而限制路由协议是在重定向之前就过滤掉路由，相比后者的执行效率更高。&lt;/p&gt;
&lt;h3&gt;路由映射表（route map）&lt;/h3&gt;
&lt;p&gt;路由映射表有脚本语言的一些特性：通过字符命名方便调用，自上而下执行，可以通过方便很方便的插入和删除，采用 match（匹配）set（设置）方式执行。可以把通过路由映射表控制的重分布路由理解为两个层面：1）是否重分布相应路由；2）对重分布的路由作何种修改（比如更改默认的 metric 值，更改 OSPF 的外部路由类型）&lt;/p&gt;
&lt;h3&gt;列表总结&lt;/h3&gt;
&lt;p&gt;到目前为止我们学习了那么多的列表，这些列表有什么关系，如何从更深层次上看待这些列表。从控制和数据层面上来列举如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;/wp-content/uploads/2011/03/list-framework.jpg&quot; alt=&quot;list-framework&quot; title=&quot;list-framework&quot;&gt;
&lt;/a&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;两点双向重分布问题&lt;/h3&gt;
&lt;p&gt;当两种路由协议有两个重分布点时由于管理距离的问题会产生次优路由问题。解决办法就是更改管理距离（distance 指定的 ip 地址是指只更改从该路由器接收到的路由的管理距离），这个问题需要单独用一个实验来总结，实验拓扑如下图：（待完善）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-OSPF]]></title><description><![CDATA[基本特征 术语解释 自制系统（AS） 邻居表 拓扑表 路由器标志符（RID） 划分区域 指定路由器（DR）和备份指定路由器（BDR） 区域边界路由器（ABR） 自治系统边界路由器（ASBR） 分组类型 邻接关系 度量计算 LSAs…]]></description><link>https://xdays.me/CCNP-ospf/</link><guid isPermaLink="false">https://xdays.me/CCNP-ospf/</guid><pubDate>Thu, 17 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;基本特征&lt;/li&gt;
&lt;li&gt;术语解释
&lt;ul&gt;
&lt;li&gt;自制系统（AS）&lt;/li&gt;
&lt;li&gt;邻居表&lt;/li&gt;
&lt;li&gt;拓扑表&lt;/li&gt;
&lt;li&gt;路由器标志符（RID）&lt;/li&gt;
&lt;li&gt;划分区域&lt;/li&gt;
&lt;li&gt;指定路由器（DR）和备份指定路由器（BDR）&lt;/li&gt;
&lt;li&gt;区域边界路由器（ABR）&lt;/li&gt;
&lt;li&gt;自治系统边界路由器（ASBR）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;分组类型&lt;/li&gt;
&lt;li&gt;邻接关系&lt;/li&gt;
&lt;li&gt;度量计算&lt;/li&gt;
&lt;li&gt;LSAs 类型总结&lt;/li&gt;
&lt;li&gt;汇总路由&lt;/li&gt;
&lt;li&gt;默认路由&lt;/li&gt;
&lt;li&gt;网络类型&lt;/li&gt;
&lt;li&gt;特殊区域
&lt;ul&gt;
&lt;li&gt;末节（stub）区域&lt;/li&gt;
&lt;li&gt;绝对末节区域（totally stub）区域&lt;/li&gt;
&lt;li&gt;NSSA（not so stub area）区域&lt;/li&gt;
&lt;li&gt;绝对 NSSA（totally NSSA）区域&lt;/li&gt;
&lt;li&gt;不规则区域&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;身份验证&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;基本特征&lt;/h3&gt;
&lt;p&gt;开放最短路径优先（OSPF）协议是一种链路状态路由协议，封装于 ip 数据包中协议号为 89，采用组播地址 224.0.0.5（所有路由器）和 224.0.0.6（DR 和 BDR）。链路状态路由协议与距离矢量路由协议最大的区别就是他可以了解到整个网络的拓扑结构，然后利用 SPF 算法根据这个链路状态数据库计算最优路径，而距离矢量路由协议总是相信邻居传来的路由信息。关于链路状态协议最好的解释是商场的地图，每一个地点都有一张已改点为中心到达商场其他地点的最佳路径，这种结构形象地体现了 OSPF 构建的 SPF 树。另外 OSPF 发送限定更新，且只将更新发往受影响的路由器，以较低的频率发送更新（每 30min，老化时间为 1h）。&lt;/p&gt;
&lt;h3&gt;术语解释&lt;/h3&gt;
&lt;h4&gt;自治系统（AS）&lt;/h4&gt;
&lt;p&gt;所有运行 OSPF 的路由器构成了一个自治系统。&lt;/p&gt;
&lt;h4&gt;邻居表&lt;/h4&gt;
&lt;p&gt;记录了路由器和相邻路由器建立邻接关系过程的状态，这里区别于 EIGRP，并不是所有存在于邻居表中的条目都和本地路由器建立了邻接关系，具体见邻接关系。&lt;/p&gt;
&lt;h4&gt;拓扑表&lt;/h4&gt;
&lt;p&gt;也就是链路状态数据库，他记录了 OSPF 的 AS 所有链路的状态，是生成路由表的基础。&lt;/p&gt;
&lt;h4&gt;路由器标志符（RID）&lt;/h4&gt;
&lt;p&gt;代表每个路由器在 OSPF 协议中的身份，并且是唯一的。每台路由器发送更新时都要打上自己的 RID。RID 的确定原则是：1）通过 router-id 命令来指定；2）选择所有换回接口最大的地址；3）选择所有接口最大的地址。&lt;/p&gt;
&lt;h4&gt;划分区域&lt;/h4&gt;
&lt;p&gt;OSPF 适合于大型网络，当网络很大时庞大的链路状态数据库以及不断的进行 SPF 计算会拖慢 OSPF 收敛。划分区域的优点主要有：由于在区域之间执行路由汇总可以减小路由表的条目；限制拓扑变化的影响范围；减小 LSA 的泛洪。区域分为骨干区域（area
0）和非骨干区域（area n）&lt;/p&gt;
&lt;h4&gt;指定路由器（DR）和备份指定路由器（BDR）&lt;/h4&gt;
&lt;p&gt;在多路访问网络中如果每台路由器都与其他路由器建立邻接关系那么拓扑结构变得很复杂，这时可以在网络中选出一个代表来代表其他路由器，与其他网络上的路由器通信，这个路由器就叫做 DR，另外 BDR 是做备份用的，当 DR 失效时 BDR 升级为 DR。选 DR 原则：优先选择接口优先级高（数字大）的，如果优先级相同就选择 RID 最大的。关于 DR 也有一个比喻：一群人坐在一间屋子开会，如果大家你一句我一句就会很混乱，这时大家选一名代表，谁有事就告诉代表，然后代表把事情传递给大家，这样可以很好的提高效率。&lt;/p&gt;
&lt;h4&gt;区域边界路由器（ABR）&lt;/h4&gt;
&lt;p&gt;连接 OSPF 的不同区域的路由器，ABR 让两个区域可以了解彼此的网络。&lt;/p&gt;
&lt;h4&gt;自治系统边界路由器（ASBR）&lt;/h4&gt;
&lt;p&gt;连接 OSPF 自治系统和其他网络的路由器，在 ASBR 上可以通过重定向把其他路由导入到 OSPF 中。&lt;/p&gt;
&lt;h3&gt;分组类型&lt;/h3&gt;
&lt;p&gt;OSPF 的分组类型有 5 种，它们的名称和功能如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;类型 名称 说明
1 hello 用于建立邻接关系
2 DBD 数据库描述 检查数据库是否同步
3 LSR 链路状态请求 向邻居请求链路状态记录
4 LSU 链路状态更新 响应请求的链路状态记录，包含一个或多个 LSA
5 LSack 对其他数据包的确认&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;邻接关系&lt;/h3&gt;
&lt;p&gt;OSPF 中两台路由器相互交换链路信息要先建立邻接关系，这里的邻接关系要区别于邻居关系：当两台路由器相互交换 hello 包就建立了邻居关系，而只有交换了 LSA 才算是建立了邻接关系。下面是建立邻接关系的详细过程：AB 两台路由器开启 OSPF，当 AB 收到的 hello 包中包含自己时连台路由器相当于建立邻居关系，称作为 2way 状态；然后下一步因为要交换 DBD 包所以要协调一个主从关系，这时进入 Exstart 状态，RID 大的作为主路由器小的作为从路由器；然后进入 Exchange 状态交换 DBD，DBD 是链路状态信息的简要概述，可以类比书的目录；接着双方根据收到的 LSR 包响应响应的链路信息，这一阶段称为 loading；最后链路状态数据库达到收敛也就是 full 状态。&lt;/p&gt;
&lt;p&gt;注意：1）在建邻接关系时如果网络是 MA 网络则要进行选 DR 和 BDR 过程，选举完成后的状态是，所有路由器都与 DR 和 BDR 建立邻接关系（full）而与其他路由器保持 2way 状态。2）建立邻居要满足的条件：hello 和 dead 时间一致；AS 号一致；身份验证，stub 区域标记一致&lt;/p&gt;
&lt;h3&gt;度量计算&lt;/h3&gt;
&lt;p&gt;OSPF 的度量称作 cost，仅考虑带宽，计算公式：10E8/bw（bitps）&lt;/p&gt;
&lt;p&gt;注意带宽是除接口带宽，单位是 bitps&lt;/p&gt;
&lt;h3&gt;LSAs 类型总结&lt;/h3&gt;
&lt;p&gt;由于 OSPF 有不同的区域，而且区域内还有不同角色的路由器，要让这些路由器通信就要构建不同种类的 LSAs 以达到特定目的，下表是对六种 LSA 的总结（主要包括通告路由器，传播范围，包含内容三部分）：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;种类 名称 通告路由器 传播范围 内容
1 router lsa RID 本区域内 拓扑信息和路由
2 network lsa DR 本区域内 本网络内的拓扑信息
3 summary lsa ABR* 整个自治系统 域间路由
4 summary ASB lsa ABR* 整个自治系统 到达 ASBR 的路由
5 external lsa ASBR 整个自治系统 域外路由（重定向）
7 NSSA lsa（暂时） ASBR 整个自治系统 在 NSSA 区域传域外路由&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意：1）在通告路由器一栏凡是打*的表示通告路由器随区域改变而改变；2）135 分别用于传播域内，域间和域外路由；3）关于 NSSA 留待特殊区域解释。&lt;/p&gt;
&lt;h3&gt;汇总路由&lt;/h3&gt;
&lt;p&gt;汇总可以减少传播的路由条目，减轻 CPU 负载等。默认 OSPF 不执行任何的自动汇总，所以要手工汇总。可以汇总的地方有两个：一个是区域边界路由器 ABR，汇总一个区域内的路由；一个是自治系统边界路由器 ASBR，汇总外部路由。&lt;/p&gt;
&lt;h3&gt;默认路由&lt;/h3&gt;
&lt;p&gt;OSPF 配默认路由的步骤：1）确保本地路由器有默认路由；2）在进程中通告默认路由：default-information
originate&lt;/p&gt;
&lt;h3&gt;网络类型&lt;/h3&gt;
&lt;p&gt;首先要搞清楚网络类型的作用，OSPF 不仅要考虑网络的结构还要考虑二层链路的特性，不同的网络类型就是满足不同的二层链路介质需求而设计的。下表列举了六种 OSPF 网络类型，以及工作在这些网络类型下的行为：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;网络类型 默认接口 hello 时间 选 DR 邻接关系 适用类型
loopback loopback 无 否 无 loopback（32）
point-to-point serial/FR’s p2p sub 10 否 hello 包自动 串口/子接口
broadcast ethernet 10 是 hello 包自动 以太口
non-broadcast FR’s phy/sub 30 是 手工指定 帧中继
point-to-multipoint -----* 30 否 hello 包自动 广播星形拓扑
p2mp nonbroadcast -----* 30 否 手工指定 非广播星形&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意：1）point-to-multipoint 和 point-to-multipoint
non-broadcast 两种网络默认不对应任何接口；2）凡是非广播的网络类型都需要手工指定邻居，指定方法是在进程下配 neighbour
ipaddr；3）可以通过修改 hello-interval 让工作在不同网络类型的接口建邻居 4）帧中继点到点子接口默认网络类型是 point-to-point，点到多点的类型是 non-broadcast，物理接口的网络类型是 non-broadcast，所以默认 OSPF 不能工作在帧中继网络中，所以要修改网络类型，最简单有效的方式是在支持 broadcast 的链路上配 point-to-multipoint 网络类型，既不需要手工配邻居也不需要选举 DR。&lt;/p&gt;
&lt;h3&gt;特殊区域&lt;/h3&gt;
&lt;h4&gt;末节（stub）区域&lt;/h4&gt;
&lt;p&gt;如果一个区域只与主干区域相连且没有 ASBR 那么这个区域内就不需要有外部路由，仅有一条默认路由就可以了。&lt;/p&gt;
&lt;h4&gt;绝对末节区域（totally stub）区域&lt;/h4&gt;
&lt;p&gt;在末节区域的基础上再去掉域间路由，也用一条指向 ABR 的默认路由代替，这样更精简了路由表。配置时 no-summary 参数只需要加在 ABR 上。&lt;/p&gt;
&lt;h4&gt;NSSA（not so stub area）区域&lt;/h4&gt;
&lt;p&gt;NSSA 区域与 stub 区域的唯一不同是它可以包括 ASBR 也就是这个区域内可以传播外部路由，那么问题就出现了，你还不能传播 5 类 LSA 还需要传播外部路由给其他区域，解决办法就是再添加 7 类路由这样既传递了外部路由也保持着 NSSA 区域的规则，7 类路由就用在这种特定的场合而且在 NSSA 的 ABR 上 7 类被转换成 5 类法非其他区域，也就是 7 类 LSA 仅存在于 NSSA 网络中。&lt;/p&gt;
&lt;h4&gt;绝对 NSSA（totally NSSA）区域&lt;/h4&gt;
&lt;p&gt;与 stub 和绝对 stub 区域的关系一样，绝对 NSSA 不传播域间路由，直接用默认路由代替。&lt;/p&gt;
&lt;h4&gt;不规则区域&lt;/h4&gt;
&lt;p&gt;区域不与主干区域相连或者主干区域被其他区域分割开的解决办法有如下三种：1）多进程双向重分布；2）通过打隧道（tunnel）来延长主干区域的范围实现区域连接；3）虚链路，通过 ABR 之间建立虚链路来连接区域。&lt;/p&gt;
&lt;h3&gt;身份验证&lt;/h3&gt;
&lt;p&gt;从密钥的角度讲有明文认证和 md5 认证，从认证的对象来讲有接口认证，区域认证和虚链路认证。可以理解为区域认证就是批量接口认证，所有归到特定区域内的接口都被认证。如果配置了区域认证，那么虚链路也包含在内被认证，所以在另一端也要配置认证才能保持虚链路的畅通。&lt;/p&gt;
&lt;h3&gt;小特性（feathers）&lt;/h3&gt;
&lt;p&gt;1）
E1 和 E2 外部路由的区别：就在 metric 值的计算上，E2 类型的外部路由被重定向到自治系统内后 metric 值不再增加，而 E1 类型继续累加自治系统内的 metric，另外重定向到 OSPF 的外部路由的默认 metric（seed
metric）值也可以修改。&lt;/p&gt;
&lt;p&gt;2）
因为有些链路带宽已经超过了 100M，这时计算的 metric 就不那么准确（100M 和 1000M 的 metric 都是 1）可以修改参考带宽以修改 metric 值，也可以直接修改链路的 cost 值。&lt;/p&gt;
&lt;p&gt;3）
当在 OSPF 中通告换回口时其子网掩码总是 32 位，确保最佳路由，因为逻辑接口就这一个地址。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNP-EIGRP]]></title><description><![CDATA[基本特征 分组类型 术语解释 邻居表 拓扑表 路由表 可行距离 通告距离 后继路由器 可行后继路由器 度量计算 底层技术 邻居发现 重置邻居关系的情况 DUAL 算法 协议执行过程 通告默认路由 负载均衡 限制查询范围 身份验证 基本特征 EIGRP…]]></description><link>https://xdays.me/CCNP-eigrp/</link><guid isPermaLink="false">https://xdays.me/CCNP-eigrp/</guid><pubDate>Wed, 16 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;基本特征&lt;/li&gt;
&lt;li&gt;分组类型&lt;/li&gt;
&lt;li&gt;术语解释
&lt;ul&gt;
&lt;li&gt;邻居表&lt;/li&gt;
&lt;li&gt;拓扑表&lt;/li&gt;
&lt;li&gt;路由表&lt;/li&gt;
&lt;li&gt;可行距离&lt;/li&gt;
&lt;li&gt;通告距离&lt;/li&gt;
&lt;li&gt;后继路由器&lt;/li&gt;
&lt;li&gt;可行后继路由器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;度量计算&lt;/li&gt;
&lt;li&gt;底层技术
&lt;ul&gt;
&lt;li&gt;邻居发现&lt;/li&gt;
&lt;li&gt;重置邻居关系的情况&lt;/li&gt;
&lt;li&gt;DUAL 算法&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;协议执行过程&lt;/li&gt;
&lt;li&gt;通告默认路由&lt;/li&gt;
&lt;li&gt;负载均衡&lt;/li&gt;
&lt;li&gt;限制查询范围&lt;/li&gt;
&lt;li&gt;身份验证&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;基本特征&lt;/h3&gt;
&lt;p&gt;EIGRP 是思科的专有协议，它由于具有一些链路状态的特性而属于高级距离矢量协议。报文封装于 EIGRP 中，协议号为 88。为确保信息传输的可靠性，EIGRP 包含一个 RTP 可靠传输协议。另外 EIGRP 的优势在于收敛速度快，支持 VLSM 和 CIDR，使用组播（地址为 224.0.0.10）通过相应的协议模块可以支持不同的协议。&lt;/p&gt;
&lt;h3&gt;分组类型&lt;/h3&gt;
&lt;p&gt;分组类型及其作用见下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;类型 作用
hello 包 建立邻居，身份验证，协商末节（stub）路由器
update 包 当收到对方的 hello 包是发送自己的路由信息
request 包 主动状态下是向邻居查询路由
reply 包 邻居的应答
ack 包 对 update，request，reply 确认&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;术语解释&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;邻居表&lt;/strong&gt; （neighbor）&lt;/h4&gt;
&lt;p&gt;当路由器收到对方发的 hello 包时就将邻居放在邻居表中，邻居表中记录了该路由器所有邻居，当拓扑变化发送更新和主动状态下查询路由时都会用到。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;拓扑表&lt;/strong&gt;（topology）&lt;/h4&gt;
&lt;p&gt;记录了从邻居那里学到的网络的拓扑信息，区别于链路状态的邻居表。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;路由表&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;所有路由协议的路由表都是一个目的，作为路由器转发数据包的参照标准。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;可行距离&lt;/strong&gt;（FD）&lt;/h4&gt;
&lt;p&gt;EIGRP 的度量（metric），就是从本地路由器出发到达目的网络的度量值。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;通告距离&lt;/strong&gt;（AD）&lt;/h4&gt;
&lt;p&gt;本地路由器的邻居的可行距离（FD）。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;后继路由器&lt;/strong&gt;（successor）&lt;/h4&gt;
&lt;p&gt;到达该路由器的路径被作为路由添加到路由表中。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;可行后继路由器&lt;/strong&gt;（FS）&lt;/h4&gt;
&lt;p&gt;到达该路由器的路径不是最优的但是满足可行性条件，可以作为备用路由，保存在拓扑表中，如果后继路由不可用则用可行后继路由器。&lt;/p&gt;
&lt;h3&gt;度量计算&lt;/h3&gt;
&lt;p&gt;EIGRP 的度量包括 K1-K5，分别是带宽，负载，延迟，可靠性和 MTU，默认采用带宽和延迟来计算 metric 值计算公式为：计算公式 256*[(
10E7/bw+delay(us)/10
)]，其中需要注意的是带宽取到达目的网络的最小带宽，延迟是所有网络延迟之和。取所有网络如接口的相应值。&lt;/p&gt;
&lt;h3&gt;底层技术&lt;/h3&gt;
&lt;h4&gt;&lt;strong&gt;邻居发现&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;当路由器运行 EIGRP 时会向所有归到 EIGRP 域内的接口发送 hello 报文（MA 网络中每 5s 发送一次，NBMA 每 60s 发送一次，而 hold 失效时间是 hello 时间的 3 倍），对端收到数据包后如果包括验证部分则进行身份验证，如果没有则添加到邻居表中，然后回应 update 包通告自身的路由表。还有很重要的一点是邻居建立的条件：as 号一致；度量类型（Key 值）一致；身份验证。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;重置邻居关系的情况&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;1）hold 时间超时，路由器认为对端路由器 down 了；2）update 超时，因为 update 包是需要 ack 包确认的，如果在重传 16 次仍然收不到回应便重置邻居关系；3）SIA（stuck
in
active）是路由器陷入主动状态不能收敛的一种情况，可能是复杂的网络结构造成的。&lt;/p&gt;
&lt;h4&gt;&lt;strong&gt;DUAL 算法&lt;/strong&gt;&lt;/h4&gt;
&lt;p&gt;重点在可行性条件和主动状态查询。可行性条件：只有下一跳的 AD 值小于当前路由器的 FD 值时才能被加入到路由表中，只此一句就体现了 EIGRP 的高级之处，这样可以避免环路的产生。主动状态查询：当本地路由器的后继路由器 down 掉，而拓扑表中又没有可行后继路由器，就会把对应的路由置为主动状态，路由器邻居发送查询包来请求到达目的网络的路由，邻居如果有对应路由直接相应请求，如果没有重复这个过程（也就是把自己对应路由置于主动状态继续向外查询），直到找到找到可以到达目的网络的路由或者确定目的网络不可达，然后在沿原路返回响应包，这个过程恰恰形象描述了弥散这种现象。&lt;/p&gt;
&lt;h3&gt;协议执行过程&lt;/h3&gt;
&lt;p&gt;开启 EIGRP 的路由器向所有运行协议的接口发送 hello 包建立邻居，然后相互交换路由信息，之后每台路由器运行 DUAL 算法计算到达每个网络的路由以及备用路由（FS，如果有的话），这样网络达到了收敛的状态，至此不会再定期发送更新，EIGRP 也是唯一个不会发送定期更新的路由协议。当链路出现问题是，也就是对应的路由失效，路由器查看自己是否有备用路由，如果有直接加入路由表，如果没有将路由置于主动状态执行查询过程。&lt;/p&gt;
&lt;h3&gt;通告默认路由&lt;/h3&gt;
&lt;p&gt;在 EIGRP 通告默认路由的方法有三种：1）重定向默认路由；2）添加默认路由，然后通告默认路由（network
0.0.0.0
但是这条命令是通告所有接口，可能不是最优的方法）；3）先通告默认路由的出口网段（network），然后使用 ip
default-network
（主类网络号）通告出口网段，确保路由表中有对应主类网络的路由（正常情况下 EIGRP 会自动产生发往 null 接口的汇总路由，这样确保了路由的稳定性）&lt;/p&gt;
&lt;h3&gt;负载均衡&lt;/h3&gt;
&lt;p&gt;负载均衡包括等价负载均衡和非等价负载均衡。等价负载均衡好理解，就是通过一种路由协议获取的度量值相同的到达目的网络的不同路由，默认是 4 条负载均衡最大支持 6 条负载均衡。非等价负载均衡就是在不等价的路径上执行，前提是所有路由都满足可行性条件（也就是在后继路由和可行后继路由上执行），然后在所有满足如下公式的路由之间执行按比例负载均衡：successor’s
FD &gt; FS’s FD。&lt;/p&gt;
&lt;h3&gt;限制查询范围&lt;/h3&gt;
&lt;p&gt;既然 SIA 拉慢了网络的收敛速度，就要有措施来避免这种状态，通过限制查询的范围可以有效阻止路由器变成 SIA 状态。具体方法无非是发送了直接回应不可达和不发送：1）路由汇总，通过在边界上执行汇总使外界学习不到明细路由，这样外界路由器收到查询包时直接回复不可达也就阻断了查询向外扩散；2）通过将路由器设置为末节路由器，来告诉邻居不要把查询包发给我，我这里得不到你想要的路由，这样也限制了查询的范围。&lt;/p&gt;
&lt;h3&gt;身份验证&lt;/h3&gt;
&lt;p&gt;身份验证的配置比较麻烦，大致总结过程是创建一个密钥链，在上面栓一把钥匙，然后启用 EIGRP 的身份验证，最后把钥匙和身份验证关联。具体命令如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;R1(config)#key chain cisco

R1(config-keychain)#key 1

R1(config-keychain-key)#key-string cisco

R1(config-keychain-key)#int s0/0

R1(config-if)#ip authentication key-chain eigrp 90 cisco

R1(config-if)#ip authentication mode eigrp 90 md5&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意点：&lt;/p&gt;
&lt;p&gt;1）
因为 EIGRP 会自动汇总，一般会关闭自动汇总。而手工汇总在接口上执行，汇总路由的 metric 值是所有路由的最小 metric 值&lt;/p&gt;
&lt;p&gt;2） 凡是打*的都是默认路由，而不是单指 0.0.0.0&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ccnp-summary]]></title><description><![CDATA[为什么总结？ 虽然 np 的学习还没有结束，但由于时间紧迫，我是边学习边总结这份文档的。这个过程让我感触很多：一个是原先学习内容的基础和表层化，感觉 np…]]></description><link>https://xdays.me/CCNP-summary/</link><guid isPermaLink="false">https://xdays.me/CCNP-summary/</guid><pubDate>Wed, 16 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;为什么总结？&lt;/h3&gt;
&lt;p&gt;虽然 np 的学习还没有结束，但由于时间紧迫，我是边学习边总结这份文档的。这个过程让我感触很多：一个是原先学习内容的基础和表层化，感觉 np 的内容更深入更详细化了，也添加了不少新内容；另一个就是总结的必要性，不仅仅是记性不好的原因，而是总结真的能让自己从整体上和更确切的把握所学的知识。&lt;/p&gt;
&lt;h3&gt;总结些什么？&lt;/h3&gt;
&lt;p&gt;因为我是参照着学习指南（BSCI 和 BCMSN）和 wolf 李老师的经典视频学过来的，并没有遵循什么参考大纲之类的。总结的内容主要是按照我的理解和思路来记录每一块内容的相关技术。&lt;/p&gt;
&lt;h3&gt;怎么总结？&lt;/h3&gt;
&lt;p&gt;包括 ccna 的总结以及现在总结的 np 部分都有一个很大的遗憾：没有配置实验和图片说明，而实验却是学习过程中非常重要的一个环节。因为时间紧迫，没有时间和精力一一整理，这里就先贴主要的文字部分吧，希望以后找到工作稳定下来有时间了再一一补上。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VPN-基于pptp的简单配置]]></title><description><![CDATA[上学期用 squid 实现了宿舍不用客户端代理上网，但是如果不是全局代理好多软件不支持代理就有很多限制。这学期对 vpn…]]></description><link>https://xdays.me/VPN-基于pptp的简单配置/</link><guid isPermaLink="false">https://xdays.me/VPN-基于pptp的简单配置/</guid><pubDate>Wed, 02 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上学期用 squid 实现了宿舍不用客户端代理上网，但是如果不是全局代理好多软件不支持代理就有很多限制。这学期对 vpn 有了一点了解，发现这才是解决客户端的终极方法。它类似宽带拨号上网，没有任何限制，并且用户管理方便。但是在一个下午的激情努力下，我终于被教程中的概念搞晕了。因为要抓紧学习 NP 的内容，确实没有很大精力搞这个，所以请周丰杰帮忙，这里表示感谢。这里先把配置记录下，至于这其中的原理和详细过程，我想留待以后研究吧。&lt;/p&gt;
&lt;p&gt;pptp 的运行原理&lt;/p&gt;
&lt;p&gt;实验拓扑图&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2011/03/pptpd-vpn-top.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2011/03/pptpd-vpn-top.jpg&quot; alt=&quot;pptpd-vpn-top&quot; title=&quot;pptpd-vpn-top&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;安装软件包&lt;/p&gt;
&lt;p&gt;需要安装的软件包有 ppp，iptables 和 pptpd，我用的 centos5.5 默认包含了 ppp 和 iptables，在有些没有加载 ppp 模块的系统用 modprobe 挂上 ppp_mppe 模块；另外 pptpd 没有包含在源中，要用 wget
&lt;a href=&quot;http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm%E4%B8%8B%E8%BD%BD%E5%90%8E%E5%AE%89%E8%A3%85%E3%80%82&quot;&gt;http://acelnmp.googlecode.com/files/pptpd-1.3.4-1.rhel5.1.i386.rpm下载后安装。&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;配置 pptpd 服务&lt;/p&gt;
&lt;p&gt;配置如下：&lt;/p&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;--------------pptp.conf--------------//pptpd 的主配置文件&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;option /etc/ppp/options.pptpd 包含 pptp 选项&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;logwtmp&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;localip
192.168.122.1 这里是本地（服务器端的 ip，当客户端拨号成功服务器会生成一个 ppp 接口与之通信，接口地址在这里指定）&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;remoteip 192.168.122.11-130（分配给客户端的地址）&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;---------------chap-secrets----------//用于验证客户端的密码文件，按说明指定&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;# client        server  secret                  IP addresses&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;xdays pptpd xdays *&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;---------------options.pptpd--------//pptpd 选项指定文件&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;name pptpd&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;refuse-pap&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;refuse-chap&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;refuse-mschap&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;require-mschap-v2&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;require-mppe-128&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;proxyarp&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;lock&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;nobsdcomp&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;novj&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;novjccomp&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;nologfd&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;idle 2592000&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;ms-dns 8.8.8.8 指定分配给客户端的 DNS 服务器地址&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;ms-dns 8.8.4.4&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;配置 iptables&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;因为客户端拨进来后要访问外网，所以在服务器这一端还要用 iptables 配 nat，具体规则如下：&lt;/p&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;p&gt;iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j
MASQUERADE 意思是所有来自 192.168.0.0/24 网段的地址都以 eth0 接口的地址伪装然后发送出去。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;相关资料：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://blog.renhao.org/2010/08/build-pptp-vpn-on-centos-5-5/&quot;&gt;http://blog.renhao.org/2010/08/build-pptp-vpn-on-centos-5-5/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[近期随想]]></title><description><![CDATA[…]]></description><link>https://xdays.me/近期随想/</link><guid isPermaLink="false">https://xdays.me/近期随想/</guid><pubDate>Tue, 01 Mar 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;很久没写日志了，可能是随着年龄增长更成熟了不想也没心思写了，这才发现连组织心里所想的能力都已渐渐退化。这两天的心情犹如天气一样寒冷，但最令我郁闷的是我找不到能排解这种心情的方式。既然好久不写，索性这次把要说的写完，也希望落笔之后有一泻千里的爽快，而我要跟着自己的信仰继续前行。&lt;/p&gt;
&lt;p&gt;其实也前也经常心情不好，但是这次不一样，那种感觉只能承受不能转移。于是我问自己：为什么不快乐呢？冒出的几个词是：家庭，工作，毕业设计，孤独，机械，网络。具体说来，一一展开：1）八年的寄人篱下的供养孩子上学的生活让妈妈吃了我无法想象的苦，我要让乡亲们都看着大学毕业的儿子让妈妈过上好日子，而现实是我看不清未来的路，我还不够自信；2）首信的工作是否适合我？在所有人都逃离北上广的时候我却不合时宜的往里挤，我能站住么？但如果放弃这个机会我又能选择什么？3）四年的大学生活我把专业课学的一塌糊涂，但我绝不认为我荒废的四年，我依然相信自己，但是我不得不面对现实，我还要经受毕业设计这个不想迈但又不得不迈的坎，我做了太多不想做但不得不做的事了；4）放假回来我发现我更自闭了，和机房的朋友和舍友都不怎么说话，一个人时就低着头走自己的路，好像生活自己的世界里；5）网络学的还处于半吊子状态，好多东西都忘了，想要复习却静不下来心看，又浮躁了。烦心的事确实不少，加上毕业离别的伤感，所有的一切掺和起来塞在心里，这就是我此刻的心情。&lt;/p&gt;
&lt;p&gt;还是鼓励和安慰一下自己吧！我所作的一切都是因为我相信人不该受外界的阻碍放弃的自己想要做的事，做自己想做的事即使被现实伤的遍体鳞伤依然可以面带微笑感觉幸福，做自己不愿做的事虽然羁绊少些或者能有些骄人的成绩但自己清楚这不是自己想要的生活，我选择前者。对于生活，我觉得平平淡淡就好，昨天和老乡聊天他还说平淡容易丧失动力所以要自己寻找一个平衡点，我的意思是生活应该有一个平淡的心态，然后自己发现生活中的乐趣。说道生活的乐趣，我觉得我每天早上走在去机房的路上都能让我感到幸福：1）看到夹在正冒浓烟的学校锅炉烟囱的太阳；2）一对夫妇用羽毛球的规则踢毽子；3）三五个老太太总是以相同的背景音乐在湖边晨练；4）沿着学校的稷下湖的最靠近湖面那排地板走，恋恋胆儿，呵呵！其实我所追求生活就那么简单。&lt;/p&gt;
&lt;p&gt;写到这心里开朗了，既然有事那就静下心来慢慢做吧，用积极的心态迎接每一天！呵呵，我都会自己安慰自己了！接下来的计划：1）看 CCNP 的视频教程，巩固复习加深理解；2）通过进阶的书籍巩固 linux 的相关知识，再配置一遍相关服务器（包括 VPN）；3）复习然后继续学习 oracle 数据库&lt;/p&gt;</content:encoded></item><item><title><![CDATA[freeradius&mysql简单配置一例]]></title><description><![CDATA[总体说下： 我用的是 ubuntu
server，因为他的强大方便的包管理系统，省了好多脑细胞。总体环境是 lamp +
phpmyadmin +
freeradius，lamp 提供给 freeradius 数据库和 phpmyadmin…]]></description><link>https://xdays.me/Freeradius-and-Mysql简单配置/</link><guid isPermaLink="false">https://xdays.me/Freeradius-and-Mysql简单配置/</guid><pubDate>Thu, 20 Jan 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;总体说下：&lt;/p&gt;
&lt;p&gt;我用的是 ubuntu
server，因为他的强大方便的包管理系统，省了好多脑细胞。总体环境是 lamp +
phpmyadmin +
freeradius，lamp 提供给 freeradius 数据库和 phpmyadmin 运行的环境。这里我仅仅实现了基本的功能就是认证，拿的思科交换机开启 aaa 功能测试，也就是客户端登录交换机先通过 freeradius 的认证，通过即可操作交换机否则拒绝。&lt;/p&gt;
&lt;p&gt;引用一张图：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2011/01/AAAbs.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2011/01/AAAbs-1024x804.jpg&quot; alt=&quot;aaacs&quot; title=&quot;aaacs&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;基于 C/S 架构，只是这里数据库和 freeradius 放一台上了。&lt;/p&gt;
&lt;p&gt;开始安装：&lt;/p&gt;
&lt;p&gt;1）安装 lamp&lt;/p&gt;
&lt;p&gt;安装系统的时候直接选上 lamp 环境就行了，需要设置一个 mysql 密码（这里是 thinkin）&lt;/p&gt;
&lt;p&gt;2）安装 phpmyadmin&lt;/p&gt;
&lt;p&gt;apt-get install
phpmyadmin，安装过程时让设置个管理 phpmyadmin 自身数据库的密码（还是 thinkin，其实也没大用处，没考虑安全，直接用的 root）&lt;/p&gt;
&lt;p&gt;3）安装 freeradius&lt;/p&gt;
&lt;p&gt;apt-get intall freeradius
freeradius-sql（数据库模块），默认安装没什么问题&lt;/p&gt;
&lt;p&gt;开始配置：&lt;/p&gt;
&lt;p&gt;首先列举下需要配置的文件 radiusd.conf（主配置文件，其他文件都是通过@INCLUDE 包含进来的），client.conf（NAS 网络接入服务器，对于 freeradius 来说是客户端的配置文件），sql.conf（数据库相关的配置文件），sites-available/default（默认虚拟主机的配置文件），再者就是 mysql 数据库中的数据了下面是具体每个文件需要修改的地方：&lt;/p&gt;
&lt;p&gt;1）radiusd.conf：找到$INCLUDE
sql.conf 这一行去掉前面的注释，把 sql.conf 的相关配置包含进来&lt;/p&gt;
&lt;p&gt;2）sql.conf：找到如下两行：&lt;/p&gt;
&lt;p&gt;login = “radius”&lt;/p&gt;
&lt;p&gt;password = “radpass”修改为：&lt;/p&gt;
&lt;p&gt;login = “root”&lt;/p&gt;
&lt;p&gt;password = “thinkin”其他的默认&lt;/p&gt;
&lt;p&gt;3）sites-available/default：去掉 authorize {}（授权）和 accounting
{}（记账）中的 sql 一行前的#，对于认证 authenticate
（认证）{}字段中 sql 已经开启&lt;/p&gt;
&lt;p&gt;4）创建导入 mysql 数据库&lt;/p&gt;
&lt;p&gt;#mysql –u root –p&lt;/p&gt;
&lt;p&gt;#create database
radius（也可用 phpmyadmin，但是这里的数据库名必须是 radius，和 sql.conf 对应的）&lt;/p&gt;
&lt;p&gt;#mysql –u root –p &amp;#x3C;
/etc/freeradius/sql/mysql/schema.sql（导入数据库模板）&lt;/p&gt;
&lt;p&gt;#insert into radius  (username,attribute,op,value)  values (0,’test’,’
User-Password’,’ :=’,’test’);（添加一个测试用户）后续的添加类似。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[思科实验模拟器GNS3使用总结]]></title><description><![CDATA[实验模拟器除了 packet
tracer 我学习过 dynamips 和 dynagen，在我总结 dynagen 时已经提高基本上所有这些通过加载真实设备 IOS 的模拟器都是基于 dynamips 的，是它提供了供 iso…]]></description><link>https://xdays.me/思科实验模拟器gns3使用总结/</link><guid isPermaLink="false">https://xdays.me/思科实验模拟器gns3使用总结/</guid><pubDate>Tue, 04 Jan 2011 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;实验模拟器除了 packet
tracer 我学习过 dynamips 和 dynagen，在我总结 dynagen 时已经提高基本上所有这些通过加载真实设备 IOS 的模拟器都是基于 dynamips 的，是它提供了供 iso 运行的环境，然后其他的软件就是让用户界面更有好些，相比 dynagen 的命令行 GNS3 的图形界面就更有好了，操作更方便了。对于 GNS3 的学习基本上自己摸索出来的，可以自己用图形界面配置了然后看看对配置文件产生了哪些更改从而对软件的运行有更深的了解。&lt;/p&gt;
&lt;p&gt;什么是 GNS3？&lt;/p&gt;
&lt;p&gt;基于图形界面的网络设备模拟器，可以模拟思科路由器、交换机（路由的交换模块）、PIX 和 ASA 等设备，最大的优势是加载真实的 ios 镜像文件，命令和配置和真实设备一样。它是一下三个组件的集合：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;dynamips   提供 ios 的运行环境&lt;/li&gt;
&lt;li&gt;dynagen   基于文本的 dynamips 的前端界面&lt;/li&gt;
&lt;li&gt;qemu   图形界面的设备模拟器，虚拟机&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GNS3 的配置文件在哪？&lt;/p&gt;
&lt;p&gt;GNS3 的配置文件主要包括两个部分，一个是软件的配置文件，在 edit-&gt;preferences 下可以看到配置文件在 C:Documents
and SettingsAdministratorApplication
Data 下的 gns3.ini，这个文件主要负责软件的全局配置比如 dynamips 和 qemu 的运行参数以及可以加载的 ios 的相关配置；另一个是工程（project）的相关配置，实际上就是相对 dynagen 的 net 文件也是拓扑的核心文件，这里面的配置选项不细列举了，可以参考 dynagen 的文档有关于这些选项的详细配置，其中几个比较关键的部分：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;workingdir = D:GNS3top..tmp  —&gt;
指定工作目录，所有产生的临时文件都放于这个目录下&lt;/li&gt;
&lt;li&gt;cnfg = D:GNS3confccnpP1R2.cfg  —&gt;
指定配置文件，当在路由器上执行了配置并保存，配置文件中就会有这条指令，下次再载入路由器自动导入相应配置，减少劳动力，所以这是一个很好的特性。但是有时候我们需要在不同环境对对相同的拓扑加载不同的配置，这时候如果配置文件自动加载了就不能再加载不同的配置文件，所以需要用#注释掉响应的配置文件选项。&lt;/li&gt;
&lt;li&gt;其他的由软件自动生成就可以不需要动&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;GNS3 的配置配置建议？&lt;/p&gt;
&lt;p&gt;实际上 GNS3 是绿色软件，唯一不够绿的地方就是软件的配置文件在 C:Documents
and SettingsAdministratorApplication
Data 不能更改，如果要移动 GNS3 需要把这个文件也转移了。下面是我对 GNS3 配置的心得：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;在软件根目录下新建 img（存放镜像文件）、top（存放工程文件也就是拓扑文件也就是 net 文件）、conf（针对相同拓扑不同配置环境的不同配置）、tmp（临时文件目录存放各种临时文件）&lt;/li&gt;
&lt;li&gt;将 dynamips、qemu 和抓包工具 wireshark 的临时文件目录都指向 tmp 文件&lt;/li&gt;
&lt;li&gt;将 image directory 指向 img 目录，project directory 指向 top 目录&lt;/li&gt;
&lt;li&gt;路由器 ios 镜像设置建议用 3640，分配 96M 内存，1G 内存跑五六个路由器不成问题&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;另外推荐一个鸿鹄的详细的 GNS3 视频教程&lt;a href=&quot;http://bbs.hh010.com/forum.php?mod=viewthread&amp;#x26;tid=36653&amp;#x26;highlight=gns3&quot;&gt;http://bbs.hh010.com/forum.php?mod=viewthread&amp;#x26;tid=36653&amp;#x26;highlight=gns3&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux-LVM]]></title><description><![CDATA[什么是 lvm？ lvm 即 logical volume
management（逻辑卷管理），是一种灵活组织磁盘和分区的方式，最大的优势在于可以打破磁盘和分区的界限随意的拓展逻辑卷的大小。原先如果分区不够用了只能备份数据重新分区再还原数据，而使用 lvm…]]></description><link>https://xdays.me/Linux-lvm/</link><guid isPermaLink="false">https://xdays.me/Linux-lvm/</guid><pubDate>Mon, 27 Dec 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;什么是 lvm？&lt;/h1&gt;
&lt;p&gt;lvm 即 logical volume
management（逻辑卷管理），是一种灵活组织磁盘和分区的方式，最大的优势在于可以打破磁盘和分区的界限随意的拓展逻辑卷的大小。原先如果分区不够用了只能备份数据重新分区再还原数据，而使用 lvm 可以动态的放大一个卷甚至也不需要 umount 下来直接在线拓展分区大小，这对于服务器来说是很不错的功能。&lt;/p&gt;
&lt;h1&gt;lvm 是如何工作的？&lt;/h1&gt;
&lt;p&gt;首先了解几个概念： *
pv（物理卷）用于创建 vg（逻辑卷组）的卷，需要将普通分区的类型改成 8e。 *
vg（逻辑卷组）由多个物理卷组成一个大的卷，可以把他想象成一个磁盘，只是这个磁盘时逻辑上的跨越了物理磁盘和分区。 * lv（逻辑卷）在 vg 上创建的逻辑卷，可以想象成 vg 的分区。
然后，lv 大小的更改是通过增减 pe 实现的，pe 是 vg 和 lv 的基本单位，vg 通过在添加的 pv 上创建 pe 来增加自身大小，然后通过增减分配给 lv 的 pe 数来控制 lv 的大小，基本原理图如下：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/12/lvm.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/12/lvm.jpg&quot; alt=&quot;lvm&quot; title=&quot;lvm&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h1&gt;相关命令有哪些？&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;物理分区相关：fdisk pv 相关：pvcreate，pvscan，pvdispaly，pvremove&lt;/li&gt;
&lt;li&gt;vg 相关：vgcreate，vgscan，vgdisplay，vgextend，vgreduce，vgchange，vgremove&lt;/li&gt;
&lt;li&gt;lv 相关：lvcreate，lvscan，lvdisplay，lvextend，lvreduce，lvremove，lvresize&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;如何创建逻辑卷以及调整逻辑卷大小？&lt;/h1&gt;
&lt;p&gt;下面是一个全程实例演示了如何创建，扩大和缩小 lv&lt;/p&gt;
&lt;h2&gt;分区并更改分区类型&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# fdisk /dev/hda

The number of cylinders for this disk is set to 19929.
There is nothing wrong with that, but this is larger than 1024,
and could in certain setups cause problems with:
1) software that runs at boot time (e.g., old versions of LILO)
2) booting and partitioning software from other OSs
(e.g., DOS FDISK, OS/2 FDISK)
Command (m for help): m
Command action
a toggle a bootable flag
b edit bsd disklabel
c toggle the dos compatibility flag
d delete a partition
l list known partition types
m print this menu
n add a new partition
o create a new empty DOS partition table
p print the partition table
q quit without saving changes
s create a new empty Sun disklabel
t change a partition’s system id
u change display/entry units
v verify the partition table
w write table to disk and exit
x extra functionality (experts only)
Command (m for help): p
Disk /dev/hda: 163.9 GB, 163928604672 bytes
255 heads, 63 sectors/track, 19929 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 2432 19535008+ 83 Linux
/dev/hda2 2433 4864 19535040 83 Linux
/dev/hda3 4865 19696 119138040 83 Linux
/dev/hda4 19697 19929 1871572+ 82 Linux swap / Solaris
Command (m for help): d
Partition number (1-5): 3
Command (m for help): p
Disk /dev/hda: 163.9 GB, 163928604672 bytes
255 heads, 63 sectors/track, 19929 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 2432 19535008+ 83 Linux
/dev/hda2 2433 4864 19535040 83 Linux
/dev/hda4 19697 19929 1871572+ 82 Linux swap / Solaris
Command (m for help): n
Command action
e extended
p primary partition (1-4)
e
Selected partition 3
First cylinder (4865-19929, default 4865):
Using default value 4865
Last cylinder or +size or +sizeM or +sizeK (4865-19696, default 19696):
Using default value 19696
Command (m for help): p
Disk /dev/hda: 163.9 GB, 163928604672 bytes
255 heads, 63 sectors/track, 19929 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 2432 19535008+ 83 Linux
/dev/hda2 2433 4864 19535040 83 Linux
/dev/hda3 4865 19696 119138040 5 Extended
/dev/hda4 19697 19929 1871572+ 82 Linux swap / Solaris
Command (m for help): n
First cylinder (4865-19696, default 4865):
Using default value 4865
Last cylinder or +size or +sizeM or +sizeK (4865-19696, default 19696): +20000M
Command (m for help): p
Disk /dev/hda: 163.9 GB, 163928604672 bytes
255 heads, 63 sectors/track, 19929 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 2432 19535008+ 83 Linux
/dev/hda2 2433 4864 19535040 83 Linux
/dev/hda3 4865 19696 119138040 5 Extended
/dev/hda4 19697 19929 1871572+ 82 Linux swap / Solaris
/dev/hda5 4865 7297 19543041 83 Linux
Command (m for help): n
First cylinder (7298-19696, default 7298):
Using default value 7298
Last cylinder or +size or +sizeM or +sizeK (7298-19696, default 19696): +20000M
Command (m for help): t
Partition number (1-6): 5
Hex code (type L to list codes): L
0 Empty 1e Hidden W95 FAT1 80 Old Minix bf Solaris
1 FAT12 24 NEC DOS 81 Minix / old Lin c1 DRDOS/sec (FAT-
2 XENIX root 39 Plan 9 82 Linux swap / So c4 DRDOS/sec (FAT-
3 XENIX usr 3c PartitionMagic 83 Linux c6 DRDOS/sec (FAT-
4 FAT16 5 Extended 41 PPC PReP Boot 85 Linux extended da Non-FS data
6 FAT16 42 SFS 86 NTFS volume set db CP/M / CTOS / .
7 HPFS/NTFS 4d QNX4.x 87 NTFS volume set de Dell Utility
8 AIX 4e QNX4.x 2nd part 88 Linux plaintext df BootIt
9 AIX bootable 4f QNX4.x 3rd part 8e Linux LVM e1 DOS access
a OS/2 Boot Manag 50 OnTrack DM 93 Amoeba e3 DOS R/O
b W95 FAT32 51 OnTrack DM6 Aux 94 Amoeba BBT e4 SpeedStor
c W95 FAT32 (LBA) 52 CP/M 9f BSD/OS eb BeOS fs
e W95 FAT16 (LBA) 53 OnTrack DM6 Aux a0 IBM Thinkpad hi ee EFI GPT
f W95 Ext’d (LBA) 54 OnTrackDM6 a5 FreeBSD ef EFI (FAT-12/16/
10 OPUS 55 EZ-Drive a6 OpenBSD f0 Linux/PA-RISC b
11 Hidden FAT12 56 Golden Bow a7 NeXTSTEP f1 SpeedStor
12 Compaq diagnost 5c Priam Edisk a8 Darwin UFS f4 SpeedStor
14 Hidden FAT16 16 Hidden FAT16 63 GNU HURD or Sys ab Darwin boot fb VMware VMFS
17 Hidden HPFS/NTF 64 Novell Netware b7 BSDI fs fc VMware VMKCORE
18 AST SmartSleep 65 Novell Netware b8 BSDI swap fd Linux raid auto
1b Hidden W95 FAT3 70 DiskSecure Mult bb Boot Wizard hid fe LANstep
1c Hidden W95 FAT3 75 PC/IX be Solaris boot ff BBT
Hex code (type L to list codes): 8e *将文件系统类型改为LVM*
Changed system type of partition 5 to 8e (Linux LVM)
Command (m for help): t
Partition number (1-6): 6
Hex code (type L to list codes): 8e
Changed system type of partition 6 to 8e (Linux LVM)
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 16: Device or
resource busy.
The kernel still uses the old table.
The new table will be used at the next reboot.
Syncing disks.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;更新磁盘分区表&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# partprobe
Warning: Unable to open /dev/fd0 read-write (Read-only file system). /dev/fd0
has been opened read-only.
[root@localhost ~]# fdisk -l
Disk /dev/hda: 163.9 GB, 163928604672 bytes
255 heads, 63 sectors/track, 19929 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/hda1 * 1 2432 19535008+ 83 Linux
/dev/hda2 2433 4864 19535040 83 Linux
/dev/hda3 4865 19696 119138040 5 Extended
/dev/hda4 19697 19929 1871572+ 82 Linux swap / Solaris
/dev/hda5 4865 7297 19543041 8e Linux LVM
/dev/hda6 7298 9730 19543041 8e Linux LVM&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;创建物理卷&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# pvcreate /dev/hda{5,6}
Physical volume “/dev/hda5″ successfully created
Physical volume “/dev/hda6″ successfully created
[root@localhost ~]# pvscan
PV /dev/hda5 lvm2 [18.64 GB]
PV /dev/hda6 lvm2 [18.64 GB]
Total: 2 [37.28 GB] / in use: 0 [0 ] / in no VG: 2 [37.28 GB]
[root@localhost ~]# pvdisplay
“/dev/hda5″ is a new physical volume of “18.64 GB”
— NEW Physical volume —
PV Name /dev/hda5
VG Name
PV Size 18.64 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID J7pxmO-KO3K-CzpG-LIwW-loFF-0FV9-eSGlDD
“/dev/hda6″ is a new physical volume of “18.64 GB”
— NEW Physical volume —
PV Name /dev/hda6
VG Name
PV Size 18.64 GB
Allocatable NO
PE Size (KByte) 0
Total PE 0 还没有划分PE
Free PE 0
Allocated PE 0
PV UUID sx2xgb-i6OW-G1OS-7VHu-yUc7-K18e-mHXfo6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;创建 vg&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# vgcreate -s 16M ftpvg /dev/hda{5,6}
Volume group “ftpvg” successfully created
[root@localhost ~]# vgscan
Reading all physical volumes. This may take a while…
Found volume group “ftpvg” using metadata type lvm2
[root@localhost ~]# pvscan
PV /dev/hda5 VG ftpvg lvm2 [18.62 GB / 18.62 GB free]
PV /dev/hda6 VG ftpvg lvm2 [18.62 GB / 18.62 GB free]
Total: 2 [37.25 GB] / in use: 2 [37.25 GB] / in no VG: 0 [0 ]&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;查看 vg 信息&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# vgdisplay
— Volume group —
VG Name ftpvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 37.25 GB
PE Size 16.00 MB
Total PE 2384 已经划分了PE
Alloc PE / Size 0 / 0
Free PE / Size 2384 / 37.25 GB
VG UUID OznWAr-uGaq-pLPy-OvkQ-MiS1-NDvk-bVAg1J&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;创建 lv&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# lvcreate -L 30G -n ftplv ftpvg
Logical volume “ftplv” created
[root@localhost ~]# vgdisplay
— Volume group —
VG Name ftpvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 2
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 0
Max PV 0
Cur PV 2
Act PV 2
VG Size 37.25 GB
PE Size 16.00 MB
Total PE 2384
Alloc PE / Size 1920 / 30.00 GB
Free PE / Size 464 / 7.25 GB
VG UUID OznWAr-uGaq-pLPy-OvkQ-MiS1-NDvk-bVAg1J&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;在 lv 上创建文件系统&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# mkfs -t ext3 /dev/ftpvg/ftplv
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
3932160 inodes, 7864320 blocks
393216 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=0
240 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208,
4096000
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 36 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;挂载文件系统写入文件&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# mount /dev/ftpvg/ftplv /var/ftp/
[root@localhost ~]# ls
anaconda-ks.cfg Desktop ftp install.log install.log.syslog www.tgz
[root@localhost ~]# cp www.tgz /var/ftp/
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 19G 7.0G 11G 41% /
/dev/hda2 19G 2.0G 16G 12% /usr
tmpfs 252M 0 252M 0% /dev/shm
/dev/mapper/ftpvg-ftplv
30G 528M 28G 2% /var/ftp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;调整 lv 大小（按 pe 数扩大）&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# lvresize -l +464 /dev/ftpvg/ftplv
Extending logical volume ftplv to 37.25 GB
Logical volume ftplv successfully resized
[root@localhost ~]# vgdisplay
— Volume group —
VG Name ftpvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 37.25 GB
PE Size 16.00 MB
Total PE 2384
Alloc PE / Size 2384 / 37.25 GB
Free PE / Size 0 / 0 这里空闲的pe已经被使用
VG UUID OznWAr-uGaq-pLPy-OvkQ-MiS1-NDvk-bVAg1J
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/ftpvg/ftplv
VG Name ftpvg
LV UUID HwZweC-La3M-8kUw-DXRB-7O62-DW7X-hIMRbM
LV Write Access read/write
LV Status available
# open 1
LV Size 37.25 GB
Current LE 2384
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 19G 7.0G 11G 41% /
/dev/hda2 19G 2.0G 16G 12% /usr
tmpfs 252M 0 252M 0% /dev/shm
/dev/mapper/ftpvg-ftplv
30G 528M 28G 2% /var/ftp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;调整文件系统大小&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# resize2fs /dev/ftpvg/ftplv
resize2fs 1.39 (29-May-2006)
Filesystem at /dev/ftpvg/ftplv is mounted on /var/ftp; on-line resizing
required
Performing an on-line resize of /dev/ftpvg/ftplv to 9764864 (4k) blocks.
The filesystem on /dev/ftpvg/ftplv is now 9764864 blocks long.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 19G 7.0G 11G 41% /
/dev/hda2 19G 2.0G 16G 12% /usr
tmpfs 252M 0 252M 0% /dev/shm
/dev/mapper/ftpvg-ftplv
37G 532M 35G 2% /var/ftp&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;所有工作都是在没有 umount 文件系统前提下在线完成的，这也是 lvm 的强大之处&lt;/p&gt;
&lt;h2&gt;卸载逻辑卷&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# umount /var/ftp/ 放大lv可以在线进行，而缩小lv则要umount后进行
[root@localhost ~]# pvscan
PV /dev/hda5 VG ftpvg lvm2 [18.62 GB / 0 free]
PV /dev/hda6 VG ftpvg lvm2 [18.62 GB / 0 free]
Total: 2 [37.25 GB] / in use: 2 [37.25 GB] / in no VG: 0 [0 ]
You have new mail in /var/spool/mail/root&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;扫描 lv&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# e2fsck -f /dev/ftpvg/ftplv
e2fsck 1.39 (29-May-2006)
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Pass 5: Checking group summary information
/dev/ftpvg/ftplv: 12/4882432 files (8.3% non-contiguous), 289173/9764864 blocks
[root@localhost ~]# resize2fs /dev/ftpvg/ftplv 30000M 缩小文件系统大小
resize2fs 1.39 (29-May-2006)
Resizing the filesystem on /dev/ftpvg/ftplv to 7680000 (4k) blocks.
The filesystem on /dev/ftpvg/ftplv is now 7680000 blocks long.
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 19G 7.0G 11G 41% /
/dev/hda2 19G 2.0G 16G 12% /usr
tmpfs 252M 0 252M 0% /dev/shm
[root@localhost ~]# mount /dev/ftpvg/ftplv /var/ftp/ 再挂在上看到确实缩小了，但是lv还没有缩小
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 19G 7.0G 11G 41% /
/dev/hda2 19G 2.0G 16G 12% /usr
tmpfs 252M 0 252M 0% /dev/shm
/dev/mapper/ftpvg-ftplv
29G 528M 28G 2% /var/ftp
[root@localhost ~]# ls /var/ftp/
lost+found www.tgz
[root@localhost ~]# vgdisplay
— Volume group —
VG Name ftpvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 3
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 37.25 GB
PE Size 16.00 MB
Total PE 2384
Alloc PE / Size 2384 / 37.25 GB
Free PE / Size 0 / 0 由于lv没有缩小，这里的pe还是被全部使用
VG UUID OznWAr-uGaq-pLPy-OvkQ-MiS1-NDvk-bVAg1J
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/ftpvg/ftplv
VG Name ftpvg
LV UUID HwZweC-La3M-8kUw-DXRB-7O62-DW7X-hIMRbM
LV Write Access read/write
LV Status available
# open 1
LV Size 37.25 GB 可以看到lv没有缩小
Current LE 2384
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;缩小 lv&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# lvresize -l -464 /dev/ftpvg/ftplv
WARNING: Reducing active and open logical volume to 30.00 GB
THIS MAY DESTROY YOUR DATA (filesystem etc.)
Do you really want to reduce ftplv? [y/n]: y
Reducing logical volume ftplv to 30.00 GB
Logical volume ftplv successfully resized
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/ftpvg/ftplv
VG Name ftpvg
LV UUID HwZweC-La3M-8kUw-DXRB-7O62-DW7X-hIMRbM
LV Write Access read/write
LV Status available
# open 1
LV Size 30.00 GB
Current LE 1920
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
[root@localhost ~]# vgdisplay
— Volume group —
VG Name ftpvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 4
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 1
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 37.25 GB
PE Size 16.00 MB
Total PE 2384
Alloc PE / Size 1920 / 30.00 GB
Free PE / Size 464 / 7.25 GB 由于lv的缩小，vg里也有了剩余的pe
VG UUID OznWAr-uGaq-pLPy-OvkQ-MiS1-NDvk-bVAg1J
[root@localhost ~]# pvdisplay
— Physical volume —
PV Name /dev/hda5
VG Name ftpvg
PV Size 18.64 GB / not usable 13.00 MB
Allocatable yes (but full)
PE Size (KByte) 16384
Total PE 1192
Free PE 0
Allocated PE 1192
PV UUID J7pxmO-KO3K-CzpG-LIwW-loFF-0FV9-eSGlDD
— Physical volume —
PV Name /dev/hda6
VG Name ftpvg
PV Size 18.64 GB / not usable 13.00 MB
Allocatable yes
PE Size (KByte) 16384
Total PE 1192
Free PE 464 这是vg中没有使用的pe对应的pv中没有使用的pe
Allocated PE 728
PV UUID sx2xgb-i6OW-G1OS-7VHu-yUc7-K18e-mHXfo6&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;新建一个 lv,过程一样&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;[root@localhost ~]# lvcreate -l 464 -n wwwlv ftpvg
Logical volume “wwwlv” created
[root@localhost ~]# vgdisplay
— Volume group —
VG Name ftpvg
System ID
Format lvm2
Metadata Areas 2
Metadata Sequence No 5
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 2
Open LV 1
Max PV 0
Cur PV 2
Act PV 2
VG Size 37.25 GB
PE Size 16.00 MB
Total PE 2384
Alloc PE / Size 2384 / 37.25 GB
Free PE / Size 0 / 0
VG UUID OznWAr-uGaq-pLPy-OvkQ-MiS1-NDvk-bVAg1J
[root@localhost ~]# lvdisplay
— Logical volume —
LV Name /dev/ftpvg/ftplv
VG Name ftpvg
LV UUID HwZweC-La3M-8kUw-DXRB-7O62-DW7X-hIMRbM
LV Write Access read/write
LV Status available
# open 1
LV Size 30.00 GB
Current LE 1920
Segments 2
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:0
— Logical volume —
LV Name /dev/ftpvg/wwwlv
VG Name ftpvg
LV UUID P5RH8f-Apyo-Bi36-gXkG-kvv0-ErQp-0YlxLu
LV Write Access read/write
LV Status available
# open 0
LV Size 7.25 GB
Current LE 464
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253:1
[root@localhost ~]# mkfs -t ext3 /dev/ftpvg/wwwlv
mke2fs 1.39 (29-May-2006)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
950272 inodes, 1900544 blocks
95027 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=1946157056
58 block groups
32768 blocks per group, 32768 fragments per group
16384 inodes per group
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632
Writing inode tables: done
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 33 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[root@localhost ~]# mkdir /var/www
[root@localhost ~]# mount /dev/ftpvg/wwwlv /var/www/
[root@localhost ~]# ls /var/www/
lost+found
[root@localhost ~]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/hda1 19G 7.0G 11G 41% /
/dev/hda2 19G 2.0G 16G 12% /usr
tmpfs 252M 0 252M 0% /dev/shm
/dev/mapper/ftpvg-ftplv
29G 528M 28G 2% /var/ftp
/dev/mapper/ftpvg-wwwlv
7.2G 145M 6.7G 3% /var/www&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;至此实例演示完成，没有演示到的是用 vgextend 和 vgreduce 命令增减 pv。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[虚拟3D桌面-Deskspace]]></title><description><![CDATA[DeskSpace 是一个非常炫的虚拟桌面软件，它以 3D 方块旋转的方式来切换 6 个虚拟桌面。这个软件最大的特色有如下两点： （1）各个虚拟桌面可以独立定制壁纸和桌面图标和文件，这样就可以单独的把一个虚拟桌面打造成工作界面，把其他的做成娱乐或其他专用桌面。 （…]]></description><link>https://xdays.me/虚拟3d桌面-deskspace/</link><guid isPermaLink="false">https://xdays.me/虚拟3d桌面-deskspace/</guid><pubDate>Sat, 25 Dec 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;DeskSpace 是一个非常炫的虚拟桌面软件，它以 3D 方块旋转的方式来切换 6 个虚拟桌面。这个软件最大的特色有如下两点：&lt;/p&gt;
&lt;p&gt;（1）各个虚拟桌面可以独立定制壁纸和桌面图标和文件，这样就可以单独的把一个虚拟桌面打造成工作界面，把其他的做成娱乐或其他专用桌面。&lt;/p&gt;
&lt;p&gt;（2）支持拖拽，如果想把一个程序移动到其他桌面只需要将程序窗口拖拽到桌面边缘，桌面自动切换到其他桌面。&lt;/p&gt;
&lt;p&gt;另外自定义快捷键实现快捷切换，喜欢与 linux 下的虚拟终端，我将虚拟桌面的快捷键设置为 alt&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;F1~F6&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;效果图一张：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/12/3d-deskspace.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/12/3d-deskspace.jpg&quot; alt=&quot;3d-deskspace&quot; title=&quot;3d-deskspace&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;下载地址：&lt;a href=&quot;http://www.xdowns.com/soft/xdowns2009.asp?softid=39126&amp;#x26;downid=5&amp;#x26;id=41441&quot;&gt;http://www.xdowns.com/soft/xdowns2009.asp?softid=39126&amp;#x26;downid=5&amp;#x26;id=41441&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[cups打印服务器]]></title><description><![CDATA[机房里有一台老师淘汰下来的打印机，虽然旧了些但是打印质量没什么问题。近日有一想法，建立共享打印机，也就是机房内所有主机（windows 和 linux）都能通过这台打印机打印。现有的条件是一台奔四主机做服务器（debian5.0 系统），一台 USB 接口打印机，windows…]]></description><link>https://xdays.me/CUPS打印服务器/</link><guid isPermaLink="false">https://xdays.me/CUPS打印服务器/</guid><pubDate>Fri, 03 Dec 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;机房里有一台老师淘汰下来的打印机，虽然旧了些但是打印质量没什么问题。近日有一想法，建立共享打印机，也就是机房内所有主机（windows 和 linux）都能通过这台打印机打印。现有的条件是一台奔四主机做服务器（debian5.0 系统），一台 USB 接口打印机，windows 客户机。&lt;/p&gt;
&lt;p&gt;什么是 CUPS？&lt;/p&gt;
&lt;p&gt;通用 UNIX 打印系统，它能支持 IPP，LPD 和 SMB 协议，同时提供友好的管理界面，在 windows 下添加网络打印机也十分方便；同时，CUPS 还提供了验证管理功能，控制共享打印机的使用范围（来源 IP 和验证等）&lt;/p&gt;
&lt;p&gt;安装 CUPS？&lt;/p&gt;
&lt;p&gt;debian 系统得益于 apt，安装十分简单，命令如下：&lt;/p&gt;
&lt;p&gt;#apt-get instll cups
  安装过程可能提示设置 samba 域名默认即可，以及是否需要通过 dhcp 提供 wins 信息这里选否。&lt;/p&gt;
&lt;p&gt;配置 CUPS？&lt;/p&gt;
&lt;p&gt;配置文件格式非常类似于 apache 的配置文件风格。&lt;/p&gt;
&lt;p&gt;监听端口默认是只监听 localhost，而我的 debian 没有图形界面，虽然可以用 links 但是还是不如图形界面友好。这里可以将将监听该做如下行：&lt;/p&gt;
&lt;p&gt;Listen *.631&lt;/p&gt;
&lt;p&gt;下面是针对特定目录的设置，主要就是权限方面的设置，在各个段内添加如下行以允许本地主机通过 web 管理：&lt;/p&gt;
&lt;p&gt;Allow your.ip.address.here&lt;/p&gt;
&lt;p&gt;这样基本的 CUPS 就完成了。&lt;/p&gt;
&lt;p&gt;windows 如何添加网络共享打印机？&lt;/p&gt;
&lt;p&gt;网上邻居-&gt;打印机和传真-&gt;添加打印机-&gt;网络打印机或连接到其他计算机的打印机-&gt;填写 URL（注意这里的 url 格式是&lt;a href=&quot;http://ip:port/printers/printer-name%EF%BC%89-%5C%3E%E9%80%89%E6%8B%A9%E9%A9%B1%E5%8A%A8%E7%A8%8B%E5%BA%8F-%5C%3E%E5%AE%8C%E6%88%90&quot;&gt;http://ip:port/printers/printer-name）-\&gt;选择驱动程序-\&gt;完成&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考链接&lt;/p&gt;
&lt;p&gt;官方文档：&lt;a href=&quot;http://www.cups.org/index.php&quot;&gt;http://www.cups.org/index.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;debianwiki：&lt;a href=&quot;http://wiki.debian.org/SystemPrinting&quot;&gt;http://wiki.debian.org/SystemPrinting&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[网络监控cacti初探]]></title><description><![CDATA[什么是 cacti？ cacti 是一个套基于 lamp 的网络流量监控软件，也可以监控服务器状态等方面。它是由 php 编写的完全基于 web 管理，而且可以安装插件来扩展其功能和监控对象的范围，有做好的模板可供使用简化了配置。 cacti 有哪些组成部分？ cacti…]]></description><link>https://xdays.me/网络监控cacti初探/</link><guid isPermaLink="false">https://xdays.me/网络监控cacti初探/</guid><pubDate>Thu, 02 Dec 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;什么是 cacti？&lt;/p&gt;
&lt;p&gt;cacti 是一个套基于 lamp 的网络流量监控软件，也可以监控服务器状态等方面。它是由 php 编写的完全基于 web 管理，而且可以安装插件来扩展其功能和监控对象的范围，有做好的模板可供使用简化了配置。&lt;/p&gt;
&lt;p&gt;cacti 有哪些组成部分？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/12/cacti-componets.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/12/cacti-componets.jpg&quot; alt=&quot;cacti-componets&quot; title=&quot;cacti-componets&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;由上图可以看出，cacti 是调用 mysql,rrdtool,net-snmp 来实现监控的，net-snmp 定时轮询设备采集信息，将采集的信息写入 rrd 文件中，而 mysql 负责记录这些数据的对应关系以及其他相关的配置信息。当用户请求查看相应设备流量时，cacti 查询 mysql 然后调用 rrdtool 来完成绘图。&lt;/p&gt;
&lt;p&gt;如何安装配置？&lt;/p&gt;
&lt;p&gt;关于安装可以参考官方手册，具体见参考链接。对于配置，大体上是先建立设备，然后添加相应的模板，然后创建相应的图形，最后再编辑一下自己的监控列表树。&lt;/p&gt;
&lt;p&gt;下面附张效果图：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/12/cacti-monitor.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/12/cacti-monitor.jpg&quot; alt=&quot;cacti-monitor&quot; title=&quot;cacti-monitor&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;官方手册从安装到配置&lt;a href=&quot;http://docs.cacti.net/manual:087&quot;&gt;http://docs.cacti.net/manual:087&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;中文文档&lt;a href=&quot;http://www.docin.com/p-12395104.html&quot;&gt;http://www.docin.com/p-12395104.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;详细的中文文档&lt;a href=&quot;http://www.docin.com/p-47052887.html&quot;&gt;http://www.docin.com/p-47052887.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LNMP 基础配置]]></title><description><![CDATA[注：本文知识搭建了基本环境，仅供测试用，具体详细的安装配置见参考链接。 简介 lnmp 是 linux+nginx+mysql+{php |
python}的缩写，是堪比 lamp 的另一种 web 服务器平台。nginx 相比 apache…]]></description><link>https://xdays.me/LNMP-基础配置/</link><guid isPermaLink="false">https://xdays.me/LNMP-基础配置/</guid><pubDate>Sun, 28 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;注：本文知识搭建了基本环境，仅供测试用，具体详细的安装配置见参考链接。&lt;/p&gt;
&lt;h1&gt;简介&lt;/h1&gt;
&lt;p&gt;lnmp 是 linux+nginx+mysql+{php |
python}的缩写，是堪比 lamp 的另一种 web 服务器平台。nginx 相比 apache 的优点有：小巧，速度快，占用内存小。据介绍 nginx 和 apache 的工作方式的类比如下：你要去大学宿舍找个同学，nginx 阿姨那里有个名单她只告诉你你同学在那个房间，而 apache 阿姨要带着你去找你那个同学，效率高低显而易见。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;p&gt;一开始我已经强调这只是一个搭建一个测试环境，所以我用 debian 系统的 apt 系统自动安装所需要的程序。安装过程很简单，但是让 nginx 和 php5-cgi 协同起来工作花了我两天时间。&lt;/p&gt;
&lt;p&gt;安装命令：&lt;br&gt;
apt-get install nginx php5-cgi mysql-server&lt;/p&gt;
&lt;p&gt;下图所示整个环境的运作:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/nginx-fastcgi.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/nginx-fastcgi.jpg&quot; alt=&quot;nginx-fastcgi&quot; title=&quot;nginx-fastcgi&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;后端的 PHP 程序根据用户请求来读写 mysql 数据库，配置的过程一个主要任务是连接 nginx 和 php5-cgi。这里我碰到了两个问题如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;nginx 和 fastcgi 无法连接？在 nginx 的默认站点配置文件中要指定一个 fastcgi 变量 SCRIPT_FILENAME，这个变量的值是“网站的根目录$fastcgi_script_name”这样才能传递正确的需要解析的 php 脚本给 fastcgi，进而让 PHP 解析。&lt;/li&gt;
&lt;li&gt;总是无法自动执行目录下的 index.php 文件，这个问题需要在 location 块里的 index 指令后添加 index.php，这样才能识别默认的 index.php 文件。&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;配置&lt;/h1&gt;
&lt;h2&gt;配置 nginx.conf&lt;/h2&gt;
&lt;p&gt;关于 nginx 的配置目前还真没有太系统的资料可参考，前几天在百度文库中发现了《nginx
http
server》，粗略的看了一下算是比较系统详尽的文档了。下面还是简单的说一下我对 nginx 配置文件的理解，配置文件是由一系列的按照一定结构组织的指令组成的，这种结构叫块（block），主要的块包括 event，http，server 和 location 他们分别控制着不同的方面，event 控制与连接相关，http 控制与 http 协议相关以及日志相关等。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/nginx.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/nginx.jpg&quot; alt=&quot;nginx-config&quot; title=&quot;nginx-config&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;还有一个比较重要的指令是 include，它可以把其他文件的内容包含进来，由这些文件共同组成整个配置文件，debian 对配置文件的组织就很好，条理清晰。下面就对 apt 安装的 nginx 的配置文件简单介绍，更详尽的指令用法参考《nginx
http server》（见参考链接）&lt;/p&gt;
&lt;p&gt;xdays:~# cat /etc/nginx/nginx.conf&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;user www-data; #用来处理请求进程的执行者
worker_processes 1; #处理请求的进程数
error_log /var/log/nginx/error.log; #错误日志文件位置
pid /var/run/nginx.pid; #进程号文件位置
events {
    worker_connections 1024; #最大连接数
}
http {
    include /etc/nginx/mime.types; #后缀与类型对应关系
    default_type application/octet-stream; #默认类型
    access_log /var/log/nginx/access.log; #访问日志记录位置
    sendfile on; #sendfile系统调用
    #tcp_nopush on;
    #keepalive_timeout 0;
    keepalive_timeout 65; #连接失效时间
    tcp_nodelay on; #开启socket选项
    gzip on; #压缩
    #include /etc/nginx/conf.d/*.conf;
    include /etc/nginx/sites-enabled/*; #包含对应目录下所有文件，注意这的通配符*
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;再者就是 sites-available 目录下的文件，每个 server 块都是一个虚拟机，可以为其制定不同的域名，像 apache 一样。默认的 default 文件接下来讨论。&lt;/p&gt;
&lt;p&gt;下面是采用 apt 安装的/etc/nginx/sites-available/default 文件：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;server {
    listen 80; #监听端口
    server_name localhost; #主机名
    access_log /var/log/nginx/localhost.access.log; #访问日志位置
    location / {  #定义一个虚拟目录
    root /var/www/; #指定对应这个目录的实际文件系统目录
    index index.html index.htm index.php; #指定自动查找的文件，这里需要注意要添加index.php！
}
location /doc {
    root /usr/share;
    autoindex on; #自动索引
    allow 127.0.0.1; #访问权限
    deny all;
}
location ~ .php$ {
fastcgi_pass 127.0.0.1:9000; #将对应的请求传送给fastcgi
fastcgi_index index.php; #指定fastcgi的自动查找文件
fastcgi_param SCRIPT_FILENAME /var/www/$fastcgi_script_name; #定义发送给fastcgi的环境变量，**脚本名**，这里需要特别注意！
#fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; #这样更通用
include fastcgi_params; #包含fastcgi_params文件，主要就是写环境变量
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;启动&lt;/h1&gt;
&lt;p&gt;下面启动依次启动 mysql，php5-cgi 和 nginx&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;/etc/init.d/mysql start;
php5-cgi -q -b 127.0.0.1:9000 &amp;amp;; #也有人把php5-cgi写成init脚本形式的，可以google下。
/etc/init.d/nginx start;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这样基本的环境就是完成了。&lt;/p&gt;
&lt;h1&gt;关于 php-fpm&lt;/h1&gt;
&lt;p&gt;我没有研究过这个东西，但是从目前（201307）的环境搭建来看这个东西已经成为主流，我的理解比较浅显：php-fpm 将 php 进行 daemon 化了。&lt;/p&gt;
&lt;p&gt;安装命令如下：&lt;br&gt;
apt-get install php5-fpm&lt;/p&gt;
&lt;p&gt;其他与 nginx 连接的注意点大同小异。&lt;/p&gt;
&lt;h1&gt;参考链接&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://blog.s135.com/nginx_php_v6/&quot;&gt;目前发现的最详尽的源码架设 lnmp 的教程《Nginx 0.8.x + PHP
5.2.13（FastCGI）搭建胜过 Apache 十倍的 Web 服务器》‍&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://iambin.blogbus.com/logs/62584905.html&quot;&gt;针对 debian 环境的教程《‍‍‍
Debian+Nginx+PHP(FastCGI)+MySQL 搭建 LNMP 服务器》‍&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wiki.nginx.org/Chs&quot;&gt;nginx 的官方 wiki&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wenku.baidu.com/view/1106f46427d3240c8447ef71.html&quot;&gt;《nginx http
server》&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://lnmp.org/&quot;&gt;方便的集成的 lnmp 一键安装包&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[SecureCRT-虚拟终端软件]]></title><description><![CDATA[SecureCRT 是 windows 下非常优秀的终端仿真程序，他有好多特性，主要的的有安全，便于管理，界面友好，自动重复指令，支持文件传输。 特性总结 1）退出时，自动关闭标签。 选项-全局选项-常规-默认会话-编辑默认配置-终端-勾选“断开时关闭” 2）SFTP…]]></description><link>https://xdays.me/SecureCRT-虚拟终端软件/</link><guid isPermaLink="false">https://xdays.me/SecureCRT-虚拟终端软件/</guid><pubDate>Sun, 28 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;SecureCRT 是 windows 下非常优秀的终端仿真程序，他有好多特性，主要的的有安全，便于管理，界面友好，自动重复指令，支持文件传输。&lt;/p&gt;
&lt;h3&gt;特性总结&lt;/h3&gt;
&lt;p&gt;1）退出时，自动关闭标签。&lt;/p&gt;
&lt;p&gt;选项-全局选项-常规-默认会话-编辑默认配置-终端-勾选“断开时关闭”&lt;/p&gt;
&lt;p&gt;2）SFTP 下载路径&lt;/p&gt;
&lt;p&gt;选项-全局选项-常规-默认会话-编辑默认配置-SFTP 标签页&lt;/p&gt;
&lt;p&gt;当通过 ssh 连接了 linux 主机时，可以右击标签页选择“连接 SFTP 标签页”，在打开的标签页下可以通过 put，get 命令上传下载文件，非常方便。&lt;/p&gt;
&lt;p&gt;3）开启中键复制功能&lt;/p&gt;
&lt;p&gt;选项-全局选项-终端-勾选“选中时复制”和“粘贴用*键”。&lt;/p&gt;
&lt;p&gt;4）脚本完成重复的工作&lt;/p&gt;
&lt;p&gt;脚本-开始录制脚本；脚本-停止录制脚本；脚本-执行。&lt;/p&gt;
&lt;h3&gt;配置优化&lt;/h3&gt;
&lt;p&gt;SecureCRT 可以把配置文件指定到一个目录内下，这样包括软件的 global 配置，还是针对某个 connection 的特定配置，以及所有的 ssh
key 都可以保存到一个目录下，这样在重装软件时可以很方便的转移。设置选项在 option-global
option-general-configuration folder 和 option-global option-SSH Host
Keys-Host keys database location 下。&lt;/p&gt;
&lt;p&gt;参考文章&lt;a href=&quot;http://tech.ddvip.com/2009-02/1234422493108450.html&quot;&gt;http://tech.ddvip.com/2009-02/1234422493108450.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;官方主页&lt;a href=&quot;http://www.vandyke.com/products/securecrt/index.html&quot;&gt;http://www.vandyke.com/products/securecrt/index.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;绿色版下载地址&lt;a href=&quot;http://www.xdowns.com/soft/xdowns2009.asp?softid=23625&amp;#x26;downid=5&amp;#x26;id=23625&quot;&gt;http://www.xdowns.com/soft/xdowns2009.asp?softid=23625&amp;#x26;downid=5&amp;#x26;id=23625&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNA-WAN]]></title><description><![CDATA[WAN 基本概念 基本概念 接入方式 PPP 串行通信标准 帧结构 分层架构 LCP NCP 相关配置命令 身份验证及相关配置 密码验证协议 PAP 配置 PAP 挑战验证协议 CHAP 配置 CHAP 帧中继（frame relay…]]></description><link>https://xdays.me/CCNA-wan/</link><guid isPermaLink="false">https://xdays.me/CCNA-wan/</guid><pubDate>Wed, 17 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;WAN 基本概念
&lt;ul&gt;
&lt;li&gt;基本概念&lt;/li&gt;
&lt;li&gt;接入方式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;PPP
&lt;ul&gt;
&lt;li&gt;串行通信标准&lt;/li&gt;
&lt;li&gt;帧结构&lt;/li&gt;
&lt;li&gt;分层架构&lt;/li&gt;
&lt;li&gt;LCP&lt;/li&gt;
&lt;li&gt;NCP&lt;/li&gt;
&lt;li&gt;相关配置命令&lt;/li&gt;
&lt;li&gt;身份验证及相关配置
&lt;ul&gt;
&lt;li&gt;密码验证协议 PAP&lt;/li&gt;
&lt;li&gt;配置 PAP&lt;/li&gt;
&lt;li&gt;挑战验证协议 CHAP&lt;/li&gt;
&lt;li&gt;配置 CHAP&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;帧中继（frame relay）
&lt;ul&gt;
&lt;li&gt;基本概念&lt;/li&gt;
&lt;li&gt;帧结构&lt;/li&gt;
&lt;li&gt;执行过程&lt;/li&gt;
&lt;li&gt;基本配置&lt;/li&gt;
&lt;li&gt;子接口及相关配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;WAN 基本概念&lt;/p&gt;
&lt;p&gt;基本概念&lt;/p&gt;
&lt;p&gt;用户室内设备（customer premises equip，CPE）用户室内的设备和内部布线&lt;/p&gt;
&lt;p&gt;数据通信设备（data communication
equipment）将用户连接到 WAN 网络云的通信链路，注意 DCE 还提供时钟频率&lt;/p&gt;
&lt;p&gt;数据终端设备（data terminal
equipment）通过 WAN 传送来自客户网络或主机计算机的数据的客户设备&lt;/p&gt;
&lt;p&gt;本地环路（local loop）用于连接 CPE 和中心局之间的介质，也叫最后一英里&lt;/p&gt;
&lt;p&gt;分界点（demarcation point）客户设备和服务提供商设备的分隔点&lt;/p&gt;
&lt;p&gt;中心局（central office）本地服务提供商的设备间和大楼&lt;/p&gt;
&lt;p&gt;WAN 设备&lt;/p&gt;
&lt;p&gt;调制解调器（modem）提供模拟信号和数字信号之间的转换&lt;/p&gt;
&lt;p&gt;CSU/DSU（channel/data service
unit）将 CPE 的数字信号转换层服务提供商设备所能理解的信号的物理层设备&lt;/p&gt;
&lt;p&gt;WAN 物理层标准&lt;/p&gt;
&lt;p&gt;在 DCE 和 DTE 之间主要使用这几种通信标准：EIA/TIA-232，EIA/TIA-449/530，EIA/TIA-612/613，V.35 和 X.25&lt;/p&gt;
&lt;p&gt;WAN 数据链路层协议&lt;/p&gt;
&lt;p&gt;WAN 常用的数据链路层协议：HDLC，PPP，frame-relay，ATM&lt;/p&gt;
&lt;p&gt;接入方式&lt;/p&gt;
&lt;p&gt;WAN 接入方式如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/wan-link-options.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/wan-link-options.jpg&quot; alt=&quot;wan-link-options&quot; title=&quot;wan-link-options&quot;&gt;&lt;/a&gt;综合业务数字网络（ISDN）&lt;/p&gt;
&lt;p&gt;一种电路交换网络，让 PSTN 的本地环路可以传送数字信号。有两种基本的 ISDN 接口，基本接口速率 BRI（base
rate
interface）提供一个 16kbit/s 的 D 信道和两个 64kbit/s 的 B 信道；基群速率接口 PRI（primary
rate
interface）可以提供相当于 T1 线路（1.544Mbit/s，23 个 B 信道和一个 D 信道）的速率，还可以提供相当于 E1 信道（2.048Mbit/s，30 个 B 信道和一个 D 信道）的速率。&lt;/p&gt;
&lt;p&gt;异步传输模式（asynchronous transport mode）&lt;/p&gt;
&lt;p&gt;基于信元的架构，信元长度固定为 53 字节，其中包括 5 字节的 ATM 头&lt;/p&gt;
&lt;p&gt;PPP（point to point protocol）&lt;/p&gt;
&lt;p&gt;串行通信标准&lt;/p&gt;
&lt;p&gt;RS-232 通信接口通常为 9 针；V.35 连接到 T1 线路的接口标准；HSSI 高速串行接口，最高支持 52Mbit/s&lt;/p&gt;
&lt;p&gt;帧结构&lt;/p&gt;
&lt;p&gt;对比 HDLC 和 PPP 的帧结构如下（数字代表字节数）：&lt;/p&gt;
&lt;p&gt;标准 HDLC&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;标志 1 地址 1 控制 2 数据 FCS2&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;其中控制字段根据信息帧，管理帧和无编号帧&lt;/p&gt;
&lt;p&gt;cisco 的 HDLC&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;标志 1 地址 1 控制 2 协议 2 数据 FCS2&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;可以看出标准 HDLC 不支持多协议，而 cisco 版本的添加了协议字段支持多协议。&lt;/p&gt;
&lt;p&gt;PPP 是基于 HDLC 的，帧结构如下&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;标志 1 地址 1 控制 2 协议 2 数据 FCS2&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意 LCP 协商可以修改 PPP 的帧结构，如有压缩选项的帧达成一致后可省略地址字段，控制字段变成一个字节&lt;/p&gt;
&lt;p&gt;分层架构&lt;/p&gt;
&lt;p&gt;LCP 链路控制协议&lt;/p&gt;
&lt;p&gt;主要负责链路建立，维护和终止，还包括一些 PPP 特有选项的配置，如身份验证，压缩和多链路。LCP 分组封装于 PPP 帧的数据字段，主要字段如下：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;编码 标识符 长度 数据&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;其中标识符用于匹配请求和应答，长度为 LCP 分组所有字段的总长度&lt;/p&gt;
&lt;p&gt;NCP 网络控制协议&lt;/p&gt;
&lt;p&gt;主要负责协调第三层协议，采用模块化模型，每种网络层协议都有相应的 NCP。IPCP 的两个选项是压缩和 IP 地址（用于拨号网络中）&lt;/p&gt;
&lt;p&gt;相关配置命令&lt;/p&gt;
&lt;p&gt;相关配置命令如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;配置 命令
启用 ppp encapsulation ppp
压缩 compress predictor | stac
链路质量监控，低于设定值自动关闭 ppp quality 80
负载均衡多链路 ppp multilink&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;身份验证及相关配置&lt;/p&gt;
&lt;p&gt;密码验证协议 PAP&lt;/p&gt;
&lt;p&gt;基本的身份验证协议，本地路由器以 LCP 包发送用户名和密码，信息已明文传送，只进行一次身份验证，远程节点验证身份回应接收还是拒绝。&lt;/p&gt;
&lt;p&gt;PAP 配置&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;步骤 命令
添加本地保存的用来验证的用户信息 username router password passwd
LCP 发送的信息 ppp pap sent-username ruoter password passwd
启用 PAP 身份验证 ppp authentication pap&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;挑战握手验证协议 CHAP&lt;/p&gt;
&lt;p&gt;相比 PAP，CHAP 的优点在定时验证和加密（md5 加密算法）具体执行过程：路由器 A 向路由器 B 发送挑战消息包括 ID，随机数和用户名 A，然后 B 查找自身数据库加上接收到的 ID，随机数来计算一个散列值，并将这个值，ID 以及用户名返回给 A，A 再查找自身数据库计算一个散列值与接收到的散列值对比如果一只则返回接受建立连接&lt;/p&gt;
&lt;p&gt;CHAP 配置&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;步骤 命令
添加保存本地用来验证的用户信息 username router password passwd
启用 CHAP 身份验证 ppp authentication chap&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;帧中继（frame relay）&lt;/p&gt;
&lt;p&gt;帧结构&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;标志 地址 数据 FCS&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;地址字段如下（数字表示位数）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;DLCI 6 C/R 1 EA 1 DLCI 4 FECN 1 BECN 1 DE 1 EA 1&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;C/R 为保留字段；EA 为扩展地址，当该位为 1 时为 DLCI 的最后一个字节；F/BECN 用于拥塞控制的位；DE 可丢弃位，也就是当网络拥塞时可以丢弃的位；DLCI 为虚电路的标识符，其保留的部分分配具体如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;VC 标识符 VC 类型
0 LMI（ANSI，ITU）
1-15 提供以后使用
992-1007 CLLM
1008-1022 提供以后使用
1019-1020 多播（cisco）
1023 LMI（cisco）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;基本概念&lt;/p&gt;
&lt;p&gt;虚电路&lt;/p&gt;
&lt;p&gt;虚电路为两台 DTE 提供一条双向通信路径，用 DLCI（数据链路连接标识符）标识。称为虚电路是因为并没有真实的电路连接设备，而是通过服务提供商的帧中继交换机来实现一种逻辑上的电路，所有用户共享带宽&lt;/p&gt;
&lt;p&gt;本地管理接口（local manage interface，LMI）&lt;/p&gt;
&lt;p&gt;DTE 和它连接的第一个帧中继交换机之间的信令标准，用于传递有关服务提供商网络和 DTE 之间的操作和状态信息。其中 LMI 扩展包括保持激活（每 10s 轮训网络一次），虚电路状态，组播（DLCI 号 1019-1022 用于组播），全局地址和简单流量控制&lt;/p&gt;
&lt;p&gt;接口速度或者端口速度&lt;/p&gt;
&lt;p&gt;就是接入电路可以传输的最大速度&lt;/p&gt;
&lt;p&gt;承诺信息速率（CIR）&lt;/p&gt;
&lt;p&gt;服务提供商承诺的最大传输速率&lt;/p&gt;
&lt;p&gt;突发速率&lt;/p&gt;
&lt;p&gt;突发速率包括承诺突发信息速率（CBIR）和超额突发量（BE），前者指超过承诺信息速率的突发量，而后者是超过 CBIR 的那部分流量&lt;/p&gt;
&lt;p&gt;可达性问题&lt;/p&gt;
&lt;p&gt;当路由器的一个接口连接多条帧中继虚电路时，由于路由协议的水平分割机制，导致无法广播路由信息到其他网络。解决这个问题的方法有两个：禁用水平分割和配置子接口&lt;/p&gt;
&lt;p&gt;流量控制&lt;/p&gt;
&lt;p&gt;帧中继通过 F/BECN 来实现简单的拥塞控制，对于从拥塞链路接收到的帧将其 BECN（后向显式拥塞通知）置位，对于发往拥塞链路的帧将其 FECN（前向显式拥塞通知）置位&lt;/p&gt;
&lt;p&gt;配置帧中继&lt;/p&gt;
&lt;p&gt;基本配置&lt;/p&gt;
&lt;p&gt;基本配置命令如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;配置 命令
启用帧中继 encapsulation frame-relay cisco | ietf
静态映射 frame-relay map protocol addr dlci [broadcast][cisco | ietf ]
本地管理接口类型 frame-relay lmi cisco | ansi |q933a&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;配置子接口&lt;/p&gt;
&lt;p&gt;子接口旨在解决 NBMA（非广播多路访问网络）的不可达问题，为每个 PVC 分配单独的接口，只是这种接口是虚拟的并不是真实的物理接口，但实现的功能是一样的，配置不收如下：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;步骤 命令
创建子接口 interface serial id.subid point-to-point
为子接口关联本地 DLCI frame-relay interface-dlci dlci-id&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;注意其中 subid 通常是本地的 dlci 号&lt;/p&gt;
&lt;p&gt;检验相关命令&lt;/p&gt;
&lt;p&gt;show frame-relay lmi | pvc dlci-id | map&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNA-WLAN和IPv6]]></title><description><![CDATA[无线局域网（wireless lan，WLAN） IEEE802.11 无线标准 无线技术相关机构 无线拓扑 无线关联过程 无线安全 开放访问 SSID，WEP 和 MAC 地址认证 WPA 和 WPA2 预共享密钥 IPv…]]></description><link>https://xdays.me/CCNA-wlan和ipv6/</link><guid isPermaLink="false">https://xdays.me/CCNA-wlan和ipv6/</guid><pubDate>Sat, 06 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;无线局域网（wireless lan，WLAN）
&lt;ul&gt;
&lt;li&gt;IEEE802.11 无线标准&lt;/li&gt;
&lt;li&gt;无线技术相关机构&lt;/li&gt;
&lt;li&gt;无线拓扑&lt;/li&gt;
&lt;li&gt;无线关联过程&lt;/li&gt;
&lt;li&gt;无线安全
&lt;ul&gt;
&lt;li&gt;开放访问&lt;/li&gt;
&lt;li&gt;SSID，WEP 和 MAC 地址认证&lt;/li&gt;
&lt;li&gt;WPA 和 WPA2 预共享密钥&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;IPv6
&lt;ul&gt;
&lt;li&gt;概述
&lt;ul&gt;
&lt;li&gt;优点&lt;/li&gt;
&lt;li&gt;报头格式&lt;/li&gt;
&lt;li&gt;地址表示方式&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;地址分类&lt;/li&gt;
&lt;li&gt;分配地址的方式
&lt;ul&gt;
&lt;li&gt;手动配置&lt;/li&gt;
&lt;li&gt;EUI-64 配置&lt;/li&gt;
&lt;li&gt;无状态自动配置&lt;/li&gt;
&lt;li&gt;DHCPv6 配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;路由协议配置
&lt;ul&gt;
&lt;li&gt;RIPng 配置&lt;/li&gt;
&lt;li&gt;EIGRPv6 配置&lt;/li&gt;
&lt;li&gt;OSPFv3 配置&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;过渡技术
&lt;ul&gt;
&lt;li&gt;双协议栈&lt;/li&gt;
&lt;li&gt;6to4 隧道&lt;/li&gt;
&lt;li&gt;NAT-PT&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;无线局域网（WLAN）&lt;/h2&gt;
&lt;h3&gt;IEEE802.11 无线标准&lt;/h3&gt;
&lt;p&gt;无线标准以相关特点的对比如下表:&lt;/p&gt;
&lt;hr&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;               802.11a                       802.11b                       802.11g                               802.11n&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;频段（GHz） 5.7 2.4 2.4 2.4/5
信道 最多 23 3 3&lt;br&gt;
调制技术 OFDM DSSS DSSS/OFDM MIMO-OFDM
速度（Mbit/s） 54 11 11/54 248
优点 距离 35m；速度快，不易受干扰 距离 35m；成本低，覆盖范围广 距离 35m；速度快，范围广，不易受阻挡 距离 70m；数据传输快；扩大的覆盖范围
缺点 成本高，范围小 速度慢，易干扰 易干扰&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;*DSSS 表示直接序列扩频；OFDM 表示正交频分复用&lt;/p&gt;
&lt;p&gt;**MIMO-OFDM 多路输入多路输出正交频分复用&lt;/p&gt;
&lt;h3&gt;无线技术相关机构&lt;/h3&gt;
&lt;p&gt;无线技术相关机构及其职责如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 职责
ITU-R 管理 RF 波段和卫星轨道分配
IEEE 规定如何调试射频来传送信息
Wi-Fi 联盟 确保供应商生产的设备可互操作&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;无线拓扑分类&lt;/h3&gt;
&lt;p&gt;无线拓扑如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;无线设备 拓扑模式 构成单位 覆盖区域
没有接入点 对等 独立基本服务集（IBSS） 基本服务区（BSA）
一个接入点 基本架构 基本服务集（BSS） 基本服务区（BSA）
一个以上接入点 基本架构 基本服务集（BSS） 扩展服务区（ESA）&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;无线关联过程&lt;/h3&gt;
&lt;p&gt;下面是无线关联的过程：&lt;/p&gt;
&lt;p&gt;信标（beacon）无线网络通告其存在性的帧&lt;/p&gt;
&lt;p&gt;探测（probe）信号 客户端用来检查网络的帧&lt;/p&gt;
&lt;p&gt;身份验证（authenticate）通过某种验证机制对客户单进行验证&lt;/p&gt;
&lt;p&gt;关联（associate）接入点和客户端建立链路的过程&lt;/p&gt;
&lt;p&gt;特别注意以上术语&lt;/p&gt;
&lt;h3&gt;无线安全&lt;/h3&gt;
&lt;h4&gt;开放访问&lt;/h4&gt;
&lt;p&gt;开放访问就是不需要认证&lt;/p&gt;
&lt;h4&gt;WEP 共享密钥加密&lt;/h4&gt;
&lt;p&gt;其缺点在于加密数据所用算法容易被破解和可扩展性问题，因为 32 位密钥是人工管理必须手动输入密钥&lt;/p&gt;
&lt;h4&gt;WPA 和 WPA2 预共享密钥&lt;/h4&gt;
&lt;p&gt;802.11i 规定了两种加密机制分别是 TKIP 和 AES，他们分别被纳入到 Wi-Fi 联盟的 WPA 和 WPA2 认证中。另外，带 TKIP 的 PSK 或 PSK2 相当于 WPA，而带 AES 的 PSK 和 PSK2 相当于 WPA2&lt;/p&gt;
&lt;h2&gt;IPv6&lt;/h2&gt;
&lt;h3&gt;概述&lt;/h3&gt;
&lt;h4&gt;优点&lt;/h4&gt;
&lt;p&gt;优点如下所示：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;改进的 ip 地址：更改了全局连接性和灵活性；更好的路由聚合的 ip 前缀；没有广播；多宿主主机提高连接的可靠性；自动配置；公有私有地址重新分配无需地址转换；简化了编址和修改机制&lt;/li&gt;
&lt;li&gt;简化的报头：路由选择效率更高；无需处理校验和；扩展报头更简单；提供流标签无需检查传输层就可识别数据流&lt;/li&gt;
&lt;li&gt;增强的移动性和安全性&lt;/li&gt;
&lt;li&gt;丰富的过渡方式：双协议栈；6to4 隧道；NAT-PT&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;报头格式&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/wan-ipv6-header.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/wan-ipv6-header.jpg&quot; alt=&quot;wan-ipv6-header&quot; title=&quot;wan-ipv6-header&quot;&gt;&lt;/a&gt;3 个基本字段和 5 个新增字段&lt;/p&gt;
&lt;h4&gt;地址表示方式&lt;/h4&gt;
&lt;p&gt;IPv6 的地址是以分号分隔 16 位为一个字段以十六进制表示的，可以省略开头的 0 不写，连续为 0 的字段用“：：”简化，如地址 FF01:0034:5678:0000:0000:1234:0000：0001 可以简写成 FF01:34:5678::1234:0:01，注意多个连续 0 的字段只能有一个段简写&lt;/p&gt;
&lt;h3&gt;地址分类&lt;/h3&gt;
&lt;p&gt;地址分类如下表：&lt;/p&gt;
&lt;p&gt;+--------------------------+--------------------------+--------------------------+
| 名称 | 作用 | 范围 |
+--------------------------+--------------------------+--------------------------+
| 单播地址 | 传送到单个网络接口，就是一对一的地址，又分为全球 | 全球单播地址 2000::/3 |
| | 单播地址，链路本地地址和本地唯一地址 | &lt;/p&gt; |
| | | 本地唯一地址 FC00::/7 |
| | | |
| | | &lt;p&gt; |
| | | 链路本地单播地址 FE80::/10 |
+--------------------------+--------------------------+--------------------------+
| 组播地址 | 发送到由组播地址识别的所有接口，一对多的地址 | FF00::/8 |
+--------------------------+--------------------------+--------------------------+
| 任播地址 | 一对多个中的一个地址 | |
+--------------------------+--------------------------+--------------------------+
| 未指定地址 | 本机地址，用于自身地址未知时 | :: |
+--------------------------+--------------------------+--------------------------+
| 环回地址 | 相当于 Ipv4 中的 127.0.0.1 | ::0 |
+--------------------------+--------------------------+--------------------------+&lt;/p&gt;
&lt;h3&gt;分配地址的方式&lt;/h3&gt;
&lt;h4&gt;手动配置&lt;/h4&gt;
&lt;p&gt;就是直接通过 ipv6 addr 命令来指定&lt;/p&gt;
&lt;h4&gt;EUI-64 配置&lt;/h4&gt;
&lt;p&gt;知道那个 IPv6 地址前缀部分并派生接口 ID，64 位接口 ID 派生方法是在 MAC 地址的中间插入 16 位，为 FFFE&lt;/p&gt;
&lt;h4&gt;无状态自动配置&lt;/h4&gt;
&lt;p&gt;过程开始从路由器学习到前缀信息，然后类似 EUI-64 配置在 MAC 地址中间插入 16 位的 FFFE，另外填充过程中会更改接口 ID 从左往右数第 7 位的值，如果是本地唯一地址则将其改为 0，如果是全球唯一地址则更改为 1，这样就完成了无状态的自动配置&lt;/p&gt;
&lt;h4&gt;DHCPv6 配置&lt;/h4&gt;
&lt;p&gt;类似 IPv4 中的 DHCP&lt;/p&gt;
&lt;h3&gt;路由协议的配置&lt;/h3&gt;
&lt;p&gt;需要指出的是所有路由协议都是在原先的基础上做了扩展，只是去掉了广播地址，使用组播地址发送更新。路由协议的配置都很类似，首先在全局配置 i 模式下开启路由协议，然后再接口配置模式下指定开启参与路由协议功能&lt;/p&gt;
&lt;h4&gt;RIPng 配置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;（config）#ipv6 router rip process-number&lt;/li&gt;
&lt;li&gt;（config-if）#ipv6 rip process-number enable&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;EIGRPv6 配置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;（config）# ipv6  router eigrp process-number&lt;/li&gt;
&lt;li&gt;（config-rtr）#no  shutdown&lt;/li&gt;
&lt;li&gt;（config-if）#ipv6 eigrp process-number&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;OSPFv3 配置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;（config）#ipv6routerospf process-number&lt;/li&gt;
&lt;li&gt;（config-rtr）#router-id router—id&lt;/li&gt;
&lt;li&gt;（config-if）#ipv6 ospf 10 area 0&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;过渡技术&lt;/h3&gt;
&lt;h4&gt;双协议栈&lt;/h4&gt;
&lt;p&gt;在路由器上同时运行两个版本的 ip 协议，全局开启 IPv6 然后在一个接口上既配上 IPv4 地址也配上 IPv6 地址&lt;/p&gt;
&lt;h4&gt;6to4 隧道&lt;/h4&gt;
&lt;p&gt;在 IPv4 公共网络上传输 IPv6 的数据流，也就是将 IPv6 数据包封装到 IPv4 数据包中，只在 IPv6 网络的出口上做设置&lt;/p&gt;
&lt;h4&gt;NAT-PT（NAT-protocol translation）&lt;/h4&gt;
&lt;p&gt;类似 NAT 只是转换前的地址是 IPv6 地址，也可以做静态，动态和端口地址转化（PAT）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNA-ACL和NAT]]></title><description><![CDATA[访问控制表（access control list，ACL） 配置 acl 的原则（3p 原则） 执行过程 分类 标准 acl 扩展 acl 命名 acl acl 的放置位置 配置过程和排错 标准 acl 配置 扩展 acl 配置 命名 acl 配置 排错 复杂 acl…]]></description><link>https://xdays.me/CCNA-acl和nat/</link><guid isPermaLink="false">https://xdays.me/CCNA-acl和nat/</guid><pubDate>Fri, 05 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;访问控制表（access control list，ACL）
&lt;ul&gt;
&lt;li&gt;配置 acl 的原则（3p 原则）&lt;/li&gt;
&lt;li&gt;执行过程&lt;/li&gt;
&lt;li&gt;分类
&lt;ul&gt;
&lt;li&gt;标准 acl&lt;/li&gt;
&lt;li&gt;扩展 acl&lt;/li&gt;
&lt;li&gt;命名 acl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;acl 的放置位置&lt;/li&gt;
&lt;li&gt;配置过程和排错
&lt;ul&gt;
&lt;li&gt;标准 acl 配置&lt;/li&gt;
&lt;li&gt;扩展 acl 配置&lt;/li&gt;
&lt;li&gt;命名 acl 配置&lt;/li&gt;
&lt;li&gt;排错&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;复杂 acl
&lt;ul&gt;
&lt;li&gt;动态 acl&lt;/li&gt;
&lt;li&gt;自反 acl&lt;/li&gt;
&lt;li&gt;基于时间的 acl&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;网络地址转换（network address translation）
&lt;ul&gt;
&lt;li&gt;基本概念
&lt;ul&gt;
&lt;li&gt;内部本地地址&lt;/li&gt;
&lt;li&gt;内部全局地址&lt;/li&gt;
&lt;li&gt;外部本地地址&lt;/li&gt;
&lt;li&gt;外部全局地址&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;类型及其执行过程
&lt;ul&gt;
&lt;li&gt;静态 nat&lt;/li&gt;
&lt;li&gt;动态 nat&lt;/li&gt;
&lt;li&gt;端口地址转换 pat（nat 重载）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;nat 的优点和缺点&lt;/li&gt;
&lt;li&gt;配置和排错
&lt;ul&gt;
&lt;li&gt;静态 nat 配置&lt;/li&gt;
&lt;li&gt;动态 nat 配置&lt;/li&gt;
&lt;li&gt;端口地址转换 pat 配置-单地址&lt;/li&gt;
&lt;li&gt;端口地址转换 pat 配置-nat 池&lt;/li&gt;
&lt;li&gt;排错&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;访问控制表（access control list，ACL）&lt;/h2&gt;
&lt;h3&gt;配置 acl 的原则（3p 原则）&lt;/h3&gt;
&lt;p&gt;每个接口（per port），每个协议（per protocol），每个方向（per
direction）只能配置一条 acl&lt;/p&gt;
&lt;h3&gt;执行过程&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/acl-process.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/acl-process.jpg&quot; alt=&quot;acl-process&quot; title=&quot;acl-process&quot;&gt;&lt;/a&gt;需要注意的是如果在一个接口的一个方向如果所有 acl 规则都不匹配，默认路由器会丢弃该数据包&lt;/p&gt;
&lt;h3&gt;分类&lt;/h3&gt;
&lt;p&gt;从根本上来说 acl 分为两类，他们的区别如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 标准 acl 扩展 acl
acl 编号 1-99；1300-1999 100-199；2000-2699
控制条件 仅用源 ip 协议类型，源 ip 和端口，目的 ip 和端口&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;另外两种 acl 都可以配置成命名 acl，命名 acl 的好处是直观，并且可以根据编号调整控制表各条语句的相互顺序&lt;/p&gt;
&lt;h3&gt;acl 放置位置&lt;/h3&gt;
&lt;p&gt;为了提高网络的工作效率，也更精确的控制流量，需要把 acl 放置的合理的位置。标准访问控制表只能通过源 ip 地址来决定数据包的通过与否，所以要将其放置到尽可能接近目的网络的位置；扩展访问控制表可以通过源和目的 ip 以及源和目的端口来控制数据包，所以要把 acl 放置到尽可能接近源网络的位置&lt;/p&gt;
&lt;h3&gt;配置和排错&lt;/h3&gt;
&lt;p&gt;访问控制表建立是在全局模式下而控制表的应用是在接口模式下&lt;/p&gt;
&lt;h4&gt;标准 acl 配置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;#access-list access-list-id permit | deny | remark
source-ip-address wildmask 其中 remark 用于注释控制表&lt;/li&gt;
&lt;li&gt;#ip access-group access-list-id in | out&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;扩展 acl 配置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;#access-list access-list-id permit | deny | remark protocol-type
source-ip wildcard operator port-numb dest-ip wildcard operator
port-numb 这里只是列举了部分规则，具体规则根据协议的类型而变化&lt;/li&gt;
&lt;li&gt;#ip access-group access-list-id in | out&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;命名 acl 配置&lt;/h4&gt;
&lt;p&gt;如上所说命名 acl 是可以直接通过编号进行编辑控制语句的前后顺序，具体如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;#ip access-list standard | extended name&lt;/li&gt;
&lt;li&gt;#sequence-number permit ** 下面的就和标准和扩展的配置规则一样了&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;排错&lt;/h4&gt;
&lt;p&gt;关于排错需要注意的是网络规划和通配符子网掩码的分配，另外明确路由器的隐式拒绝规则，排错命令有 sh
ip access-list，注释信息需要在 running-config 下才能看到&lt;/p&gt;
&lt;h3&gt;复杂 acl&lt;/h3&gt;
&lt;p&gt;复杂 acl 通过其他策略实现的访问控制，如验证后自动添加一条 acl，自反 acl 也就是只允许由内部发起连接的返回数据流通过的 acl，还有基于时间的 acl 允许数据特定时间段内通过&lt;/p&gt;
&lt;h4&gt;动态（锁和钥匙）acl&lt;/h4&gt;
&lt;p&gt;默认使用一条 acl 阻止所有数据通过，当用户通过 telnet 登陆并通过身份验证时 telnet 断开，自动建立一条动态 acl 允许数据通过，还可以设置超时时间&lt;/p&gt;
&lt;h4&gt;自反 acl&lt;/h4&gt;
&lt;p&gt;只允许响应内部网络发起的连接的外部数据通过，而拒绝其他的数据&lt;/p&gt;
&lt;h4&gt;基于时间的 acl&lt;/h4&gt;
&lt;p&gt;相关配置如下：&lt;/p&gt;
&lt;p&gt;#time-range acl-name&lt;/p&gt;
&lt;p&gt;#periodic Weekday 7:00 to 8:00&lt;/p&gt;
&lt;p&gt;#创建 acl 时就是在扩展 acl 之后加上一个 time-range acl-name&lt;/p&gt;
&lt;h2&gt;网络地址转换（network address translation）&lt;/h2&gt;
&lt;h3&gt;基本概念&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;名称 含义
内部本地地址 内部网络分配给主机的地址
内部全局地址 数据包离开 nat 路由器是的公网 ip 地址
外部全局地址 分配给外部主机的公网地址
外部本地地址 通常认为和外部全局地址相同&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;类型和执行过程&lt;/h3&gt;
&lt;h4&gt;静态 nat&lt;/h4&gt;
&lt;p&gt;当数据包从 nat 路由器发送出去时仅源 ip 地址被更改，并且 nat 路由器是参考 nat 表来更改地址，一个内部地址对应一个外部地址&lt;/p&gt;
&lt;h4&gt;动态 nat&lt;/h4&gt;
&lt;p&gt;nat 路由器上指定一个地址池，由路由器自动分配内部地址对应的外部地址，并且在通信过程中一直保存着这种对应关系&lt;/p&gt;
&lt;h4&gt;端口地址转换（pat，或者 nat 重载）&lt;/h4&gt;
&lt;p&gt;nat 路由器同时修改数据包的源 ip 地址和端口号（合成 socket）都更改掉，并且维护着这种对应关系。这里又根据转换后的数据包的源 ip 地址又有两种情况，单公有 ip 地址的重载（overload）和公有 ip 地址池的重载。实际上我们可以把这两种情况想象成灾静态 nat 和动态 nat 的基础上加上了重载的特性&lt;/p&gt;
&lt;h3&gt;nat 的优点和缺点&lt;/h3&gt;
&lt;p&gt;如下表所示&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;优点 缺点
节省了公有 ip 地址；提高了连接到公网的灵活性；提供了一致的内部网络编址方案；提供了网络安全性 影响性能，重新封装；影响端到端的功能；无法跟踪端到端的 ip 地址；一些协议无法工作&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;配置和排错&lt;/h3&gt;
&lt;h4&gt;静态 nat 配置&lt;/h4&gt;
&lt;p&gt;#ip nat inside source inside-address global-address
定义一条 nat 规则使内网地址和外网地址建立联系&lt;/p&gt;
&lt;p&gt;#ip nat inside 设置需要转换的接口&lt;/p&gt;
&lt;p&gt;#ip nat outside 转换后的送出接口&lt;/p&gt;
&lt;h4&gt;动态 nat 配置&lt;/h4&gt;
&lt;p&gt;#ip nat pool pool-name start-addr end-addr netmask
net-netmask 定义一个 nat 池&lt;/p&gt;
&lt;p&gt;#access-list access-list-id permit net-addr
net-netmask 定义一个访问控制表来控制需要 nat 的范围&lt;/p&gt;
&lt;p&gt;#ip nat inside source list  access-list-id pool
pool-name 定义一条 nat 规则把需要 nat 的网段范围和供 nat 用的 nat 池联系起来&lt;/p&gt;
&lt;p&gt;#ip nat inside&lt;/p&gt;
&lt;p&gt;#ip nat outside&lt;/p&gt;
&lt;h4&gt;端口地址转换（pat）配置-单地址&lt;/h4&gt;
&lt;p&gt;#access-list access-list-id permit net-addr net-netmask&lt;/p&gt;
&lt;p&gt;#ip nat inside source list access-list-id interface interface-id
overload 定义一条 nat 规则建立一个网段和一个接口的端口地址转换规则&lt;/p&gt;
&lt;p&gt;#ip nat inside&lt;/p&gt;
&lt;p&gt;#ip nat outside&lt;/p&gt;
&lt;h4&gt;端口地址转换（pat）配置-nat 池&lt;/h4&gt;
&lt;p&gt;#access-list access-list-id permit net-addr net-netmask&lt;/p&gt;
&lt;p&gt;#ip nat pool pool-name start-addr end-addr netmask net-netmask&lt;/p&gt;
&lt;p&gt;#ip nat inside list access-list-id pool pool-name overload
定义一条规则建立一个网段和一个 nat 池的端口地址转换规则&lt;/p&gt;
&lt;p&gt;#ip nat inside&lt;/p&gt;
&lt;p&gt;#ip nat outside&lt;/p&gt;
&lt;h4&gt;排错&lt;/h4&gt;
&lt;p&gt;可以从以下角度分析问题所在：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;检查访问控制表的 ip 范围&lt;/li&gt;
&lt;li&gt;检查 nat 地址池的范围&lt;/li&gt;
&lt;li&gt;确定内部和外部接口分配正确&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还有 sh ip nat translations 查看 nat 表&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNA-VLAN]]></title><description><![CDATA[虚拟局域网（virtual lan，vlan） 优点 vlan id 范围 vlan 类型 vlan 中继 vlan 中继协议（vlan trunk protocol） 基本概念 操作过程 配置和排错 vlan 间路由 每接口对应一个 vlan 单臂路由（router on  a…]]></description><link>https://xdays.me/CCNA-vlan/</link><guid isPermaLink="false">https://xdays.me/CCNA-vlan/</guid><pubDate>Thu, 04 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;虚拟局域网（virtual lan，vlan）
&lt;ul&gt;
&lt;li&gt;优点&lt;/li&gt;
&lt;li&gt;vlan id 范围&lt;/li&gt;
&lt;li&gt;vlan 类型&lt;/li&gt;
&lt;li&gt;vlan 中继&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;vlan 中继协议（vlan trunk protocol）
&lt;ul&gt;
&lt;li&gt;基本概念&lt;/li&gt;
&lt;li&gt;操作过程&lt;/li&gt;
&lt;li&gt;配置和排错&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;vlan 间路由
&lt;ul&gt;
&lt;li&gt;每接口对应一个 vlan&lt;/li&gt;
&lt;li&gt;单臂路由（router on  a stick）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配置语音 vlan&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;虚拟局域网（vlan）&lt;/h2&gt;
&lt;h3&gt;优点&lt;/h3&gt;
&lt;p&gt;虚拟局域网相对传统局域网的优点有如下几条：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;安全，实现了数据隔离&lt;/li&gt;
&lt;li&gt;成本降低&lt;/li&gt;
&lt;li&gt;性能提高&lt;/li&gt;
&lt;li&gt;广播控制&lt;/li&gt;
&lt;li&gt;简化应用管理和项目管理&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;vlan id 范围&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;名称 普通 vlan（normal） 扩展 vlan（extend）
ID 范围 1-1005（其中 1 和 1002-1005 自动创建不能删除不能修改） 1006-4094
保存位置 Flash 中的 vlan.dat 数据库文件中 运行配置文件中
VTP 支持 支持 不支持（v3 支持）&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;vlan 类型&lt;/h3&gt;
&lt;hr&gt;
&lt;p&gt;名称 介绍
数据 vlan 传送用户数据
默认 vlan 所有接口默认所属 vlan，指 vlan1
黑洞 vlan 也叫哑 vlan，未使用端口分配的 vlan
本征（native）vlan 中继端口所属的 vlan
管理 vlan 用于访问交换机管理功能的 vlan，默认 vlan1
语音 vlan 用于传送语音的 vlan，需要专门配置&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;vlan 中继&lt;/h3&gt;
&lt;p&gt;vlan 中继用于分配在不同交换机上相同 vlan 的主机间相互通信，有两种中继协议，ISL 和 802.1q。ISL（inter-switch
link）协议时再以太网帧的基础上加上 26 字节的报头和 4 字节的 FCS，基本不太常用。主要介绍 802.1q 协议，帧格式如下：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;目的地址 6 源地址 6 Ethertype=0x8100 协议标识 2 用户优先级 3bit CFI 令牌网 1bit vlan-id 12bit 长度/类型 2 数据 pad 填充 FCS 4&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;其中，用户优先级用于服务质量，而 vlan-id 用来标识不同 vlan 的数据。还要强调的是本征 vlan，实际上它就是一个特殊的 vlan，只有中继链路的两个接口划分到这个 vlan。当交换机将不同 vlan 的数据发送到其他交换机的时候再中继链路的出口上打上相应的标签，通过中继链路传到其他交换机上时其他交换机根据根据标签转发数据，在转发到相应访问接口时会去掉相应的标签，也就是说只在中继链路上才能看到打了标签的帧。本征 vlan 另一个作用就是如果再中继端口上收到没有打标签的帧则发送给本征 vlan，这样就能保证像 CDP 的协议正常工作。&lt;/p&gt;
&lt;h2&gt;vlan 中继协议（vlan trunk protocol）&lt;/h2&gt;
&lt;p&gt;vtp 是要完成在所有的交换机上实现 vlan 的统一管理的任务。vtp 要工作在一个 vtp 域中，两个不同域的交换机不能相互传递 vlan 信息，拥有共同域名的交换机构成一个 vtp 域&lt;/p&gt;
&lt;h3&gt;基本概念&lt;/h3&gt;
&lt;p&gt;vtp 消息封装于以太网帧（目的地址使用组播地址 0100-0ccc-cccc）中，然后打上标签通过中继链路上传播 vlan 信息&lt;/p&gt;
&lt;h4&gt;服务器 server&lt;/h4&gt;
&lt;p&gt;这是 catalyst 交换机的默认模式，负责管理整个 vtp 域内的所有 vlan 信息，包括添加删除和修改。而且要注意服务器模式下的交换机 vlan 信息保存于 NVRAM 中&lt;/p&gt;
&lt;h4&gt;客户端 client&lt;/h4&gt;
&lt;p&gt;只能接收服务器发来的 vlan 信息并更新自己的 vlan 信息，转发更新，但不能删除和修改 vlan&lt;/p&gt;
&lt;h4&gt;透明 transparent&lt;/h4&gt;
&lt;p&gt;接收并转发 vtp 通告，但不会更新自己的 vlan 数据库，也不会把自己的 vlan 信息发送给其他交换机，仅能管理本地的 vlan 数据库。&lt;/p&gt;
&lt;h4&gt;vtp 修剪&lt;/h4&gt;
&lt;p&gt;达到仅将广播信息发送到需要该信息的中继链路上的目的&lt;/p&gt;
&lt;h3&gt;操作过程&lt;/h3&gt;
&lt;p&gt;交换机的默认配置如下：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 值
vtp 版本 1
vtp 域名 null
vtp 模式 server
配置修订版本 0
vlan vlan1&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;vtp 通告&lt;/h4&gt;
&lt;p&gt;总结通告&lt;/p&gt;
&lt;p&gt;包括 vtp 配置的详细信息，由 vtp 服务器每 5 分钟发送一次，执行对 vlan 数据库配置后立即发送总结通告&lt;/p&gt;
&lt;p&gt;子集通告&lt;/p&gt;
&lt;p&gt;通告 vlan 具体信息&lt;/p&gt;
&lt;p&gt;请求通告&lt;/p&gt;
&lt;p&gt;请求 vlan 信息&lt;/p&gt;
&lt;p&gt;注意：在以上几种通告中要注意配置修订版本号，它的值越大说明 vlan 信息越新,客户端通过比较配置修订版本号来决定是否更新本地 vlan 信息&lt;/p&gt;
&lt;h3&gt;配置和排错&lt;/h3&gt;
&lt;h4&gt;配置&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;#vtp mode server | transparent | client&lt;/li&gt;
&lt;li&gt;#vtp domain name domain-name&lt;/li&gt;
&lt;li&gt;#vtp pruning&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;排错&lt;/h4&gt;
&lt;p&gt;版本不兼容，域名不一致，没有启用 vtp server&lt;/p&gt;
&lt;h2&gt;vlan 间路由&lt;/h2&gt;
&lt;h3&gt;每接口对应一个 vlan&lt;/h3&gt;
&lt;p&gt;每个 vlan 中的一个接入端口与路由器接口相连，对路由器屏蔽了 vlan 的概念，在路由器看来就是在路由两个不同网段&lt;/p&gt;
&lt;h3&gt;单臂路由（router on a stick）&lt;/h3&gt;
&lt;p&gt;通过配置中继和路由子接口，让路由器也参与到虚拟局域网中来，每个子接口对应于一个 vlan 接入接口，配置如下：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;#intface f0/0.1&lt;/li&gt;
&lt;li&gt;#encapsulation dot1q vlan 30&lt;/li&gt;
&lt;li&gt;#ip addr xxx xxxx&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;配置语音 vlan&lt;/h2&gt;
&lt;p&gt;ip 电话就是一个特殊三端口的交换机，一个口接交换机的接入端口，一个接 pc，另一个供自身使用，它和交换机建立中继链路（通过 CDP）以承载 pc 发来的流量。需要注意的是这里交换机端口不再仅属于一个 vlan，出了接入 vlan 外还要在其开启服务质量后分配一个语音 vlan 以承载语音数据。配置具体步骤如下&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;#config t 进入全局配置模式&lt;/li&gt;
&lt;li&gt;#mls qos 开启服务质量&lt;/li&gt;
&lt;li&gt;#interface f/1 进入端口配置模式&lt;/li&gt;
&lt;li&gt;#switchport priority extend trust&lt;/li&gt;
&lt;li&gt;#mls qos trust cos&lt;/li&gt;
&lt;li&gt;#switchport voicevlan dot1q&lt;/li&gt;
&lt;li&gt;#switchport mode access&lt;/li&gt;
&lt;li&gt;#switchport access vlan 3&lt;/li&gt;
&lt;li&gt;#switchport   voice vlan 10&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[CCNA-交换基础和STP]]></title><description><![CDATA[交换基础 分层网络中交换机的功能 转发数据包方式 第二层交换的 3 个功能 端口安全 生成树协议（spanning tree protocol，STP） 基本概念 桥 ID 根桥 网桥协议数据单元（bridge protocol data unit…]]></description><link>https://xdays.me/CCNA-交换基础和stp/</link><guid isPermaLink="false">https://xdays.me/CCNA-交换基础和stp/</guid><pubDate>Tue, 02 Nov 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;交换基础
&lt;ul&gt;
&lt;li&gt;分层网络中交换机的功能&lt;/li&gt;
&lt;li&gt;转发数据包方式&lt;/li&gt;
&lt;li&gt;第二层交换的 3 个功能&lt;/li&gt;
&lt;li&gt;端口安全&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;生成树协议（spanning tree protocol，STP）
&lt;ul&gt;
&lt;li&gt;基本概念
&lt;ul&gt;
&lt;li&gt;桥 ID&lt;/li&gt;
&lt;li&gt;根桥&lt;/li&gt;
&lt;li&gt;网桥协议数据单元（bridge protocol data unit）&lt;/li&gt;
&lt;li&gt;根端口&lt;/li&gt;
&lt;li&gt;指定端口&lt;/li&gt;
&lt;li&gt;端口状态&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;STP 协议执行过程（820.1D）&lt;/li&gt;
&lt;li&gt;其他生成树协议&lt;/li&gt;
&lt;li&gt;拓展特性
&lt;ul&gt;
&lt;li&gt;portfast&lt;/li&gt;
&lt;li&gt;BPDU guard&lt;/li&gt;
&lt;li&gt;BPDU filtering&lt;/li&gt;
&lt;li&gt;uplinkfast&lt;/li&gt;
&lt;li&gt;backbonefast&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;交换基础&lt;/h2&gt;
&lt;h3&gt;分层网络中交换机的功能&lt;/h3&gt;
&lt;p&gt;LAN 体系结构分为三层，包括接入层（access），分发层（distribute）和核心层（core），每一层对交换机的功能都有不同要求，具体如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;层次 功能要求
接入层 端口安全；VLAN；快速以太网/千兆以太网；以太网供电（PoE）；链路聚合（Etherchannel）；服务质量（QoS）
分布层 第 3 层支持；很高的转发速率；千兆以太网/万兆以太网；冗余组件；安全策略/访问控制列表；链路聚合；服务质量
核心层 第 3 层支持；极高转发速度；千兆以太网/万兆以太网；冗余组件；链路聚合；服务质量&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;转发数据包的方式&lt;/h3&gt;
&lt;p&gt;交换机转发数据的方式有存储转发和快速转发，其中快速转发又可分为快速转发和免分片转发（fragment-free），快速转发只查看目的地址就开始转发，免分片转发转发之前存储前 64 个字符。&lt;/p&gt;
&lt;h3&gt;第二层交换的 3 个功能&lt;/h3&gt;
&lt;p&gt;地址学习，转发/过滤（控制冲突域），避免环路（STP）&lt;/p&gt;
&lt;h3&gt;端口安全&lt;/h3&gt;
&lt;p&gt;端口安全包括两方面内容：安全规则和违规模式。安全规则包括允许特定 MAC 地址访问，允许特定数量的 MAC 地址访问；违规模式包括保护（仅不转发流量），限制（不转发流量，发出 SNMP 陷阱和 syslog 消息，增加违规计数器），关闭（限制的所有动作，关闭端口）。注意：MAC 地址的获取方式包括静态，动态和粘滞（sticky），粘滞方式会把学习到的 MAC 地址添加到运行配置文件中。下表为相关配置命令：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;#switchport port-security [ mac-address | maximum | violation]
#switchport port-security mac-address [ x.x.x.x | sticky ]
#switchport port-security maximum x
#switchport port-security violation protect | restrict | shutdown&lt;/p&gt;
&lt;hr&gt;
&lt;h2&gt;生成树协议（spanning tree protocol，STP）&lt;/h2&gt;
&lt;h3&gt;基本概念&lt;/h3&gt;
&lt;h4&gt;桥 ID&lt;/h4&gt;
&lt;p&gt;用来标识广播域内的每一个交换机，它主要由如下三部分组成：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;桥优先级 4 位 扩展系统 ID 12 位 MAC 地址 48 位&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;根桥&lt;/h4&gt;
&lt;p&gt;实施 STP 的第一步就是选根桥，因为一些行为都是相对根桥来操作的，可以把根桥想象成最终形成的 STP 树的根。选举根桥的标准时最高的网桥优先级，特别注意这里的最高网桥优先级是指的最小的桥 ID，也就是说在选举根桥的时候数字越小越好&lt;/p&gt;
&lt;h4&gt;网桥协议数据单元（spanning tree protocol，STP）&lt;/h4&gt;
&lt;p&gt;下图是通过 wireshark 抓到的 STP 消息：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/switch-stp-bpdu.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/switch-stp-bpdu.jpg&quot; alt=&quot;switch-stp-bpdu&quot; title=&quot;switch-stp-bpdu&quot;&gt;&lt;/a&gt;注意消息类型字段是区分 BPDU 类型：0x00 表示配置 BPDU，0x80 表示 TCN 用于拓扑发生变化时通告，另外链路开销如下表：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;链路速度 开销
10Gbit/s 2
1Gbit/s 4
100Mbit/s 19
10Mbit/s 100&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;根端口&lt;/h4&gt;
&lt;p&gt;所有的非根网桥都要选举根端口，就是到达根桥开销最小的端口。首先明确一点就是在生成树协议中数字越小优先级越大，然后确定根端口的标准先后顺序是：路径开销—上一跳交换机的桥 ID—链路另一端端口优先级—链路另一端端口号&lt;/p&gt;
&lt;h4&gt;指定端口（designate port）&lt;/h4&gt;
&lt;p&gt;每一条二层链路上都要选举，也就是连接交换机的链路两端要有一个是指定端口。确定知道那个端口的标准有限顺序和确定根端口的一样。这时候我们想想根端口和指定端口恰好完美的实现了无环拓扑的构建，根端口确保了每个网桥到达根的路径只有一条且开销最小，而指定端口在根端口的基础上确保每条链路到达根桥的路径只有一条且开销最小，最终便实现了一种逻辑上星型的拓扑&lt;/p&gt;
&lt;h4&gt;端口状态&lt;/h4&gt;
&lt;p&gt;下表为 802.1D 规定的端口状态：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;端口状态 动作
阻塞（blocking） 丢弃收到数据帧；不转发数据帧；不获取地址；接收处理 BPDU
侦听（listening） 丢弃收到数据帧；不转发数据帧；不获取地址；接收处理并传输 BPDU
学习（learning） 丢弃收到数据帧；不转发数据帧；获取地址；接收处理并传输 BPDU
转发（forwarding） 接收转发收到数据帧；转发数据帧；获取地址；接收处理传输 BPDU
禁用（disabled） 相当于 down 状态&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;STP 执行过程&lt;/h3&gt;
&lt;p&gt;总体上来说是选举根桥—选举根端口—选举指定端口—把非指定端口 block 掉，完成收敛。下面用转自&lt;a href=&quot;http://www.china-ccie.com/ccie/lilun/switching/switching.html#6&quot;&gt;china-ccie&lt;/a&gt;上的例子来说明&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/11/switch-stp-converge.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/11/switch-stp-converge.jpg&quot; alt=&quot;switch-stp-converge&quot; title=&quot;switch-stp-converge&quot;&gt;&lt;/a&gt;&lt;br&gt;
上图的网络环境中，运行 STP 后，则选举如下角色：（所有链路为 100
Mb/s，即 Path Cost 值为 19）&lt;/p&gt;
&lt;p&gt;根交换机（Root）&lt;/p&gt;
&lt;p&gt;因为 4 台交换机的优先级分别为 SW1（4096）
，SW2（24576），SW3（32768），SW4（32768），选举优先级最高的（数字最低的）为根交换机，所以 SW1 被选为根交换机，如果优先级相同，则比较 MAC 地址。&lt;/p&gt;
&lt;p&gt;根端口（Root Port）&lt;/p&gt;
&lt;p&gt;根端口需要在除 SW1 外的非根交换机上选举。SW2 上从端口 F0/23 到达根的 Path
Cost 值为 19，从 F0/19 和 F0/20 到达根的 Path
Cost 值都为 19×3=57。因此，F0/23 被选为根端口。SW3 上从端口 F0/19 到达根的 Path
Cost 值为 19，从 F0/23 和 F0/24 到达根的 Path
Cost 值都为 19×3=57。因此，F0/19 被选为根端口。SW4 上从所有端口到达根的 Path
Cost 值都为 19×2=38，所以从比较 Path
Cost 值，无法选出根端口，接下来比较上一跳交换机 Bridge-ID，也就是比较 SW2 与 SW3 的 Bridge-ID，所以选择往 SW2 的方向，然而通过端口 F0/19 和 F0/20 都可以从 SW2 到达根交换机，所以接下来比较端口 F0/19 和 F0/20 对端交换机端口的优先级，因为 SW2 的 F0/19 端口优先级为 128，而 F0/20 的端口优先级为 112，所以 SW4 选择连接 SW2 的 F0/20 的端口为根端口，即 SW4 的 F0/20 为根端口，如果此步还选不出，SW4 将根据
对端端口号做出决定，也就是 F0/19 和 F0/20，数字小的为根端口，也就是 F0/19。&lt;/p&gt;
&lt;p&gt;指定端口(Designated Port)&lt;/p&gt;
&lt;p&gt;每个网段（每个冲突域），或理解为每条线路都要选举指定端口。在根交换机 SW1 连接 SW2 的网段与连接 SW3 的网段中，当然是根自己的端口离自己最近，所以这两个网段中，选举根交换机上的端口为指定端口，因此，根交换机上所有的端口都应该是指定端口。在 SW3 连接 SW4 的两个网段中，同样也是 SW3 上的两个端口离根交换机最近，所以在这两个网段中，选举 SW3 上的端口为指定端口。在 SW2 连接 SW4 的两个网段中，同样也是 SW2 上的两个端口离根交换机最近，所以在这两个网段中，选举 SW2 上的端口为指定端口。&lt;/p&gt;
&lt;p&gt;注：根交换机上所有的端口最终都为指定端口。&lt;/p&gt;
&lt;p&gt;其它既不是根端口，也不是指定端口的落选的端口，就是 SW4 上的 F0/19，F0/23，F0/24，都将被 STP 放入 Blocking 状态，不为用户提供数据转发，以此来防止环路。最终的网络，构建出了任何两点之间，都是单链路的环境，不会有环路，当使用中的链路失效时，Blocking 的端口可以代替原端口。上图的 STP 选举结果如下：&lt;/p&gt;
&lt;p&gt;根交换机（Root）&lt;/p&gt;
&lt;p&gt;SW1&lt;/p&gt;
&lt;p&gt;根端口（Root Port）&lt;/p&gt;
&lt;p&gt;SW2：F0/23 SW3：F0/19 SW4：F0/20&lt;/p&gt;
&lt;p&gt;指定端口(Designated Port)&lt;/p&gt;
&lt;p&gt;SW1：F0/19，F0/23 SW2：F0/19，F0/20 SW3：F0/23，F0/24&lt;/p&gt;
&lt;p&gt;Blocking 端口&lt;/p&gt;
&lt;p&gt;SW4：F0/19，F0/23，F0/24&lt;/p&gt;
&lt;h3&gt;其他生成树协议&lt;/h3&gt;
&lt;h4&gt;快速生成树协议（rapid STP，RSTP,也就是 802.1w）&lt;/h4&gt;
&lt;p&gt;因为阻塞，侦听和禁用都不转发数据，将其统一为丢弃（discarding）状态，RSTP 端口有丢弃，学习和转发 3 种状态。在 STP 中链路失效要经过一个最大失效时间和两个转发延迟才能启用 block 端口这样需要进过 50 秒，而 RSTP 经过 3 个 Hello 时间就认为与根交换机失去联系，立即将丢弃状态的转为启用状态。&lt;/p&gt;
&lt;h4&gt;PVST（思科专有 ISL 协议），PVST+（pervlan 802.1d）和 Rapid PVST+（pervlan 802.1w）&lt;/h4&gt;
&lt;p&gt;这三种协议都支持 vlan，在每个 vlan 上构建独立的生成树，PVST 只支持 ISL 中继协议，PVST+和 Rapid
PVST+分别是基于 STP（802.1D）和 RSTP（802.1w）并添加了 vlan 的支持，而且添加了一些拓展特性，关于这些拓展特性下面会有讨论。注意：以上协议为思科转悠协议&lt;/p&gt;
&lt;h4&gt;MSTP(802.1s)&lt;/h4&gt;
&lt;p&gt;多个 vlan 可映射到相同的生成树实例，由 802.1s 规定&lt;/p&gt;
&lt;h3&gt;拓展特性&lt;/h3&gt;
&lt;h4&gt;portfast&lt;/h4&gt;
&lt;p&gt;因为对于接入层的交换机接口一般不会形成环路，所以端口启动时可以跳过 STP 计算过程直接过渡到转发状态，这就是 portfast&lt;/p&gt;
&lt;h4&gt;BPDU guard&lt;/h4&gt;
&lt;p&gt;如果启用了 portfast 的端口连接了会收到 BPDU 消息这种情况下 portfast 是个错误的配置，为了避免这个问题可以添加 BPDU
guard 特性，也就是当收到 BPDU 消息时执行 shutdown 或者 error-disable 状态。全局启动的 bpduguard 只会影响启用了 portfast 的端口，而接口上的启动的 bpduguard 会对所有接口有效不管它是否开启了 portfast&lt;/p&gt;
&lt;h4&gt;BPDU filtering&lt;/h4&gt;
&lt;p&gt;过滤掉接口上发送和接收的 BPDU，相当于关闭了 STP 功能。如果 BPDU
Filtering 是全局开启的，则只能在开启了 portfast 的接口上过滤 BPDU，并且只能过滤掉发出的 BPDU，并不能过滤收到的 BPDU；如果是在接口模式下开启的，则可以过滤掉任何接口收到和发出的 BPDU&lt;/p&gt;
&lt;h4&gt;uplinkfast&lt;/h4&gt;
&lt;p&gt;接入层交换机检测到自身的链路断开时立即开启 blocking 的端口而不去等待 Hello 超时和转发延迟，且只支持全局开启。&lt;/p&gt;
&lt;h4&gt;backbonefast&lt;/h4&gt;
&lt;p&gt;具体参考一下&lt;a href=&quot;http://www.china-ccie.com/ccie/lilun/switching/switching.html#17&quot;&gt;http://www.china-ccie.com/ccie/lilun/switching/switching.html#17&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CCNA-EIGRP和OSPF]]></title><description><![CDATA[增强内部网关路由协议 EIGRP 概述 消息格式 消息类型 可靠传输协议 邻居关系建立 度量计算 DUAL 算法相关概念 可行距离 报告（通告）距离 后继路由器 可行后继路由器 配置和排错 开放最短路径优先协议 OSPF 概述 消息格式 消息类型 路由 ID…]]></description><link>https://xdays.me/CCNA-eigrp和ospf/</link><guid isPermaLink="false">https://xdays.me/CCNA-eigrp和ospf/</guid><pubDate>Sun, 31 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;增强内部网关路由协议 EIGRP&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;概述
&lt;ul&gt;
&lt;li&gt;消息格式&lt;/li&gt;
&lt;li&gt;消息类型&lt;/li&gt;
&lt;li&gt;可靠传输协议&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;邻居关系建立&lt;/li&gt;
&lt;li&gt;度量计算&lt;/li&gt;
&lt;li&gt;DUAL 算法相关概念
&lt;ul&gt;
&lt;li&gt;可行距离&lt;/li&gt;
&lt;li&gt;报告（通告）距离&lt;/li&gt;
&lt;li&gt;后继路由器&lt;/li&gt;
&lt;li&gt;可行后继路由器&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配置和排错&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;开放最短路径优先协议 OSPF&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;概述
&lt;ul&gt;
&lt;li&gt;消息格式&lt;/li&gt;
&lt;li&gt;消息类型&lt;/li&gt;
&lt;li&gt;路由 ID&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;邻接关系建立&lt;/li&gt;
&lt;li&gt;度量计算&lt;/li&gt;
&lt;li&gt;迪科斯特拉算法（Dijkstra，或称 SPF）&lt;/li&gt;
&lt;li&gt;多路访问网络中 DR 和 BDR 选择&lt;/li&gt;
&lt;li&gt;配置和排错&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;增强内部网关路由协议 EIGRP&lt;/h2&gt;
&lt;h3&gt;概述&lt;/h3&gt;
&lt;h4&gt;消息格式&lt;/h4&gt;
&lt;p&gt;EIGRP 的一大特性是通过协议相关模块（protocol
dependentmodules，PDM）支持多种协议，有 IP，IPv6，IPX，AppleTalk 四种，此处我们只学习 IP 协议相关的。EIGRP 封装于 IP 数据包中，协议类型字段为 0x58，采用三层组播地址 224.0.0.10，二层组播地址为 0100.5e00.000a。下表是数据包格式：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;帧头 IP 数据包 EIGRP 数据包包头 类型/长度/值（TLV）&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;EIGRP 数据包包头&lt;/p&gt;
&lt;table style=&quot;text-align: center;&quot; border=&quot;1&quot; cellspacing=&quot;0&quot; cellpadding=&quot;0&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td width=&quot;189&quot; valign=&quot;top&quot;&gt;
版本
&lt;/td&gt;
&lt;td width=&quot;189&quot; valign=&quot;top&quot;&gt;
操作码
&lt;/td&gt;
&lt;td width=&quot;189&quot; valign=&quot;top&quot;&gt;
校验和
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot; width=&quot;568&quot; valign=&quot;top&quot;&gt;
标志
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot; width=&quot;568&quot; valign=&quot;top&quot;&gt;
序列号
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot; width=&quot;568&quot; valign=&quot;top&quot;&gt;
确认
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot; width=&quot;568&quot; valign=&quot;top&quot;&gt;
自治系统号
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td colspan=&quot;3&quot; width=&quot;568&quot; valign=&quot;top&quot;&gt;
TLVs
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
其中TLVs又分参数TLV，内部路由TLV，外部路由TLV
&lt;h4&gt;消息类型&lt;/h4&gt;
&lt;p&gt;EIGRP 共有 5 种数据包类型，分别是：Hello，更新，查询，响应，确认。这些数据包由协议数据包包头的操作码（opcode）字段来决定&lt;/p&gt;
&lt;h4&gt;可靠传输协议&lt;/h4&gt;
&lt;p&gt;因为传输层采用实时传输协议（real time
protocol，RTP），EIGRP 支持可靠和不可靠传输。Hello 数据包采用不可靠传输，其他几种数据包都采用可靠传输，即收到数据包后要进行确认&lt;/p&gt;
&lt;h3&gt;邻居关系建立&lt;/h3&gt;
&lt;p&gt;邻居关系的建立和维持是通过不断发送 Hello 数据包维持的，一般网络每 5 秒发送一次，dead 时间是 15 秒，对于非广播多路访问网络（NBMA）的发送时间间隔为 60 秒，dead 时间为 180 秒。邻居关系建立的条件有如下三个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;发送和收到 Hello 数据包&lt;/li&gt;
&lt;li&gt;具有相同的 AS 号&lt;/li&gt;
&lt;li&gt;具有相同的度量（K 值）&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;度量计算&lt;/h3&gt;
&lt;p&gt;EIGRP 的度量有带宽（bandwidth），延迟（delay），负载（load），可靠性（reliability），虽然最大传输单元（maximum
transport
unit，MTU）不是度量，但是在设置 K 值和路由重定向时需要指定，度量计算公式如下：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Metric = （10000000/bandwidth + delay-of-sum/10）* 256&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;DUAL 算法&lt;/h3&gt;
&lt;p&gt;DUAL 的核心是保证了到达目的网络不会出现路由环路&lt;/p&gt;
&lt;h4&gt;可行距离（feasible distance，FD）&lt;/h4&gt;
&lt;p&gt;到达目的网络的所有路径中的最佳度量，这条路径会添加到路由表中&lt;/p&gt;
&lt;h4&gt;报告距离（reported/advertised distance，RD/AD）&lt;/h4&gt;
&lt;p&gt;只是从不同路由器角度对同一度量的不同称呼，比如路由器 A 发送通告给路由器 B，这个度量对于 A 来说是可行距离，对于 B 来说是通告距离&lt;/p&gt;
&lt;h4&gt;可行性条件（feasible condition，FD）&lt;/h4&gt;
&lt;p&gt;当邻居通向特定网络的报告距离比本地路由通向相同网络的可行距离短时，即满足可行性条件&lt;/p&gt;
&lt;h4&gt;后继路由器（successor）&lt;/h4&gt;
&lt;p&gt;用于转发数据包的邻居路由，具有到达目的网络最小的开销，它会显示在路由表中&lt;/p&gt;
&lt;h4&gt;可行后继路由器（feasible successor）&lt;/h4&gt;
&lt;p&gt;满足可行性条件，但是没有当前的后继路由器的报告距离小的邻居路由器&lt;/p&gt;
&lt;h3&gt;配置和排错&lt;/h3&gt;
&lt;h4&gt;配置命令&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;#router  eigrp xx  开启 EIGRP，xx 为自治系统号&lt;/li&gt;
&lt;li&gt;#network 192.168.1.0
0.0.0.255 设置参与路由协议的网络（通配符子网掩码可以表示一个范围的网段，其中 0 表示必须匹配 1 表示不需要匹配）&lt;/li&gt;
&lt;li&gt;#passive-interface
interface-id 设置不参与路由协议的接口（设置被动接口的接口将也不会发送 Hello 数据包，这一点与 RIP 区分开）&lt;/li&gt;
&lt;li&gt;#no auto-summary 不自动汇总&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;排错命令&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;#sh ip eigrp neighbour&lt;/li&gt;
&lt;li&gt;#sh ip eigrp topology
[all-links]查看拓扑结构，加上 all-links 时不符合可行性条件的条目也会列举出来&lt;/li&gt;
&lt;li&gt;#debug ip eigrp **查看 eigrp 产生的一些日志信息&lt;/li&gt;
&lt;/ul&gt;
&lt;h2&gt;开放最短路径优先协议 OSPF&lt;/h2&gt;
&lt;h3&gt;概述&lt;/h3&gt;
&lt;h4&gt;消息格式&lt;/h4&gt;
&lt;p&gt;OSPF 包封装于 IP 数据包中，协议代号为 0x59,；采用组播地址 224.0.0.5 和 224.0.0.6，前者代表所有路由器，后者代表 DR 和 BDR&lt;/p&gt;
&lt;p&gt;OSPF 分组&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;帧头 IP 数据包 OSPF 数据包包头 数据&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;OSPF 数据包包头&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;版本 类型 分组长度 路由器 ID 区域 ID 校验和 身份验证类型 身份验证&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;消息类型&lt;/h4&gt;
&lt;hr&gt;
&lt;p&gt;类型 作用
Hello 发现邻居并在他们之间建立邻接（adjacency）关系
数据库描述（DBD） 检查数据库之间是否同步
链路状态请求（LSR） 向另一台路由器请求特定的链路状态
链路状态更新（LSU） 发送请求的链路转台更新
确认（LSAck） 对其他类型的分组确认&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;路由 ID&lt;/h4&gt;
&lt;p&gt;用来表示路由器的 IP 的地址，有环回接口的用最高环回接口作为 RID，如果没有用所有接口中最高的 IP 地址作为 RID，路由 ID 还用于多路访问网络中 DR 和 BDR 的选择。&lt;/p&gt;
&lt;h3&gt;邻接关系的建立&lt;/h3&gt;
&lt;p&gt;邻接关系的建立和维持是通过不断发送 Hello 数据包维持的，一般网络每 10 秒发送一次，dead 时间是 40 秒，对于非广播多路访问网络（NBMA）的发送时间间隔为 30 秒，dead 时间为 120 秒。邻居关系建立的条件有如下三个：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;具有相同的 Hello 发送和失效时间&lt;/li&gt;
&lt;li&gt;区域 ID 相同&lt;/li&gt;
&lt;li&gt;末节区域标记相同&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;度量计算&lt;/h3&gt;
&lt;p&gt;计算公式如下：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Metric = 100000000 / bandwidth 或者自己通过 ip ospf cost 命令自己设定&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;迪科斯特拉（Dijkstra）算法&lt;/h3&gt;
&lt;p&gt;Dijkstra 算法的核心思想是让每台路由器通过泛洪得到的链路状态数据库构建一个以自己为根的全网目录树。大体过程是这样的：路由器启动起来自后，首先了解自身的直连网络，然后向邻居发送 Hello 数据包建立邻接关系，接着每个路由器建立链路状态数据包并泛洪给邻接路由器，邻居收到后继续泛洪给除接受接口的其他接口知道所有路由器保存了全网链路状态数据库，最后路由器执行 SPF 算法构建自己的 SPF 树同时计算最短路径并将相应条目添加到路由表中，由此完成了收敛&lt;/p&gt;
&lt;h3&gt;多路访问网络中 DR 和 BDR 的选择&lt;/h3&gt;
&lt;p&gt;多路访问网络中的 OSPF 问题是每两台路由器间都要创建邻接关系导致大量的邻接关系，而且由于 OSPF 初始化采用泛洪方式会导致流量很大。为了解决这一问题，采用选举指定路由器（designate
router）然后通过 DR 做代表来减小避免上述问题的方法。一个有趣的类比是：多个人之间相互介绍肯定要比选一个人做代表然后一一向大家介绍每一个人所用的时间要多，这就是 DR 的作用，而 BDR 主要是用作备份。选举的方式如下：先比较路由器优先级，选择拥有最高优先级（优先级数字越大说明优先级越高）做 DR，第二高的作为 BDR，如果优先级相同则通过路由器 ID 来比较。&lt;/p&gt;
&lt;h3&gt;配置和排错&lt;/h3&gt;
&lt;h4&gt;配置命令&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;#router ospf  xx 开启 OSPF，xx 为进程号，本地有效&lt;/li&gt;
&lt;li&gt;#network 192.168.1.0 0.0.0.255 area
0 参与路由协议的接口或者说网段并且制定区域 ID&lt;/li&gt;
&lt;li&gt;#passive-interface 不参与路由协议的接口&lt;/li&gt;
&lt;li&gt;#router-id 10.1.1.1 手动指定 RID&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;排错命令&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;#sh ip ospf neighbor | database | interface&lt;/li&gt;
&lt;li&gt;#debug ip ospf  *&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[CCNA-静态路由和RIP]]></title><description><![CDATA[静态路由 路由全过程 路由表原理 带下一跳或送出接口的静态路由 默认路由 路由信息协议（routing infomation protocol，RIP） 度量和管理距离 路由环路及解决办法 RIP 的各种定时器 配置相关命令 连续网络问题 RIPv2 与 RIPv…]]></description><link>https://xdays.me/CCNA-静态路由和rip/</link><guid isPermaLink="false">https://xdays.me/CCNA-静态路由和rip/</guid><pubDate>Sat, 30 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;静态路由
&lt;ul&gt;
&lt;li&gt;路由全过程&lt;/li&gt;
&lt;li&gt;路由表原理&lt;/li&gt;
&lt;li&gt;带下一跳或送出接口的静态路由&lt;/li&gt;
&lt;li&gt;默认路由&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;路由信息协议（routing infomation protocol，RIP）
&lt;ul&gt;
&lt;li&gt;度量和管理距离&lt;/li&gt;
&lt;li&gt;路由环路及解决办法&lt;/li&gt;
&lt;li&gt;RIP 的各种定时器&lt;/li&gt;
&lt;li&gt;配置相关命令&lt;/li&gt;
&lt;li&gt;连续网络问题&lt;/li&gt;
&lt;li&gt;RIPv2 与 RIPv1 的区别&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;静态路由&lt;/h3&gt;
&lt;h4&gt;路由全过程&lt;/h4&gt;
&lt;p&gt;数据在位于不同网段内的两个主机之间传播经过了那些过程，在《CCNA 学习指南》第六章的“路由基础”节“IP 路由选择过程”小节分 36 步详细说明，这里略过&lt;/p&gt;
&lt;h4&gt;路由表原理&lt;/h4&gt;
&lt;p&gt;一下这三条原理出自《 cisco ip routing
》，相当经典，先记下这三条路由原则，在以后的路由学习过程中逐渐体会才能真正理解其含义：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;每个路由器根据自身的路由表独立作出路径选择&lt;/li&gt;
&lt;li&gt;一台路由器中包含的某些信息并不表示其他路由器也有相同的信息&lt;/li&gt;
&lt;li&gt;一个网络到达另一个网络的路由信息并提供反向路径的路由信息&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;带下一跳或者带送出接口的静态路由&lt;/h4&gt;
&lt;p&gt;在配置静态路由时可以指定下一跳地址或者送出接口，两者区别就在于如果指定的是下一跳地址路由器还需要再查找一次路由表以便确定送出接口，所以推荐用送出接口直接指定；但是对于以太网由于同一网段内可能不止两个接口，所以最好同时指定下一跳地址和送出接口。总之，对于串行链路指定送出接口，对于以太网接口指定下一跳地址和送出接口&lt;/p&gt;
&lt;h4&gt;默认路由&lt;/h4&gt;
&lt;p&gt;其实默认路由和路由汇总的目的都是减小路由表的数目，路由汇总实际上就是 CIDR 的概念，即通过减小子网掩码中 1 的个数，来将多个小的子网汇总成一个大的网络。这里说默认路由通常用于截断网络（stub
network，也叫截断网络），这种网络有且仅有一个出口路由器&lt;/p&gt;
&lt;h3&gt;路由信息协议（routing infomation protocol，RIP）&lt;/h3&gt;
&lt;h4&gt;度量和管理距离&lt;/h4&gt;
&lt;p&gt;度量（metric）是用来权衡通过同种路由协议获得的到达相同网段的多个路由条目的重要性，通常包括跳数，带宽，延迟，负载，可靠性和开销；管理距离（administrative
distance，AD）用于权衡通过不同协议获得的到达相同网段的多个路由条目的重要性。也就是说先比较管理距离，再比较度量。下表是不同路由协议的管理距离总结：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;路由类型 默认 AD
直连路由 0
静态路由 1
EIGRP 90
IGRP 100
OSPF 110
RIP 120
外部 EIGRP 170
未知路由 255&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;其中未知路由不会被使用。&lt;/p&gt;
&lt;h4&gt;路由环路及解决办法&lt;/h4&gt;
&lt;p&gt;路由环路的根本原因是距离矢量路由协议的收敛速度慢，它是这样一种状态：两个相邻的路由器都认为能通过各自到达一个已经关闭的网络，数据包在两个路由器之间来回传播直到 ttl 等于 0 为止。解决办法由如下几种：&lt;/p&gt;
&lt;p&gt;设置最大跳数（maximum hop count）&lt;/p&gt;
&lt;p&gt;路由环路实际上就是一个计数到无穷大的过程，可以设定一个上限，达到上限就认为目的网络不可达，这个上限就是最大跳数，RIP 的最大跳数是 15，计数至就认为目的网络不可达。&lt;/p&gt;
&lt;p&gt;水平分割（split horizon）&lt;/p&gt;
&lt;p&gt;通过特定接口接收到并学习的路由信息不会再从对应接口发送出去。&lt;/p&gt;
&lt;p&gt;路由毒化（route poisoning）&lt;/p&gt;
&lt;p&gt;当一个网络出问题时与其相连的路由器将对应网段标记为不可达，当接收到不可达的路由信息时接收路由器再将不可达路由信息反向发给发送方，这样就确保了所有路由器都接收到这个不可达路由信息，这个过程叫毒性反转（poison
reserve）&lt;/p&gt;
&lt;p&gt;保持关闭（holddowns）&lt;/p&gt;
&lt;p&gt;对于关闭网络设定一个定时器，超时后再发送相应的路由信息，有效防止频繁开关的网络影响网络收敛（convergence）&lt;/p&gt;
&lt;p&gt;RIP 的各种定时器&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 作用 时间（单位 s）
更新定时器 发送路由更新时间 30
失效定时器 认定路由失效等待的时间 180
保持失效定时器 不可达路由信息的保持时间 180
刷新计时器 无效路由器删除前等待时间 240&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;相关配置命令&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;启动 rip 并启动路由配置模式#router rip&lt;/li&gt;
&lt;li&gt;设置参加路由协议的网络#network&lt;/li&gt;
&lt;li&gt;其他命令&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;ul&gt;
&lt;li&gt;排除不参与路由协议的接口：passive-interface，但要注意这个接口还是会接收路由更新的，只是不会发送了。&lt;/li&gt;
&lt;li&gt;设置默认网络：default-infomation originate&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;连续网络问题&lt;/h4&gt;
&lt;p&gt;这个问题能很有意思，通过这个例子也能更好的理解 RIPv1 和 RIPv2 的区别。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/route-ripv1-discontiguousnetworks.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/10/route-ripv1-discontiguousnetworks.jpg&quot; alt=&quot;route-ripv1-discontiguousnetworks&quot; title=&quot;route-ripv1-discontiguousnetworks&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;有类网络 172.30.0.0 的三个子网 172.30.1.0，172.30.2.0，172.30.100.0 被不同的有类网络的子网 209.265.200.228 和 209.265.200.232 分隔开。由于 RIPv1 是有类网络在更新中只发送有类网络的路由信息这是最根本的问题，R2 会认为到达 172.30.0.0 有两条路径且度量相等，所以会执行等价均衡负载，R1 和 R3 也不能学习到各自相连的网络。&lt;/p&gt;
&lt;p&gt;如果我们将路由协议改为 RIPv2 仍然会出现这个问题，这是因为路由器在发送路由更新时会自动把有类网络的子网汇总到有类网络，而忽略了子网的路由信息，这是不连续网络问题的另一个原因。&lt;/p&gt;
&lt;h4&gt;RIPv2 与 RIPv1 的区别&lt;/h4&gt;
&lt;p&gt;下表总结了两个版本的区别&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;RIPv1 RIPv2
有类 无类
广播更新 组播更新（224.0.0.9）
不支持不连续网络 支持连续网络
不支持验证 支持验证&lt;/p&gt;
&lt;hr&gt;</content:encoded></item><item><title><![CDATA[CCNA-硬件及IOS]]></title><description><![CDATA[硬件组成 主要部件 接口与端口 配置寄存器 启动过程 IOS 备份升级 CLI 命令 设置标志区 重设口令 启用 ssh 服务 设置加载 ios 顺序和位置 优化命令 硬件组成 主要部件 应当说路由器就是一台专用计算机，它的主要组件有： 名称 功能
只读存储器（ROM…]]></description><link>https://xdays.me/CCNA-硬件及ios/</link><guid isPermaLink="false">https://xdays.me/CCNA-硬件及ios/</guid><pubDate>Thu, 28 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;ul&gt;
&lt;li&gt;硬件组成
&lt;ul&gt;
&lt;li&gt;主要部件&lt;/li&gt;
&lt;li&gt;接口与端口&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;配置寄存器&lt;/li&gt;
&lt;li&gt;启动过程&lt;/li&gt;
&lt;li&gt;IOS 备份升级&lt;/li&gt;
&lt;li&gt;CLI 命令
&lt;ul&gt;
&lt;li&gt;设置标志区&lt;/li&gt;
&lt;li&gt;重设口令&lt;/li&gt;
&lt;li&gt;启用 ssh 服务&lt;/li&gt;
&lt;li&gt;设置加载 ios 顺序和位置&lt;/li&gt;
&lt;li&gt;优化命令&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;硬件组成&lt;/h3&gt;
&lt;h4&gt;主要部件&lt;/h4&gt;
&lt;p&gt;应当说路由器就是一台专用计算机，它的主要组件有：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 功能
只读存储器（ROM） 开机自检程序 POST 确定硬件功能及可用接口，Bootstrap 引导程序加载 IOS，微型 IOS 用于维护操作
随机存储器（RAM） 保存路由器运行时的临时数据，各种表，相当于ＰＣ中的内存
非易失性存储器（NVRAM） 保存路由器和交换机的配置
闪存（FLASH） 用于保存 IOS 文件
配置寄存器（configuration register） 控制路由器的启动方式，需要注意它存储在 NVRAM 中&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;接口与端口&lt;/h4&gt;
&lt;p&gt;接口（interface）通常指用于转发数据包的物理接口，而端口（port）指用于管理路由器的物理接口&lt;/p&gt;
&lt;h3&gt;配置寄存器&lt;/h3&gt;
&lt;p&gt;共有 16 位来控制路由器的启动方式。其中第 6 位表示忽略 NVRAM 内容，用于重设口令，最为常见；正常情况为 0x2102，忽略 NVRAM 中配置文件为 0x2142，详见重设口令&lt;/p&gt;
&lt;h3&gt;启动过程&lt;/h3&gt;
&lt;ol&gt;
&lt;li&gt;上电，POST 执行自检，检查接口&lt;/li&gt;
&lt;li&gt;Bootstrap 查找 IOS 并加载，默认从闪存中加载，然后是 TFTP 上，最后是 ROM 中的迷你 IOS&lt;/li&gt;
&lt;li&gt;IOS 在 NVRAM 中查找启动配置文件，如果没有发送广播在 TFTP 上寻找配置文件，如果也没有就启动设置模式&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;备份升级&lt;/h3&gt;
&lt;h4&gt;有 IOS 升级备份&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;确定与 TFTP 的连通性 ping&lt;/li&gt;
&lt;li&gt;查看 FLASH 大小，sh flash / sh version&lt;/li&gt;
&lt;li&gt;升级#copy tftp flash/备份#copy flash tftp&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;重新安装 IOS&lt;/h4&gt;
&lt;p&gt;有时候因为一些情况 flash 中 IOS 被破坏导致系统无法正常启动，两种解决办法，具体如下：&lt;/p&gt;
&lt;p&gt;系统无法加载 IOS 默认是进入 rommon 模式&lt;/p&gt;
&lt;p&gt;方法一  tftpdnld&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;设置如下环境变量，指定 tftp 和加载文件&lt;/li&gt;
&lt;li&gt;执行 tftpdnld，然后按提示操作后，reset 重启&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;方法二 xmodem&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;需要说明的是用 console 口传很慢，能加快点的方法是提高波特率，通过 rommon&gt;confreg 按提示设置波特率最高，再修改终端软件的波特率&lt;/li&gt;
&lt;li&gt;执行命令 rommon&gt;xmodem {the name of the IOS that is saved on the PC}&lt;/li&gt;
&lt;li&gt;根据使用情况找到 send xmodem 命令，按提示选择发送，等待完成，reset 重启&lt;/li&gt;
&lt;/ol&gt;
&lt;h3&gt;CLI 命令&lt;/h3&gt;
&lt;p&gt;需要注意常用的命令有：&lt;/p&gt;
&lt;h4&gt;设置标志区&lt;/h4&gt;
&lt;p&gt;以相同的字符作为分隔符。(config)#banner motd \$====$&lt;/p&gt;
&lt;h4&gt;重设口令&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;启动过程中按 ctrl+break 键进入 rommon 模式&lt;/li&gt;
&lt;li&gt;设置配置寄存器，使加载过程忽略 NVRAM，rommon&gt;confreg
0x2142，reset 重新启动&lt;/li&gt;
&lt;li&gt;加载配置文件#copy start run&lt;/li&gt;
&lt;li&gt;重设密码(config)#enable secret ***&lt;/li&gt;
&lt;li&gt;保存配置文件#copy run start&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;启用 ssh 服务&lt;/h4&gt;
&lt;ol&gt;
&lt;li&gt;首先必须要添加主机名和域名因为生成密钥时会用到&lt;/li&gt;
&lt;li&gt;生成密钥（crypto key generate rsa genera-keys modulus 1024），&lt;/li&gt;
&lt;li&gt;设置超时时间和最大尝试失败次数（ip ssh
time-out/authentication-retries 2），&lt;/li&gt;
&lt;li&gt;允许 ssh 请求（transport input ssh telnet）&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;设置路由器加载 IOS 顺序和位置&lt;/h4&gt;
&lt;p&gt;执行（config）#boot system ?
可以看到路由器可以从很多位置加载 IOS，从 tftp 加载 IOS 的好处是可以多个路由器共享一个 IOS 方便升级，节省空间，另外可以配置多个启动位置以确保可以顺利启动路由器。&lt;/p&gt;
&lt;p&gt;示例：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;R3640(config)#boot system tftp c3640-jk9s-mz.124-16.bin 192.168.1.250

R3640(config)#boot system flash c3640-js-mz.124-12.bin

R3640(config)#boot system rom&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;优化命令&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;no ip domain-lookup 不进行域名解析

line console 0

logging syn 消息同步

exec-time 0 0 登陆不超时&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[CCNA-网络基础]]></title><description><![CDATA[目录 OSI 模型，名称，职责，包括的协议 TCP/IP 模型 应用层：http,ftp,tftp,dhcp,smb,telnet 传输层：tcp/udp 网络层：ip，icmp，arp，rarp,proxy-arp 数据链路层：IEEE802.2/802.…]]></description><link>https://xdays.me/CCNA-网络基础/</link><guid isPermaLink="false">https://xdays.me/CCNA-网络基础/</guid><pubDate>Mon, 25 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;目录&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;#osi&quot;&gt;OSI 模型，名称，职责，包括的协议&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#tcp/ip&quot;&gt;TCP/IP 模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#application&quot;&gt;应用层：http,ftp,tftp,dhcp,smb,telnet&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#transport&quot;&gt;传输层：tcp/udp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#network&quot;&gt;网络层：ip，icmp，arp，rarp,proxy-arp&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#datalink&quot;&gt;数据链路层：IEEE802.2/802.3,ethernetii&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#physical&quot;&gt;物理层：线缆类型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ethernet&quot;&gt;以太网：帧格式，csma/cd，类型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;#ipaddr&quot;&gt;ip 寻址：地址类型，广播地址，子网划分，cidr，vlsm&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;&lt;a name=&quot;osi&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;OSI 模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;全称开放系统互联模型（open system interconnection
model）主要层次，各层作用以及相关协议如下表所示：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 作用 相关协议
应用层（application） 为用户提供应用程序服务 http,ftp,tftp,dhcp,smb,telnet
表示层（presentation） 表示，处理数据&lt;br&gt;
会话层（session） 在不同程序间管理会话&lt;br&gt;
传输层（transport） 提供可靠和不可靠数据传输，重传前执行错误纠正 tcp/udp
网络层（network） 提供逻辑寻址路由选择 ip,icmp,arp,rarp,proxy-arp
数据链路层（data link） 将数据组合成帧，控制介质访问，错误检测但不纠正 IEEE802.2/802.3
物理层（physical） 设备间传输比特，电压大小，线路速率和接口引脚&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;a name=&quot;tcp/ip&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;TCP/IP 模型&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;现在因特网实际应用中的协议栈，也成为 DoD 模型。它一共分四层，各层名称以及与 OSI 对应的层次如下表所示：&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 对应 OSI 层
过程/应用层协议（process/application） 应用层，表示层，会话层
主机到主机协议（host-to-host） 传输层
网际层（internet） 网络层
网络接入层（network access） 数据链路层，物理层&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;协议数据单元 pdu&lt;/h4&gt;
&lt;p&gt;每一层对应的协议数据单元的称呼&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;名称 协议数据单元
application data
transport segment
network package
data link frame
physical bit&lt;/p&gt;
&lt;hr&gt;
&lt;h3&gt;&lt;a name=&quot;application&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;应用层协议&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;http 协议&lt;/h4&gt;
&lt;p&gt;用于 web 服务的协议，主要特点可概括如下：&lt;/p&gt;
&lt;p&gt;1.支持客户/服务器模式。&lt;/p&gt;
&lt;p&gt;2.简单快速：客户向服务器请求服务时，只需传送请求方法和路径。请求方法常用的有
get、head、post。每种方法规定了客户与服务器联系的类型不同。由于 http
协议简单，使得 http 服务器的程序规模小，因而通信速度很快。&lt;/p&gt;
&lt;p&gt;3.灵活：http 允许传输任意类型的数据对象。正在传输的类型由 content-type
加以标记。&lt;/p&gt;
&lt;p&gt;4.无连接：无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求，并收到客户的应答后，即断开连接。采用这种方式可以节省传输时间。&lt;/p&gt;
&lt;p&gt;5.无状态：http
协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息，则它必须重传，这样可能导致每次连接传送的数据量增大。另一方面，在服务器不需要先前信息时它的应答就较快。&lt;/p&gt;
&lt;p&gt;参考文档：&lt;a href=&quot;http://wenku.baidu.com/view/9fc10d6c1eb91a37f1115c86.html&quot;&gt;http://wenku.baidu.com/view/9fc10d6c1eb91a37f1115c86.html&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;ftp 协议&lt;/h4&gt;
&lt;p&gt;用于文件传输的协议，具体可参考&amp;#x3C;/?p=101&gt;&lt;/p&gt;
&lt;h4&gt;dhcp 协议&lt;/h4&gt;
&lt;p&gt;用于局域网内自动分配 ip 地址的协议，具体可参考&amp;#x3C;/?p=179&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;transport&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;传输层协议&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;tcp/udp 协议&lt;/h4&gt;
&lt;p&gt;传输层通过顺序和确认号提供可靠传输，通过窗口来实现流量和拥塞控制，具体参考&amp;#x3C;/?p=105&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;network&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;网络层协议&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;ip 协议&lt;/h4&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/ip-headers.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/10/ip-headers.jpg&quot; alt=&quot;ip-headers&quot; title=&quot;ip-headers&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;字段依次代表：版本，包头长度，服务类型，数据包长度，标识（标识同一数据包），标志和分片偏移量（重组数据包依据），ttl 生存时间，协议类型（上层协议），校验和（如果出错只是丢弃而不重传），源地址，目的地址，其他选项，填充（以满足 32 位）&lt;/p&gt;
&lt;h4&gt;icmp 协议&lt;/h4&gt;
&lt;p&gt;虽然是网络层协议，但是它是封装在 ip 包内的，具体类型主要有&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/icmp-type.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/10/icmp-type.jpg&quot; alt=&quot;icmp-type&quot; title=&quot;icmp-type&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;h4&gt;arp 协议&lt;/h4&gt;
&lt;p&gt;提供通过广播由 ip 地址到 mac 地址的解析过程的协议，关于 arp 欺骗参考&amp;#x3C;/?p=109&gt;&lt;/p&gt;
&lt;h4&gt;rarp 协议&lt;/h4&gt;
&lt;p&gt;对于无盘工作站，只知道自己 mac 地址的情况下请求自己 ip 地址的情况。&lt;/p&gt;
&lt;h4&gt;proxy-arp 协议&lt;/h4&gt;
&lt;p&gt;arp 请求由路由器代理，从而实现不同网段之间的二层通信（基于 arp 和 mac 地址）。&lt;/p&gt;
&lt;h4&gt;广播域与冲突域，点到点与端到端&lt;/h4&gt;
&lt;p&gt;广播域就是一个网段内的所有主机，冲突域是共享相同介质的所有主机，广播域大于等于冲突域。点到点是指的设备通过第二层地址通信，端到端是指的通过第三层设备通信。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;datalink&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;数据链路层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;IEEE 把数据链路层分成两层分别是 802.2 逻辑链路控制（logical link
control）和 802.3 介质访问控制（media access
control），前者负责协调上层协议，后者负责控制介质访问；而更常见的是以太网的数据链路层，两者区别如下：&lt;/p&gt;
&lt;p&gt;802.3 帧&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;前导码 8 源地址 6 目的地址 6 长度 2 数据 FCS 校验和&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;ethernetII 帧&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;前导码 8 源地址 6 目的地址 6 类型 2 数据 FCS 校验和&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;总之，以太网可以直接区分上层协议。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;physical&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;物理层&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;主要有三个方面介质（铜介质有采用 rj-45 接口的非屏蔽双绞线 utp 和同轴电缆 coaxial
cable，光纤，无线），编码（不归零码，曼侧斯特码），信号（电压大小）&lt;/p&gt;
&lt;p&gt;线缆类型&lt;/p&gt;
&lt;p&gt;直通线（straight-through），交叉线（crossover），全反线（rolled）：其中直通线用于不同设备间，交叉线用于相同设备间，全反线用于连接思科设备的 console 口。注意：路由器按做 PC 处理，而集线器按做交换机处理。&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;ethernet&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;以太网&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数据链路层上面已经介绍了，下表是物理层上以太网的类型&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/ethernet-type.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/10/ethernet-type.jpg&quot; alt=&quot;ethernet-type&quot; title=&quot;ethernet-type&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;CSMA/CD 载波监听多路访问/冲突检测（carrier sense multiple
access/collision
detect）是用于总线型拓扑下的一种通信方式在现在交换式网络中已经不再使用，参考文档&lt;a href=&quot;http://baike.baidu.com/view/54303.htm&quot;&gt;http://baike.baidu.com/view/54303.htm&lt;/a&gt;&lt;/p&gt;
&lt;h3&gt;&lt;a name=&quot;ipaddr&quot;&gt;&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;&lt;strong&gt;IP 寻址&lt;/strong&gt;&lt;/p&gt;
&lt;h4&gt;有类地址划分&lt;/h4&gt;
&lt;hr&gt;
&lt;p&gt;类型 起始位 子网掩码
A 0 255.0.0.0
B 10 255.255.0.0
C 110 255.255.255.0
D 1110 组播
E 1111 实验&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;无类地址划分&lt;/h4&gt;
&lt;p&gt;CIDR 无类域间路由（classless inter-domain routing）和 VLSM（variable
length subnet
masks）,，通过 VLSM 把 ip 地址更灵活的划分，通过 CIDR 将划分的地址块汇总聚合。&lt;/p&gt;
&lt;p&gt;私有地址&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;地址类 范围
A 类 10.0.0.0—10.255.255.255
B 类 172.16.0.0—172.31.255.255
C 类 192.168.0.0—192.168.255.255&lt;/p&gt;
&lt;hr&gt;
&lt;h4&gt;保留地址&lt;/h4&gt;
&lt;hr&gt;
&lt;p&gt;地址 功能
网络地址全为 0 这个网络分段
网络地址全为 1 全部网络
127.0.0.1 操作系统环回测试
结点地址全 0 网络中任意主机
结点地址全 1 网络上所有结点
整个 ip 地址为 0 默认路由
整个 ip 地址为 1 对网络上所有结点广播，受限广播&lt;/p&gt;
&lt;hr&gt;</content:encoded></item><item><title><![CDATA[思科实验模拟器Dynamips&Dynagen]]></title><description><![CDATA[Dynamips 是所有这些软件的核心负责加载运行 IOS 等工作，其他的都是基于其上的中间层，目的就是便于用户使用，Dynagen 是基于.net 文件和命令行的工具，而 DynamipsGUI 也就是小凡是图形界面的更易于操作。软件最大的特点是真实加载 IOS…]]></description><link>https://xdays.me/思科实验模拟器dynamipsdynagen/</link><guid isPermaLink="false">https://xdays.me/思科实验模拟器dynamipsdynagen/</guid><pubDate>Sun, 24 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Dynamips 是所有这些软件的核心负责加载运行 IOS 等工作，其他的都是基于其上的中间层，目的就是便于用户使用，Dynagen 是基于.net 文件和命令行的工具，而 DynamipsGUI 也就是小凡是图形界面的更易于操作。软件最大的特点是真实加载 IOS，可以与真实的网卡桥接，还可以虚拟帧中继交换机，ATM 交换机。&lt;/p&gt;
&lt;p&gt;软件下载&lt;/p&gt;
&lt;p&gt;官方网站 &lt;a href=&quot;http://www.dynagen.org/&quot;&gt;http://www.dynagen.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;windows 版的虽然做成了安装包，软件是纯绿色的，安装后可以随意移动文件夹。&lt;/p&gt;
&lt;p&gt;主要组件&lt;/p&gt;
&lt;p&gt;Dynamips，Dynagen，.net 文件和一些简化操作的批处理脚本。&lt;/p&gt;
&lt;p&gt;1）  Dynamips&lt;/p&gt;
&lt;p&gt;-H  7200 在 7200 端口上启动 Dynamips&lt;/p&gt;
&lt;p&gt;-e   查看真实网卡参数，供虚拟桥接用&lt;/p&gt;
&lt;p&gt;2）Dynagen pathtonetfile&lt;/p&gt;
&lt;p&gt;具体命令可以用 help 命令查看；注意加载 IOS 后要用 idlepc get
device_name 命令计算 idle 值命用 idlepc save device_name default
存入 net 文件中&lt;/p&gt;
&lt;p&gt;3）net 文件&lt;/p&gt;
&lt;p&gt;这是设置虚拟路由器型号和构建拓扑的关键文件，在安装目录的 sample_labs 目录下有一个 all_config_options.txt 文件供参考，具体配置可以参考网上别人测试后作的现成文件。&lt;/p&gt;
&lt;p&gt;4）批处理脚本 bat 文件&lt;/p&gt;
&lt;p&gt;需要注意的就是：要在 tmp 目录下运行 Dynamips 以便产生的临时问价都位于此文件夹内便于以后清除。&lt;/p&gt;
&lt;p&gt;操作步骤&lt;/p&gt;
&lt;p&gt;前期准备：下载 IOS，构思拓扑图&lt;/p&gt;
&lt;p&gt;具体步骤：运行 Dynamips—编写 net 文件也就是选设备和构建拓扑—运行 Dynagen 加载 IOS—启动设备—telnet 配置实验&lt;/p&gt;
&lt;p&gt;一个 net 文件示例-三个路由器串联：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# 3routerlab

autostart = False

[localhost]

port = 7200

udp = 10000

workingdir = ..tmp

[[3640]]

image = ..imagesc3640-telco-mz.124-8.bin

#npe = npe-400

ram = 60

mmap = False

confteg = 0x2142

[[ROUTER R1]]

model = 3640

s1/0 = R2 s1/0

[[router R2]]

model = 3640

s1/1 = R3 s1/0

[[router R3]]

model = 3640&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参考链接：&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ipflow.utc.fr/index.php/Cisco_7200_Simulator&quot;&gt;http://www.ipflow.utc.fr/index.php/Cisco_7200_Simulator&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.dynagen.org/&quot;&gt;http://www.dynagen.org/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://wenku.baidu.com/view/dbaf7bbfc77da26925c5b06d.html&quot;&gt;http://wenku.baidu.com/view/dbaf7bbfc77da26925c5b06d.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[递增设置ip批处理命令]]></title><description><![CDATA[刷票是件体力活，但是运用好点小知识还是能减小运动量的，一般刷票都需要更改 IP 地址，手动更改又费事，下面的批处理命令就是我自己参考在线资料做的脚本，还是挺好用的。]]></description><link>https://xdays.me/递增设置ip批处理命令/</link><guid isPermaLink="false">https://xdays.me/递增设置ip批处理命令/</guid><pubDate>Fri, 22 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;刷票是件体力活，但是运用好点小知识还是能减小运动量的，一般刷票都需要更改 IP 地址，手动更改又费事，下面的批处理命令就是我自己参考在线资料做的脚本，还是挺好用的。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;@ echo off
echo *****ip自动更改器*****
echo n
echo 提示：请按提示输入起始和结束ip地址
echo 等待提示“按任意键继续时”就可以按F5刷新浏览器开始投票了”
rem 设置变量
set nic=内部连接
rem 设置起始地址
set /p s=起始地址：
set /a add=s
rem 设置结束地址
set /p e=结束地址：
set /a end=e
set /a end+=1
rem 网关地址
set gat=192.168.1.1
rem 执行循环
:loop
rem //是否达到结束IP地址
if %add%==%end% (
goto exit
)
echo 耐心等待几秒~
rem //更改IP
netsh interface ip set address name=%nic% source=static addr=192.168.1.%add% mask=255.255.255.0 %gat% 1 &gt;nul
rem //更改DNS
netsh interface ip set dns name=%nic% source=static addr=210.44.176.1 primary &gt;nul
echo 目前ip地址:%add%
set /a add+=1
@pause
goto loop
:exit
rem 循环结束
echo 工作完成！
@pause

@ echo off&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[CentOS5.5安装配置笔记]]></title><description><![CDATA[上学起用机房的机器搭了一台服务器，底层系统是 rhel5.4，提供各种服务，其中包括 ssh,nat,lamp,ftp,proxy…]]></description><link>https://xdays.me/CentOS5-5安装配置笔记/</link><guid isPermaLink="false">https://xdays.me/CentOS5-5安装配置笔记/</guid><pubDate>Thu, 07 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;上学起用机房的机器搭了一台服务器，底层系统是 rhel5.4，提供各种服务，其中包括 ssh,nat,lamp,ftp,proxy 等。由于是边学习边试验有很多不恰当的地方，系统也装了很多用不到的软件。一方面打算把系统管理的更有条理，另一方面更重要的是好好复习一下以前学的知识，这次打算用 centos5.5 最小化安装，然后配置各种服务，也记录一下这个过程希望于人于己都能有所帮助。&lt;/p&gt;
&lt;p&gt;机器配置：&lt;/p&gt;
&lt;p&gt;机房配置：&lt;br&gt;
处理器：Intel Pentium 4, 2377 MHz (18 x 132)&lt;br&gt;
内存：512M（SDRAM）&lt;br&gt;
显卡：GeForce4 MX 440 with AGP8X（64M）&lt;br&gt;
硬盘：2 块 40G&lt;br&gt;
网卡：2 块 RealTek8139&lt;br&gt;
主板：Epox EP-4PEA800(I)&lt;br&gt;
BIOS：Phoenix-Award BIOS v6.00PG&lt;/p&gt;
&lt;p&gt;一、硬盘安装&lt;/p&gt;
&lt;p&gt;​1.
由于原先安装了 rhel 由 grub 引导，第 2 块硬盘做 ftp 的数据盘，所以把原先的数据都备份到这块硬盘上了，主要包括一些套件源码包和配置文件。&lt;/p&gt;
&lt;p&gt;​2. 拷贝出系统镜像下的 isolinux 目录到第二块硬盘，mount  -o loop
/var/ftp/xos/centos5.5.iso /mnt，cp -r /mnt/isolinux /var/ftp，umount
/mnt。&lt;/p&gt;
&lt;p&gt;​3. 编辑 grub 配置文件/boot/grub/menu.ist，添加如下内容：&lt;/p&gt;
&lt;p&gt;title CentOS&lt;br&gt;
kernel(hd0,0)/isolinux/vmlinuz&lt;br&gt;
initrd(hd0,0)/isolinux/initrd.img&lt;/p&gt;
&lt;p&gt;4.重启引导。&lt;/p&gt;
&lt;p&gt;5.分区，自定义安装包，安装 gcc，automake 和 base
group 下的部分软件包，也基本上是最小化安装了。&lt;/p&gt;
&lt;p&gt;二、初始配置&lt;/p&gt;
&lt;p&gt;1.查看安装了多少包，rpm -qa | wc -l，335 个还可以。&lt;/p&gt;
&lt;p&gt;​2. 配置网络&lt;/p&gt;
&lt;p&gt;​1)
备份默认配置文件(以后的配置前都要执行这一步，只是本文省略不写了)，养成好习惯。cd
/etc/sysconfig/network-script/，mkdir backup ，cp ifcfg-eth0 backup/。&lt;/p&gt;
&lt;p&gt;​2) 修改 ifcfg-eth0 如下：&lt;/p&gt;
&lt;p&gt;DEVICE=eth0&lt;br&gt;
BOOTPROTO=static&lt;br&gt;
HWADDR=00:A1:B0:13:F0:D9&lt;br&gt;
ONBOOT=yes&lt;br&gt;
IPADDR=192.168.1.251&lt;br&gt;
NETMASK=255.255.255.0&lt;br&gt;
GATEWAY=192.168.1.1&lt;/p&gt;
&lt;p&gt;​3) 添加 DNS 服务器地址，编辑/etc/resolv.conf 添加如下两行：&lt;br&gt;
nameserver 210.44.176.1&lt;br&gt;
nameserver 202.102.152.3&lt;/p&gt;
&lt;p&gt;三、配置 ssh&lt;/p&gt;
&lt;p&gt;系统默认安装并且启动了 ssh 服务，这里仅修改一下配置文件使 root 可以直接登录，去掉 PermitRootLogin
yes 这一行的注释。另外配置文件的详细介绍参考：ssh 服务器一文&amp;#x3C;/?p=99&gt;&lt;/p&gt;
&lt;p&gt;四、挂载 centos 镜像作为本地源。&lt;/p&gt;
&lt;p&gt;​1) mkdir /media/Centos&lt;/p&gt;
&lt;p&gt;​2) cd /etc/yum.repos.d/;mv ﻿﻿﻿CentOS-Base.repo CentOS-Base.repo.backup
; cp CentOS-Media.repo  CentOS-Media.repo.backup&lt;/p&gt;
&lt;p&gt;3)编辑 CentOS-Media.repo 修改如下：&lt;/p&gt;
&lt;p&gt;[c5-media]&lt;/p&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;name=CentOS-$releasever - Media&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;baseurl=file:///media/CentOS/&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;#        file:///media/cdrom/&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;#        file:///media/cdrecorder/&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;gpgcheck=1&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;enabled=1&lt;/p&gt;
&lt;/div&gt;
&lt;div id=&quot;_mcePaste&quot;&gt;
&lt;p&gt;gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;[c5-media]name=CentOS-$releasever -
Mediabaseurl=file:///media/CentOS/#        file:///media/cdrom/#      
 file:///media/cdrecorder/gpgcheck=1enabled=1gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5&lt;/p&gt;
&lt;p&gt;​4) 开机挂在硬盘，在/etc/fstab 添加一行：&lt;/p&gt;
&lt;p&gt;/dev/hdb1               /var/ftp                ext3    defaults      
 0 2&lt;/p&gt;
&lt;p&gt;​5) 开机挂在光盘镜像，在/etc/rc.local 中添加一行：&lt;/p&gt;
&lt;p&gt;mount -o loop /var/ftp/centos5.5.iso /media/CentOS/&lt;/p&gt;
&lt;p&gt;注意：下面的服务器套件的安装基本都是从源码安装，这里自己养成一个习惯：把下载下来的源码压缩包都放在/usr/local/src/目录下，解压后的源文件目录在安装后保留以便以后更新卸载使用。习惯程序安装载/usr/local/目录下，即给 configure 脚本添加选项—prefix=/usr/local.安装好测试时要关闭防火墙，否则请求就被拒之门外了。&lt;/p&gt;
&lt;p&gt;五、架设 ftp 服务器&lt;/p&gt;
&lt;p&gt;​1) 编辑 builddefs.h 文件，选择添加功能都添加上以便以后拓展。&lt;/p&gt;
&lt;p&gt;​2) 参照 INSTALL 文件添加用户和目录。&lt;/p&gt;
&lt;p&gt;​3) make install;cp vsftpd.conf /etc。&lt;/p&gt;
&lt;p&gt;​4) 配置参考简易 vsftp 搭建一文&amp;#x3C;/?p=101&gt;&lt;/p&gt;
&lt;p&gt;​5) 开机自动运行，在/etc/rc.local 添加一行/usr/local/sbin/vsftpd
&amp;#x26;（后台运行不要忘了，不然的话它一直占用前台就没办法登录了）&lt;/p&gt;
&lt;p&gt;六、架设 proxy 服务器&lt;/p&gt;
&lt;p&gt;​1) 安装参考 INSTALL 文件&lt;/p&gt;
&lt;p&gt;​2) 配置参考 proxy 服务器-squid 一文&amp;#x3C;/?p=192&gt;&lt;/p&gt;
&lt;p&gt;七、搭建 lamp 环境&lt;/p&gt;
&lt;p&gt;安装配置参考 lamp 环境搭建一文&amp;#x3C;/?p=290&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VMware 虚拟化架构理解]]></title><description><![CDATA[花了一上午研究了一下 VMware…]]></description><link>https://xdays.me/VMware-虚拟化架构理解/</link><guid isPermaLink="false">https://xdays.me/VMware-虚拟化架构理解/</guid><pubDate>Sun, 03 Oct 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;花了一上午研究了一下 VMware 的虚拟化产品，总体感觉挺混乱的。一开始搞不清头绪，参考了一些资料，才大体明白了怎么回事。&lt;a href=&quot;http://hi.baidu.com/chenshake/blog/category/%D0%E9%C4%E2%BB%AF&quot;&gt;陈前辈&lt;/a&gt;的博客里相关资料让帮我明白了好多，在此谢过。因为仅仅是一个初步的了解，只总结些基本概念，以后真正用到再深入学习吧！&lt;/p&gt;
&lt;p&gt;什么是虚拟化？&lt;/p&gt;
&lt;p&gt;通俗说就是用软件虚拟硬件，从而实现在单一的物理硬件平台之上运行多个操作系统，充分利用硬件资源，提高了计算机的工作效率。&lt;/p&gt;
&lt;p&gt;VMware 虚拟化架构？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/vi3-1.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/10/vi3-1.jpg&quot; alt=&quot;vi3-1&quot; title=&quot;vi3-1&quot;&gt;&lt;/a&gt;参考上图，VMware
vSphere 是虚拟化平台的最新版本，它包括了 VMware ESX 4.1 和 VMware vCenter
Server 4.1 等组件。而上一个版本是 VMware Infrastructure
3（简称 VI3），主要包括 VMware ESX 3.5 和 VMware vCenter Server
2.5 等组件。如果再大的环境下可能要像下图所示的架构添加存储网络。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/vi3-2.gif&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/10/vi3-2.gif&quot; alt=&quot;vi3-2&quot; title=&quot;vi3-2&quot;&gt;&lt;/a&gt;&lt;a href=&quot;/wp-content/uploads/2010/10/vi3-1.jpg&quot;&gt;&lt;br&gt;
&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;VMware ESX
：从上图也可以看出，他就是运行在硬件上的虚拟层，调度硬件，虚拟机运行在其上。&lt;br&gt;
VMware vCenter Server :配置管理虚拟化基础架构的的中心。&lt;/p&gt;
&lt;p&gt;文档资料?&lt;/p&gt;
&lt;p&gt;可以参考官方的 demos，如果要安装评估版本需要注册，在现在页面上有 demos 信息。&lt;/p&gt;
&lt;p&gt;此外，还有 HA，DRS，Consolidated
Backup，VMtion 功能有待学习，初步了解就到此为止了。&lt;/p&gt;
&lt;p&gt;参考资料：&lt;a href=&quot;http://hi.baidu.com/chenshake/blog/item/ff4444ee26eb78fab3fb953f.html&quot;&gt;http://hi.baidu.com/chenshake/blog/item/ff4444ee26eb78fab3fb953f.html&lt;/a&gt;&lt;br&gt;
百度，谷歌&lt;/p&gt;</content:encoded></item><item><title><![CDATA[GRUB2笔记]]></title><description><![CDATA[GRUB2 的组成部分？ GRUB2 主要有三个部份： /etc/default/grub            —这个文件包含了 GRUB2 的菜单。 /etc/grub.d/                   —这个目录包含了生成 GRUB2 菜单的脚本。 /boot…]]></description><link>https://xdays.me/GRUB2笔记/</link><guid isPermaLink="false">https://xdays.me/GRUB2笔记/</guid><pubDate>Sun, 26 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;GRUB2 的组成部分？&lt;/p&gt;
&lt;p&gt;GRUB2 主要有三个部份：&lt;/p&gt;
&lt;p&gt;/etc/default/grub            —这个文件包含了 GRUB2 的菜单。&lt;br&gt;
/etc/grub.d/                   —这个目录包含了生成 GRUB2 菜单的脚本。&lt;br&gt;
/boot/grub/grub.cfg       —GRUB2 的配置文件，勿直接编辑。&lt;br&gt;
update-grub command reads the /etc/grub.d directory and looks for
executable scripts inside it. The scripts are read, in the order of
their numbering, and written into the grub.cfg file, along with the menu
settings read from the /etc/default/grub file.&lt;/p&gt;
&lt;p&gt;update-grub 命令读取 /etc/grub.d
目录中的可执行脚本，并且按照数字顺序执行来生成 grub.cfg
文件，这期间 00_header 会读取/etc/default/grub 文件中的配置。&lt;/p&gt;
&lt;p&gt;启动条目来自多个地方，默认的来自安装 GRUB 的发行版，还有在硬盘上探测到的其他操作系统，外加用户添加 shell 脚本增加的定制条目。&lt;/p&gt;
&lt;p&gt;添加或者删除某个条目，您可以通过更改脚本的权限实现，并不需要删除它们。GRUB2 可以在任何时候重新安装，包括通过 GRUB2 启动的系统中。&lt;/p&gt;
&lt;p&gt;如何恢复 GRUB2？&lt;/p&gt;
&lt;p&gt;比较通用的办法：&lt;br&gt;
1）想办法用 livecd 启动系统&lt;br&gt;
2）挂载相应分区：如果没有给/boot 单独分区就直接#sudo  mount  /dev/sdax
/mnt;然后#sudo grub-install —root-directory=/mnt /dev/sda 就完成了&lt;br&gt;
3）还有一种用到 chroot 的方法，chroot 挺可怕的，根目录都变了。&lt;/p&gt;
&lt;p&gt;GRUB2 启动引导器 – 完全教程
(1)&lt;a href=&quot;http://apps.hi.baidu.com/share/detail/15773952&quot;&gt;http://apps.hi.baidu.com/share/detail/15773952&lt;/a&gt;&lt;br&gt;
GRUB2 启动引导器 – 完全教程
(2)&lt;a href=&quot;http://apps.hi.baidu.com/share/detail/15224191&quot;&gt;http://apps.hi.baidu.com/share/detail/15224191&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;再附上一篇比较详细的教程： &lt;a href=&quot;http://blog.chinaunix.net/u/4466/showart_2108545.html&quot;&gt;http://blog.chinaunix.net/u/4466/showart_2108545.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[LAMP 环境搭建]]></title><description><![CDATA[注：一下是在百度文库中找到的资料，写的不错，步骤简明扼要。 一、拷贝软件到服务器（Discuz、UCenter、mysql、
php、apache、ZendOptimizer） 二、修改远程登录显示乱码 1.编辑：/etc/sysconfig/il8n 2.把 UTF-…]]></description><link>https://xdays.me/LAMP-环境搭建/</link><guid isPermaLink="false">https://xdays.me/LAMP-环境搭建/</guid><pubDate>Sun, 26 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;注：一下是在百度文库中找到的资料，写的不错，步骤简明扼要。&lt;/p&gt;
&lt;p&gt;一、拷贝软件到服务器（Discuz、UCenter、mysql、
php、apache、ZendOptimizer）&lt;/p&gt;
&lt;p&gt;二、修改远程登录显示乱码&lt;/p&gt;
&lt;p&gt;1.编辑：/etc/sysconfig/il8n&lt;/p&gt;
&lt;p&gt;2.把 UTF-8 改成 GB2312&lt;/p&gt;
&lt;p&gt;关闭 selinux&lt;/p&gt;
&lt;p&gt;使用文本编辑工具打开 /etc/selinux/config 把 SELINUX=enforcing
注释掉：#SELINUX=enforcing ，然后新加一行为：SELINUX=disabled&lt;br&gt;
保存，关闭。&lt;br&gt;
重启系统。&lt;/p&gt;
&lt;p&gt;三、关闭不需要的服务（discuz 可选）&lt;/p&gt;
&lt;p&gt;# ntsysv&lt;/p&gt;
&lt;p&gt;以下仅列出需要启动的服务，未列出的服务一律推荐关闭：&lt;/p&gt;
&lt;p&gt;atd ,crond ,irqbalance ,microcode_ctl ,network ,sendmail ,sshd ,syslog
,,snmpd (cacti 时启用) ,snmptrapd（cacti 时启用）&lt;/p&gt;
&lt;p&gt;四、重启&lt;/p&gt;
&lt;p&gt;#init 6&lt;/p&gt;
&lt;p&gt;五、安装 mysql&lt;/p&gt;
&lt;p&gt;1.如果有老版本的 rpm 包，给他卸载了&lt;/p&gt;
&lt;p&gt;# rpm -qa |grep mysql
查看系统中是否已经安装了 MySQL，如果是卸载所有以 mysql 开头的包.&lt;/p&gt;
&lt;p&gt;# rpm -e mysql-5.0.45-7.el5 —nodeps&lt;/p&gt;
&lt;p&gt;—nodeps：参数安装和卸载的时候不考虑依赖关系&lt;/p&gt;
&lt;p&gt;​2. 解压&lt;/p&gt;
&lt;p&gt;#tar -zxvf mysql-5.0.56.tar.gz -C /usr/local/src/&lt;/p&gt;
&lt;p&gt;-C: 解压到制定目录&lt;/p&gt;
&lt;p&gt;3.进入目录&lt;/p&gt;
&lt;p&gt;# cd /usr/local/src/mysql-5.1.30/&lt;/p&gt;
&lt;p&gt;​4. 配置安装 (配置前先建立一个 mysql 文件夹)&lt;/p&gt;
&lt;p&gt;# ./configure —prefix=/usr/local/mysql/&lt;br&gt;
&gt; —with-extra-charsets=all&lt;br&gt;
&gt; —sysconfdir=/etc 配置文件的路径&lt;/p&gt;
&lt;p&gt;（出现 Thank you for choosing MySQL!就成功了）&lt;/p&gt;
&lt;p&gt;以下可选：&lt;/p&gt;
&lt;p&gt;—localstatedir=/usr/local/mysql/data 数据库存放的路径&lt;br&gt;
&gt; —enable-assembler 使用一些字符函数的汇编版本&lt;br&gt;
&gt; —with-mysqld-ldflags=-all-static 以纯静态方式编译服务端&lt;br&gt;
&gt; —with-charset=utf8 添加 utf8 字符支持&lt;br&gt;
&gt; —with-extra-charsets=all 添加所有字符支持&lt;/p&gt;
&lt;p&gt;—with-plugins=all
如果从源代码编译安装 mysql,缺省安装时,是没有 innodb 引擎的.所以,在 configure 的时候,要加入—with-
plugins=all(或者 max),这样才会支持 innodb.在 mysql 里可以执行 show
engines 命令来查看当前的 mysql 服务器所支持的存储引擎.&lt;/p&gt;
&lt;p&gt;5 make&lt;/p&gt;
&lt;p&gt;6 make install&lt;/p&gt;
&lt;p&gt;7 拷贝一个配置文件，当作以后 mysql 的配置文件&lt;/p&gt;
&lt;p&gt;# cp /usr/local/mysql/share/mysql/my-large.cnf /etc/my.cnf（出现 cp:
overwrite `/etc/my.cnf’?
y 问是否覆盖，因为 rpm 装过所以有一个原来的，选择 y 是）&lt;/p&gt;
&lt;p&gt;！这里添加一个选择项，如果没有用 rpm 装过，那么系统本身不会有 mysql 的用户和组，所以要自己建立。&lt;/p&gt;
&lt;p&gt;#groupadd mysql&lt;/p&gt;
&lt;p&gt;#useradd -g mysql -d m/usr/local/var mysql&lt;/p&gt;
&lt;p&gt;注意：my.cnf 里注释掉 skip-federated 新版本不需要这个参数了。如果需要这个引擎的在编译的时候要加上—with-plugins=federated,在 my.cnf 里用 federated 参数就行了。&lt;br&gt;
先修改 my.cnf,再初使化数据库,要不然过不去的。&lt;/p&gt;
&lt;p&gt;8 改 Mysql 用户的宿主目录&lt;/p&gt;
&lt;p&gt;# vi /etc/passwd 找 mysql 用户，把宿主目录的路径改成/usr/local/mysql/var
（var 文件夹要自己建立# mkdir /usr/local/mysql/var）&lt;/p&gt;
&lt;p&gt;建立完了用 ll -d var/看下文件夹的属性，发现属主和属组不对，应该是 mysql&lt;/p&gt;
&lt;p&gt;9 改 mysql 用户宿主目录的属主和属组&lt;/p&gt;
&lt;p&gt;chown -R mysql:mysql /usr/local/mysql/var/&lt;/p&gt;
&lt;p&gt;-R:递归处理&lt;/p&gt;
&lt;p&gt;10 切换到 mysql 用户&lt;/p&gt;
&lt;p&gt;# su - mysql&lt;/p&gt;
&lt;p&gt;11 初始化 mysql 服务器中的数据库，也就是安装数据库&lt;/p&gt;
&lt;p&gt;$ /usr/local/mysql/bin/mysql_install_db&lt;/p&gt;
&lt;p&gt;12 修改 MySQL 的最大连接数&lt;/p&gt;
&lt;p&gt;# vi /etc/my.cnf&lt;/p&gt;
&lt;p&gt;//添加以下行&lt;/p&gt;
&lt;p&gt;[mysqld]&lt;br&gt;
set-variable=max_connections=1000&lt;br&gt;
set-variable=max_user_connections=500&lt;/p&gt;
&lt;p&gt;set-variable=wait_timeout=200&lt;/p&gt;
&lt;p&gt;//max_connections 设置最大连接数为 1000&lt;/p&gt;
&lt;p&gt;//max_user_connections 设置每用户最大连接数为 500&lt;/p&gt;
&lt;p&gt;//wait_timeout 表示 200 秒后将关闭空闲（IDLE）的连接，但是对正在工作的连接不影响&lt;/p&gt;
&lt;p&gt;13 启动 mysql&lt;/p&gt;
&lt;p&gt;$ /usr/local/mysql/bin/mysqld_safe &amp;#x26; （出现 Starting mysqld daemon with
databases from /usr/local/var，多按几下回车）&lt;/p&gt;
&lt;p&gt;停止 mysql&lt;/p&gt;
&lt;p&gt;# /usr/local/mysql/bin/mysqladmin -u root -p shutdown&lt;br&gt;
13 测试下是否运行&lt;/p&gt;
&lt;p&gt;$ netstat -tnl |grep 3306 （看到 3306 就是 mysql
的默认端口，显示 3306 端口表示成功启动了 mysql）&lt;/p&gt;
&lt;p&gt;14 登陆 mysql&lt;/p&gt;
&lt;p&gt;1).如果在 root 用户下：先给 root 用户设置密码：&lt;/p&gt;
&lt;p&gt;#/usr/local/mysql/bin/mysqladmin -u root password “这里写密码”&lt;/p&gt;
&lt;p&gt;# /usr/local/mysql/bin/mysql -uroot -p （加-p 参数是要求输入密码）&lt;/p&gt;
&lt;p&gt;2).如果还在 mysql 用户下：&lt;/p&gt;
&lt;p&gt;$ mysql -uroot
(如果找不到 mysql 命令，那么就用绝对路径/usr/local/mysql/bin/mysql -uroot)&lt;/p&gt;
&lt;p&gt;3).显示所有数据库：mysql&gt; show databases;&lt;/p&gt;
&lt;p&gt;4).创建数据库：mysql&gt; create database cacti; cacti 是数据库名字&lt;/p&gt;
&lt;p&gt;5).删除数据库：mysql&gt; drop database cacti;&lt;/p&gt;
&lt;p&gt;6).给 mysql 的 root 用户设置密码，（默认 root 用户是没有密码的）&lt;/p&gt;
&lt;p&gt;mysqladmin -u root password 密码&lt;/p&gt;
&lt;p&gt;这时，以后在登录就给用：mysql -u root -p 然后输入密码的方式登录了。&lt;/p&gt;
&lt;p&gt;q:退出&lt;/p&gt;
&lt;p&gt;15 设置自动启动&lt;/p&gt;
&lt;p&gt;1). su - 换成管理员身份&lt;/p&gt;
&lt;p&gt;# echo “/usr/local/bin/mysqld_safe &amp;#x26;” &gt;&gt; /etc/rc.local&lt;/p&gt;
&lt;p&gt;more /etc/rc.local 查看是否添加成功&lt;/p&gt;
&lt;p&gt;2）.这是另外一种方法&lt;/p&gt;
&lt;p&gt;在 MySQL 二进制包里面有一个叫 myslq.server 的启动脚本程序。把它复制到/etc/rc.d/init.d 目录里面&lt;/p&gt;
&lt;p&gt;#cp /usr/local/src/mysql-5.0.56/support-files/mysql.server
/etc/rc.d/init.d/mysqld （cp: overwrite `/etc/rc.d/init.d/mysqld’?
y 询问是否覆盖，选 y 是）&lt;/p&gt;
&lt;p&gt;修改/etc/rc.d/init.d/mysqld 文件的权限&lt;/p&gt;
&lt;p&gt;# chmod 700 /etc/rc.d/init.d/mysqld&lt;/p&gt;
&lt;p&gt;使用 chkconfig&lt;br&gt;
#chkconfig —level 35 mysqld on&lt;/p&gt;
&lt;p&gt;# chkconfig —list mysqld&lt;/p&gt;
&lt;p&gt;六、安装 apache&lt;/p&gt;
&lt;p&gt;1 查看 gcc 环境：#rpm -q gcc&lt;/p&gt;
&lt;p&gt;2 将源码包拷贝到/usr/local/src/目录下&lt;/p&gt;
&lt;p&gt;#mv httpd-2.2.9.tar.gz php-5.2.6.tar.gz /usr/local/src/&lt;/p&gt;
&lt;p&gt;3 解压&lt;/p&gt;
&lt;p&gt;#tar zxvf httpd-2.2.9.tar.gz&lt;/p&gt;
&lt;p&gt;4 进入目录&lt;/p&gt;
&lt;p&gt;#cd httpd-2.2.9&lt;/p&gt;
&lt;p&gt;5 新建 apache2 文件夹&lt;/p&gt;
&lt;p&gt;mkdir /usr/local/apache2&lt;/p&gt;
&lt;p&gt;6 编译前的配置&lt;/p&gt;
&lt;p&gt;#./configure —prefix=/usr/local/apache2 —enable-so —enable-rewrite&lt;/p&gt;
&lt;p&gt;—prefix=:指定 apache 安装的目录（如果不指定，就安装到=/usr/local 目录下）&lt;br&gt;
—enable-so ：开启动态加载模块功能&lt;br&gt;
—enable-rewrite:开启 rewrite 功能&lt;br&gt;
—enable-ssl 支持 ssl 套接字层&lt;/p&gt;
&lt;p&gt;7 编译程序&lt;/p&gt;
&lt;p&gt;#make&lt;/p&gt;
&lt;p&gt;8 安装已编译好的程序&lt;/p&gt;
&lt;p&gt;#make install&lt;/p&gt;
&lt;p&gt;9 apache 启动&lt;/p&gt;
&lt;p&gt;#/usr/local/apache2/bin/apachectl start&lt;/p&gt;
&lt;p&gt;查看：#ps -All |grep httpd&lt;/p&gt;
&lt;p&gt;在浏览器测试一下，因该能看见：It works!&lt;/p&gt;
&lt;p&gt;安装 GD 库 &lt;a href=&quot;http://blog.sina.com.cn/s/blog%5C_517e2e1b0100ejyg.html&quot;&gt;http://blog.sina.com.cn/s/blog\_517e2e1b0100ejyg.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;七、以模块方式安装 php&lt;/p&gt;
&lt;p&gt;1 解压&lt;/p&gt;
&lt;p&gt;# tar -zxvf php-5.2.6.tar.gz -C /usr/local/src/&lt;/p&gt;
&lt;p&gt;-C ：配合 tar 命令，把源码包释放到指定目录&lt;/p&gt;
&lt;p&gt;2 进入目录&lt;/p&gt;
&lt;p&gt;# cd /usr/local/src/php-5.2.6&lt;/p&gt;
&lt;p&gt;3 编译前配置&lt;/p&gt;
&lt;p&gt;# cd php-5.2.6/&lt;br&gt;
[root@localhost php-5.2.6]# ./configure —prefix=/usr/local/php5&lt;br&gt;
&gt; —with-apxs2=/usr/local/apache2/bin/apxs&lt;br&gt;
&gt; —with-config-file-path=/usr/local/php5&lt;br&gt;
&gt; —with-mysql=/usr/local/mysql/&lt;br&gt;
&gt; —with-gd&lt;br&gt;
&gt; —enable-gd-native-ttf&lt;br&gt;
&gt; —with-libxml-dir=/usr/local/libxml2&lt;br&gt;
&gt; —with-zlib-dir=/usr/local/zlib&lt;br&gt;
&gt; —with-freetype-dir=/usr/local/freetype&lt;br&gt;
&gt; —with-jpeg-dir=/usr/local/libjpeg&lt;br&gt;
&gt; —with-png-dir=/usr/local/libpng&lt;br&gt;
&gt; —enable-xml&lt;br&gt;
&gt; —enable-sockets&lt;br&gt;
&gt; —enable-mbstring&lt;/p&gt;
&lt;p&gt;—with-apxs2 ：设置 php 为 apache 服务器提供的模块安装的位置&lt;br&gt;
—with-config-file-path ：设置 php 程序的配置文件所在位置。&lt;br&gt;
—with-mysql=/usr/local/mysql/：设置 php 为 mysql 提供模块的位置&lt;br&gt;
—with-gd:这样安装的是 php 自带的 gd 库&lt;br&gt;
—enable-gd-native-ttf //激活对本地 TrueType 字符串函数的支持&lt;br&gt;
—with-freetype-dir=/usr/local/freetype //激活对 FreeType 2.x 的支持&lt;br&gt;
—with-jpeg-dir=/usr/local/libjpeg //激活对 jpeg-6b 的支持&lt;br&gt;
—with-png-dir=/usr/local/libpng //激活对 png 的支持&lt;br&gt;
—enable-xml //支持 XML&lt;br&gt;
—enable-sockets //支持套接字&lt;br&gt;
—enable-mbstring //安装 phpmyadmin 时用&lt;br&gt;
—with-mcrypt //安装 phpmyadmin 时用,php 传输加密方法&lt;/p&gt;
&lt;p&gt;4 编译和安装&lt;/p&gt;
&lt;p&gt;#make ；make install&lt;/p&gt;
&lt;p&gt;5 拷贝模板配置文件&lt;/p&gt;
&lt;p&gt;因为安装完成后，还没有配置文件，所以把 php 源码包里的 php.ini-dist 文件拷贝出来&lt;/p&gt;
&lt;p&gt;# cp php.ini-dist /usr/local/php5/php.ini&lt;/p&gt;
&lt;p&gt;6 apache 设置&lt;/p&gt;
&lt;p&gt;打开 apache 配置文件：/usr/local/apache2/conf/httpd.conf&lt;/p&gt;
&lt;p&gt;看看是否存在这行：LoadModule php5_module modules/libphp5.so&lt;/p&gt;
&lt;p&gt;再加入一行 AddType application/x-httpd-php .php .php4 .php5（加在 AddType
application/x-compress .Z&lt;/p&gt;
&lt;p&gt;\.php .php4
.php5 意思是以这些扩展名结尾的文件，在 apache 中用 php 解析器解析。&lt;br&gt;
AddType application/x-gzip .gz .tgz 下面就行）&lt;/p&gt;
&lt;p&gt;再找到 DirectoryIndex 关键字：添加 index.php&lt;/p&gt;
&lt;p&gt;7 重启 apache 服务&lt;/p&gt;
&lt;p&gt;[root@localhost php5]# /usr/local/apache2/bin/apachectl stop&lt;br&gt;
[root@localhost php5]# /usr/local/apache2/bin/apachectl start&lt;/p&gt;
&lt;p&gt;8 测试一下&lt;/p&gt;
&lt;p&gt;在/usr/local/apache2/htdocs 下建立 test.php 文件&lt;/p&gt;
&lt;p&gt;&amp;#x3C;?php&lt;br&gt;
phpinfo();&lt;br&gt;
?&gt;&lt;/p&gt;
&lt;p&gt;八、安装 ZendOptimizer&lt;/p&gt;
&lt;p&gt;1 解压&lt;/p&gt;
&lt;p&gt;# tar zxvf ZendOptimizer-3.3.0a-linux-glibc21-i386.tar.gz -C
/usr/local/src/&lt;/p&gt;
&lt;p&gt;2 进入目录&lt;/p&gt;
&lt;p&gt;#cd /usr/local/src/ZendOptimizer-3.3.0a-linux-glibc21-i386&lt;/p&gt;
&lt;p&gt;3 安装&lt;/p&gt;
&lt;p&gt;./install&lt;/p&gt;
&lt;p&gt;然后一路回车，看到这个，php.ini 的路径，要写的是目录路径,然后再一路回车&lt;/p&gt;
&lt;p&gt;4 测试下，做个 php 测试页&lt;/p&gt;
&lt;p&gt;# vi /usr/local/apache2/htdocs/testZend.php&lt;/p&gt;
&lt;p&gt;5 访问下看看&lt;/p&gt;
&lt;p&gt;应该看到，红框里的内容&lt;/p&gt;
&lt;p&gt;九、安装 eaccelerato0.9.5&lt;/p&gt;
&lt;p&gt;1.解压 tar jxvf eaccelerator-0.9.5.3.tar.bz2 -C /usr/local/src
（因为是 bz2 包，所以要用 j，而不用 z）&lt;/p&gt;
&lt;p&gt;2.进入解压目录&lt;/p&gt;
&lt;p&gt;cd /usr/local/src/eaccelerator-0.9.5.3/&lt;/p&gt;
&lt;p&gt;3.指定 php 所在路径&lt;/p&gt;
&lt;p&gt;# export PHP_PREFIX=“/usr/local/php5”&lt;/p&gt;
&lt;p&gt;# $PHP_PREFIX/bin/phpize&lt;/p&gt;
&lt;p&gt;# ./configure —enable-eaccelerator=shared
—with-php-config=$PHP_PREFIX/bin/php-config&lt;/p&gt;
&lt;p&gt;# make ; make install&lt;/p&gt;
&lt;p&gt;这时会将 eaccelerator 安装到 php 目录中，屏幕会显示 eaccelerator.so 所在路径，例如：&lt;br&gt;
Installing shared extensions:
/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/　　记住这个路径。&lt;/p&gt;
&lt;p&gt;4.修改 php.ini 在最后加入&lt;/p&gt;
&lt;p&gt;[eaccelerator]&lt;/p&gt;
&lt;p&gt;extension=“/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”&lt;/p&gt;
&lt;p&gt;eaccelerator.shm_size=“32”&lt;br&gt;
eaccelerator.cache_dir=“/data/cache/eaccelerator”&lt;br&gt;
eaccelerator.enable=“1”&lt;br&gt;
eaccelerator.optimizer=“1”&lt;br&gt;
eaccelerator.check_mtime=“1”&lt;br&gt;
eaccelerator.debug=“0”&lt;br&gt;
eaccelerator.filter=&quot;&quot;&lt;br&gt;
eaccelerator.shm_max=“0”&lt;br&gt;
eaccelerator.shm_ttl=“0”&lt;br&gt;
eaccelerator.shm_prune_period=“0”&lt;br&gt;
eaccelerator.shm_only=“0”&lt;br&gt;
eaccelerator.compress=“1”&lt;br&gt;
eaccelerator.compress_level=“9”&lt;/p&gt;
&lt;p&gt;解释：&lt;/p&gt;
&lt;p&gt;extension”/usr/local/php5/lib/php/extensions/no-debug-non-zts-20060613/eaccelerator.so”&lt;/p&gt;
&lt;p&gt;解释：PHP 扩展 eaccelerator.so 的路径。就是上面要记下的绝对路径&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.shm_size=“32”&lt;/p&gt;
&lt;p&gt;解释：eaccelerator 可使用的共享内存大小(单位为 MB)。&lt;/p&gt;
&lt;p&gt;在 Linux 下，单个进程的最大内存使用量受/proc/sys/kernel/shmmax 中设置的数字限制(单位为字节)，例如 CentOS
4.4 的 shmmax 默认值为 33554432 字节(33554432bytes/1024/1024=32MB)。&lt;/p&gt;
&lt;p&gt;临时更改该值：&lt;br&gt;
# echo 字节数 &gt; /proc/sys/kernel/shmmax&lt;/p&gt;
&lt;p&gt;按照以上方法更改，在每次重启系统时，该值会被自动还原。如果想永久更改，可以修改/etc/sysctl.conf 文件，设置：&lt;br&gt;
kernel.shmmax = 字节数&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.cache_dir=“/data/cache/eaccelerator”&lt;/p&gt;
&lt;p&gt;解释：缓存路径，可以使用命令 mkdir -p
/data/cache/eaccelerator 创建该目录，然后使用命令 chmod 0777
/data/cache/eaccelerator 设置该目录权限为 0777&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.enable=“1”&lt;/p&gt;
&lt;p&gt;解释：打开或者关闭 eaccelerator。“1”指打开，“0”指关闭。默认值为”1”。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.optimizer=“1”&lt;/p&gt;
&lt;p&gt;解释：打开或者关闭代码优化，开启可以加快代码的执行速度。“1”指打开，“0”指关闭。默认值为”1”。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.check_mtime=“1”&lt;/p&gt;
&lt;p&gt;解释：当打开此项时，eaccelerator 会在每次请求时检查 php 文件的修改时间，看其是否被修改过，这会耗费一点时间，如果 php 文件被修改过，eaccelerator 会重新编译缓存该 php 文件。当关闭此项时，如果 php 文件被修改，则需要手工删除 eaccelerator 缓存，才能显示被修改的 php 文件。“1”指打开，“0”指关闭。默认值为”1”。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.debug=“0”&lt;/p&gt;
&lt;p&gt;解释：打开或者关闭调试记录。当打开时，eaccelerator 会将对一个缓存文件的每次请求都写进 log。打开此项只对调试 eaccelerator 是否有 BUG 时有益处。“1”指打开，“0”指关闭。默认值为”0”。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.filter=&quot;&quot;&lt;/p&gt;
&lt;p&gt;解释：决定哪些 PHP 文件应该被缓存。可以指定一个范围(比如”*.php
*.phtml”)，这样被指定的文件就会被缓存。如果该范围以!开头，被指定的文件就不会被缓存。默认值为&quot;&quot;，表示缓存所有的 PHP 文件。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.shm_max=“0”&lt;/p&gt;
&lt;p&gt;解释：一个用户使用例如 eaccelerator_put 之类的函数能够往共享内存中加载的最大数据。默认值为”0”，表示不限制。(单位为字节)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.shm_ttl=“0”&lt;/p&gt;
&lt;p&gt;解释：当没有足够的空闲共享内存去尝试缓冲一个新脚本时，将删除至少在 shm_ttl 秒之前没有被访问过的文件。默认值为”0”，表示不尝试从共享内存中删除任何旧的脚本。(单位为秒)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.shm_prune_period=“0”&lt;/p&gt;
&lt;p&gt;解释：当没有足够的空闲共享内存去尝试缓冲一个新脚本时，将删所有旧脚本，前提是这个尝试在超过 shm_prune_period 秒之前被执行过。默认值为”0”，表示不尝试从共享内存中删除任何旧的脚本。(单位为秒)&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.shm_only=“0”&lt;/p&gt;
&lt;p&gt;解释：打开或者关闭在磁盘上缓存编译过的脚本。这个参数对会话数据和内容缓存没有效果。默认值为”0”，表示使用磁盘和共享内存来缓存。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.compress=“1”&lt;/p&gt;
&lt;p&gt;解释：打开或者关闭缓存内容压缩。“1”指打开，“0”指关闭。默认值为”1”。&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;eaccelerator.compress_level=“9”&lt;/p&gt;
&lt;p&gt;解释：内存压缩的级别。默认值为”9”，表示最大压缩。&lt;/p&gt;
&lt;p&gt;5.建立缓存目录：&lt;br&gt;
# mkdir -p /data/cache/eaccelerator&lt;br&gt;
# chmod 0777 /data/cache/eaccelerator&lt;br&gt;
6.重启 apache&lt;/p&gt;
&lt;p&gt;# /usr/local/apache2/bin/apachectl stop&lt;/p&gt;
&lt;p&gt;# /usr/local/apache2/bin/apachectl start&lt;br&gt;
测试下：出现以下表示 ok。&lt;/p&gt;
&lt;p&gt;十、 安装 ucenter&lt;/p&gt;
&lt;p&gt;1 解压 ucenter&lt;/p&gt;
&lt;p&gt;#unzip UCenter_1.0.0_SC_GBK.zip -d ucenter&lt;/p&gt;
&lt;p&gt;-d：解压的目录，不指定-d，解压出来的文件都是分散的。&lt;/p&gt;
&lt;p&gt;2 进入 ucenter 文件夹&lt;/p&gt;
&lt;p&gt;#cd /root/ucenter&lt;/p&gt;
&lt;p&gt;3 把 upload 文件夹放到 apache 文档目录&lt;/p&gt;
&lt;p&gt;# mv upload/ /usr/local/apache2/htdocs/uc&lt;/p&gt;
&lt;p&gt;4 给 data 文件加 777 的权限&lt;/p&gt;
&lt;p&gt;#ll -d usr/local/apache2/htdocs/uc/data&lt;/p&gt;
&lt;p&gt;# chmod 777 -R data/&lt;/p&gt;
&lt;p&gt;5 安装 ucenter&lt;/p&gt;
&lt;p&gt;在浏览器里输入&lt;a href=&quot;http://192.168.254.35/uc/install/&quot;&gt;http://192.168.254.35/uc/install/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;6 填写相关配置&lt;/p&gt;
&lt;p&gt;如果没有初始密码，这里就空着&lt;/p&gt;
&lt;p&gt;十一、 安装 discuz&lt;/p&gt;
&lt;p&gt;1 解压 discuz&lt;/p&gt;
&lt;p&gt;# unzip Discuz_6.1.0_SC_GBK.zip -d discuz6&lt;/p&gt;
&lt;p&gt;2 把 upload 文件夹放到 apache 文档目录（随便来个名字）&lt;/p&gt;
&lt;p&gt;# mv upload/ /usr/local/apache2/htdocs/bbs&lt;/p&gt;
&lt;p&gt;3 改 bbs 目录分配 777 权限&lt;/p&gt;
&lt;p&gt;# chmod 777 -R /usr/local/apache2/htdocs/bbs/&lt;/p&gt;
&lt;p&gt;4 安装过程&lt;/p&gt;
&lt;p&gt;输入这个&lt;a href=&quot;http://192.168.254.35/bbs/install/&quot;&gt;http://192.168.254.35/bbs/install/&lt;/a&gt;
（不要忘了 install，否则会报 mysql 错误）&lt;/p&gt;
&lt;p&gt;补充：&lt;/p&gt;
&lt;p&gt;安装 phpmyadmin（备忘）&lt;/p&gt;
&lt;p&gt;最基本的修改就这几项：&lt;br&gt;
$cfg[‘Servers’][$i][‘controluser’] = ‘root’;&lt;br&gt;
$cfg[‘Servers’][$i][‘controlpass’] = ‘single’;&lt;br&gt;
$cfg[‘blowfish_secret’] = ‘cisco’; /* YOU MUST FILL IN THIS FOR
COOKIE AUTH! */&lt;/p&gt;
&lt;p&gt;参考链接&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://cn.php.net/manual/en/install.unix.apache2.php&quot;&gt;http://cn.php.net/manual/en/install.unix.apache2.php&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.libgd.org/FAQ&quot;&gt;http://www.libgd.org/FAQ&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.libgd.org/FAQ&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://www.libgd.org/FAQ_PHP&quot;&gt;http://www.libgd.org/FAQ_PHP&lt;/a&gt;&lt;a href=&quot;http://cn.php.net/manual/en/install.unix.apache2.php&quot;&gt;&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux 中文乱码]]></title><description><![CDATA[开这篇文章主要目的是来总结一下自己在 linux 下遇到的各种问题及其解决办法，其实归根结底都是字符编码的问题，不同系统的不同字符编码之间相互显示就会出现乱码，要做的就是把编码统一就行了。windows 采用的 gb2312 而 linux 用的 utf…]]></description><link>https://xdays.me/Linux-中文乱码/</link><guid isPermaLink="false">https://xdays.me/Linux-中文乱码/</guid><pubDate>Sun, 26 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;开这篇文章主要目的是来总结一下自己在 linux 下遇到的各种问题及其解决办法，其实归根结底都是字符编码的问题，不同系统的不同字符编码之间相互显示就会出现乱码，要做的就是把编码统一就行了。windows 采用的 gb2312 而 linux 用的 utf8，所以两者之间经常出现编码不一致&lt;/p&gt;
&lt;p&gt;远程登录 putty 的中文显示？&lt;/p&gt;
&lt;p&gt;打开 putty 主程序，选择 window-〉Appearance-〉Font
settings-〉Change…,选择 Fixedsys 字体,字符集选择 CHINESE_GB2312。&lt;br&gt;
在 window-〉Appearance-〉Translation 中，Received data assumed to be in
which character set 中,把 Use font encoding 改为 UTF-8.
如果经常使用,把这些设置保存在 session 里面。&lt;br&gt;
经过这两步设置就可以显示中文了。&lt;/p&gt;
&lt;p&gt;登录 vsftp 服务器，中文文件列表显示乱码？&lt;/p&gt;
&lt;p&gt;还是一开始提到了，linux 用 uft8 而想 flashfxp 这样的客户端软件用 gb2312 编码，所以产生乱码。至于解决办法可以这样考虑能更改的地方有四个：linux 和 windows 系统，vsftp，flashfxp。对于服务器而言，让客户去更改设置是不明智的，所以能更改的地方就只有 linux 和 vsftp，但是 vsftp 我在配置文件中没有找到相关选项，所以干脆直接把 linux 系统默认的 locale 改成 gb2312 吧。对于 redhat 系统，编辑/etc/sysconfig/i18n 文件改为 LANG=“zh_CN.gb2312”，logout 再 login 一切就正常了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ext2Fsd-读取linux分区]]></title><description><![CDATA[Ext2Fsd 这个小工具，便可以实现在 Windows 中挂载 Linux
分区的目的。Ext2Fsd 能够在 Windows 2000、XP、2003、Vista
等系统中运行，支持挂载 Ext2/Ext3 类型的分区,对 Ext4 的支持还不是太好。 我的双系统是 xp…]]></description><link>https://xdays.me/Ext2fsd-读取linux分区/</link><guid isPermaLink="false">https://xdays.me/Ext2fsd-读取linux分区/</guid><pubDate>Sun, 26 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;Ext2Fsd 这个小工具，便可以实现在 Windows 中挂载 Linux
分区的目的。Ext2Fsd 能够在 Windows 2000、XP、2003、Vista
等系统中运行，支持挂载 Ext2/Ext3 类型的分区,对 Ext4 的支持还不是太好。&lt;/p&gt;
&lt;p&gt;我的双系统是 xp 和 ubuntu10.04，能看到文件件看不到里面的内容，虽然我安装时没选可写功能，但还是悠着点，期待更新吧！&lt;/p&gt;
&lt;p&gt;程序目录内就那几个文件主要有这样几个工具：Ext2Mgr.exe 是主程序，Mke2fs.exe 格式化工具，Mount.exe 挂载工具，具体用法用-h 选项查看，DrvRemover.exe 删除所有挂载点。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://www.ext2fsd.com/&quot;&gt;官方主页：http://www.ext2fsd.com/&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux 日志文件]]></title><description><![CDATA[概述 日志文件的概念很好理解，就是什么时间，谁，在哪里里，做了什么事。专门有一个叫做 syslog(ubuntu 采用的拓展的 rsyslog…]]></description><link>https://xdays.me/Linux-日志文件/</link><guid isPermaLink="false">https://xdays.me/Linux-日志文件/</guid><pubDate>Sun, 26 Sep 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;日志文件的概念很好理解，就是什么时间，谁，在哪里里，做了什么事。专门有一个叫做 syslog(ubuntu 采用的拓展的 rsyslog)的程序来负责收集系统产生的这些信息，然后按照规则把他们写道特定的地方，这些地方包括文件，控制台，打印机，远程主机等。由于日志文件记录信息逐渐增多，就需要有程序管理日志文件，这就是 logrotate。对于这两个程序的认识主要对配置文件的了解。但是最重要的不是这些，而是要能看懂日志信息，这就要对系统，对服务等有个全面的认识，这样才能知道日志文件里说的是怎么一回事。&lt;/p&gt;
&lt;h3&gt;syslog 配置&lt;/h3&gt;
&lt;h4&gt;语法&lt;/h4&gt;
&lt;p&gt;语法：服务名称 [运算符] 信息等级          记录信息的位置&lt;/p&gt;
&lt;h4&gt;服务名称&lt;/h4&gt;
&lt;p&gt;服务名称：该服务产生的讯息会被纪录的意 思。syslog
认识的服务主要有底下这些：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;auth, authpriv：主要与认证有关的机制，例如 telnet, login, ssh
等需要认证的服务都是使用此一机制；&lt;/li&gt;
&lt;li&gt;cron：例行性命令 cron/at 等产生讯息记录的地方；&lt;/li&gt;
&lt;li&gt;daemon：与各个 daemon 有关的讯息；&lt;/li&gt;
&lt;li&gt;kern：核心 (kernel) 产生讯息的地方；&lt;/li&gt;
&lt;li&gt;lpr：打印相关的讯息！&lt;/li&gt;
&lt;li&gt;mail：只要与邮件收发有关的讯息纪录都属于这个；&lt;/li&gt;
&lt;li&gt;news：与新闻群组服务器有关的东西；&lt;/li&gt;
&lt;li&gt;syslog：syslogd 这支程序本身产生的信息啊！&lt;/li&gt;
&lt;li&gt;user, uucp, local0 ~ local7：与 Unix like 机器本身有关的一些讯息。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;运算符&lt;/h4&gt;
&lt;p&gt;运算符限制了记录信息的范围&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;. ：代表比后面还要高的等级(含该等级)都被记录下来的意思，
例如：mail.info 代表只要是 mail 的信息，而且该信息等级高于 info
(含 info )时，就会被记录下来；&lt;/li&gt;
&lt;li&gt;.=：代表所需要的等级就是后面接的等级而已；&lt;/li&gt;
&lt;li&gt;.!：代表不等于。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;信息等级&lt;/h4&gt;
&lt;p&gt;信息等级：总共分成下列几种等级：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;info ： 提示一些讯息数据；&lt;/li&gt;
&lt;li&gt;notice ： 注意！需要比较留意的讯息；&lt;/li&gt;
&lt;li&gt;waring 或 warn ：
警示的讯息，以上三个讯息都还是没有错误的情况，虽然是需要留意，但是还没有到错误的情况；&lt;/li&gt;
&lt;li&gt;err 或 error ： 呀！错误讯息出现了！该要检验错误的问题发生原因了；&lt;/li&gt;
&lt;li&gt;crit ： 临界点了！再不处理可就伤脑筋了！&lt;/li&gt;
&lt;li&gt;alert ： 错误讯息一再地警告警告！你将要完蛋了！&lt;/li&gt;
&lt;li&gt;emerg 或 panic ： 阿！系统已经进入混乱的阶段！真的是完蛋了～～&lt;/li&gt;
&lt;li&gt;特殊等级：例如 debug （显示较多的信息！）及 none
（不要记录该服务的内容！）等&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;记录日志位置&lt;/h4&gt;
&lt;p&gt;记录信息的位置&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;档案的绝对路径：通常就是放在 /var/log
里头的档案啦！如果绝对路径后跟“-”表示&lt;strong&gt;异步写入&lt;/strong&gt;，这样能提升性能。&lt;/li&gt;
&lt;li&gt;打印机或其它设备：例如 /dev/lp0 这个打印机装置，/dev/console 指控制台&lt;/li&gt;
&lt;li&gt;使用者名称：如 root，显示给使用者啰！另外如果是*就是告诉所有用户&lt;/li&gt;
&lt;li&gt;远程主机：例如 @test.adsldns.org&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;配置文件示例&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# Log all kernel messages to the console.
# Logging much else clutters up the screen.
#kern.*                                                 /dev/console

# Log anything (except mail) of level info or higher.
# Don&apos;t log private authentication messages!
*.info;mail.none;authpriv.none;cron.none                /var/log/messages

# The authpriv file has restricted access.
authpriv.*                                              /var/log/secure

# Log all the mail messages in one place.
mail.*                                                  -/var/log/maillog

# Log cron stuff
cron.*                                                  /var/log/cron

# Everybody gets emergency messages
*.emerg                                                 *

# Save news errors of level crit and higher in a special file.
uucp,news.crit                                          /var/log/spooler

# Save boot messages also to boot.log
local7.*                                                /var/log/boot.log&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;logrotate 配置&lt;/h3&gt;
&lt;p&gt;/etc/logrotate.conf 和/etc/logrotate.d/*&lt;/p&gt;
&lt;p&gt;这是一个默认配置文件，也就是如果具体的服务没有具体设置就采用此默认项&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;# see &quot;man logrotate&quot; for details
# rotate log files weekly
weekly
# keep 4 weeks worth of backlogs
rotate 4
# create new (empty) log files after rotating old ones
create
# uncomment this if you want your log files compressed
#compress
# RPM packages drop log rotation information into this directory
#具体程序的配置文件在下面这个目录内，语法规则类似
include /etc/logrotate.d
# no packages own wtmp -- we&apos;ll rotate them here
/var/log/wtmp {
monthly
minsize 1M
create 0664 root utmp
rotate 1
}
# system-specific logs may be also be configured here.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;参考链接&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;鸟哥的站：&lt;a href=&quot;http://linux-vbird.bluedata.org/linux%5C_base/0570syslog.htm&quot;&gt;http://linux-vbird.bluedata.org/linux\_base/0570syslog.htm&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;man syslog.conf 最好的最权威的&lt;/li&gt;
&lt;li&gt;维基百科  &lt;a href=&quot;http://en.wikipedia.org/wiki/Syslog&quot;&gt;http://en.wikipedia.org/wiki/Syslog&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Linux 字符处理]]></title><description><![CDATA[linux
系统中很多文件都是纯文本文件，如配置文件和日志文件。系统管理时对这些文件的处理显得尤为重要，系统中带有很多经典的字符处理命令，他们在系统管理和脚
本编写时有很强大的功能，这些命令包括 cut,diff,expand/unexpand,grep,head
/tail…]]></description><link>https://xdays.me/Linux-字符处理/</link><guid isPermaLink="false">https://xdays.me/Linux-字符处理/</guid><pubDate>Thu, 05 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;linux
系统中很多文件都是纯文本文件，如配置文件和日志文件。系统管理时对这些文件的处理显得尤为重要，系统中带有很多经典的字符处理命令，他们在系统管理和脚
本编写时有很强大的功能，这些命令包括 cut,diff,expand/unexpand,grep,head
/tail,join,paste,sed,sort,cat/tac,tr,uniq。下面具体总结以下相关命令的常用用法：&lt;/p&gt;
&lt;p&gt;cut&lt;/p&gt;
&lt;p&gt;功能：截取文件内容或者输出中的相应字段&lt;br&gt;
常用选项：&lt;br&gt;
-d 指定字段分隔符&lt;br&gt;
-c 取固定字符范围&lt;br&gt;
-f 取第几个字段&lt;/p&gt;
&lt;p&gt;diff&lt;/p&gt;
&lt;p&gt;功能：比较两个文本不同，以格式化样式显示。&lt;br&gt;
常用选项：&lt;br&gt;
-b 忽略空格数不同&lt;br&gt;
-B 忽略空白行&lt;br&gt;
-i 忽略大小写&lt;br&gt;
-I 忽略指定字符差异&lt;br&gt;
-t 输出的 tab 以空格替换&lt;/p&gt;
&lt;p&gt;expand/unexpand&lt;/p&gt;
&lt;p&gt;功能：将 tab 转换成空格/将空格转换成 tab&lt;br&gt;
常用选项：&lt;br&gt;
-t 指定 tab 代表空格数，默认 8&lt;/p&gt;
&lt;p&gt;grep&lt;/p&gt;
&lt;p&gt;功能：从文件或者标准输入中过滤并显示匹配行&lt;br&gt;
常用选项：&lt;br&gt;
-i 忽略大小写&lt;br&gt;
-n 显示行号&lt;br&gt;
-v 显示不匹配的行&lt;/p&gt;
&lt;p&gt;注意：在构造匹配字符串时可以用正则表达式，这是一种相当复杂但是很好很强大的规则，推荐两篇基础教程&lt;a href=&quot;http://deerchao.net/tutorials/regex/regex.htm&quot;&gt;正则表达式 30 分钟入门教程&lt;/a&gt;和&lt;a href=&quot;http://www.regexlab.com/zh/regref.htm&quot;&gt;揭开正则表达式的神秘面纱&lt;/a&gt;，
总结的相当不错。&lt;/p&gt;
&lt;p&gt;head/tail&lt;/p&gt;
&lt;p&gt;功能：显示文件或者标准输入的开头/结尾几行&lt;br&gt;
常用选项：&lt;br&gt;
-n 显示的行数&lt;/p&gt;
&lt;p&gt;join&lt;/p&gt;
&lt;p&gt;功能：根据相同字段合并两个文件&lt;br&gt;
命令选项：&lt;br&gt;
-t 指定分隔符&lt;br&gt;
-i 忽略大小写&lt;br&gt;
-1 n 指定第一个文件的哪一段&lt;br&gt;
-2 n 指定第二个文件的哪一段&lt;/p&gt;
&lt;p&gt;paste&lt;/p&gt;
&lt;p&gt;功能：将两个文件对应行合并，并以 tab 分开。&lt;br&gt;
命令选项：&lt;br&gt;
-d 指定分隔符&lt;/p&gt;
&lt;p&gt;sed&lt;/p&gt;
&lt;p&gt;功能：对标准输入的处理&lt;br&gt;
命令选项：&lt;br&gt;
-n 安静模式，仅显示被处理过的行&lt;br&gt;
-f 输出到文件&lt;br&gt;
-r 支持扩展正则表达式&lt;br&gt;
操作说明：n1:n2 function&lt;br&gt;
function 主要包括：&lt;br&gt;
a 新增；c 替换；d 删除；i 插入；p 打印；s 搜索&lt;br&gt;
指令示例：ifconfig eth0 |grep ‘binetb’ | sed ‘s/^.*addr://g’ | sed
‘s/Bcast.*$//g’    
/*过滤出带有 ip 地址的那一行，在把 ip 地址前后的字符用空白替换掉，就得到 ip 地址了*/&lt;/p&gt;
&lt;p&gt;sort&lt;/p&gt;
&lt;p&gt;功能：对文件内容或者标准输入以行为单位排序&lt;br&gt;
命令选项：&lt;br&gt;
-b 忽略开始空格&lt;br&gt;
-f 忽略大小写&lt;br&gt;
-k 按照第几个字段排序&lt;br&gt;
-n 使用数字排序&lt;br&gt;
-o 输出到文件&lt;br&gt;
-r 逆序排序&lt;br&gt;
-t 指定分隔符&lt;/p&gt;
&lt;p&gt;cat/tac&lt;/p&gt;
&lt;p&gt;功能：显示/逆序显示 文件内容&lt;br&gt;
命令选项：&lt;br&gt;
-A 显示控制符号&lt;br&gt;
-n 显示行号&lt;/p&gt;
&lt;p&gt;tr&lt;/p&gt;
&lt;p&gt;功能：替换删除字符&lt;br&gt;
命令选项：&lt;br&gt;
-d 删除指定字符&lt;br&gt;
-s 替换重复字符&lt;/p&gt;
&lt;p&gt;uniq&lt;/p&gt;
&lt;p&gt;功能：重复字符只显示一次&lt;br&gt;
命令选项：&lt;br&gt;
-i 忽略大小写&lt;br&gt;
-c 进行计数&lt;/p&gt;</content:encoded></item><item><title><![CDATA[人体使用手册-书摘]]></title><description><![CDATA[…]]></description><link>https://xdays.me/人体使用手册-书摘/</link><guid isPermaLink="false">https://xdays.me/人体使用手册-书摘/</guid><pubDate>Thu, 05 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;我们没有任何理由不爱惜自己的身体，重视健康。这本《人体使用手册》中的很多中医的观点很有道理，这里总结阅读过程中标记的文字段落，如下所示：&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;人体系统&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;五脏六腑和经络：五脏六腑是中国人用了几千年的一个名词，就是指人体的主要器官。中国人把人体内部的主要器官分为“脏”和“腑”两个大类。“脏”是指实心或有机构的器官，有心、肝、脾、肺、肾五个脏。“腑”是指空心的容器，有小肠、胆、胃、大肠、膀胱等五个腑，另外将人体的胸腔和腹腔合并起来是第六个腑，称为三焦。由于心包和心脏是在一起的，而三焦却和所有其它的腑没有关联，因此．中国人就把所有脏腑称为“五脏六腑”。除了前面所说的五脏和五腑互为表里外，心包和三焦则是另一组互为表里的经络。除了五脏六腑对应的十一条经络之外，另外还有心包经、任脉和督脉三条经络，一共是十四条主要的经络。各个经络还有分支，称之为经别，几乎遍及全身。&lt;/p&gt;
&lt;p&gt;人体的功能系统：指挥系统，能量供给系统（人体的能量供给系统就是消化系统加上造血系统和心血管系统），资源管理系统，诊断维修系统，废物清理系统，周边功能系统，网络系统（经络系统，神经系统，血管系统，淋巴系统）&lt;/p&gt;
&lt;p&gt;**  血气能量系统**&lt;/p&gt;
&lt;p&gt;什么是血气？&lt;/p&gt;
&lt;p&gt;血气指的是一个人的正常能量，“火”则指人体储存的能量，也就是我们透支体力时的能量来源。另外也用阴阳来代表这两种能源，阴指储存的“火”，阳指正常的“血气”。“阳虚”指的是血气略有不足；“阴虚”则是人体血气不足到需要动用储存的“火”；“阴虚火重”则说明不但动用储存的“火”，而且还在大量透支；“阴阳两虚”则代表“血气”和“火”都已大量亏虚接近殆尽。&lt;/p&gt;
&lt;p&gt;五个血气水平？&lt;/p&gt;
&lt;p&gt;健康水平：用中医的眼光来说，这样的人各方面都很平衡，不偏阴也不偏阳，不偏虚也不偏实，平衡是中医追求的目标。因此这是最健康的等级，这个等级的特征是身材匀称，脸色红润，脾气温和，作息规律。&lt;/p&gt;
&lt;p&gt;阳虚水平：血气低于健康水平，造成血气下降的原因很多，如睡眠太晚，或长期营养吸收不良等&lt;/p&gt;
&lt;p&gt;阴虚水平：血气下降的趋势长期不能扭转，血气降至低于阳虚的下限后，由于人体的能量太低，诊断维修系统无法完全正常工作，疾病入侵或器官的损伤如没有立即的危险，就暂时将之搁置。&lt;/p&gt;
&lt;p&gt;阴阳两虚水平：由阴虚的状况继续消耗能量，等到储存的能量即将用尽的时候，也就是“火”
快用完了，就到了“阴阳两虚”的水平。这时人体会经常处于疲倦的状态。这个时候人体为了取得必要的能量，会到肌肉里或其它部位，淬取能量。&lt;/p&gt;
&lt;p&gt;血气枯竭水平：由阴阳两虚的血气水平再继续下降，最终降低到中医所说的“阴阳大虚”的水平，用比较白话的说法，就是血气枯竭。&lt;/p&gt;
&lt;p&gt;血气升降症状？&lt;/p&gt;
&lt;p&gt;最简单的是观察嘴唇和牙龈的颜色，这个部份会明显的反映身体内血液的颜色，而且会留下过去一段时间血气状况的痕迹。长期血气透支后，会使嘴唇的颜色渐渐转暗，严重的成为紫黑色。但是当开始改善睡眠习惯之后，会从下嘴唇的内侧开始改变颜色，逐渐由内而外，当改变至嘴唇厚度的中间部位，可以从外部看到明显的里外颜色差异时，至少需要半年的时间。整个下嘴唇颜色全变成淡红色时，则需一年以上的调养。因此，只要从上下嘴唇的颜色差异，就能判断过去这段时间里，这个人的血气是不是处在上升的趋势，而且也能判断其调养时日的长短。&lt;/p&gt;
&lt;p&gt;牙龈是另一个非常容易观察血气的部位，特别是一些原来血气很低的人，原来的牙龈颜色多数都很深，当开始依照我们的方法调整生活习惯之后，约两周到一个月就会在牙龈靠近牙齿的部份出现一条很细的新肉痕迹，这部份的颜色接近粉红色，和原来的深色形成强烈的对比。随着调养时间的不断加长，淡红色的部份逐渐增加，两色中间形成一条很清楚的线条，只要观察这条线的位置，就能知道这个人在过去一段时间的生活习惯或工作压力的变化。牙龈的颜色如果很淡，表示这个人睡眠的时间够长，但时辰不对，血气仍然不足。正常的血色应该带点血红色。
在血气增加的过程中，牙龈上的牙肉会愈长愈厚，露在外面的牙齿愈来愈短，牙肉会逐渐长到牙齿的缝隙中，这也是观察血气趋势的很好方法。相反的，如果血气不断下降，则牙龈上的牙肉会愈来愈低，也就是牙肉逐渐收缩，牙齿愈来愈长，直到把牙根都露出来，就很容易得牙周病。&lt;/p&gt;
&lt;p&gt;手掌的颜色和肤质也是观察血气的重要信息，如果脸色红润，但是掌心也很红，则是肝气上冲造成的红，这种红润不能代表这个人原来的血气，如果泄除了肝气，可能脸上的红润就完全褪光了。标准的手掌颜色应该掌心白、指尖红，这样的手掌表示这个人目前肝气不盛，脸上的红润就是真正的健康色。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;日常保养&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;敲胆经&lt;/p&gt;
&lt;p&gt;每天在大腿外侧的四个穴位点（环跳、风市、中渎、膝阳关）敲打，每敲打四下算一次，每天敲左右大腿各五十次，也就是左右各两百下。由于大腿的肌肉和脂肪都很厚，因此必须用点力，要感觉力度能透进去，而且以每秒大约两下的节奏敲，才能有效刺激穴位。敲胆经的目的主要在于刺激胆经，强迫胆汁的分泌，提升人体的吸收能力，提供人体造血系统所需的充足材料。慢性病的最根本原因就是每一天的能量供应不足。&lt;/p&gt;
&lt;p&gt;胆功能不好的症状有很多，最明显的就是白头发，这是由于人体的能量不足所致，中医有一句话：“发乃血之末”，由于营养供应不足才会造成白发。油性头发也是另一种症状，这是由于胆汁分泌不足，无法有效分解吃进去的油脂，加上肝热的因素，就从头发排出来油了。&lt;/p&gt;
&lt;p&gt;早睡早起&lt;/p&gt;
&lt;p&gt;“早睡早起身体好”是我们从小就被反复教导的良好生活习惯，可是现在每当建议朋友晚上最好十点钟睡觉时，百分之九十的朋友的回答都是那怎么可能。只有那些已经得了不容易医治疾病的百分之十的朋友，才会排除万难，勉强遵守这个从小被教育的生活习惯。&lt;/p&gt;
&lt;p&gt;根据我们的经验，如果每天十一点睡，加上前一章的敲胆经改善营养的吸收，血气至少可以保持平衡，而且有很少部份的余蓄，如果十点睡，就可以使人体的血气形成上升的趋势。&lt;/p&gt;
&lt;p&gt;按摩心包经&lt;/p&gt;
&lt;p&gt;注：这部分内容看不懂，涉及专业的中医了，不转了。&lt;/p&gt;
&lt;p&gt;不生气&lt;/p&gt;
&lt;p&gt;从中医角度来分析，发脾气时，气会往上冲，直冲头顶，所以会造成头顶发热，久而久之就会形成秃顶。严重的暴怒，有时会造成肝内出血，更严重的还有可能会吐血，吐出来的是肝里的血，程度轻一点的，则出血留在肝内，一段时间就形成血瘤。这些听起来很可怕，可是却是真实的情形。&lt;/p&gt;
&lt;p&gt;生气的实质意义是“用别人的过错惩罚自己”是人类最愚笨的一种行为。&lt;/p&gt;
&lt;p&gt;保持洁净的肠胃&lt;/p&gt;
&lt;p&gt;在我们的经验里，肠胃的问题和多数的慢性病有密切的关系。另外强调的是防止唾液感染和不吃生的动物性食物。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux 磁盘操作]]></title><description><![CDATA[硬盘有哪些组成部分？ 这里指的是与存储相关的结构，从大到小依次包括，柱面—磁道—扇区。柱面是指硬盘盘面半径相同的所有磁道，它也是划分分区的单位；磁道就是盘面上的圆
圈；扇区是硬盘上的最小物理存储单位，一般为 512 字节。再来说一下 MBR（master
boot
record…]]></description><link>https://xdays.me/Linux-磁盘操作/</link><guid isPermaLink="false">https://xdays.me/Linux-磁盘操作/</guid><pubDate>Wed, 04 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;硬盘有哪些组成部分？&lt;/p&gt;
&lt;p&gt;这里指的是与存储相关的结构，从大到小依次包括，柱面—磁道—扇区。柱面是指硬盘盘面半径相同的所有磁道，它也是划分分区的单位；磁道就是盘面上的圆
圈；扇区是硬盘上的最小物理存储单位，一般为 512 字节。再来说一下 MBR（master
boot
record）,硬盘的 0 柱面、0 磁头、1 扇区，即硬盘的第一个扇区。这 512 字节有重要信息，前 446 字节为存储引导程序（boot
loader）像 grub，lilo 等，接着 64 字节叫做 DPT（disk patition
table）来存储硬盘分区的信息，最后两字节固定为 55AA。&lt;/p&gt;
&lt;p&gt;文件系统基本概念有哪些？&lt;/p&gt;
&lt;p&gt;节点(inode)和块(block)：文件的属性和内容是分开存储的，节点用来存储属性，块用来存储内容包括文件名，而且节点还包括指向块的指针。文件系统就是通过节点和块来定位文件的。&lt;/p&gt;
&lt;p&gt;目录(directory)和文件(file)：建立目录和文件都需要分配节点和块；目录本质上也是一个文件，只是分配给目录的块存储的是目录内文件的关联性。&lt;br&gt;
超级块(super
block)：记录文件系统信息的地方，是一个分区最开始的那个块。&lt;br&gt;
组描述(group description),块位图(block bitmap),inode 位图(inode
bitmap),inode 表和数据块：这五部分组成了一个块组，而整个分区就是由超级块和块组组成。组描述记录开始，块位图记录块是否可用，inode
位图记录 inode 是否可用，inode 表是 inode 存储区，block 是块存储区。以上描述都可以用 dumpe2fs 命令查看。&lt;/p&gt;
&lt;p&gt;与文件系统相关的命令又哪些？&lt;/p&gt;
&lt;p&gt;​1)
fdisk：分区工具，具体用法可以查看帮助文件，这里需要注意的是分区是可以直接指定分区大小而让程序自己计算从哪个柱面开始哪个结束。&lt;br&gt;
2)
mount：挂载工具，将文件系统或者文件系统的一部分挂载到目录树的节点上。特别注意-o
选项的一些参数，放到/etc/fstab 那部分讨论。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;fsck,badblocks：磁盘检验，使用时一定要将设备卸载下来。&lt;/li&gt;
&lt;li&gt;df,du：查看分区空间和文件大小，常用选项是-sh。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;如何设置启动载入分区？&lt;/p&gt;
&lt;p&gt;启动载入分区主要是配置/etc/fstab 文件，此文件共有六个字段依次是设备，挂载点，文件系统，选项，备份，检查。这里的选项就是 mount
-o 添加的一些选项，比较常用的有：&lt;br&gt;
rw/ro：读写/只读&lt;br&gt;
sync/async：同步/异步磁盘与内存数据&lt;br&gt;
auto/noauto：自动/非自动载入&lt;br&gt;
exec/noexec：是否有可执行权限&lt;br&gt;
user/nouser：是否允许普通用户挂载&lt;br&gt;
suid/nosuid：是否允许 suid 存在&lt;br&gt;
usrquota：用户磁盘配额&lt;br&gt;
grpquota：用户组磁盘配额&lt;br&gt;
default：相当于 rw,suid,exec,auto,nouser,async&lt;/p&gt;
&lt;p&gt;什么是磁盘配额？&lt;/p&gt;
&lt;p&gt;磁盘配额就是对普通用户使用的磁盘空间进行限制，包括最低限制，最高限制，宽限时间(在最高限制范围内，允许用户超过最低限制的时间)。另外注意：磁盘配额是针对分区的；不能对 root 用户执行配额。&lt;/p&gt;
&lt;p&gt;如何配置磁盘配额？&lt;/p&gt;
&lt;p&gt;首先要在挂载相应分区时添加 usrquota 参数使其支持磁盘配额；然后通过相应命令编辑用户的配额；最后查看检查相应的配额设置。&lt;/p&gt;
&lt;p&gt;不同版本的编辑命令不太一样，但是达到的目的都是一样的。这里列举 redhat 下的执行命令，具体还是看手册：&lt;br&gt;
#quota -ugvsl  查看磁盘配额&lt;br&gt;
#quotacheck -augvM 扫描磁盘的配额空间&lt;br&gt;
# edquota -ugtp  编辑用户(组)的限额值和宽限时间&lt;br&gt;
#quotaon/quotaoff -aug 开启和关闭磁盘配额&lt;/p&gt;</content:encoded></item><item><title><![CDATA[iptables 防火墙及nat]]></title><description><![CDATA[什么是 iptables？ iptables 是用来配置 linux 内核自带的包过滤系统的命令行工具，它主要是面向系统管理员。 什么是规则，链，表？ 规则（rule…]]></description><link>https://xdays.me/Iptables-防火墙及NAT/</link><guid isPermaLink="false">https://xdays.me/Iptables-防火墙及NAT/</guid><pubDate>Mon, 02 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;什么是 iptables？&lt;/p&gt;
&lt;p&gt;iptables 是用来配置 linux 内核自带的包过滤系统的命令行工具，它主要是面向系统管理员。&lt;/p&gt;
&lt;p&gt;什么是规则，链，表？&lt;/p&gt;
&lt;p&gt;规则（rule）：包过滤条件及处理方式，这是过滤系统的基本单位。比如规则可以指定源地址，目的地址，源端口，目的端口等，如果匹配规则就按照相关处理方式处理数据包。&lt;/p&gt;
&lt;p&gt;链（chain）：链是数据包的传播路径，是规则的集合，包括一条或者多条规则。数据包到达某条链时，iptables 依次按规则处理数据包。&lt;/p&gt;
&lt;p&gt;表（table）：提供特定功能的一组链，常见的主要有 filter 表（INPUT,FORWARD,OUTPUT 链），nat 表
（PREROUTING,POSTROUTING,OUTPUT 链），mangle 表
（PREROUTING,POSTROUTING,INPUT,FORWARD,OUTPUT 链）。&lt;/p&gt;
&lt;p&gt;数据包有怎样的传输过程（链之间的关系）？&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/08/iptables.png&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/08/iptables.png&quot; alt=&quot;iptables&quot; title=&quot;iptables&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;(图片转自鸟哥私房菜)&lt;/p&gt;
&lt;p&gt;iptables 的语法？&lt;/p&gt;
&lt;p&gt;iptables [-t 表(默认 filter)][命令选项]   {链} [ 匹配选项(默认所有) ][ 操作选项]&lt;/p&gt;
&lt;p&gt;命令选项：-A 添加 -D 删除 -I 插入，加序号 -L 查看 -P 默认规则 -F
清除规则 -N 创建新链 -X 删除指定链 -Z 清零计数器&lt;/p&gt;
&lt;p&gt;匹配选项：（很多，具体查看手册，这里列举常用的）&lt;br&gt;
接口号：-i 指定从哪个接口收到的包&lt;br&gt;
协议类型：-p {tcp | udp | icmp} 指定协议类型&lt;br&gt;
源地址：-s ip/netmask，可以指定 ip 地址和网段&lt;br&gt;
目的地址：-d/netmask，同上&lt;br&gt;
源端口号：—sport n1:n2，特定范围端口&lt;br&gt;
目的端口：—dport n1:n2，同上&lt;br&gt;
icmp 类型：—icmp-type n 指定 icmp 类型号&lt;br&gt;
状态模块：-m [mac | state]，—mac-source 源 mac 地址，—state
包括 INVALID，ESTABLISHED，NEW，RELATED&lt;/p&gt;
&lt;p&gt;操作选项：-j
指定匹配数据包的处理方式，有 ACCEPT，DROP，SNAT，DNAT，还可以传递给其他的自定义链。&lt;/p&gt;
&lt;p&gt;怎样操作规则？&lt;/p&gt;
&lt;p&gt;主要是如何保存和恢复，以及如何开机启动规则。&lt;br&gt;
保存规则：iptables-save &gt; filename&lt;br&gt;
恢复规则：iptables-restore &amp;#x3C; filename&lt;br&gt;
注意：redhat 系统可以执行 service iptables save 或者 iptables-save &gt;
/etc/sysconfig/iptables 来保存规则并开机启动。&lt;/p&gt;
&lt;p&gt;什么是 nat？&lt;/p&gt;
&lt;p&gt;nat（network address
translation）是一种将私有地址转换成公有地址的技术，优点主要是解决 ip 地址不足以及增强网络安全等问题。&lt;/p&gt;
&lt;p&gt;如何通过 iptables 配置 nat 服务器？&lt;/p&gt;
&lt;p&gt;首先打开内核的路由功能：echo “1” &gt; /proc/sys/net/ipv4/ip_forward&lt;br&gt;
然后再 nat 表的 POSTROUTING 链中添加规则：iptables -t nate -A POSTROUTING 
-o eth1 -j SNAT —to A.B.C.D&lt;br&gt;
最后设定客户端的网关为 nat 服务器面向 lan 的接口地址。&lt;/p&gt;
&lt;p&gt;使用 nat 时有哪些控制方式？&lt;/p&gt;
&lt;p&gt;因为 nat 服务器是作为客户端的网关，在其上做控制显得尤为必要了。从 iptables 内建表格相关性(如图)可以看出，其实控制就是通过编辑 nat 表的 FORWARD 和 PREROUTING 链来实现的，命令选项也与其他链一样。&lt;/p&gt;
&lt;p&gt;还有一个有意思的控制，强制重定向到特定站点。&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#iptables -t nat -A PREROUTING -i eth0 -p tcp -dport 80 -j DNAT --to 192.168.1.250:80&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参考资料：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;《鸟哥的 linux 私房菜—服务器架设篇》&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.frozentux.net/iptables-tutorial/cn/iptables-tutorial-cn-1.1.19.html#TRAVERSINGGENERAL&quot;&gt;Iptables 指南 1.1.19&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.faqs.org/docs/iptables/&quot;&gt;Iptables Tutorial 1.1.19&lt;/a&gt;, 一篇详细介绍 iptables 的文档，把文档写的如此详细，不得不佩服也感谢译者&lt;/li&gt;
&lt;/ul&gt;</content:encoded></item><item><title><![CDATA[Linux 特殊权限]]></title><description><![CDATA[在 linux 系统里除了常见的三组权限外，还有一组特殊权限它们分别是 1）suid 2）sgid 3）sticky bit 或者称为 sbit 这組权限主要用在一些别叫细微的条件下，也可见 linxu…]]></description><link>https://xdays.me/Linux-特殊权限/</link><guid isPermaLink="false">https://xdays.me/Linux-特殊权限/</guid><pubDate>Sun, 01 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;在 linux 系统里除了常见的三组权限外，还有一组特殊权限它们分别是&lt;br&gt;
1）suid&lt;br&gt;
2）sgid&lt;br&gt;
3）sticky bit 或者称为 sbit&lt;/p&gt;
&lt;p&gt;这組权限主要用在一些别叫细微的条件下，也可见 linxu 系统的严谨之处。&lt;/p&gt;
&lt;p&gt;由于特殊权限对于文件和目录是不同的，我们这里分开讨论。&lt;/p&gt;
&lt;p&gt;对于文件的特殊权限&lt;/p&gt;
&lt;p&gt;suid：对二进制文件有效，当用户执行具有该权限的文件时将具有文件拥有者的权限，例如查看/etc/shadow 文件发现如下权限：-r--------
1 root root 1047 May  3 11:57
/etc/shadow，也就是说只有 root 用户强制写入才能更改该文件，但是每个用户在执行 passwd 命令的时候却成功的更新了自己的密码，原因就在/usr/bin/passwd 这个文件上，来看一下它的权限：-rwsr-xr-x
1 root root 22960 Jul 17  2006
/usr/bin/passwd，看到有 s 权限，这样就解释了上面的问题。&lt;br&gt;
sgid：与 suid 类似只不过执行时拥有文件拥有者所属组的权限。&lt;br&gt;
sbit：对文件无效。&lt;/p&gt;
&lt;p&gt;对于目录的特殊权限：&lt;br&gt;
suid：对目录无效。&lt;br&gt;
sgid：在该目录下建立的文件的拥有者所属组与目录的相同，例如：&lt;br&gt;
drwxrwsrwx 2 root root 4096 May  7 21:05 tst&lt;br&gt;
-rw-rw-r— 1 ease root 0 May  7 21:05 easefile&lt;br&gt;
都是 root 用户组。&lt;/p&gt;
&lt;p&gt;sbit：拥有这个权限的目录有这样的特点，在这个目录下建立的文件只有文件拥有者和 root 可以删除，其他的用户不可删除，即使 ta 拥有 w 的权限。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux 环境变量文件]]></title><description><![CDATA[系统环境设置文件包括系统设置文件和个人设置文件。 系统设置文件 /etc/sysconfig/i18n 系统语系 /etc/profile 设置系统重要的变量 /etc/bashrc 确定 umask 功能 确定提示符内容 命令别名及系统其他功能 /etc/profile.d…]]></description><link>https://xdays.me/Linux-环境变量文件/</link><guid isPermaLink="false">https://xdays.me/Linux-环境变量文件/</guid><pubDate>Sun, 01 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;系统环境设置文件包括系统设置文件和个人设置文件。&lt;/p&gt;
&lt;h1&gt;系统设置文件&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;/etc/sysconfig/i18n 系统语系&lt;/li&gt;
&lt;li&gt;/etc/profile 设置系统重要的变量&lt;/li&gt;
&lt;li&gt;/etc/bashrc 确定 umask 功能 确定提示符内容 命令别名及系统其他功能&lt;/li&gt;
&lt;li&gt;/etc/profile.d/*.sh 进行一些附加设置值如命令别名&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;个人设置文件&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;~/bash_profile&lt;/li&gt;
&lt;li&gt;~/.bashrc 个性化设置值&lt;/li&gt;
&lt;li&gt;~/.bash_history 历史命令记录文件&lt;/li&gt;
&lt;li&gt;~/.bash_logout 记录注销后进行的操作&lt;/li&gt;
&lt;/ul&gt;
&lt;h1&gt;总结：&lt;/h1&gt;
&lt;ul&gt;
&lt;li&gt;/etc/bashrc&lt;/li&gt;
&lt;li&gt;~/.bashrc&lt;/li&gt;
&lt;li&gt;/etc/profile.d&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;通常容易忽略第三个目录下设置的命令别名。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ubuntu 系统配置]]></title><description><![CDATA[​1. 更新源 编辑/etc/apt/sources.list 文件，源不列了，搜吧大把大把的。 2.firefox 的 flash 插件中文乱码： 编辑/etc/fonts/conf.d/49-sansserif.conf 字体配置文件，将其中的 sans-serif…]]></description><link>https://xdays.me/Ubuntu-系统配置/</link><guid isPermaLink="false">https://xdays.me/Ubuntu-系统配置/</guid><pubDate>Sun, 01 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;div id=&quot;blog_text&quot;&gt;
&lt;p&gt;​1. 更新源&lt;br&gt;
编辑/etc/apt/sources.list 文件，源不列了，搜吧大把大把的。&lt;/p&gt;
&lt;p&gt;2.firefox 的 flash 插件中文乱码：&lt;/p&gt;
&lt;p&gt;编辑/etc/fonts/conf.d/49-sansserif.conf 字体配置文件，将其中的 sans-serif 替换成 AR
PL UKai CN（系统中安装的字体），重启 firefox 即可。&lt;/p&gt;
&lt;p&gt;3.安装 nvidia 显卡驱动&lt;br&gt;
直接打开硬件驱动管理程序选择建议安装的驱动，下载完成重启即可。&lt;/p&gt;
&lt;p&gt;​4. 允许 root 登录&lt;br&gt;
因为系统建立好后没有给 root 赋予密码，要想 root 登录先$ sudo passwd root ,
这样 root 就可以文本终端登录了，然后设置 系统—系统管理—登录窗口
即可允许 root 在图形届满登录。&lt;/p&gt;
&lt;p&gt;​5. 安装虚拟机 virtualbox-ose&lt;/p&gt;
&lt;p&gt;具体安装设置都很简单，找个教程：&lt;a href=&quot;http://www.kafan.cn/edu/xuniji/200811012526.html&quot;&gt;http://www.kafan.cn/edu/xuniji/200811012526.html&lt;/a&gt;讲的很详细了，这里只是提一下几个需要特别注意的点：&lt;br&gt;
1）虚拟机的双向共享剪切板可以实现宿主机与客户机之间的拷贝粘贴。&lt;br&gt;
2）宿主机的虚拟光驱会作为客户机的物理光驱。&lt;br&gt;
3）分配共享空间后可以用 net use x:
&lt;a href=&quot;file://vboxsvr/sharename&quot;&gt;\vboxsvrsharename&lt;/a&gt;打开共享空间。&lt;br&gt;
4）系统安装完毕之后要安装增强功能，以实现鼠标捕捉及共享剪切板功能。&lt;/p&gt;
&lt;p&gt;补充：源内的 2.1.4 老了，还是用官方网站上的方法安装最新的版本吧，只是速度有点慢。&lt;br&gt;
官方安装：&lt;a href=&quot;http://www.virtualbox.org/wiki/Linux_Downloads&quot;&gt;http://www.virtualbox.org/wiki/Linux_Downloads&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;​6. 安装 stardic 的词典&lt;/p&gt;
&lt;p&gt;词典下载地址：&lt;br&gt;
cdict-gb dictionary(en - zh_CN): &lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt;
… ct-gb-2.4.2.tar.bz2&lt;br&gt;
oxford-gb dictionary(en - zh_CN) 牛津现代英汉双解词典:
&lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt; … rd-gb-2.4.2.tar.bz2&lt;br&gt;
stardict1.3 dictionary(en - zh_CN): &lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt;
… ct1.3-2.4.2.tar.bz2&lt;br&gt;
xdict-ec-gb dictionary(en - zh_CN): &lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt;
… ec-gb-2.4.2.tar.bz2&lt;br&gt;
langdao-ec-gb dictionary(en - zh_CN) 朗道英汉字典:
&lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt; … ec-gb-2.4.2.tar.bz2&lt;br&gt;
21 century bidirectional dictionary 21 世纪英汉汉英双向词典:
&lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt; … idian-2.4.2.tar.bz2&lt;br&gt;
quick_eng-zh_CN: &lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt; …
zh_CN-2.4.2.tar.bz2&lt;br&gt;
21 century bidirectional science and technology dictionary
21 世纪双语科技: &lt;a href=&quot;http://www.snowbird-linux.com/do&quot;&gt;http://www.snowbird-linux.com/do&lt;/a&gt; …
idian-2.4.2.tar.bz2&lt;/p&gt;
&lt;p&gt;安装的方法（以安装 stardict-oxford-gb-2.4.2.tar.bz2 为例）&lt;br&gt;
先下好安装的词典软件包， stardict-oxford-gb-2.4.2.tar.bz2&lt;br&gt;
在它的目录下面解压： tar -xjvf stardict-oxford-gb-2.4.2.tar.bz2&lt;br&gt;
再把解压后的文件夹放入到/usr/share/stardict/dic 中：&lt;br&gt;
mv stardict-oxford-gb-2.4.2/usr/share/stardict/dic&lt;br&gt;
安装结束,重新启动星际译王加载词典&lt;/p&gt;
&lt;p&gt;7。 配置桌面图标&lt;/p&gt;
&lt;p&gt;在终端下输入 gconf-editor 打开配置编辑器，依次展开/apps/nautilus/desktop/，勾选相应键即可。另外在/apps/nautilus/icon_view/default_zoom_level 可以设置图标大小。&lt;/p&gt;
&lt;p&gt;​8. Flash 插件不显示中文或者显示方框解决&lt;br&gt;
1）编辑/etc/fonts/conf.d/49-sansserif.conf 字体配置文件&lt;br&gt;
2）将其中的 sans-serif 替换成 AR PL UKai CN（系统中安装的中文字体）&lt;br&gt;
3）重启 firefox 即可&lt;/p&gt;
&lt;p&gt;​9. 右键添加打开终端&lt;br&gt;
＃sudo apt-get install nautilus-open-terminal&lt;/p&gt;
&lt;p&gt;10.sudo apt-get install unrar p7zip-rar p7zip-full cabextract&lt;/p&gt;
&lt;p&gt;​11. lftp 访问一些服务器出现乱码&lt;/p&gt;
&lt;p&gt;主要是因为客户端和服务器的编码不一支，在用户家目录下编辑文件~/.lftprc 或者~/.lftp/rc，添加如下内容：&lt;br&gt;
debug 3&lt;br&gt;
set ftp:charset GBK&lt;br&gt;
set file:charset UTF-8&lt;br&gt;
#set ftp:passtive-mode no&lt;br&gt;
#alias utf8 ” set ftp:charset UTF-8”&lt;br&gt;
#alias gbk ” set ftp:charset GBK”&lt;/p&gt;
&lt;p&gt;​12. 删除旧内核&lt;br&gt;
方法一：用“新立得软件管理包”程序&lt;/p&gt;
&lt;p&gt;“系统”-&gt;“新立得软件管理包”，然后搜索“linux-image”，找到旧内核并进行删除；&lt;br&gt;
方法二：命令行操作&lt;br&gt;
$ dpkg —get-selections | grep linux-image-2.6.27 | grep -v $(uname
-r)&lt;/p&gt;
&lt;p&gt;先用这些命令的组合查看列出来的结果是不是要删除的内核，确认无误后，在上述命令行后继续加指令：&lt;br&gt;
$ dpkg —get-selections | grep linux-image-2.6.27 | grep -v $(uname
-r) | awk ‘{print $1}’ | xargs sudo apt-get -y purge&lt;/p&gt;
&lt;p&gt;​13. 修改默认终端窗口大小&lt;br&gt;
1）#sudo vi
/usr/share/vte/termcap/xterm，修改:co#80:it#8:li#24:这一行就可以了。&lt;br&gt;
2）直接通过菜单修改配置文件，直观方便。&lt;/p&gt;
&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Linux 网络命令]]></title><description><![CDATA[​1. ping 功能说明：检测主机。 语　　法：ping
[-dfnqrRv][-c<完成次数>][-i<间隔秒数>][-i<网络界面>]
[-l<前置载入>][-p<范本样式>][-s<数据包大小>][-t<存活数值>][主机名称或
IP 地址] 补充说明：执行 ping…]]></description><link>https://xdays.me/Linux-网络命令/</link><guid isPermaLink="false">https://xdays.me/Linux-网络命令/</guid><pubDate>Sun, 01 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;​1. ping&lt;/p&gt;
&lt;p&gt;功能说明：检测主机。&lt;/p&gt;
&lt;p&gt;语　　法：ping
[-dfnqrRv][-c&amp;#x3C;完成次数&gt;][-i&amp;#x3C;间隔秒数&gt;][-i&amp;#x3C;网络界面&gt;]
[-l&amp;#x3C;前置载入&gt;][-p&amp;#x3C;范本样式&gt;][-s&amp;#x3C;数据包大小&gt;][-t&amp;#x3C;存活数值&gt;][主机名称或
IP 地址]&lt;/p&gt;
&lt;p&gt;补充说明：执行 ping 指令会使用 ICMP 传输协议，发出要求回应的信息，若远端主机的网络功能没有问题，就会回应该信息，因而得知该主机运作正常。&lt;/p&gt;
&lt;p&gt;参　　数：&lt;br&gt;
-d 使用 Socket 的 SO_DEBUG 功能。&lt;br&gt;
-c&amp;#x3C;完成次数&gt; 设置完成要求回应的次数。&lt;br&gt;
-f 极限检测。&lt;br&gt;
-i&amp;#x3C;间隔秒数&gt; 指定收发信息的间隔时间。&lt;br&gt;
-I&amp;#x3C;网络界面&gt; 使用指定的网络界面送出数据包。&lt;br&gt;
-l&amp;#x3C;前置载入&gt; 设置在送出要求信息之前，先行发出的数据包。&lt;br&gt;
-n 只输出数值。&lt;br&gt;
-p&amp;#x3C;范本样式&gt; 设置填满数据包的范本样式。&lt;br&gt;
-q 不显示指令执行过程，开头和结尾的相关信息除外。&lt;br&gt;
-r 忽略普通的 Routing Table，直接将数据包送到远端主机上。&lt;br&gt;
-R 记录路由过程。&lt;br&gt;
-s&amp;#x3C;数据包大小&gt; 设置数据包的大小。&lt;br&gt;
-t&amp;#x3C;存活数值&gt; 设置存活数值 TTL 的大小。&lt;br&gt;
-v 详细显示指令的执行过程。&lt;/p&gt;
&lt;p&gt;实例：&lt;br&gt;
测试网络是否畅通：ping -c 3 192.168.1.1&lt;/p&gt;
&lt;p&gt;注意：&lt;br&gt;
1） ping 不通大多数是由防火墙设置造成的。&lt;/p&gt;
&lt;p&gt;​2. ifconfig&lt;/p&gt;
&lt;p&gt;功能说明：显示或设置网络设备。&lt;/p&gt;
&lt;p&gt;语　　法：ifconfig [网络设备][down up -allmulti -arp -promisc][add&amp;#x3C;地址&gt;][del&amp;#x3C;地址&gt;][&amp;#x3C;网络设备类型&gt;
&amp;#x3C;硬件地址&gt;][io_addr][irq
][media&amp;#x3C;网络媒介类型&gt;][mem_start&amp;#x3C;内存地址&gt;][metric&amp;#x3C;数目&gt;][mtu&amp;#x3C;字
节&gt;][netmask&amp;#x3C;子网掩码&gt;][tunnel&amp;#x3C;地址&gt;][-broadcast&amp;#x3C;地址&gt;]
[-pointopoint&amp;#x3C;地址&gt;][ip地址]&lt;/p&gt;
&lt;p&gt;参　　数：&lt;br&gt;
add&amp;#x3C;地址&gt; 设置网络设备 IPv6 的 IP 地址。&lt;br&gt;
del&amp;#x3C;地址&gt; 删除网络设备 IPv6 的 IP 地址。&lt;br&gt;
down 关闭指定的网络设备。&lt;br&gt;
&amp;#x3C;网络设备类型&gt;&amp;#x3C;硬件地址&gt; 设置网络设备的类型与硬件地址。&lt;br&gt;
io_addr 设置网络设备的 I/O 地址。&lt;br&gt;
irq 设置网络设备的 IRQ。&lt;br&gt;
media&amp;#x3C;网络媒介类型&gt; 设置网络设备的媒介类型。&lt;br&gt;
mem_start&amp;#x3C;内存地址&gt; 设置网络设备在主内存所占用的起始地址。&lt;br&gt;
metric&amp;#x3C;数目&gt; 指定在计算数据包的转送次数时，所要加上的数目。&lt;br&gt;
mtu&amp;#x3C;字节&gt; 设置网络设备的 MTU(maximum transfer unit)。&lt;br&gt;
netmask&amp;#x3C;子网掩码&gt; 设置网络设备的子网掩码。&lt;br&gt;
tunnel&amp;#x3C;地址&gt; 建立 IPv4 与 IPv6 之间的隧道通信地址。&lt;br&gt;
up 启动指定的网络设备。&lt;br&gt;
-broadcast&amp;#x3C;地址&gt; 将要送往指定地址的数据包当成广播数据包来处理。&lt;br&gt;
-pointopoint&amp;#x3C;地址&gt;
与指定地址的网络设备建立直接连线，此模式具有保密功能。&lt;br&gt;
-promisc 关闭或启动指定网络设备的 promiscuous 模式。&lt;br&gt;
[IP 地址] 指定网络设备的 IP 地址。&lt;br&gt;
[网络设备] 指定网络设备的名称。&lt;/p&gt;
&lt;p&gt;实例：&lt;br&gt;
激活网络设备：ifconfig eth0 up&lt;br&gt;
更改网络设备信息： #ifconfig eth0 192.168.1.112 netmask 255.255.255.0&lt;/p&gt;</content:encoded></item><item><title><![CDATA[VirtualBox 安装笔记]]></title><description><![CDATA[​1. 安装虚拟机 virtualbox-3.0.4 源内的版本 2.1.4 老了，还是用官方网站上的方法安装最新的版本吧，只是速度有点慢。，官方安装：http://www.virtualbox.org/wiki/Linux_Downloads 添加源：deb http…]]></description><link>https://xdays.me/VirtualBox/</link><guid isPermaLink="false">https://xdays.me/VirtualBox/</guid><pubDate>Sun, 01 Aug 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;​1. 安装虚拟机 virtualbox-3.0.4&lt;/p&gt;
&lt;p&gt;源内的版本 2.1.4 老了，还是用官方网站上的方法安装最新的版本吧，只是速度有点慢。，官方安装：&lt;a href=&quot;http://www.virtualbox.org/wiki/Linux_Downloads&quot;&gt;http://www.virtualbox.org/wiki/Linux_Downloads&lt;/a&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;添加源：deb &lt;a href=&quot;http://download.virtualbox.org/virtualbox/debian&quot;&gt;http://download.virtualbox.org/virtualbox/debian&lt;/a&gt; lenny
non-free&lt;br&gt;
2） 安装公钥：wget -q
&lt;a href=&quot;http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc&quot;&gt;http://download.virtualbox.org/virtualbox/debian/sun_vbox.asc&lt;/a&gt; -O- |
sudo apt-key add -&lt;br&gt;
3）安装：apt-get install virtualbox-3.0&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;​2.
找个教程：&lt;a href=&quot;http://www.kafan.cn/edu/xuniji/200811012526.html&quot;&gt;http://www.kafan.cn/edu/xuniji/200811012526.html&lt;/a&gt;讲的很详细了，这里只是提一下几个需要特别注意的点：&lt;br&gt;
1）虚拟机的双向共享剪切板可以实现宿主机与客户机之间的拷贝粘贴。&lt;br&gt;
2）宿主机的虚拟光驱会作为客户机的物理光驱。&lt;br&gt;
3）分配共享空间后可以用 net use x:
&lt;a href=&quot;file://vboxsvr/sharename&quot;&gt;\vboxsvrsharename&lt;/a&gt;打开共享空间。&lt;br&gt;
4）系统安装完毕之后要安装增强功能，以实现鼠标捕捉及共享剪切板功能。&lt;/p&gt;
&lt;p&gt;​3. 读取 usb 设备&lt;br&gt;
1）查看 vboxusers 用户组的 GID：sudo cat /etc/group |grep vbox&lt;br&gt;
2）添加开机挂载项，编辑/etc/fstab，最后添加行：none/proc/bus/usb usbfs
devgid=123,devmode=644 0 0&lt;br&gt;
3）重启 ubuntu&lt;/p&gt;
&lt;ol start=&quot;4&quot;&gt;
&lt;li&gt;网络配置&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;virtualbox 各个版本提供的网络连接方式不一样，最新的 3.0.4 给了四种连接方式 NAT，Bridged
Adapter，Internal 和 Host-only Adapter，分别来解释一下：&lt;/p&gt;
&lt;p&gt;1）NAT：最简单的联网方式，不需要配置，所以是默认的联网方式。虚拟机就像通过路由器连接到网络，它可以通过整合在虚拟机内的虚拟 DHCP 服务器来分配 IP，虚拟机实际上是以主机 IP 地址来访问 web 的，因此虚拟机对外网是不可见的，然而最大的弊端也在于此，主机也就无法到达虚拟机了。但是可以利用 port
forwarding 端口转接实现访问虚拟机的目的。&lt;br&gt;
2)Bridged
Adapter：virtualbox 用一个设备驱动程序来过滤通过物理网卡的数据，允许 virtualbox 阻止和添加数据，这样就有效的在虚拟机里创建了一个网络接口。以这种方式接入网络的虚拟机在主机看来是和自己有同等地位的，直接介入网络，但前提是你得给虚拟机分配一个合理的 IP。但是我的实验没有成功，可以从虚拟机 ping 通主机，但是不能从主机 ping 通虚拟机，可能是 virtualbox 的局限性造成的。（原来是虚拟机的 xp 系统的防火墙搞的怪，问题解决了。09.08.23）&lt;br&gt;
3）Internal：与 Bridged
Adapter 相似，通过 Internal 可以直接连接到外网，只是这里的外网是指其他的虚拟机。尽管理论上讲，能用 Internal 实现的功能都能用 Bridged
Adapter 实现。但是选择 Internal 的理由有两点，安全和速度。&lt;br&gt;
4）Host-only
Adapter：主机多出一个 vboxnet0 接口，这个接口和虚拟机的网卡直接相连，这就是 Host-only 模式，主机和虚拟机之间可以互相通信，而虚拟机不可以连接外网。这也是很灵活的一种设置方式，扩展性很好，至于怎么扩展还待研究中。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux-PAM]]></title><description><![CDATA[概述 Linux-PAM (Pluggable Authentication Modules for Linux…]]></description><link>https://xdays.me/Linux-PAM/</link><guid isPermaLink="false">https://xdays.me/Linux-PAM/</guid><pubDate>Sat, 31 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Linux-PAM&lt;/em&gt; (Pluggable Authentication Modules for Linux)是一套供管理员选择的用来验证应用程序用户的共享库，它把权限控制与应用程序分离，你可以随意更改认证方式而不需要重新编译程序，具有很好的灵活性和课拓展性。&lt;/p&gt;
&lt;h3&gt;组成组件&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;模块文件：/lib/security/*&lt;/li&gt;
&lt;li&gt;模块配置文件：/etc/security/*&lt;/li&gt;
&lt;li&gt;PAM 配置文件：/etc/pam.conf 和/etc/pam.d/*&lt;/li&gt;
&lt;li&gt;一些 PAM 相关命令如 pam-auth-update 等&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;PAM 运行原理&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; +----------------+
  | application: X |
  +----------------+       /  +----------+     +================+
  | authentication-[----&gt;--\--] Linux-   |--&amp;lt;--| PAM config file|
  |       +        [----&amp;lt;--/--]   PAM    |     |================|
  |[conversation()][--+    \  |          |     | X auth .. a.so |
  +----------------+  |    /  +-n--n-----+     | X auth .. b.so |
  |                |  |       __|  |           |           _____/
  |  service user  |  A      |     |           |____,-----
  |                |  |      V     A
  +----------------+  +------|-----|---------+ -----+------+
                         +---u-----u----+    |      |      |
                         |   auth....   |--[ a ]--[ b ]--[ c ]
                         +--------------+
                         |   acct....   |--[ b ]--[ d ]
                         +--------------+
                         |   password   |--[ b ]--[ c ]
                         +--------------+
                         |   session    |--[ e ]--[ c ]
                         +--------------+&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;图的左边表示一个应用程序:X.  这应用程序有和 Linux-PAM  库的接口并且在认证方面没有什么特别之处. Linux-PAM  函数库  (图的中部)  查询 PAM 配置文件的内容并且装入适用于程序  X  的模块.  这些模块进入四个管理组(  图的中下部)中的一个,并且以它们出现在配置文件中的顺序堆叠起来  .  这些模组由 Linux-PAM 呼叫后,为应用程序执行不同的认证工作  .  需要用户提供或提供给用户的文本信息,可以通过使用应用程序提供的 conversation 函数来交换.&lt;/p&gt;
&lt;h3&gt;PAM 管理组&lt;/h3&gt;
&lt;p&gt;下面是 manual 中简短说明：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;Simply put, these groups take care of different aspects of a typical
user´s request for a restricted service:

account - provide account verification types of service: has the user´s
password expired?; is this user permitted access to the requested
service?

authentication - authenticate a user and set up user credentials.
Typically this is via some challenge-response request that theuser must
satisfy: if you are who you claim to be please enter your password. Not
all authentications are of this type, there exist,hardware based
authentication schemes (such as the use of smart-cards and biometric
devices), with suitable modules, these may be substituted seamlessly for
more standard approaches to authentication - such is the flexibility of
Linux-PAM.

password - this group´s responsibility is the task of updating
authentication mechanisms. Typically, such services are strongly coupled
to those of the auth group. Some authentication mechanisms lend
themselves well to being updated with such a function. Standard UN\*X
password-based access is the obvious example: please enter a replacement
password.

session - this group of tasks cover things that should be done prior to
a service being given and after it is withdrawn. Such tasks include the
maintenance of audit trails and the mounting of the user´s home
directory. The session management group is important as it provides both
an opening and closing hook for modules to affect the services available
to a user.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;配置文件&lt;/h3&gt;
&lt;p&gt;在/etc/pam.conf 里：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;service-name   module-type           control-flag   module-path   arguments
服务名称           模块类型（管理组）控制标志      模块路径       模块参数&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里仅讨论基本控制标志：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;required;  需要的,这表明此模块返回成功值对于整个 module-type 的成功是必要的.  此模块的返回失败并不会传回给用户，直到剩下的模块(同样 module-type)都执行过.&lt;/li&gt;
&lt;li&gt;requisite;  必要的,类似  required,  只不过,  当这类模块返回失败时,整个控制会立刻回到应用程序.  返回值同第一个需要的或必要的模块返回的失败相同.&lt;/li&gt;
&lt;li&gt;sufficient;  充分的,与 requisite 恰恰相反，这模块返回的成功会被认为已经   充分满足 Linux-PAM  库确认这类模块(module-type)是成功的条件.  如果没有先前的 requisite  模块返回了失败,那么不再会有其它’堆叠’  的模块被呼叫. (注意,  这种情况下,随后的 requisite  模块就不会   被呼叫.).  这模块返回的失败不会看作是致命的错误而至影响应用程序从这 module-type  得到成功的结果.&lt;/li&gt;
&lt;li&gt;optional;  可选的,正如这名字一样,此 control-flag  致使模块对最终的成功或失败的结果不会产生决定性的影响.
通常用于显示信息，并不在应用方面.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;在/etc/pam.d/的配置文件类似。&lt;/p&gt;
&lt;p&gt;具体模块一起参数和配置文件&lt;/p&gt;
&lt;h3&gt;参考链接&lt;/h3&gt;
&lt;p&gt;参考文档：&lt;br&gt;
&lt;a href=&quot;http://debian.securedservers.com/kernel/pub/linux/libs/pam/Linux-PAM-html/Linux-PAM_SAG.html&quot;&gt;The Linux-PAM System Administrators’ Guide&lt;/a&gt;&lt;br&gt;
&lt;a href=&quot;http://www.chinaunix.net/jh/4/390136.html&quot;&gt;The Linux-PAM System Administrators’ Guide(中文版)&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[网院机房整理]]></title><description><![CDATA[过了两天不是人的生活，想整理一下机房的机器，重装下系统，替换下坏的部件，拼凑下坏的机器。网院的机房简直是个噩梦，本来计划挺好，现实如此残酷以致处处受挫。 机房配置： 处理器：Intel Pentium 4, 2377 MHz (18 x 132) 内存：256M（SDRAM…]]></description><link>https://xdays.me/网院机房整理/</link><guid isPermaLink="false">https://xdays.me/网院机房整理/</guid><pubDate>Fri, 30 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;div id=&quot;blog_text&quot;&gt;
&lt;p&gt;过了两天不是人的生活，想整理一下机房的机器，重装下系统，替换下坏的部件，拼凑下坏的机器。网院的机房简直是个噩梦，本来计划挺好，现实如此残酷以致处处受挫。&lt;/p&gt;
&lt;p&gt;机房配置：&lt;br&gt;
处理器：Intel Pentium 4, 2377 MHz (18 x 132)&lt;br&gt;
内存：256M（SDRAM）&lt;br&gt;
显卡：GeForce4 MX 440 with AGP8X（64M）&lt;br&gt;
主板：Epox EP-4PEA800(I)&lt;br&gt;
BIOS：Phoenix-Award BIOS v6.00PG&lt;/p&gt;
&lt;p&gt;本来我初步计划是挺完美的，先学习系统封装，按照教程做自己的系统，然后通过 MAX 网刻把镜像分发到个机器。封装教程好像叫 IT 姐妹花什么的，用了一天时间总共封装了六七遍，虚拟机和真实机器下都试了，没有一遍成功，提示未知硬件错误，无奈…看来我的人品出了很大问题。第二天，既然封装不成，那就拿个现成的镜像网刻呗。这里我取了折中的办法，先在一台机器上安装做优化，添加自己的 OEMLOGO 和壁纸和其他，执行全盘网刻。谁知网刻服务器智能支持一台客户端，多余两台直接卡住，速度最大 400M/min，这网络伤透了我的心，再次无奈…只好一个一个来。网刻一大缺点是需要安装客户端，我攥着 U 盘穿梭在这台那台机器之间，昨天晚上做梦都梦见自己装系统了，想想好凄凉。最后给每台机器系统盘来个备份，以后系统弄乱了解决起来也比较快。&lt;br&gt;
总结一下收获吧：&lt;/p&gt;
&lt;p&gt;1.系统封装很有意思，可以随心所欲的制作自己的系统，可惜太复杂，需要对系统的结构比较全面了解。&lt;/p&gt;
&lt;p&gt;2.MAX 网刻是批量装系统的有力工具，并且设置也不复杂。具体下面是教程链接：&lt;br&gt;
GHOST 全盘镜像制作：&lt;a href=&quot;http://pzz.cn/bbs/read.php?tid=26435&quot;&gt;http://pzz.cn/bbs/read.php?tid=26435&lt;/a&gt;&lt;br&gt;
网刻教程：&lt;a href=&quot;http://pzz.cn/bbs/read.php?tid=50400&quot;&gt;http://pzz.cn/bbs/read.php?tid=50400&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;3.网刻也有其缺点，所有系统都一个模子刻出来，所以机器配置必须一样。另外母盘上 IP 地址务必自动获取，不然也会冲突的。所有计算机名也一样，虽然目前还没出现什么问题。&lt;br&gt;
4.拆卸之余总能发现一些问题，也算是一些收获吧。&lt;/p&gt;
&lt;/div&gt;</content:encoded></item><item><title><![CDATA[ccna-summary]]></title><description><![CDATA[为什么总结？ 经过这一个学期的学习，ccna…]]></description><link>https://xdays.me/CCNA-summary/</link><guid isPermaLink="false">https://xdays.me/CCNA-summary/</guid><pubDate>Mon, 26 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h2&gt;为什么总结？&lt;/h2&gt;
&lt;p&gt;经过这一个学期的学习，ccna 的课程结束了。我在学习的过程中感觉到很外国教材的优点：结构清晰，很有条理，知识点紧凑，注重实践。一直有个想法，把所有学的知识联系起来，分类总结，然后写写自己的心得体会。这样一来巩固一下所学知识，而来便于以后参考，再者如果能对后来者的学习有帮助也算是我的趣事.&lt;/p&gt;
&lt;h2&gt;总结些什么？&lt;/h2&gt;
&lt;p&gt;在 learning space 上看到了 ccna exam
topics，我想就按照这个思路来总结吧！具体如下【640-802 CCNA® Exam Topics
(Blueprint)】：&lt;/p&gt;
&lt;p&gt;**描述网络的工作原理&lt;br&gt;
**•描述各种网络设备的用途和功能&lt;br&gt;
•选择符合网络标准所需的组件&lt;br&gt;
•使用 OSI 和 TCP/IP 模型及其相关协议来解释数据在网络中如何流动&lt;br&gt;
•描述常见的网络应用，包括 Web 应用&lt;br&gt;
•描述 OSI 和 TCP 模型中的协议的用途和基本工作方式&lt;br&gt;
•描述应用（IP 语音和 IP 视频）对网络的影响&lt;br&gt;
•解释网络图表&lt;br&gt;
•定义网络中两台主机之间的路径&lt;br&gt;
•描述网络和互联网通信所需要的组件&lt;br&gt;
•使用分层模型方法发现和纠正第 1、2、3、7 层中的常见网络问题&lt;br&gt;
•局域网/广域网的工作方式和特性的差别&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;利用 VLAN 和交换机间通信来配置、验证交换机，并对其进行故障排除&lt;/strong&gt;&lt;br&gt;
•选择适当的介质、电缆、端口和连接器将交换机连接到其他网络设备和主机&lt;br&gt;
•解释以太网技术及其媒体访问控制方法&lt;br&gt;
•解释网络分段和流量管理的基本概念&lt;br&gt;
•解释思科交换机的工作原理和基本的交换概念&lt;br&gt;
•执行和验证初始的交换机配置任务，包括远程访问管理&lt;/p&gt;
&lt;p&gt;•使用基本的工具（包括：ping、traceroute、telnet、SSH、arp、ipconfig）、SHOW（显示）和 DEBUG（调试）命令来验证网络状态和交换机的工作情况&lt;/p&gt;
&lt;p&gt;•发现、诊断和解决常见的交换网络媒体问题、配置问题、自动协商和交换机硬件故障&lt;br&gt;
•描述增强的交换技术（包括：VTP、RSTP、VLAN、PVSTP、802.1q）&lt;/p&gt;
&lt;p&gt;•描述 VLAN 如何创建逻辑分隔的网络，以及在这些逻辑分隔的网络之间进行路由的需要&lt;br&gt;
•配置、验证 VLAN 并对其进行故障排除&lt;br&gt;
•配置、验证思科交换机上的中继并对其进行故障排除&lt;br&gt;
•配置、验证 VLAN 间路由并对其进行故障排除&lt;br&gt;
•配置、验证 VTP 并对其进行故障排除&lt;br&gt;
•配置、验证 RSTP 工作状态并对其进行故障排除&lt;/p&gt;
&lt;p&gt;•解释各种 show（显示）和 debug（调试）命令的输出，以验证思科交换网络的工作状态&lt;/p&gt;
&lt;p&gt;•实施基本的交换机安全机制（包括：端口安全机制、中继访问、管理除了 vlan1 之外的 vlan 等）&lt;/p&gt;
&lt;p&gt;**实施 IP 寻址机制和 IP 服务，满足中型企业分支机构网络的要求&lt;br&gt;
**•描述使用专用和公共 IP 地址的操作方法和优势&lt;br&gt;
•解释使用 DHCP 和 DNS 的工作方式和优势&lt;/p&gt;
&lt;p&gt;•在路由器上配置、验证 DHCP 和 DNS 运行，并对其进行故障排除（包括：CLI/SDM）&lt;br&gt;
•针对局域网环境中的主机实施静态和动态寻址服务&lt;br&gt;
•计算和将寻址机制（包括 VLSM IP 寻址设计）应用到网络&lt;/p&gt;
&lt;p&gt;•使用 VLSM 和概述（summarization）确定适当的无类别寻址机制，以满足局域网/广域网环境中的寻址要求&lt;br&gt;
•描述运行 IPv6 与 IPv4 的技术要求（包括：协议、双协议栈、隧道等）&lt;br&gt;
•描述 IPv6 地址&lt;br&gt;
•识别和纠正与 IP 寻址和主机配置有关的常见问题&lt;/p&gt;
&lt;p&gt;**配置、验证思科设备上的基本路由器操作和路由，并对其进行故障排除&lt;br&gt;
**•描述基本的路由概念（包括：数据包转发、路由器查找进程）&lt;br&gt;
•描述思科路由器的工作情况（包括：路由器引导进程、POST、路由器组件）&lt;br&gt;
•选择适当的介质、电缆、端口和连接器将路由器连接到其他网络设备和主机&lt;br&gt;
•配置、验证 RIPv2 并对其进行故障排除&lt;br&gt;
•访问和使用路由器设置基本参数（包括：CLI/SDM）&lt;br&gt;
•连接、配置和验证设备接口的工作状态&lt;br&gt;
•使用 ping、traceroute、telnet、SSH 或其他工具验证设备配置和网络连接&lt;br&gt;
•在给定具体路由要求的条件下执行和验证静态或默认路由的路由配置任务&lt;br&gt;
•管理 IOS 配置文件（包括：保存、编辑、升级、恢复）&lt;br&gt;
•管理思科 IOS&lt;br&gt;
•比较路由方法和路由协议&lt;br&gt;
•配置、验证 OSPF 并对其进行故障排除&lt;br&gt;
•配置、验证 EIGRP 并对其进行故障排除&lt;br&gt;
•验证网络连接（包括：使用 ping、traceroute、telnet 或 SSH）&lt;br&gt;
•对路由问题进行故障排除&lt;br&gt;
•使用 SHOW 和 DEBUG 命令验证路由器硬件和软件工作情况&lt;br&gt;
•实施基本的路由器安全机制&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解释和选择 WLAN 所需的适当的管理任务&lt;/strong&gt;&lt;br&gt;
•描述与无线媒体有关的标准（包括：IEEE WI-FI 联盟、ITU/FCC）&lt;br&gt;
•识别和描述小型无线网络中的组件的用途（包括：SSID、BSS、ESS）&lt;br&gt;
•识别配置无线网络的基本参数，确保设备连接到正确的接入点&lt;br&gt;
•比较 WPA 安全机制的无线安全特性和功能（包括：open、WEP、WPA-1/2）&lt;br&gt;
•识别无线网络实施过程中的常见问题（包括：接口、错误配置）&lt;/p&gt;
&lt;p&gt;**识别对网络的安全威胁，描述消除这些威胁的一般方法&lt;br&gt;
**•描述目前数量不断增加的网络安全威胁，并解释通过实施全面的安全策略来抵御网络安全威胁的需求&lt;br&gt;
•解释防御网络设备、主机和应用常见到的安全威胁的一般方法&lt;br&gt;
•描述常见安全设备和应用的功能&lt;br&gt;
•描述采用推荐安全机制的操作方法，包括保护网络设备安全的最初几步&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在中型企业分支机构网络中实施、验证 NAT 和 ACL，并对其进行故障排除&lt;/strong&gt;&lt;br&gt;
•描述 ACL 的用途和类型&lt;br&gt;
•根据网络过滤要求配置和应用 ACL（包括：CLI/SDM）&lt;br&gt;
•使用 SDM/CLI 配置和应用 ACL，以限制 telnet 和 SSH 对路由器的访问&lt;br&gt;
•在网络环境中验证和监控 ACL&lt;br&gt;
•对 ACL 问题进行故障排除&lt;br&gt;
•解释 NAT 的基本运行状态&lt;br&gt;
•使用 CLI/SDM 针对给定的网络要求配置 NAT&lt;br&gt;
•对 NAT 问题进行故障排除&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;实施和验证广域网链路&lt;/strong&gt;&lt;br&gt;
•描述连接到广域网的各种方法&lt;br&gt;
•配置和验证基本的广域网串行连接&lt;br&gt;
•在思科路由器上配置和验证帧中继&lt;br&gt;
•对广域网实施问题进行故障排除&lt;br&gt;
•描述 VPN 技术（包括：重要性、优势、作用、影响和组件）&lt;br&gt;
•配置和改变思科路由器之间的 PPP 连接&lt;/p&gt;
&lt;h2&gt;  怎么总结？&lt;/h2&gt;
&lt;p&gt;初步定下的流程是：先基本概念大体阐述，然后是实例实践配置命令，最后是我学习过程遇到的问题以及注意点或者说是心得体会吧。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[网络大赛]]></title><description><![CDATA[…]]></description><link>https://xdays.me/网络大赛/</link><guid isPermaLink="false">https://xdays.me/网络大赛/</guid><pubDate>Mon, 26 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;div id=&quot;blog_text&quot;&gt;
&lt;p&gt;网络大赛路上&lt;/p&gt;
&lt;p&gt;现在坐在去聊城车上，心里没有欣喜，没有激动，只想以一个平静的心态发挥出自己的水平。刚上车时在看题库，张老师说不用看了，别那么紧张。其实我并没紧张，仔细一想应该紧张的。&lt;/p&gt;
&lt;p&gt;开学就要大四了，回首大学经历的这三年，痛苦和遗憾种种不好应该居多吧！一切于计算机和机械之间的抉择。太过现实的性格让我选择了机械放弃了计算
机，但实际上是我放弃了机械选择了计算机。放不下饭碗，又固执的坚持自己的兴趣，浮躁，迷茫，看不到未来。每天过的很忙碌却感觉不到充实。大二漫无目的地
厮混了一年，成绩考的乱七八糟，大三伊始有思悔改，既然选择就安心做机械吧。也许我就是那么不安分，就那么贱，这学期报了 CCNA，花了很大经历，经常逃
课，期末挂科，有生以来第一次挂科，两门。所以，我又思悔改，暑假后还是好好学机械吧，毕竟也不是那么讨厌机械。或许我已经走的太远了，找不到来时的路…&lt;/p&gt;
&lt;p&gt;我想，既然我在计算机这条路上走了那么一段曲折的路，终究要留下些什么吧，很庆幸能参加这次比赛，我要努力…这篇博客充斥了太多的消极的东西，我只是想写下来让自己的心不要那么沉重。毕竟，我还相信未来，相信未来… 
—7.22&lt;/p&gt;
&lt;p&gt;回来了&lt;/p&gt;
&lt;p&gt;回来两天了，想写点什么纪念以下这次比赛，但心情复杂又不知道说些什么。我们队以 0.545 分成绩落榜了，当我看到这个分数的时候内新的滋味无从表达，我只是对这个结果而不是对分数遗憾。如果对于一个非本专业的学生来说，能有几个证明自己有能力胜任相关工作的凭证是很重要的，而当初参加这个比赛也主要为这个目的努力的。那段时间值得回忆：思科的四本教材每一本至少要看两遍，题库做了一遍，还有专业课的五门课突击，每天七点起床，奔波于自习室和餐厅，晚上 11 点从自习室回来继续看题库，身心俱疲。一个月下来，瘦了将近十斤…想想又何苦呢？透支健康，无论做什么都傻。我还是那句话，无论现实给了你什么，充满希望的生活依然要继续… 
—7.26&lt;/p&gt;
&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Proxy 服务器-Squid]]></title><description><![CDATA[什么是代理服务器? 代理服务器是介于客户端和 Web 服务器之间的另一台服务器，有了它之后，浏览器不是直接到 web…]]></description><link>https://xdays.me/Proxy服务器-Squid/</link><guid isPermaLink="false">https://xdays.me/Proxy服务器-Squid/</guid><pubDate>Thu, 22 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;什么是代理服务器?&lt;/p&gt;
&lt;p&gt;代理服务器是介于客户端和 Web 服务器之间的另一台服务器，有了它之后，浏览器不是直接到 web 服务器去取回网页而是向代理服务器发出请
求，请求会先送到代理服务器，由代理服务器来请求浏览器所需要的信息并传送给你的浏览器。大部分代理服务器都具有缓冲的功能，就好像一个大的 Cache，它有很大的存储空间，它不断将新取得数据储存到它本机的存储器上，如果浏览器所请求的数据
在它本机的存储器上已经存在而且是最新的，那么它就不重新从 Web 服务器取数据，而直接将存储器上的数据传送给用户的浏览器，这样就能显著提高浏览速度和
效率。总之：代理服务器是
Internet 链路级网关(Gateway)所提供的一种重要的安全功能，它的工作主要在开放系统互联
(OSI) 模型的对话层，从而起到防火墙的作用。&lt;/p&gt;
&lt;p&gt;安装及其配置？&lt;/p&gt;
&lt;p&gt;1.安装：apt-get intall squid 或者按照源码包中的 INSTALL 文件说明源码安装&lt;/p&gt;
&lt;p&gt;2.启动停止脚本：/etc/init.d/squid start | stop | restart&lt;/p&gt;
&lt;p&gt;3.配置文件：/etc/squd/squid.conf
此配置文件相当于一份手册，配置时可以参考，这里仅讨论基本配置项。&lt;/p&gt;
&lt;p&gt;(1)管理配置&lt;br&gt;
http_port 192.168.0.1:3128  //监听端口&lt;br&gt;
cache_mgr  webmaster //管理员联系方式&lt;br&gt;
cache_dir ufs /var/squid   //缓存目录&lt;br&gt;
cache_mem 32MB   //缓存大小&lt;br&gt;
cache_access_log /var/squid/access.log   //访问记录，重要！&lt;/p&gt;
&lt;p&gt;(2)访问控制&lt;br&gt;
格式为：&lt;br&gt;
acl  acl-name  type  arguement&lt;br&gt;
http_access deny | allow acl-name&lt;br&gt;
示例：&lt;br&gt;
acl  mynet ip src 10.110.12.0/24&lt;br&gt;
http_access allow mynet&lt;br&gt;
注意：&lt;/p&gt;
&lt;p&gt;1）访问控制表的末尾要有拒绝所有的语句，否则按照 allow-deny 的规则可能会允许一些网络访问外网。&lt;/p&gt;
&lt;p&gt;2）访问控制除了 ip 以外还有 MAC 地址，域名，域名后缀（正则表达式），时间，并发连接数，通过认证等，具体可以参考配置文件编写。&lt;/p&gt;
&lt;p&gt;3）访问控制表采用的是或逻辑，也就是如果有一条规则匹配那么就匹配这条控制表；施加到访问控制表上的规则采用的与逻辑，也就是只有多个规则同时匹配了才执行相应的规则，否则继续匹配。&lt;/p&gt;
&lt;p&gt;(3)认证访问&lt;/p&gt;
&lt;p&gt;认证访问就是客户端要必须经过输入用户名和密码后验证通过后才能使用代理服务。squid 有很多验证身份的方式，大类上分为基本的，Digest 和 NTLM，这里使用 Digest 方式。其原理也比较好理解，squid 将客户端的用户名和密码（加密的）传递给辅助进程，然后辅助进程通过保存在本地的验证文件来验证客户端，如果通过验证则可以代理，否则显示拒绝信息。基本配置就是加上如下两行：&lt;/p&gt;
&lt;p&gt;auth_param digest program /usr/lib/squid/digest_pw_auth
/path/to/authfile 定义采用什么样的认证方式，这里也指定了验证文件&lt;/p&gt;
&lt;p&gt;auth_param digest realm Authentication Required 定义显示给客户端的信息&lt;/p&gt;
&lt;p&gt;acl login proxy_auth REQUIRED 定义访问控制表&lt;/p&gt;
&lt;p&gt;http_access allow login 定义匹配访问控制表的规则&lt;/p&gt;
&lt;p&gt;监控以及排错？&lt;/p&gt;
&lt;p&gt;监控也主要有三种方式：基本的 squidclient 与 squid 交互获得信息；squid 的 cachemgr.cgi 库；snmp（不提倡的方式）。最基本的方式执行命令如下：&lt;/p&gt;
&lt;p&gt;squidclient mgr:info&lt;/p&gt;
&lt;p&gt;另外 squid 的日志文件 access.log，cache.log，store.log 分别对应访问日志，缓存日志，本地存储日志，通常位于/var/log/squid/目录下。&lt;/p&gt;
&lt;p&gt;参考链接：《Squid 中文权威指南》&lt;a href=&quot;http://home.arcor.de/jeffpang/squid/index.html&quot;&gt;http://home.arcor.de/jeffpang/squid/index.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[iconv-字符编码转换]]></title><description><![CDATA[linux 下打开 windows 下的文本文件时通常都是乱码，这是因为 windows 的字符编码是 gbk 而 linux 的是 utf8，所以需要转换才行。 转换工具：iconv 用法： -f, —from-code=NAME 原始文本编码 -t, —to-code…]]></description><link>https://xdays.me/Iconv字符编码转换/</link><guid isPermaLink="false">https://xdays.me/Iconv字符编码转换/</guid><pubDate>Tue, 20 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;linux 下打开 windows 下的文本文件时通常都是乱码，这是因为 windows 的字符编码是 gbk 而 linux 的是 utf8，所以需要转换才行。&lt;br&gt;
转换工具：iconv&lt;br&gt;
用法：&lt;/p&gt;
&lt;p&gt;-f, —from-code=NAME 原始文本编码&lt;/p&gt;
&lt;p&gt;-t, —to-code=NAME 输出编码&lt;/p&gt;
&lt;p&gt;信息：&lt;/p&gt;
&lt;p&gt;-l, —list 列举所有已知的字符集&lt;/p&gt;
&lt;p&gt;输出控制：&lt;/p&gt;
&lt;p&gt;-c 从输出中忽略无效的字符&lt;/p&gt;
&lt;p&gt;-o, —output=FILE 输出文件&lt;/p&gt;
&lt;p&gt;-s, —silent suppress warnings&lt;/p&gt;
&lt;p&gt;—verbose 打印进度信息&lt;/p&gt;
&lt;p&gt;-?, —help 给出该系统求助列表&lt;/p&gt;
&lt;p&gt;—usage 给出简要的用法信息&lt;/p&gt;
&lt;p&gt;-V, —version 打印程序版本号&lt;/p&gt;
&lt;p&gt;示例：iconv -f gbk -t utf8 gbktext.txt &gt;utf8text&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Linux-服务管理]]></title><description><![CDATA[概述 服务就是跑在后台的程序；linux 的服务主要分为独立启动的和依靠 super
daemon(xinetd)来启动两种；系统依靠 shell…]]></description><link>https://xdays.me/Linux-服务管理/</link><guid isPermaLink="false">https://xdays.me/Linux-服务管理/</guid><pubDate>Tue, 20 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;服务就是跑在后台的程序；linux 的服务主要分为独立启动的和依靠 super
daemon(xinetd)来启动两种；系统依靠 shell 脚本来管理服务的启动与停止；另外系统又一套机制负责管理服务的访问权限；最后服务的管理离不开响应的工具。&lt;/p&gt;
&lt;h3&gt;服务管理脚本&lt;/h3&gt;
&lt;p&gt;系统的服务管理脚本主要位于/etc/init.d/(redhat)或者/etc/rc.d/init.d/(debian)下，脚本的结构基本上是：脚本的描述、环境调用、搜寻配置文件、加载 functions、服务的启动停止与加载、最后还会有脚本的参数。然后在需要运行该服务的 runlevel 下建立对应的软连接，由 init 程序在开机时负责在对应的 runlevel 下启动对应的服务。&lt;/p&gt;
&lt;h3&gt;服务访问控制&lt;/h3&gt;
&lt;h4&gt;验证是否支持&lt;/h4&gt;
&lt;p&gt;服务的访问的前提条件是服务加载了 libwrap.so 模块，可以通过如下命令查看服务是否支持访问控制&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ldd $(which sshd) | grep libwrap&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h4&gt;hosts.allow 和 hosts.deny 格式&lt;/h4&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ssh:192.168.1.0/255.255.255.0:allow
服务名:要匹配的客户端地址:处理规则&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;更为详尽的规则参考权威的手册&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;#man 5 hosts_access
#man 5 hosts_options&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;服务管理工具&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;ntsysv&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;sysv-rc-conf&lt;/span&gt;&lt;/li&gt;
&lt;li&gt;&lt;span style=&quot;color: #000000;&quot;&gt;BUM&lt;/span&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;服务参考列表&lt;/h3&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;acpi-support – 你最好使其在S运行等级处于“X”状态。
acpid – acpi守护程序.这两个用于电源管理，对于笔记本和台式电脑很重要，所以让它们开启。
alsa – 如果你使用alsa声音子系统，是的，开启它。
alsa-utils -在我系统里，此服务取代了alsa，所以我关闭了alsa并在S运行等级将此服务开启。**注意**，我所说的“关闭”是指在所有运行等级里面去除所有 “X”。如果在你系统里没有它，没问题。
anacron – 一个cron子系统，当时间到达时用于执行任何没有被执行的cron作业。当某种cron 作业时间准备好时，很可能你或许已经关闭了你的计算机。打个比方，updatedb被计划在每天2点执行，但是在那个时候，你的计算机是关闭的，然后如果 ananron服务如果是开启的话，它将设法抓起那个updatedb cron… 我将它关闭是因为我不经常关闭我的笔记本，但是否开启此服务完全取决于你。
apmd – 这是十分困惑我的一个服务。我已经开启了acpid服务，那同时开启apmd有啥好处呢？如果你的计算机不是那么老，甚至不能支持acpi，然后你可以设 法关闭它。无论如何，我是关闭它的。
atd – 就像cron，一个作业调度程序。我把它关了
binfmt-support – 核心支持其他二进制的文件格式。我让它开着
bluez-utiles – 我把它关了因为我没有任何蓝牙设备
bootlogd – 开启它
cron – 开启它
cupsys – 管理打印机的子系统。我没有打印机所以我关闭它了，如果你有打印机，开启他。
dbus – 消息总线系统(message bus system)。非常重要，开启它。
dns-clean – 当使用拨号连接，主要用于清除dns信息。我不用拨号，所以我关闭了它。
我关闭了它。
fetchmail – 一个邮件接受守护进程，我关闭了它。
gdm – gnome桌面管理器。 无论如何我关闭它了，因为我将系统用终端引导。如果你想直接引导到图形用户界面，这取决于你。
gdomap – 事实上我也不知道为什么此服务必需开启。我没有在其他系统见过这个守护程序，所以我将其关闭并且我没觉得我失去了什么。开启它对笔记本或者台式机有任何好 处吗？
gpm – 终端鼠标支持。如果你觉得你在终端使用鼠标更好，那么在运行等级 1 和2 开启它。那正是你所需要的。
halt – 别更改它。
hdparm – 调整硬盘的脚本。我在运行等级 2，3，4，5去除了它但是在S 运行等级添加了它。我觉得早点打开DMA，32bit I/O等等将对其余过程有益。我自己也将原来的脚本精简了一下。如果我知道我正做什么，我觉得做过多的检查没用。相应配置文件是/etc /hdparm.conf。
hibernate – 如果你的系统支持休眠，把它打开，否则它对你没用。
hotkey-setup – 此守护进程为你的笔记本建立一些热键映射。支持的制造商包括：HP, Acer, ASUS, Sony, Dell, 和IBM。如果你有那些品牌的笔记本，你可以打开它，否则它或许对你没有任何好处。
hotplug and hotplug-net #激活热插拔系统是费时的。我将考虑关掉它们。我在的/etc/network/interfaces文件作了很多修改，并将其设置为自动运行，而不是在 热插拔进程期间映射我的无线网卡。所以我可以将它们关掉。我已经测试过了，甚至我将它们关闭，ubuntu仍旧可以检测到我的usb驱动器，我的数码相 机，等等。所以我认为关掉它们是很安全的**注意**如果在关闭热插拔服务以后发现你的声卡部工作了，你可以将服务打开，或者编辑 /etc/modules文件并添加声卡驱动模块。经测试，后者比较快。
hplip – HP打印机和图形子系统，我将其关闭了。
ifrename – 网络接口重命名（network interface rename）脚本。听上去很酷但是我把它关掉了。主要用于管理多网络接口名称。虽然我有无线网卡和以太网卡，两者被内核标识为eth0和ath0，所以 此服务对我不是很有用。
ifupdown and ifupdown-clean – 打开它，它们是开机时网络及口激活脚本。
inetd or inetd.real – 查看文件/etc/inetd.conf 注释掉所有你不需要的服务。如果该文件不包含任何服务，那关闭它是很安全的。
klogd – 打开它。
linux-restricted-modules-common – 你应该去查看下是否你的系统装载有任何受限制的模块。既然我需要madwifi ath_pci 模块，所以我将其开启。受限制的模块可以从/lib/linux-restricted-modules查看到。如果你发现你没有使用任何受限制的模块， 那关掉这个服务没事。
lvm – 我没有使用逻辑卷所以我将此服务关闭。让它开启如果你 *确实* 有lvm（lvm是逻辑卷管理器在此不再扩充）.
makedev – 打开它。
mdamd – Raid管理工具。不使用Raid所以我将此服务关闭。
module-init-tools – 从/etc/modules加载扩展模块。你可以研究/etc/modules文件查看是否有一些你不需要的模块。通常我们将此服务开启。
networking – 在启动期间通过扫描/etc/network/interfaces文件增加网络接口和配置dns信息。让它开着。
ntpdate – 通过ubuntu时间服务器同步时间 。在开机的时候我不需要它，故我关掉了此服务。
nvidia-kernel – 我自己编译了nvidia驱动，所以此服务对我没用。如果你从受限制模块中使用nvidia驱动，那打开此服务。
pcmcia – 激活pcmica设备。我将此服务打开在S运行等级而不是分别在2，3，4，5运行等级打开此服务，因为我觉得起先让硬件设备准备更好。如果你在使用没有 pcmica卡的台式机的话，请关闭此服务。
portmap – 管理像nis，nfs等等之类服务的守护程序。如果你的笔记本或台式机是纯粹的客户端，那么关闭此服务。
powernowd – 管理CPU频率的客户端程序。主要用于支持CPU speed stepping技术的笔记本。通常如果你在配置一台笔记本，你应该开启此服务。如果是台式机，那此服务应该没有用。
ppp and ppp-dns – 对我没用，我不使用拨号。
readahead – **感谢 mr_pouit!** readahead似乎是一种“预加载程序”。在开机时它将一些库文件加载到内存，以便一些程序启动的更快。但是它给启动时间增加了3-4秒。所以，你可 以留着它…或者不。**更新**，经我测试我觉得加载程序没有什么不同。所以我决定关闭此服务。如果你有打开此服务的理由，那就打开它 。
reboot – 别更改它。
resolvconf – 按照你的网络状态自动配置DSN信息，我将它打开着。
rmnologin – 如果发现nologin，那么去除它。此情况不会在笔记本上面发生，所以我摆脱它。
我不打算在我的笔记本上使用rsync协议，所以我将其关闭
sendsigs – 在重启和关机期间发送信号。顺其自然。
single – 激活单用户模式。顺其自然。
ssh – ssh守护程序。 我需要ssh，所以我将此服务打开。
stop-bootlogd – 从2，3，4，5运行等级停止bootlogd。顺其自然。
sudo – 检查sudo 状态。我没在一台笔记本或者台式机客户端上看到任何使用sudo的好处，因此我关闭了它。
sysklogd – 顺其自然。
udev and udev-mab – 用户空间dev文件系统（userspace dev filesystem）。好东西，我将它们打开。
umountfs – 顺其自然。
urandom – 随机数生成器。可能没什么用处，但是我留着它。
usplash – 嗯，如果你想看到漂亮的开机画面，顺其自然。无论如何沃关闭此服务了。如果你想关闭它，你也可以编辑/boot/grub/menu.lst文件注释掉 splashimage行，除去开机 splash核心选项。
vbesave – 显卡BIOS配置工具。它能保存你显卡的状态。我将其开启。
xorg-common – 设置X服务ICE socket。我将其从在S运行等级开启移动到2，3，4，5，运行等级。如果我引导到单用户模式，那我不需要此服务。在最初引导期间这种方法将不占用时 间。
adjtimex – 这也是调整核心hw时钟的工具。通常你不会在开机列表中看见它。在非常少有的情况如果你确实在开机进程中看见它了，事出有因，因此最好顺其自然。在我的情 况里，它是关闭的。
dirmngr – 证书列表管理工具（certification lists management tool）。和gnupg一起工作。你必须看看你是否需要它。在我的情况里，我是关掉它的。
hwtools – 一个优化irqs的工具。不确定打开它的好处。在我的情况里，我是关掉它的。
libpam-devperm – 在系统崩溃之后用于修理设备文件许可的一个守护程序。听起来不错，因此我打开它了。
lm-sensors – 如果你的主板内建一些传感芯片，通过用户空间（userspace）查看hw状态可能是有帮助的。我运行了它，但是它提示“没有发现传感器”，因此我关闭 了此服务。
mdadm-raid – 作用和mdadm服务相同。用来管RAID设备。如果你没有此类设备，那尽管关掉它好了。
screen-cleanup – 一个用来清除开机屏幕的脚本。嗯，是否关闭它有你决定。在我的情况里，我打开它了。
xinetd – 用来管理其他守护进程的一个inetd超级守护程序。在我的系统里，xinetd管理chargen, daytime, echo和time (在 /etc/xinetd.d 目录找到的)，我不关系任何一个，因此我关掉了此服务。如果在xinetd下你确实有一些重要的服务，那打开它。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h3&gt;参考链接&lt;/h3&gt;
&lt;p&gt;挺全面的： &lt;a href=&quot;http://www.opsers.org/base/one-day-of-learning-linux-system-services-that-manage.html&quot;&gt;http://www.opsers.org/base/one-day-of-learning-linux-system-services-that-manage.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;鸟哥经典的：&lt;a href=&quot;http://vbird.dic.ksu.edu.tw/linux_basic/linux_basic.php#part5&quot;&gt;http://vbird.dic.ksu.edu.tw/linux_basic/linux_basic.php#part5&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[dhcp服务器]]></title><description><![CDATA[执行过程： 1、客户发出的 IP 租用请求报文 DHCP 客户机初始化 TCP/IP，通过 UDP 端口 67 向网络中发送一个 DHCPDISCOVER 广播包，请求租用 IP 地址。该
广播包中的源 IP 地址为 0.0.0.0，目标 IP 地址为 255.255.25…]]></description><link>https://xdays.me/DHCP服务器/</link><guid isPermaLink="false">https://xdays.me/DHCP服务器/</guid><pubDate>Sun, 18 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;执行过程：&lt;/p&gt;
&lt;p&gt;1、客户发出的 IP 租用请求报文&lt;/p&gt;
&lt;p&gt;DHCP 客户机初始化 TCP/IP，通过 UDP 端口 67 向网络中发送一个 DHCPDISCOVER 广播包，请求租用 IP 地址。该
广播包中的源 IP 地址为 0.0.0.0，目标 IP 地址为 255.255.255.255；包中还包含客户机的 MAC 地址和计算机名。&lt;/p&gt;
&lt;p&gt;2、DHCP 回应的 IP 租用提供报文&lt;/p&gt;
&lt;p&gt;任何接收到 DHCPDISCOVER 广播包并且能够提供 IP 地址的 DHCP 服务器，都会通过 UDP 端口 68 给客户机回应一个 DHCPOFFER 广播
包，提供一个 IP 地址。该广播包的源 IP 地址为 DCHP 服务器 IP，目标 IP 地址为 255.255.255.255；包中还包含提供的 IP 地址、子网掩码
及租期等信息。&lt;/p&gt;
&lt;p&gt;3、客户选择 IP 租用报文&lt;/p&gt;
&lt;p&gt;客户机从不止一台 DHCP 服务器接收到提供之后，会选择第一个收到的 DHCPOFFER 包，并向网络中广播一个
DHCPREQUEST 消息包，表明自己已经接受了一个 DHCP 服务器提供的 IP 地址。该广播包中包含所接受的 IP 地址和服务器的 IP 地址。
所有其他的 DHCP 服务器撤消它们的提供以便将 IP 地址提供给下一次 IP 租用请求。&lt;/p&gt;
&lt;p&gt;4、DHCP 服务器发出 IP 租用确认报文&lt;/p&gt;
&lt;p&gt;被客户机选择的 DHCP 服务器在收到 DHCPREQUEST 广播后，会广播返回给客户机一个 DHCPACK 消息包，表明已经接受客户机的选择，并将这
一 IP 地址的合法租用以及其他的配置信息都放入该广播包发给客户机。&lt;/p&gt;
&lt;p&gt;5、客户配置成功后发出的公告报文&lt;/p&gt;
&lt;p&gt;客户机在收到 DHCPACK 包，会使用该广播包中的信息来配置自己的 TCP/IP，则租用过程完成，客户机可以在网络中通信。&lt;/p&gt;
&lt;p&gt;至此一个客户获取 IP 的 DHCP 服务过程基本结束，不过客户获取的 IP 一般是用租期，到期前需要更新租期，这个过程是通过租用更新数据包来完成的。&lt;/p&gt;
&lt;p&gt;安装配置：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;code class=&quot;language-text&quot;&gt;#sudo apt-get install dhcp3-server&lt;/code&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;启动停止脚本：/etc/init.d/dhcp3-server start | stop | status | reload&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;配置文件：/etc/dhcp3/dhcpd.conf，配置文件对基本配置的说明很清楚了，这里只重点强调几个配置选项。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;1）基本及动态配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;default-lease-time 600;//默认租期
max-lease-time 7200;
subnet 10.254.239.0 netmask 255.255.255.224 {  //建立地址池
    range 10.254.239.10 10.254.239.20;  //用于dhcp协议的地址范围
    range dynamic-bootp 10.254.239.40 10.254.239.60;  
    //用于bootp协议的地址范围
    option routers 10.254.239.1; //网关
    option broadcast-address 10.254.239.63;  //广播地址
    option domain-name-servers 192.168.10.1;  //dns服务器地址
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;2）静态配置：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;host fantasia {
    hardware ethernet 08:00:07:26:c0:a5;  //按照规定格式
    fixed-address 10.254.239.62;
}&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[暑假计划]]></title><description><![CDATA[知识库： 1）书籍：鸟哥的 linux 私房菜，操作系统原理（linux），深入解析 ubuntu 操作系统，思科网络技术学院（第一二三四学期），单片机应用与 c 语言程序设计，机电传动控制学习辅导与题解 2）在线：ubuntu manul，wiki and forum…]]></description><link>https://xdays.me/暑假计划/</link><guid isPermaLink="false">https://xdays.me/暑假计划/</guid><pubDate>Sat, 10 Jul 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;知识库：&lt;/p&gt;
&lt;p&gt;1）书籍：鸟哥的 linux 私房菜，操作系统原理（linux），深入解析 ubuntu 操作系统，思科网络技术学院（第一二三四学期），单片机应用与 c 语言程序设计，机电传动控制学习辅导与题解&lt;br&gt;
2）在线：ubuntu manul，wiki and forum，cisco
connection，（单片机在找）等&lt;br&gt;
目标：&lt;br&gt;
1）全国网络技术大赛争取进决赛&lt;br&gt;
2）机电产品设计大赛完成，单片机开发全过程&lt;br&gt;
3）能用 linux 搭建 lamp,ftp,dhcp,ssh,squid,nat 等平台&lt;br&gt;
4）机电传动控制和控制工程基础重新学习，补考&lt;br&gt;
计划：&lt;br&gt;
1）看完 RHCE253 课程（复习以下 033 和 133 的课程笔记）&lt;br&gt;
2）将 linux 架设各种简单的服务的过程写到博客里去&lt;br&gt;
3）将思科相关的内容总结一下写到博客里&lt;br&gt;
4）看完十天学会单片机,看懂师哥些的代码&lt;/p&gt;</content:encoded></item><item><title><![CDATA[ARP欺骗过程]]></title><description><![CDATA[假设一个只有三台电脑组成的局域网，该局域网由交换机(Switch)连接。其中一个电脑名叫 A，代表攻击方；一台电脑叫 S，代表源主机，即发送数据的电脑；令一台电脑名叫 D，代表目的主机，即接收数据的电脑。这三台电脑的 IP 地址分别为 192.168.0.2，192.168.…]]></description><link>https://xdays.me/ARP欺骗过程/</link><guid isPermaLink="false">https://xdays.me/ARP欺骗过程/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;假设一个只有三台电脑组成的局域网，该局域网由交换机(Switch)连接。其中一个电脑名叫 A，代表攻击方；一台电脑叫 S，代表源主机，即发送数据的电脑；令一台电脑名叫 D，代表目的主机，即接收数据的电脑。这三台电脑的 IP 地址分别为 192.168.0.2，192.168.0.3，192.168.0.4。MAC 地址分别为 MAC_A，MAC_S，MAC_D。&lt;/p&gt;
&lt;p&gt;现在，S 电脑要给 D 电脑发送数据了，在 S 电脑内部，上层的 TCP 和 UDP 的数据包已经传送到了最底层的网络接口层，数据包即将要发送出去，但这时还不知道目的主机 D 电脑的 MAC 地址 MAC_D。这时候，S 电脑要先查询自身的 ARP 缓存表，查看里面是否有 192.168.0.4 这台电脑的 MAC 地址，如果有，那很好办，就将
封装在数据包的外面。直接发送出去即可。如果没有，这时 S 电脑要向全网络发送一个 ARP 广播包，大声询问：“我的 IP 是 192.168.0.3，硬件地址是 MAC_S，我想知道 IP 地址为 192.168.0.4 的主机的硬件地址是多少？”
这时，全网络的电脑都收到该 ARP 广播包了，包括 A 电脑和 D 电脑。A 电脑一看其要查询的 IP 地址不是自己的，就将该数据包丢弃不予理会。而 D 电脑一看 IP 地址是自己的，则回答 S 电脑：“我的 IP 地址是 192.168.0.4，我的硬件地址是 MAC_D”需要注意的是，这条信息是单独回答的，即 D 电脑单独向 S 电脑发送的，并非刚才的广播。现在 S 电脑已经知道目的电脑 D 的 MAC 地址了，它可以将要发送的数据包上贴上目的地址 MAC_D，发送出去了。同时它还会动态更新自身的 ARP 缓存表，将 192.168.0.4－MAC_D 这一条记录添加进去，这样，等 S 电脑下次再给 D 电脑发送数据的时候，就不用大声询问发送 ARP 广播包了。这就是正常情况下的数据包发送过程。&lt;/p&gt;
&lt;p&gt;这样的机制看上去很完美，似乎整个局域网也天下太平，相安无事。但是，上述数据发送机制有一个致命的缺陷，即它是建立在对局域网中电脑全部信任的基础上的，也就是说它的假设前提是：无论局域网中那台电脑，其发送的 ARP 数据包都是正确的。那么这样就很危险了！因为局域网中并非所有的电脑都安分守己，往往有非法者的存在。比如在上述数据发送中，当 S 电脑向全网询问“我想知道 IP 地址为 192.168.0.4 的主机的硬件地址是多少？”后，D 电脑也回应了自己的正确 MAC 地址。但是当此时，一向沉默寡言的 A 电脑也回话了：“我的 IP 地址是 192.168.0.4，我的硬件地址是 MAC_A”
，注意，此时它竟然冒充自己是 D 电脑的 IP 地址，而 MAC 地址竟然写成自己的！由于 A 电脑不停地发送这样的应答数据包，本来 S 电脑的 ARP 缓存表中已经保存了正确的记录：192.168.0.4－MAC_D，但是由于 A 电脑的不停应答，这时 S 电脑并不知道 A 电脑发送的数据包是伪造的，导致 S 电脑又重新动态更新自身的 ARP 缓存表，这回记录成：192.168.0.4－MAC_A，很显然，这是一个错误的记录（这步也叫 ARP 缓存表中毒），这样就导致以后凡是 S 电脑要发送给 D 电脑，也就是 IP 地址为 192.168.0.4 这台主机的数据，都将会发送给 MAC 地址为 MAC_A 的主机，这样，在光天化日之下，A 电脑竟然劫持了由 S 电脑发送给 D 电脑的数据！这就是 ARP 欺骗的过程。&lt;/p&gt;
&lt;p&gt;转自:&lt;a href=&quot;http://baike.baidu.com/view/726493.htm?fr=ala0&quot;&gt;http://baike.baidu.com/view/726493.htm?fr=ala0&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Ping命令的工作过程及单向Ping通的原因]]></title><description><![CDATA[当网络出现问题时，我们最常用的测试工具就是“Ping”命令了。但有时候我们会碰到单方向 Ping 通的现象，例如通过 HUB 或一根交叉线连接的在同一个
局域网内的电脑 A、 B，在检查它们之间的网络连通性时，发现从主机 A Ping
主机 B 正常而从主机 B Ping…]]></description><link>https://xdays.me/Ping命令的工作过程及单向ping通的原因/</link><guid isPermaLink="false">https://xdays.me/Ping命令的工作过程及单向ping通的原因/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;当网络出现问题时，我们最常用的测试工具就是“Ping”命令了。但有时候我们会碰到单方向 Ping 通的现象，例如通过 HUB 或一根交叉线连接的在同一个
局域网内的电脑 A、 B，在检查它们之间的网络连通性时，发现从主机 A Ping
主机 B 正常而从主机 B Ping 主机 A 时，出现“超时无应答”错误。为什么呢?&lt;br&gt;
要知道这其中的奥秘，我们有必要来看看 Ping 命令的工作过程到底是怎么样的。&lt;/p&gt;
&lt;p&gt;原理部分：&lt;/p&gt;
&lt;p&gt;假定主机 A 的 IP 地址是 192.168.1.1，主机 B 的 IP 地址是 192.168.1.2，都在同一子网内，则当你在主机 A 上运行“Ping
192.168.1.2”后，都发生了些什么呢?&lt;/p&gt;
&lt;p&gt;首先，Ping 命令会构建一个固定格式的 ICMP 请求数据包，然后由 ICMP 协议将这个数据包连同地址“192.168.1.2”一起交给 IP 层协议（和
ICMP 一样，实际上是一组后台运行的进程），IP 层协议将以地址“192.168.1.2”作为目的地址，本机 IP 地址作为源地址，加上一些其他的控制
信息，构建一个 IP 数据包，并在一个映射表中查找出 IP 地址 192.168.1.2 所对应的物理地址（也叫 MAC 地址，熟悉网卡配置的朋友不会陌生，这是
数据链路层协议构建数据链路层的传输单元——帧所必需的），一并交给数据链路层。后者构建一个数据帧，目的地址是 IP 层传过来的物理地址，源地址则是本机
的物理地址，还要附加上一些控制信息，依据以太网的介质访问规则，将它们传送出去。&lt;/p&gt;
&lt;p&gt;主机 B 收到这个数据帧后，先检查它的目的地址，并和本机的物理地址对比，如符合，则接收；否则丢弃。接收后检查该数据帧，将 IP 数据包从帧中提取出来，交
给本机的 IP 层协议。同样，IP 层检查后，将有用的信息提取后交给 ICMP 协议，后者处理后，马上构建一个 ICMP 应答包，发送给主机 A，其过程和主机 A
发送 ICMP 请求包到主机 B 一模一样。&lt;/p&gt;
&lt;p&gt;单向 Ping 通问题：&lt;/p&gt;
&lt;p&gt;从 Ping 的工作过程，我们可以知道，主机 A 收到了主机 B 的一个应答包，说明两台主机之间的去、回通路均正常。也就是说，无论从主机 A 到主机 B，还是从主机 B 到主机 A，都是正常的。那么，是什么原因引起只能单方向 Ping 通的呢?&lt;/p&gt;
&lt;p&gt;一、安装了个人防火墙&lt;/p&gt;
&lt;p&gt;在共享上网的机器中，出于安全考虑，大部分作为服务器的主机都安装了个人防火墙软件，而其他作为客户机的机器则一般不安装。几乎所有的个人防火墙软件，默
认情况下是不允许其他机器 Ping 本机的。一般的做法是将来自外部的 ICMP 请求报文滤掉，但它却对本机出去的 ICMP 请求报文，以及来自外部的 ICMP
应答报文不加任何限制。这样，从本机 Ping 其他机器时，如果网络正常，就没有问题。但如果从其他机器 Ping 这台机器，即使网络一切正常，也会出现“超
时无应答”的错误。&lt;/p&gt;
&lt;p&gt;大部分的单方向 Ping 通现象源于此。解决的办法也很简单，根据你自己所用的不同类型的防火墙，调整相应的设置即可。&lt;/p&gt;
&lt;p&gt;二、错误设置 IP 地址&lt;/p&gt;
&lt;p&gt;正常情况下，一台主机应该有一个网卡，一个 IP 地址，或多个网卡，多个 IP 地址（这些地址一定要处于不同的 IP 子网）。但对于在公共场所使用的电脑，特别
是网吧，人多手杂，其中不泛有“探索者”。曾有一次两台电脑也出现了这种单方向 Ping 通的情况，经过仔细检查，发现其中一台电脑的“拨号网络适配器
”（相当于一块软网卡）的 TCP/IP 设置中，设置了一个与网卡 IP 地址处于同一子网的 IP 地址，这样，在 IP 层协议看来，这台主机就有两个不同的接口处
于同一网段内。当从这台主机 Ping 其他的机器时，会存在这样的问题：&lt;/p&gt;
&lt;p&gt;（1）主机不知道将数据包发到哪个网络接口，因为有两个网络接口都连接在同一网段；&lt;/p&gt;
&lt;p&gt;（2）主机不知道用哪个地址作为数据包的源地址。因此，从这台主机去 Ping 其他机器，IP 层协议会无法处理，超时后，Ping
就会给出一个“超时无应答”的错误信息提示。但从其他主机 Ping 这台主机时，请求包从特定的网卡来，ICMP 只须简单地将目的、源地址互换，并更改一些
标志即可，ICMP 应答包能顺利发出，其他主机也就能成功 Ping 通这台机器了。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[SSH服务器]]></title><description><![CDATA[​1. 安装 $sudo apt-get install openssh-server ​2. 设置开机启动 安装 sysvconfig，设置 ssh 开机启动 ​3. 配置文件详解 ＃cat /etc/ssh/sshd_config # Package generated…]]></description><link>https://xdays.me/SSH-配置服务器/</link><guid isPermaLink="false">https://xdays.me/SSH-配置服务器/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;​1. 安装&lt;br&gt;
$sudo apt-get install openssh-server&lt;/p&gt;
&lt;p&gt;​2. 设置开机启动&lt;br&gt;
安装 sysvconfig，设置 ssh 开机启动&lt;/p&gt;
&lt;p&gt;​3. 配置文件详解&lt;br&gt;
＃cat /etc/ssh/sshd_config&lt;/p&gt;
&lt;p&gt;# Package generated configuration file&lt;br&gt;
# See the sshd(8) manpage for details&lt;/p&gt;
&lt;p&gt;# What ports, IPs and protocols we listen for&lt;br&gt;
Port 22 ＃开放端口&lt;br&gt;
# Use these options to restrict which interfaces/protocols sshd will
bind to&lt;br&gt;
#ListenAddress ::&lt;br&gt;
#ListenAddress 0.0.0.0 ＃监听主机适配卡&lt;br&gt;
Protocol 2 ＃默认协议&lt;br&gt;
# HostKeys for protocol version 2&lt;br&gt;
HostKey /etc/ssh/ssh_host_rsa_key    ＃version 2 使用的 RSA 私钥&lt;br&gt;
HostKey /etc/ssh/ssh_host_dsa_key    ＃version 2 使用的 DSA 私钥&lt;br&gt;
#Privilege Separation is turned on for security&lt;br&gt;
UsePrivilegeSeparation yes&lt;/p&gt;
&lt;p&gt;# Lifetime and size of ephemeral version 1 server key&lt;br&gt;
KeyRegenerationInterval 3600 ＃重新创建 Public key 建立连接&lt;br&gt;
ServerKeyBits 768   ＃Sever key 的长度&lt;/p&gt;
&lt;p&gt;# Logging&lt;br&gt;
SyslogFacility AUTH    ＃日志登录文件相关&lt;br&gt;
LogLevel INFO&lt;/p&gt;
&lt;p&gt;# Authentication:&lt;br&gt;
LoginGraceTime 120 ＃ - - 还不知道&lt;br&gt;
PermitRootLogin yes   ＃重要的，是否允许 root 登录&lt;br&gt;
StrictModes yes    ＃当 host key 改变 sever 不接受联机&lt;/p&gt;
&lt;p&gt;RSAAuthentication yes ＃使用 RSA 认证&lt;br&gt;
PubkeyAuthentication yes   ＃允许使用 Public Key 针对 version 2&lt;br&gt;
#AuthorizedKeysFile    %h/.ssh/authorized_keys   
#用于设置不需要密码用户登录&lt;/p&gt;
&lt;p&gt;# Don’t read the user’s ~/.rhosts and ~/.shosts files&lt;br&gt;
IgnoreRhosts yes&lt;br&gt;
# For this to work you will also need host keys in
/etc/ssh_known_hosts&lt;br&gt;
RhostsRSAAuthentication no&lt;br&gt;
# similar for protocol version 2&lt;br&gt;
HostbasedAuthentication no&lt;br&gt;
# Uncomment if you don’t trust ~/.ssh/known_hosts for
RhostsRSAAuthentication&lt;br&gt;
#IgnoreUserKnownHosts yes       ＃不用.rhosts 认证&lt;/p&gt;
&lt;p&gt;# To enable empty passwords, change to yes (NOT RECOMMENDED)&lt;br&gt;
PermitEmptyPasswords no    ＃不允许空密码登录&lt;/p&gt;
&lt;p&gt;# Change to yes to enable challenge-response passwords (beware issues
with&lt;br&gt;
# some PAM modules and threads)&lt;br&gt;
ChallengeResponseAuthentication no ＃允许任何密码认证，默认设置为 no&lt;/p&gt;
&lt;p&gt;# Change to no to disable tunnelled clear text passwords&lt;br&gt;
#PasswordAuthentication yes ＃应该是用密码认证&lt;/p&gt;
&lt;p&gt;# Kerberos options&lt;br&gt;
#KerberosAuthentication no&lt;br&gt;
#KerberosGetAFSToken no&lt;br&gt;
#KerberosOrLocalPasswd yes&lt;br&gt;
#KerberosTicketCleanup yes&lt;/p&gt;
&lt;p&gt;# GSSAPI options&lt;br&gt;
#GSSAPIAuthentication no&lt;br&gt;
#GSSAPICleanupCredentials yes&lt;/p&gt;
&lt;p&gt;X11Forwarding yes    ＃X-Window 相关设置&lt;br&gt;
X11DisplayOffset 10&lt;br&gt;
PrintMotd no&lt;br&gt;
PrintLastLog yes&lt;br&gt;
TCPKeepAlive yes&lt;br&gt;
#UseLogin no&lt;/p&gt;
&lt;p&gt;#MaxStartups 10:30:60     ＃允许的未登录窗口数&lt;br&gt;
#Banner /etc/issue.net&lt;/p&gt;
&lt;p&gt;# Allow client to pass locale environment variables&lt;br&gt;
AcceptEnv LANG LC_*   ＃语系变量设置&lt;/p&gt;
&lt;p&gt;Subsystem sftp /usr/lib/openssh/sftp-server   ＃sftp 设置项目&lt;/p&gt;
&lt;p&gt;UsePAM yes ＃用 PAM 管理认证&lt;/p&gt;
&lt;p&gt;​4. 安全设置&lt;/p&gt;
&lt;p&gt;其实 ssh 的配置文件已经设置的很到位了，不建议随便修改，只是为了安全起见要修改几点：&lt;br&gt;
1）取消 root 登录: PermitRootLogin no&lt;br&gt;
2）不允许多个用户登录，把这几个用户加入同一个组，然后拒绝这个组：
DenyGroups nossh&lt;/p&gt;
&lt;p&gt;附配置文件详解（转自：&lt;a href=&quot;http://linux-vbird.bluedata.org/linux_server/0310telnetssh.htm#ssh_sshdconfig&quot;&gt;http://linux-vbird.bluedata.org/linux_server/0310telnetssh.htm#ssh_sshdconfig&lt;/a&gt;）：&lt;/p&gt;
&lt;p&gt;# 1. 关于 SSH Server 的整体设定，包含使用的 port
啦，以及使用的密码演算方式&lt;br&gt;
Port 22 　　　　　　　　　　# SSH 预设使用 22 这个
port，您也可以使用多的 port ！&lt;br&gt;
# 亦即重复使用 port 这个设定项目即可！&lt;br&gt;
Protocol 2,1 　　　　　　　 # 选择的 SSH 协议版本，可以是 1 也可以是 2
，&lt;br&gt;
# 如果要同时支持两者，就必须要使用 2,1 这个分隔了！&lt;br&gt;
#ListenAddress 0.0.0.0 　　 #
监听的主机适配卡！举个例子来说，如果您有两个 IP，&lt;br&gt;
# 分别是 192.168.0.100 及 192.168.2.20 ，那么只想要&lt;br&gt;
# 开放 192.168.0.100 时，就可以写如同下面的样式：&lt;br&gt;
ListenAddress 192.168.0.100          # 只监听来自 192.168.0.100 这个
IP 的 SSH 联机。&lt;br&gt;
# 如果不使用设定的话，则预设所有接口均接受 SSH&lt;br&gt;
PidFile /var/run/sshd.pid 　　　　　　# 可以放置 SSHD 这个 PID
的档案！左列为默认值&lt;br&gt;
LoginGraceTime 600 　　　　 # 当使用者连上 SSH server
之后，会出现输入密码的画面，&lt;br&gt;
# 在该画面中，在多久时间内没有成功连上 SSH server ，&lt;br&gt;
# 就断线！时间为秒！&lt;br&gt;
Compression yes 　　　　　　# 是否可以使用压缩指令？当然可以啰！&lt;/p&gt;
&lt;p&gt;# 2. 说明主机的 Private Key 放置的档案，预设使用下面的档案即可！&lt;br&gt;
HostKey /etc/ssh/ssh_host_key 　　　　# SSH version 1 使用的私钥&lt;br&gt;
HostKey /etc/ssh/ssh_host_rsa_key 　　# SSH version 2 使用的 RSA
私钥&lt;br&gt;
HostKey /etc/ssh/ssh_host_dsa_key 　　# SSH version 2 使用的 DSA
私钥&lt;br&gt;
# 2.1 关于 version 1 的一些设定！&lt;br&gt;
KeyRegenerationInterval 3600 　 　　　# 由前面联机的说明可以知道，
version 1 会使用&lt;br&gt;
# server 的 Public Key ，那么如果这个 Public&lt;br&gt;
# Key 被偷的话，岂不完蛋？所以需要每隔一段时间&lt;br&gt;
# 来重新建立一次！这里的时间为秒！&lt;br&gt;
ServerKeyBits 768 　　　　　　　　　 # 没错！这个就是 Server key
的长度！&lt;/p&gt;
&lt;p&gt;# 3. 关于登录文件的讯息数据放置与 daemon 的名称！&lt;br&gt;
SyslogFacility AUTH 　　　　　　　　　# 当有人使用 SSH
登入系统的时候，SSH 会记录资&lt;br&gt;
# 讯，这个信息要记录在什么 daemon name 底下？&lt;br&gt;
# 预设是以 AUTH 来设定的，即是 /var/log/secure&lt;br&gt;
# 里面！什么？忘记了！回到 Linux 基础去翻一下&lt;br&gt;
# 其它可用的 daemon name 为：DAEMON,USER,AUTH,&lt;br&gt;
# LOCAL0,LOCAL1,LOCAL2,LOCAL3,LOCAL4,LOCAL5,&lt;br&gt;
LogLevel INFO 　　　　　　　　　　　　#
登录记录的等级！嘿嘿！任何讯息！&lt;br&gt;
# 同样的，忘记了就回去参考！&lt;/p&gt;
&lt;p&gt;# 4. 安全设定项目！极重要！&lt;br&gt;
# 4.1 登入设定部分&lt;br&gt;
PermitRootLogin no 　　 　　# 是否允许 root
登入！预设是允许的，但是建议设定成 no！&lt;br&gt;
UserLogin no 　　　　　　　 # 在 SSH 底下本来就不接受 login
这个程序的登入！&lt;br&gt;
StrictModes yes 　　　　　　# 当使用者的 host key 改变之后，Server
就不接受联机，&lt;br&gt;
# 可以抵挡部分的木马程序！&lt;br&gt;
#RSAAuthentication yes 　　 # 是否使用纯的 RSA 认证！？仅针对 version
1 ！&lt;br&gt;
PubkeyAuthentication yes 　 # 是否允许 Public Key ？当然允许啦！只有
version 2&lt;br&gt;
AuthorizedKeysFile      .ssh/authorized_keys&lt;br&gt;
# 上面这个在设定若要使用不需要密码登入的账号时，那么那个&lt;br&gt;
# 账号的存放档案所在档名！&lt;br&gt;
# 4.2 认证部分&lt;br&gt;
RhostsAuthentication no 　　# 本机系统不止使用 .rhosts ，因为仅使用
.rhosts 太&lt;br&gt;
# 不安全了，所以这里一定要设定为 no ！&lt;br&gt;
IgnoreRhosts yes 　　　　　 # 是否取消使用 ~/.ssh/.rhosts
来做为认证！当然是！&lt;br&gt;
RhostsRSAAuthentication no # 这个选项是专门给 version 1 用的，使用
rhosts 档案在&lt;br&gt;
# /etc/hosts.equiv 配合 RSA 演算方式来进行认证！不要使用&lt;br&gt;
HostbasedAuthentication no # 这个项目与上面的项目类似，不过是给
version 2 使用的！&lt;br&gt;
IgnoreUserKnownHosts no 　　# 是否忽略家目录内的 ~/.ssh/known_hosts
这个档案所记录&lt;br&gt;
# 的主机内容？当然不要忽略，所以这里就是 no 啦！&lt;br&gt;
PasswordAuthentication yes # 密码验证当然是需要的！所以这里写 yes
啰！&lt;br&gt;
PermitEmptyPasswords no 　　# 若上面那一项如果设定为 yes
的话，这一项就最好设定&lt;br&gt;
# 为 no ，这个项目在是否允许以空的密码登入！当然不许！&lt;br&gt;
ChallengeResponseAuthentication yes # 挑战任何的密码认证！所以，任何
login.conf&lt;br&gt;
# 规定的认证方式，均可适用！&lt;br&gt;
#PAMAuthenticationViaKbdInt yes      # 是否启用其它的 PAM
模块！启用这个模块将会&lt;br&gt;
# 导致 PasswordAuthentication 设定失效！&lt;/p&gt;
&lt;p&gt;# 4.3 与 Kerberos 有关的参数设定！因为我们没有 Kerberos
主机，所以底下不用设定！&lt;br&gt;
#KerberosAuthentication no&lt;br&gt;
#KerberosOrLocalPasswd yes&lt;br&gt;
#KerberosTicketCleanup yes&lt;br&gt;
#KerberosTgtPassing no&lt;/p&gt;
&lt;p&gt;# 4.4 底下是有关在 X-Window 底下使用的相关设定！&lt;br&gt;
X11Forwarding yes&lt;br&gt;
#X11DisplayOffset 10&lt;br&gt;
#X11UseLocalhost yes&lt;/p&gt;
&lt;p&gt;# 4.5 登入后的项目：&lt;br&gt;
PrintMotd no              #
登入后是否显示出一些信息呢？例如上次登入的时间、地点等&lt;br&gt;
# 等，预设是 yes ，但是，如果为了安全，可以考虑改为 no ！&lt;br&gt;
PrintLastLog yes 　　　　　# 显示上次登入的信息！可以啊！预设也是 yes
！&lt;br&gt;
KeepAlive yes 　　　　　　 # 一般而言，如果设定这项目的话，那么 SSH
Server 会传送&lt;br&gt;
# KeepAlive 的讯息给 Client 端，以确保两者的联机正常！&lt;br&gt;
# 在这个情况下，任何一端死掉后， SSH 可以立刻知道！而不会&lt;br&gt;
# 有僵尸程序的发生！&lt;br&gt;
UsePrivilegeSeparation yes # 使用者的权限设定项目！就设定为 yes 吧！&lt;br&gt;
MaxStartups 10 　　　　　　# 同时允许几个尚未登入的联机画面？当我们连上
SSH ，&lt;br&gt;
# 但是尚未输入密码时，这个时候就是我们所谓的联机画面啦！&lt;br&gt;
# 在这个联机画面中，为了保护主机，所以需要设定最大值，&lt;br&gt;
# 预设最多十个联机画面，而已经建立联机的不计算在这十个当中&lt;/p&gt;
&lt;p&gt;# 4.6 关于使用者抵挡的设定项目：&lt;br&gt;
DenyUsers *　　　　　　　 #
设定受抵挡的使用者名称，如果是全部的使用者，那就是全部&lt;br&gt;
# 挡吧！若是部分使用者，可以将该账号填入！例如下列！&lt;br&gt;
DenyUsers test&lt;br&gt;
DenyGroups test 　　　　　 # 与 DenyUsers 相同！仅抵挡几个群组而已！&lt;/p&gt;
&lt;p&gt;# 5. 关于 SFTP 服务的设定项目！&lt;br&gt;
Subsystem       sftp    /usr/lib/ssh/sftp-server&lt;/p&gt;</content:encoded></item><item><title><![CDATA[一篇文章的思考]]></title><description><![CDATA[今天在 IT 实验室上看到这《实践人生，一个普通 IT…]]></description><link>https://xdays.me/一篇文章的思考/</link><guid isPermaLink="false">https://xdays.me/一篇文章的思考/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天在 IT 实验室上看到这《实践人生，一个普通 IT 人的十年回顾》的一篇文章，看着看着那种发自肺腑的共鸣让泪水涌在眼角，之后更多的是感动和崇敬。我很羡慕他的人生，有高潮也有低谷，而且那种低谷是真正的孤注一掷的低谷，高潮也是洒下奋斗的汗水与泪水换来的成功，这样的人生才是辉煌的，才是无悔的。&lt;/p&gt;
&lt;p&gt;文中有些话对我感触很深，在此记下：&lt;br&gt;
1.
好的学习方式：学理论打基础，在实践中逐步理解理论，多思多悟，就会发现层出不穷的新技术中有许多一成不变的东西存在。&lt;br&gt;
2.
现在的本科生比我当时强太多了，但至少有一点他们中的许多人不如我，他们不如我勤奋，也不具备我的毅力，我觉得这是现在这批八十年代出生的大学生最缺的东西。&lt;/p&gt;
&lt;ol start=&quot;3&quot;&gt;
&lt;li&gt;艰难困苦，玉汝于成！&lt;/li&gt;
&lt;li&gt;世上的人大多都只会锦上添花，但只有雪中送炭的才是最宝贵的。&lt;/li&gt;
&lt;li&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;一道道大题空在那儿做不出来，都像是不断讥笑我不自量力，又像是一张张面无血色的血盆大口，一张口就把我吞下去了，连骨头渣都不留。&lt;/p&gt;
&lt;ol start=&quot;6&quot;&gt;
&lt;li&gt;上帝是公平的，他给你一个弱点的同时也提供一个让你克服弱点的方法.&lt;/li&gt;
&lt;li&gt;怎么学都不如从失败中学的多.&lt;/li&gt;
&lt;li&gt;人生若不尝试，怎能体现人活的价值？&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;由此也想起现在的我，迷茫的我。相比之下，我们这代人是幸福的，我们有了很好的先天条件，但是我们却更迷茫。首先，我们都在憧憬自己美好的未来，相信自己总有功成名就的一天。然而，问题会出在两个方面：一是我们该往哪里奋斗才能有那一天；二是我们该如何奋斗才能有那一天。看看作者，我们在很多方面有着相似之处，我们都会看着自己的专业课可本很厚，因为我们的兴趣不再上面。而恰如作者所说，我们这批人大多数都没有他们那种勤奋和毅力，应该说勤奋就是毅力的体现。具体说来，虽然我也怀着浓厚的兴趣去看那厚厚的计算机图书，但是总避免不了去看看看了多少还有多少。&lt;/p&gt;
&lt;p&gt;我为自己选择了方向——计算机网络，理由是计算机网络在应用层面，不需要像编程一样苦心专研，而且单薄的身体也经不住不正常生活的考验。简单憧憬一下未来：我一个公司，单位或者学校的一个普通员工，做个比网络管理员告点层次的职业，拿着可以养家糊口的工资，不必为生活奔波，仅此足以。&lt;/p&gt;
&lt;p&gt;有了这样的目标也有了为之奋斗的动力和途径，平时努力学习基础知识，先拿下软考的网络工程师，如果可能在考些其他认证，作为敲开职业大门的钥匙。一切似乎都是理所当然，目标如此简单，途径是如此明确，最为关键也是我最缺乏的就是作者十年中一直具有的品质也是其成功的关键所在——毅力。&lt;/p&gt;
&lt;p&gt;另外，这篇文章对我感触最深的是作者在不断忏悔他对父母的负担和不负责任，对于一个而立之年的人仍然依赖父母，心理上确实难以承受，但最终他没有辜负父母的期望，无怨无悔。&lt;/p&gt;
&lt;p&gt;俞敏洪说过，人生应该做几件感动自己和别人的事情。作者的十年感动了自己，也感动了我们…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[传输层协议tcp/udp]]></title><description><![CDATA[一、TCP 和 UDP 分段结构 tcp&udpsegment 1）！顺序号的单位是应用层数据的大小（byte 为单位），也就是说两次 tcp 报文段的顺序号之差就是应用层数据大小（byte 为单位）。！ 2）确认号是请求下一个数据包的顺序号。 3）length 字段以 3…]]></description><link>https://xdays.me/传输层协议tcpudp/</link><guid isPermaLink="false">https://xdays.me/传输层协议tcpudp/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;一、TCP 和 UDP 分段结构&lt;/h3&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/06/tcpudpsegment.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/06/tcpudpsegment.jpg&quot; alt=&quot;tcp&amp;#x26;udpsegment&quot; title=&quot;tcp&amp;#x26;udpsegment&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;1）！&lt;span
style=&quot;color: #000000;&quot;&gt;顺序号的单位是应用层数据的大小（byte 为单位），也就是说两次 tcp 报文段的顺序号之差就是应用层数据大小（byte 为单位）。！&lt;br&gt;
&lt;/span&gt;2）确认号是请求下一个数据包的顺序号。&lt;br&gt;
3）length 字段以 32 位为单位计量。&lt;br&gt;
4）code bits 主要有如下含义：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;U R G 紧急指针（u rgent pointer）有效&lt;/li&gt;
&lt;li&gt;A C K 确认序号有效。&lt;/li&gt;
&lt;li&gt;P S H 接收方应该尽快将这个报文段交给应用层。&lt;/li&gt;
&lt;li&gt;R S T 重建连接。&lt;/li&gt;
&lt;li&gt;S Y N 同步序号用来发起一个连接。&lt;/li&gt;
&lt;li&gt;F I N 发端完成发送任务。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5）urgent pointer 紧急指针：只有当 U R
G 标志位置 1 时紧急指针才有效。紧急指针是一个正的偏移量，和序号字段中的值相加表示紧急数据最后一个字节的序号。带有紧急指针的数据段不必等待缓冲数据而直接发送。&lt;/p&gt;
&lt;h3&gt;二、可靠传输&lt;/h3&gt;
&lt;h4&gt;1. 序号确认&lt;/h4&gt;
&lt;p&gt;1）三次握手，建立连接&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/06/tcp-3hands-shake.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/06/tcp-3hands-shake.jpg&quot; alt=&quot;tcp-3hands-shake&quot; title=&quot;tcp-3hands-shake&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2）四次握手，连接终止&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;/wp-content/uploads/2010/06/tcp-finish.jpg&quot;&gt;&lt;img src=&quot;/wp-content/uploads/2010/06/tcp-finish.jpg&quot; alt=&quot;tcp-finish&quot; title=&quot;tcp-finish&quot;&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这里再讨论一个细节：当 A 发送了 FIN 消息，并收到确认时整个连接进入半关闭状态。这时 B 仍能向 A 发送数据，A 仍要接收。当 B 没有数据要发送时就发送 FIN 消息，A 回复 ACK 消息。至此，连接并没有完全释放，A 进入 time-wait 状态。两个 MSL（最长报文寿命）之后，A 进入 closed 状态，连接释放。&lt;/p&gt;
&lt;p&gt;3）发送方在发送数据包的同时设置超时计时器，在指定时间内没有收到确认（三种可能：发送丢失，确认丢失和确认延迟）就重新传送报文。&lt;/p&gt;
&lt;h3&gt;三、提高效率&lt;/h3&gt;
&lt;h4&gt;1）累计确认&lt;/h4&gt;
&lt;p&gt;只对按序号到达的最后一个分组确认，表示在此之前的分组都已经收到了。&lt;/p&gt;
&lt;h4&gt;2）缓冲传输&lt;/h4&gt;
&lt;p&gt;当需要传输不大的数据时，发送端一直等待，直到累计一个大的数据块再传输。&lt;/p&gt;
&lt;h4&gt;3）流水线传输&lt;/h4&gt;
&lt;p&gt;不必等待对方确认，发送方可以连续发送多个分组。&lt;/p&gt;
&lt;h4&gt;4）选择确认 SACK&lt;/h4&gt;
&lt;p&gt;对没有按顺序到达的，且中间缺少一些序号的数据只传送缺少的那部分数据。这里要用到ｔｃｐ首部的选项字段。&lt;/p&gt;
&lt;h3&gt;四、流量控制&lt;/h3&gt;
&lt;p&gt;1）滑动窗口（tcp 的核心机制）&lt;/p&gt;
&lt;p&gt;2）死锁及解决：如果接收方由于接收缓存满向发送方发送零窗口报文，不久有了缓存空间，就向发送发发送 rwnd=400 的报文，但是这个报文在传动过程中丢失，造成死锁。tcp 为每个连接设定一个持续定时器（persistence
timer），在收到零窗口的报文后启动它，到期后发送零窗口的探测报文，另一方回应窗口大小，防止死锁。&lt;/p&gt;
&lt;p&gt;3）nagle 算法：发送方把第一个字节先发送出去，缓存后面的数据字节。待收到第一字节的确认后，把数据封装成报文发送出去，同时继续缓存，只有收到上一个报文的确认才发送下一个报文。适合发送数据快，网络速度慢的情况。&lt;/p&gt;
&lt;p&gt;4）糊涂窗口综合症：当接收端能接收最大报文长度的报文；接收端缓存有一半空间。以上两种情况时才发送数据，提高效率。&lt;/p&gt;
&lt;p&gt;5）发送窗口取接收窗口（rwnd）和拥塞窗口（cwnd）中较小的一个。&lt;/p&gt;
&lt;h3&gt;五、拥塞控制&lt;/h3&gt;
&lt;p&gt;1）慢开始与拥塞避免&lt;/p&gt;
&lt;p&gt;具体协议不写了，只列举重要概念：拥塞窗口（cwnd），传输轮次（transmit
round），慢开始门限（ssthresh），ＡＩＭＤ（加法增大乘法减小）算法。&lt;/p&gt;
&lt;p&gt;２）快重传和快恢复&lt;/p&gt;
&lt;p&gt;快重传指当发送方连续收到三个重复确认后就立即重传重复确认的报文，不必等待超时重传计时器。而重传意味着网络可能拥塞，但是还不一定拥塞，所以重传后执行快恢复算法。与慢开始和拥塞避免不同的是：当慢开始门限（ssthresh）减半后，不是将拥塞窗口置为 1MSS 而是慢开始门限的大小，然后也不是执行慢开始算法，而是执行拥塞避免算法。&lt;/p&gt;
&lt;p&gt;3）发送窗口取接收窗口（rwnd）和拥塞窗口（cwnd）中较小的一个。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[其实幸福不会来敲门]]></title><description><![CDATA[感动。 在父子俩在餐厅里坐着，看着远处一家人快乐的吃饭的时候。修好的机器亮起了灯，明亮的就像是来自天堂。chris…]]></description><link>https://xdays.me/其实幸福不会来敲门/</link><guid isPermaLink="false">https://xdays.me/其实幸福不会来敲门/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;感动。&lt;/p&gt;
&lt;p&gt;在父子俩在餐厅里坐着，看着远处一家人快乐的吃饭的时候。修好的机器亮起了灯，明亮的就像是来自天堂。chris 红了眼圈，和上司们一一握手，然后冲出去，冲到幼儿园，抱起他的儿子。&lt;br&gt;
所以他生活的这一部分，这一小部分，叫做幸福。&lt;/p&gt;
&lt;p&gt;诚如人人都偶尔会犯傻会火星一样，人人都难以避免的会在生活中有一部分叫做 being
losers，被税务局弄得破产，被房东踢出门，甚至家人都离你而去，而你，瞪着死鱼眼儿，不知道该怎么办。&lt;/p&gt;
&lt;p&gt;有人会就此妥协，接受生活给你的乌七吗黑，为一切焦头烂额，满口抱怨，终此一生，甚至沉醉在酒精或者别的什么里面。&lt;/p&gt;
&lt;p&gt;而这个人，并不会这样做。他抬头望着天，暗自嘀咕为什么我不能幸福，并且不顾一切的向着似乎有幸福的光芒在闪烁的远方冲去。自然，他最后如愿以偿，飞上枝头变凤凰，带领可爱的儿子过上不再为房租烦恼的日子，甚至会拥有一座大房子，人们无法想象的财产，etc.&lt;/p&gt;
&lt;p&gt;但是还是会想，如果并没有成功，他的生活又会怎样？&lt;/p&gt;
&lt;p&gt;史铁生有一篇小说叫做命若琴弦，如同某次我没做到的作文题目所说:瞎子艺人弟子也是瞎子。老艺人临终时告诉弟子一个秘密，当弹断第 1000 根琴弦的时候，就可以打开琴，里面藏着复明的秘方。艺人的前辈无一人能弹断 1000 根，而老人一生，刚好弹断了 999 根，他们全都无缘秘方。那时的弟子，20 出头，强烈地渴望着光明，他接过那把藏有秘方的琴，开始了一生辛苦的弹奏。终于，当华发满头时，他弹断了第 1000 根琴弦。他迫不及待地打开琴，琴中根本就没有什么秘方！平静下来之后，老瞎子明白了：他不是早就得到那个秘方吗？因为有这个秘方，他才有了生存的勇气。他努力地说书弹弦，受人尊敬，他学会了爱与被爱。于是，老瞎子叫来自己的弟子，送给他一把琴，把当年师傅的秘密又重复了一遍，只不过，把 1000 根变成了 1200 根。听着小瞎子淙淙的琴声，老瞎子想：也许，他一生都弹不断 1200 根琴弦……&lt;/p&gt;
&lt;p&gt;更通常的结果便是如此，幸福并不一定会在你的艰难困苦，你的乐观的或者是破釜沉舟的努力后实现，你也许劳苦一生，最后却发现幸福其实并不真实存在，或者根本遥不可及。只是如若因此放弃追求，生命又有什么意义？&lt;/p&gt;
&lt;p&gt;永远需要为某一种结果而付出努力，无比艰辛的努力，个中滋味苦涩无人能知，然而结果却永远是未知。在这种情况下，是放弃追求，退守原本的平静，还是放手一搏，压下赌注，看一看这一次的结果？&lt;/p&gt;
&lt;p&gt;记得几个月以前，经常患得患失的感受，往往是在一番心理斗争后，给出自己这样的结论：逃避追求永远也不会得到幸福，如果想要得到什么，唯一的方法就是努力，而结果既然不在能够控制的范围之内，又何必要为之而烦恼？&lt;/p&gt;
&lt;p&gt;没有什么事来得容易，也并不是努力就能够确保拥有什么，只是这实在是唯一可能的选择，也是唯一重要的东西。每一个师傅都在失望与绝望之后深谙了这个道理，于是那张空白的药方，才会在一把又一把的琴里流传，才会有一个又一个的瞎子，拼命的拉断了一根又一根的琴弦，在希望的夹缝中生存了下来。&lt;/p&gt;
&lt;p&gt;于是觉得在 the pursuit of
happiness 这个影片名里，pursuit 才是重点。中国人把它翻译成当幸福来敲门，实在是本末倒置，因为幸福，绝不会随便来敲你家的门。&lt;/p&gt;
&lt;p&gt;PS：&lt;br&gt;
1 最后那句 nobody
who，让我想起了一个无比纠结的故事，以及七班的那几个很 ws 的绰号。&lt;br&gt;
2 第一次看 will smith 演的电影啊，这人以前是演喜剧的？&lt;/p&gt;
&lt;p&gt;转自 blog: &lt;a href=&quot;http://blog.hjenglish.com/vermouth/archive/2007/04/14/687145.html&quot;&gt;http://blog.hjenglish.com/vermouth/archive/2007/04/14/687145.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[健康讲座]]></title><description><![CDATA[​1. 平衡饮食 1）凉白开水，不能喝放太久的。 2）推荐饮料：绿茶，红葡萄酒，豆浆，酸奶，骨头汤，蘑菇汤。…]]></description><link>https://xdays.me/健康讲座/</link><guid isPermaLink="false">https://xdays.me/健康讲座/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;​1. 平衡饮食&lt;br&gt;
1）凉白开水，不能喝放太久的。&lt;br&gt;
2）推荐饮料：绿茶，红葡萄酒，豆浆，酸奶，骨头汤，蘑菇汤。&lt;/p&gt;
&lt;p&gt;3）食物：&lt;br&gt;
老玉米，荞麦，薯类，小米粥，芝麻&lt;br&gt;
“一把蔬菜一把豆，一个鸡蛋加点肉”&lt;br&gt;
大豆。&lt;br&gt;
喝豆浆好。&lt;/p&gt;
&lt;p&gt;十种实物不吃：松花蛋，臭豆腐，味精，方便面，葵花籽，菠菜，猪肝，烤牛羊肉，泡菜，油条。&lt;/p&gt;
&lt;p&gt;菜：&lt;/p&gt;
&lt;p&gt;胡萝卜，南瓜，苦瓜，番茄—西红柿—不能生吃—西红柿炒鸡蛋，大蒜—生吃—切成片。&lt;br&gt;
吃的挺热闹，吃的挺糟糕！&lt;/p&gt;
&lt;p&gt;螺旋藻&lt;/p&gt;
&lt;p&gt;微波炉辐射性大&lt;/p&gt;
&lt;p&gt;​2. 有氧运动&lt;br&gt;
1）中强度&lt;br&gt;
3.心理状态&lt;br&gt;
生气是拿别人的缺点和错误来惩罚自己。&lt;br&gt;
忍耐是一种修养。&lt;br&gt;
不要死于无知。&lt;br&gt;
天天快乐！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[写给我未来老婆的一封信]]></title><description><![CDATA[…]]></description><link>https://xdays.me/写给我未来老婆的一封信/</link><guid isPermaLink="false">https://xdays.me/写给我未来老婆的一封信/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;亲爱的：&lt;/p&gt;
&lt;p&gt;你的生活中的过去的我正在给我的生活中未来的你写信诉说一下我现在的状况。看似荒唐，但我相信作为邮递员的时间一定会把这封信交到你的手中，让它来告诉你现在的我对你的憧憬…&lt;/p&gt;
&lt;p&gt;从另一个角度讲，我只是用一种特殊的方式写下了我对爱情的所有理解，至于这封信能不能被你看到，或者说有没有将来的你会来看这封信我都不敢确定，因为我一向那么悲观。&lt;/p&gt;
&lt;p&gt;关于你的模样，我时时会想起。你不知道在我生活的现在，我发现很多男生都喜欢很漂亮的女生，我也不知道为什么我好像是自卑惯了，我的眼神在女生身上提留的时间从来都是三秒以内。这也常常让我怀疑我有没有发现你的可能性。&lt;/p&gt;
&lt;p&gt;关于对爱情的理解，我始终认为那是两厢情愿的事情，就算我是穷光蛋或者有那么一天也发达了该出现的你还是会出现，不该出现的你还是不会出现。我爱你，也同样被你爱着，我们就会共度此生。我向来坚信我永远都是一个对感情绝对专一的人，我现在仍然相信这一点，如果他们曾经爱过但有一天她不爱了那是他的错。或者是他爱错了人，或者是他没能给她爱…&lt;/p&gt;
&lt;p&gt;然后就是对你的期望和要求。首先是必须孝顺，这是一切一切的前提，是没有没有商量的余地的。我相信我会公平的对待我们的老人，这一点你放心。但是，如果你真的不尽人意，那我希望你不要阻挡我尽孝道，否则只有最坏的结果了。还有就是我希望我们能共同奋斗，相互鼓励，理解和支持，因为我相信那样才更有奋斗的动力，爱情的力量 O(∩_∩)O。而且，你必须会做饭会做家务，这一点我还是受点“优良传统”的影响的，因为我感觉吃着老婆做的饭才感到家的温暖。最后，我的老婆一定不能懒惰，因为你的懒惰要建立在我的勤劳的基础上，而事实是我并不勤劳，而且懒惰不仅是一种习惯，而是一种对待任何事情的态度，这才是最关键的。&lt;/p&gt;
&lt;p&gt;再者就和你说说我现在的生活吧，说实话我也不知道我现在的生活算不算生活。我不好好学习，但我也没有甘于堕落。那天我突然想起一句话，我想打着机械的名义，通过计算机为自己争得一片天地。但是我现在最大的苦恼和顾虑是我不能确定我能成功，或者说我是在孤注一掷，我没有败的资本。不过既然选择了就要风雨兼程，路还要继续走下去。&lt;/p&gt;
&lt;p&gt;好了就写到这里了，文件—保存。&lt;/p&gt;
&lt;p&gt;最后愿你和未来的我生活甜蜜美满，如果真有那么一天！&lt;/p&gt;</content:encoded></item><item><title><![CDATA[家庭 未来 感情]]></title><description><![CDATA[…]]></description><link>https://xdays.me/家庭-未来-感情/</link><guid isPermaLink="false">https://xdays.me/家庭-未来-感情/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;不知道室因为心情不好才会去想一些事情，还是因为想一些事情才心情不好，今日的我又把往日的烦恼痛苦和失落统统搬出来细数一遍，把自己无情地甩向黑暗的深渊。&lt;/p&gt;
&lt;p&gt;“家庭”二字在我听来室那么沉重，在我心中从一家三口变成一家两口的那一刻家庭也随他一起而去了，继而的寄人篱下和母亲所承受的委屈让我感到自己是如此的无能。也许我独立了我能支撑起一个家庭后，妈妈就应该算是幸福了，算是对几年来无言的心酸与苦楚的最好的回报了，仅此而已。仅次而已室因为她的愿望仅仅室挺起腰杆做人而不再再别人的脸色下度过属于自己的每一天。然而，我该问自己我做到了吗？我什么时候才能做到？是她的希望渺茫到自己都看不到的那一天还是我再也没有机会做到的那一天？！&lt;/p&gt;
&lt;p&gt;他们总是问我：“你为什么那么悲观？”而我总是以我要把伤感转化成文字带出我的思想，这样生活中的我才能快乐为接口来回应。然而事情真的如此简单？消极和悲观能像清理垃圾一样从我的思想中消灭吗？我梦想如此。我是一个地道的悲观主义者，我总认为一件事情未发生之前把所有最坏的结果想到是一件很必要的事情，因为你可以因为结果没有你想象那么糟糕而庆幸，也可以因为事情正如你所料自己也早已想到有了心理准备而得到些许抚慰。尽管如此，我承认我惧怕后者，在我看来对我而言那就意味着穷困潦倒终此一生，而更大的不幸是母亲。我讨厌孤注一掷，也在进行着和畏惧着…&lt;/p&gt;
&lt;p&gt;似乎还有什么给身在乌云下的我添上了几丝阴霾，就是那段不堪回首的感情，之所以不称之为爱情是因为经历之后我对着千百年来人们传颂的人类最宝贵的东西更加迷惑。什么是爱情？是你我之间的那一句“我爱你”？还是…突然发现，对于爱情我一无所知，这也许能回答近几天我一直问自己的问题：为什么我的爱情失败了？为什么我们之间的这段感情失败了？为什么我那么用心去爱天冷了我提醒她小心着凉，晚上她出去上网我催她早点回去，她手机停机你了为了能联系到她我把生活费给她充花费，那么用心我还是失败了？为什么我一直坚信执子之手与子偕老而见到你是如此陌生？为什么我一生只爱一人的简单想法竟要如此破灭？有太多的为什么没来得及问，而在我心里她却渐渐里我而去。当木已成舟，我们无力回天，无论有再多的不甘心。那么我的这些“为什么”怎么办？谁能够来回答我呢？也许没有人能回答，也许只有我自己能回答但不是现在的我，也许永远也没有人能回答…&lt;/p&gt;
&lt;p&gt;路，永远都没有尽头…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[完全用GNU/Linux工作]]></title><description><![CDATA[理解 GNU/Linux “UNIX 是简单的，你不需要成为天才也能理解这种简单。” 由于 GNU/Linux 这个词太长，下面如果没有特别指明，“Linux”就是指“GNU/Linux”。 在这个年代，恐怕没有人需要我来介绍 Linux 是什么了吧？如果你觉得“Linux…]]></description><link>https://xdays.me/完全用gnulinux工作/</link><guid isPermaLink="false">https://xdays.me/完全用gnulinux工作/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;理解 GNU/Linux&lt;br&gt;
“UNIX 是简单的，你不需要成为天才也能理解这种简单。”&lt;/p&gt;
&lt;p&gt;由于 GNU/Linux 这个词太长，下面如果没有特别指明，“Linux”就是指“GNU/Linux”。&lt;/p&gt;
&lt;p&gt;在这个年代，恐怕没有人需要我来介绍 Linux 是什么了吧？如果你觉得“Linux
只不过是跟 DOS
差不多的东西”，那你恐怕很久在山洞里没见天日了吧？请问问你旁边的 Linux
用户，Linux 到底是个什么地位？&lt;/p&gt;
&lt;p&gt;那为什么我还要写一篇这样的文章？因为，我发现还有很多人不不理解 Linux 和
UNIX，虽然他们也在用它，但是他们有时会问：“为什么 Linux 不能像 Windows
那样 ……？”，“怎么 Redhat Linux 不能 mount NTFS 分区！”，“Linux
下用什么整理硬盘？”，“什么时候 OpenOffice 才能完全兼容 Word 文件啊？”，“现在还有什么 Windows 能干的事情 Linux 干不了的？”……&lt;/p&gt;
&lt;p&gt;他们有 40G 的硬盘，却只为 Linux
分配了 2G 空间，有时还抱怨“这个东西怎么占这么多硬盘！” 似乎 Windows
该占用大部分硬盘。他们把重要的数据装在 Windows 的分区，似乎信不过 Linux。他们总是到处寻找新奇的，好看的 GUI 程序，对命令行的东西一概不屑一顾。他们对 Drag&amp;#x26;Drop，菜单配置，自动升级非常感兴趣。他们如果找到一个很像
Windows 程序的 Linux 程序，一定会很高兴的说：“哈哈！Linux 也能……了！”
如果 Linux 在某种测试中胜过 Windows，他们会高兴得跳起来。他们没有办法用 Linux 解决问题的时候，甚至用 Wine 来运行 Windows 程序。有时实在没办法，只好重起到
Windows，或者干脆省得麻烦，在 Windows 下装一个 VMWare 虚拟一个 Linux
玩。&lt;/p&gt;
&lt;p&gt;你支持 Linux，你喜欢
Linux，你能从中感觉到快乐，这非常好。你现在只需要明白的是：Linux
从来就不是一个玩具，它是天才 UNIX 的后代。UNIX
是自晶体管发明以来最伟大的发明，它从诞生那一天开始就比 Windows
的设计出色。Linux 并不需要追赶
Windows，不需要打垮微软，它的最终目标是改变整个计算机世界，还人们自由，给人们乐趣和方便。其它 UNIX 很多都已经败在 Linux 脚下，更何况
Windows！&lt;/p&gt;
&lt;p&gt;你如果出现了以上的情况，说明你的思想受到了 Windows
的某种潜移默化的影响和误导。你没有能够从本质上理解存在于 Linux 身上的
UNIX 思想。UNIX 的设计者 Dennis Ritchie 说：“Unix is simple. It just
takes a genius to understand its simplicity.”
但是我不这么认为，因为我不是一个天才，但是我却勇敢的把 Windows 完全删除掉，半年之后我体会到了
UNIX 的思想和好处。因为我相信这样的信念：“Windows 能办到的事 Linux
一定能办到，而且办的更好。”&lt;/p&gt;
&lt;p&gt;这小节开头的话应该改成：“Unix 是简单的，但是在这个冲斥着 Windows
错误观念的世界，你需要信念和勇气才能理解它的简单！”
我下面就告诉你一些我理解到的东西。&lt;/p&gt;
&lt;p&gt;微软的地位&lt;/p&gt;
&lt;p&gt;微软的名声在欧洲和美国的大学里，特别是在计算机系里之坏，大家可能有所耳闻。我认识的
MIT，Stanford
的教授，贝尔实验室的专家，甚至一个欧洲小国的高中计算机老师都绝口不提微软的名字。在他们眼里，微软只是一个没有真技术，专靠在落后国家商业宣传和垄断经营的小公司。这个“小”并不是说它人少，钱少，而是说它先进技术少。&lt;/p&gt;
&lt;p&gt;我上次和王益合作写了一个算法演示程序，那个算法是贝尔实验室一位科学家 Steven
Fortune 很天才的发明，为了程序能够被身边大多数人使用，我们选择了 VC+MFC
作为平台。我在分析算法时还得到 Fortune
很热情的鼓励，寄给我一份资料，还多次回信耐心的给我讲解了很多细节。但是程序完成之后，我把样品发给
Fortune，他回信说：“对不起。我机器上没有 MFC。”
话说的很客气，但是我已经感觉到了他对 Windows 的不屑。然后我把 MFC
静态编译进程序再发给他，他就没有再回信了。他显然不是瞧不起我，而是确实有难处。&lt;/p&gt;
&lt;p&gt;你能感觉到这位科学家对微软和 Windows
是什么态度了吧？不是反感，而是他心里根本没有 Windows
这个东西！微软在高科技领域没有发展，那么它怎么生存呢？到发展中国家去发展一下，他们的人民还对电脑一无所知，我说不定甚至可以打入大学的计算机系呢。我送他们软件，我捐钱盖大楼，我找图灵奖获得者来演讲！&lt;/p&gt;
&lt;p&gt;好了，现在全国的大学包括清华，几乎所有人机器必装盗版 Win2000, Office
XP，学校的选课系统是非 IE 不能正确浏览，论文用 Word 编辑，演示用 ppt 做，连
863 项目都用 VC
写程序了。我很久以前就看到一份报纸说，“微软为什么不严厉打击盗版？”
这篇文章说，微软非但不打击中国的盗版行为，而且有放任之趋势。放长线吊大鱼，“以后我要你们加倍的来还我！”
确实如此，它的目的快实现了。&lt;/p&gt;
&lt;p&gt;Windows 笼罩下的中国计算机教育&lt;br&gt;
说句丢脸的话，比尔盖茨很久以前是我的偶像…… //blush&lt;/p&gt;
&lt;p&gt;在中国，比尔盖茨被很多人奉为神圣，“少年电脑天才”，甚至有的人提到他的名字就做出“抱拳对天”的姿势。很多人谈到微软的“新技术”，“高科技”
都是眉飞色舞。各种“VC 编程圣经”，“深入了解 Visual
C++”之类的书，在开头几页都会出现非常肉麻的字眼，“在那团团的混沌中，一个开天辟地的精灵，Windows
1.0，诞生了……”&lt;/p&gt;
&lt;p&gt;微软的软件被这么多人盗用，那么人们是怎样使用这些盗版程序的呢？先看看电脑培训班，教的都是一些
DOS 命令，打字，Windows 基本操作，Word
文档处理，PowerPoint，高级班可能有 Excel，Access……
参加各种微软认证考试，MCSE, MSDE
的人络绎不绝，考试辅导班都贴出了“280 元。考过为止”之类的字样，考试参考资料更是昂贵，有些电脑书店整整两书架都是“Microsoft
Press”的东西。我有个同学参加认证考试，每门考试都要 200 多元，而且你一次考不过再考，又要交钱。他后来还津津乐道跟我说，看我，花了 XXXX(一个四位数)元考过了微软认证，得到一张比尔盖茨亲笔签名的证书和价值 6000 元的
Windows XP 内部发行版。&lt;/p&gt;
&lt;p&gt;“电脑要从娃娃抓起”，我们再来看看娃娃们学的是什么。大部分家长给孩子买了电脑之后，他们首先就会装一个盗版的
Windows，然后买来盗版的游戏开始玩。如果哪个孩子会用 Delphi
编程序，那可不得了。报社记者，电视台争相报导，说，某某学校的初中生某某，在别人都还在玩电脑游戏这种“初级阶段”的时候就已经用
Delphi 写程序了。镜头还瞄准了他显示器上面的像框中的比尔盖茨头像！&lt;/p&gt;
&lt;p&gt;我刚进入大学计算机系时还不懂得什么是操作系统，因为我以前只用过“中华学习机”。看到新入学的同学们各个谈论的都是
“Windows 95”，“VC”……
我简直觉得我落后了好几十年一样，整个一土人，根本跟他们答不上话。好不容易找到一个比较熟的同学问了一下：“你们天天谈论的瘟 95 是什么啊？”答：“win95 就是一个操作系统，跟 DOS 是一类。”“朵死是什么？”
“你连 DOS 都不知道是什么？别在计算机系混了。”
学校上课当然不讲 VC 编程之类的东西，但是上 Pascal
的老师有一次就说：“嗨，我们学校真是落后。现在别人都用 C, C++，甚至 VC
了，我们还在讲
Pascal。不知道什么时候才能有 VC 课啊。你们出去也是要用 VC 的，只好自学了。”
有些同学很多时候上课都捧着一本很重的“Windows
编程大全”之类的书，根本没有听课，吃饭时就念念有词的跟我说，“代码的优化是无止境的”，“匈牙利命名法真是伟大的发明”
…… 这就是中国很多大学计算机系的情况。&lt;/p&gt;
&lt;p&gt;感觉到无知了？这不是偶然的，而是微软长久以来的如意算盘。它要让无知的大家都把它奉为神圣，它要让支持 UNIX,
Xwindow 的人一旦说 UNIX 好，Xwindow 好的时候，都被一群人围着说教：“这个
Windows 也能做到”，“你对 Windows 有偏见”，“微软才是主流啊”，“你敢瞧不起
win2k？”，“.NET 就是世界潮流”，“微软的毕竟是新技术”，“有钱就是有技术”……
甚至在一番论战比较后败下来还是要说：“Windows
性能差点，但是易用性强”，“Windows
是老百姓用的，要求别那么高”，“微软那么有钱，以后想超过 UNIX
还不容易吗？”……&lt;/p&gt;
&lt;p&gt;发达国家的计算机教育&lt;br&gt;
我前段时间在 USENET 发文问有关 Scheme
语言的问题时，认识了一位丹麦人。他解决了我所有的问题，并且建议我阅读一些很“深奥”的有关程序语言语法，文法的书，他告诉我很多网站可以学习
LISP，Scheme，人工智能，算法。他叫我看 Jonathan Rees
的论文。他还打包给我寄过来一份 MIT 的 “How to Design
Programs”。他说他在自己的 PC 机上装的是 Linux，他用 Emacs 编辑，运行
Scheme 程序。他对 Emacs
的了解和爱好真是使人惊讶。他大学本科毕业时做的毕业设计是一个 Scheme
解释器。这对于我来说是望尘末及了。&lt;/p&gt;
&lt;p&gt;他是那么的不厌其烦，我的每一个问题他都详细的回答。我有时都觉得过于详细了，怎么这么耐心啊？我觉得他似乎是我的高中老师。他是什么样的人呢？我好奇的打听了他的情况。原来，她是丹麦一所普通高中的计算机老师！注意我换了人称代词！&lt;/p&gt;
&lt;p&gt;她说她在高中里讲授程序设计和算法，计算机语言文法分析。她说用
Scheme，她的学生不用再为指针越界，内存泄漏等程序语言本身的问题而烦恼，而专注于问题和算法本身。有利于培养学生解决问题的能力，特别是用计算机解决数学问题的能力。&lt;/p&gt;
&lt;p&gt;天哪！为什么欧洲出现那么多数学家，几何学家？你看看别人重视的是什么！我们的计算机教育如果继续这样下去，只会沿着弯路越走越远！&lt;/p&gt;
&lt;p&gt;微软和它的朋友们的如意算盘&lt;br&gt;
下面来看看微软的收入是怎么来的。首先，Windows 98 系列操作系统，一个就是
100 多美元，每次升级又是几乎同样的价钱。Windows NT
还要贵几倍，而且有用户数目限制，5 个用户的，10 个用户的……
以后如果要增加用户数目还要按比例付钱。这个奇怪的现象被通用汽车公司的总裁比喻为：“你买的微软牌汽车最开头只有一个座位，每加一个座位你得向汽车公司付钱，每开 100 英里要大修一次，每过一年要换一次引擎。”&lt;/p&gt;
&lt;p&gt;花了如此多钱买来的操作系统就能用了吗？它竟然连压缩程序都没有提供！你装上
Windows 之后一般第一件事就是去下载一个 WinZip 吧，“只要 29
美元”。Windows 会中病毒啊，马上花 70 美元买一个 Norton AntiVirus
吧。还有黑客呢？再买一个 Norton Internet Security 好了，100
美元。系统需要优化，磁盘需要整理，买一个 Norton System Works
是你最佳的解决方案，100 美元。&lt;/p&gt;
&lt;p&gt;可是你现在还是不能干正事啊！你想要一个 Word, PowerPoint？那就买一套
Office XP 吧，一起买便宜些，$459.90。&lt;/p&gt;
&lt;p&gt;那些程序不会用啊！那些菜单怎么设置，到底有什么功能啊？看“帮助”也学不会。买本书看看吧，我推荐“Special
Edition Using Microsoft Office
XP”，不贵，$27.99。这本书里面大部分是屏幕抓图，还是买一本旧的比较划算，$17.85。&lt;/p&gt;
&lt;p&gt;你如果只是当个秘书，上面的差不多还凑合了。可是你有更高的追求，你想成为
Windows 程序员。首先买一个 Visual Studio.NET
吧，要不然怎么编译程序。$494.95。&lt;/p&gt;
&lt;p&gt;为了紧跟微软动向，世界潮流，不能不注册个 MSDN
什么的吧？这个贵一点，不过物有所值啊，$2,799。&lt;/p&gt;
&lt;p&gt;嗯，你现在已经是上层阶级，白领人士了。你现在可以像这样“自由”的，“安全”的生活了：&lt;/p&gt;
&lt;p&gt;什么是 Windows 能干而 Linux 干不了的事情？&lt;br&gt;
“Windows 能干而 Linux 干不了的事情，那就是不需要干的事情。”&lt;/p&gt;
&lt;p&gt;有个朋友看我半年没有用 Windows，有时就会问我：“你只用
Linux，有没有发现有些 Windows 能处理的事情 Linux 干不了？”&lt;/p&gt;
&lt;p&gt;我回答说：“Windows 能干而 Linux 干不了的事情，那就是不需要干的事情。”&lt;/p&gt;
&lt;p&gt;Windows 能做的有益的事情 Linux 都能做&lt;br&gt;
Windows 下的某些功能确实是我们需要的，那么 Linux
的开发者们和用户也需要这种功能，他们就会去实现这种功能，而且比 Windows
的方式好得多。由于大多数科学家，工程师用的都是 Linux 或者某种商业 UNIX,
所以几乎所有商业的科学工程程序，比如 Matlab, Mathematica, AutoCAD,
Candence 的，Synopsys 的，Avant! 的……全都是先有 UNIX
的版本(包括 Linux)，然后再考虑移植给 Windows，甚至根本不移植给
Windows，因为 Windows
的机器一般没有足够的能力运行这样的程序。你不要以为只有 Windows 才有
PSpice, UNIX 的 HSpice
要好得多，而且可以运行在大型主机上。当然它们不是免费的，但是它们值那个价钱。&lt;/p&gt;
&lt;p&gt;但是 Windows 下有些东西在 Linux
下没有很相似的，或者你找到很多类似的，但是它们每一个比起 Windows
的那个程序都要差很多，那么原因有两种可能性：&lt;/p&gt;
&lt;p&gt;有一个完全类似的程序，但是由于它乍一看不漂亮，被你忽略了。&lt;br&gt;
而其它程序虽然看起来很漂亮，但是它们是一些初学编程的人写的。现在由于
Gtk+, Qt 的诞生，Linux
下开发图形界面程序极其简单，很多初中生甚至小学生都可以随手编出一些漂亮不中用的程序。如果你整天寻找这样的程序挑来挑去，永远也找不到你满意的。&lt;/p&gt;
&lt;p&gt;我曾经也犯过这样的错误，优秀的 FVWM, lftp, Mutt, wget
都被我忽略过！当我找回它们的时候，我是那么的羞愧不已，它们现在都是我的朋友
用这些程序你可以改变它们的一切，我第一次看到 FVWM
觉得它只不过是一个有很厚很难看边框的东西。可是现在，我的同学看到 FVWM
都说：“哇！真漂亮。”&lt;/p&gt;
&lt;p&gt;有另一种完全不同的方式可以达到相同的目的，甚至更好。&lt;br&gt;
很多人很关心 Open Office, Star Office, AbiWord, …
他们多么盼望有一天某一个 Linux 程序能够完全兼容的打开一个复杂的 doc
文档。但是你永远也不可能有那一天。为什么呢？因为微软为了占有市场，必定不会让其它系统的程序能够完全兼容它的文档格式！它一定会不断变化
doc 文档的内部结构，隐藏一些秘密，让其它公司的程序打开 doc
文档时总是有某种问题，从而你必需购买 Microsoft Office 和 Windows。&lt;/p&gt;
&lt;p&gt;你应该想一下，那么多的高智商的大学教授，科学家，学生，他们用的都是 Linux
或者其它类型的 UNIX，他们没有 Word
可用，怎么处理文档呢？这么多年没有一个像 Open Office
的程序出现，难道大家没有办法写文档吗？&lt;/p&gt;
&lt;p&gt;显然不是这样。你看看那些高水平的学术杂志，论文，那些大学教授的网页，那些漂亮的 PDF 幻灯片，它们是什么做的？原来
UNIX 用户早就有非常方便的 troff, LaTeX, SGML
等东西可以处理文档，而且它们比起 Word 都要高明的多。Word
显然被这些大拿忽略了，以至于很久以来没有人想在 Linux 下开发一个类似 Word
的程序，除非某些公司想抢微软的饭碗。&lt;/p&gt;
&lt;p&gt;很多人留着 Windows 在硬盘上的原因无非是为了用 Word 和
PowerPoint。你待会儿可以看看我的 TeX 网页，你就会知道为什么我可以完全离开
Windows.&lt;/p&gt;
&lt;p&gt;Windows 能做的那些没用的事情 Linux 永远做不好&lt;br&gt;
电脑游戏&lt;br&gt;
有些人说 Linux 下不能玩 Windows 下所能得到的所有游戏。的确，Linux
下虽然也有少量的游戏，比如 Quake。但是它没有 Counter Strike, 没有 Star
Craft, ……&lt;/p&gt;
&lt;p&gt;并不是说电脑游戏不该玩，但是应该适可而止。电脑是用来处理事务，帮助你学习，解决问题的工具，而不是一个玩具！整天沉迷于电脑游戏中，而不出去感觉外面的世界，你会变得越来越冷酷，越来越缺乏人情味。你与真实的世界越来越远。&lt;/p&gt;
&lt;p&gt;你可以在 CS 里杀人，你可以在 Tomb Raider 里探险，你甚至可以在 Tony
Hawk’s Pro Skaters 里滑板…… 但是 It’s not
real！你虽然有很高的“反恐技巧”，但是遇到歹徒的时候，你是那么的怯懦；你虽然控制
Laura 伸手敏捷，但是你打篮球的时候怎么总是被人断球？你虽然可以轻易的在
THPS 里作出一个 “360 kickflip to hangten grind to
fakie”，但是你踩在自己的滑板上的时候还不会 ollie！&lt;/p&gt;
&lt;p&gt;说回来，如果你偶尔玩一下电脑游戏未尝不可。但是世界上有远比 Windows + PC
更好的游戏方式。Sony 的 PlayStation2, SEGA 的 DreamCast, Nintendo 的
N64，Namco 的街机……每一个都比 Windows
游戏精彩，每一个都有如此高的 3D 性能，以至于 Pentium4, Itanium + GForce4
都无法与它们比美！&lt;/p&gt;
&lt;p&gt;Linux
的用户们都是关心解决世界的关键问题的份子，他们哪里有时间用自己的机器来玩游戏啊？他们每天用 Linux 高效的做完自己的工作就到阳光下享受自然去了。要玩游戏也是玩一些类似推箱子，贪吃蛇之类的智力小游戏。所以，你知道为什么
Linux 几乎没有游戏了吧？&lt;/p&gt;
&lt;p&gt;“整理硬盘，优化系统”&lt;br&gt;
这是一个非常有意思的话题，仅次于有关“病毒”的话题。相信很多 Windows
用户都有整理硬盘的经历。在很多 Windows
用户眼里，“硬盘用久了，会出现碎片，速度会减慢，需要一个程序来整理，整理硬盘的时候不要做其它工作”，这好像是天经地义的事情。&lt;/p&gt;
&lt;p&gt;我也曾经津津有味的看着 Norton Defrag
一点一点的把我的硬盘排序，调整，用图形的方式显示出来，然后报告：“100%
没有碎片。你的硬盘现在已经达到最佳状态。”
我现在才发觉我那时是多么的幼稚。&lt;/p&gt;
&lt;p&gt;Linux 和 UNIX
用户似乎从来没有“整理硬盘”这种说法呢？你觉得很奇怪吗？如果你觉得很奇怪，那说明你的思想在某种程度上被微软的垃圾程序禁锢了。你需要明白，UNIX
的大型主机很多必须是一天 24 小时，一年 365 又 1/4 天不停运转的，要是每个星期都要整理一次硬盘，在整理的时候几乎不能干任何事情，那是绝对行不通的！&lt;/p&gt;
&lt;p&gt;Linux 机器根本不用整理硬盘，这就是为什么没有看到过 Linux
用户整理硬盘。Linux 的文件系统是比 Windows 的 FAT, FAT32, NTFS
高明得多的文件系统，它们不但可以对文件设置权限，实施完全的保护，而且可以“越用越整齐”，“越用碎片越少”！你应该把文件大部分放在
Linux 的分区，而不是 Windows 分区，因为它比 Windows 分区可靠得多。&lt;/p&gt;
&lt;p&gt;还有更滑稽的事情就是有很多“Norton System Doctor”，“Windows
优化大师”，“超级兔仔注册表魔法”
之类的程序存在，而且价格昂贵。似乎一个操作系统本来应该有很多问题，需要别的厂商做程序来“优化”它，而且为了得到优化，你需要付钱！这些问题
Linux 根本就没有，所以不需要什么优化。Linux 内核本身就是高度优化的。&lt;/p&gt;
&lt;p&gt;IDE&lt;br&gt;
有些人在抱怨为什么 Linux 没有一个良好的 IDE 开发环境。Linux
现在已经有一些 IDE 了，但是总是有很多问题。你是不是正在寻找，正在期望
Linux
某一天可以有一个 VC 那样的开发环境？你有没有发现你正在进入微软给你设下的怪圈？你为什么一定要用
IDE？你说：“IDE 开发迅速，调试方便，适合大型程序……”
那说明微软的程序在你脑子里已经比较根深蒂固，你需要好好清醒一下了，看看我来告诉你。&lt;/p&gt;
&lt;p&gt;高明的 UNIX 程序员不用 IDE，IDE 从来就是给初级 Windows 程序员用的。&lt;/p&gt;
&lt;p&gt;你看看大型的 UNIX 程序，包括 Linux 内核，各种网络服务程序，Xwindow
程序在内，哪一个是 IDE 搞出来的？我们实验室的 EDA 程序也没有一个是 IDE
弄的，我还知道 Candence, Synopsys，Mentor 的高性能的图形界面 EDA
程序也都不是 IDE 写的。你信不信，微软的人在写 Windows
本身的时候也根本不用 IDE！&lt;br&gt;
有一次某杂志采访一些出名的 Linux 内核程序员，包括 Linus
在内，没有一个人用 IDE，有的人用 VIM，有的用 Emacs，只有 Linus 说“GNU
Emacs is evil”，但是其实他用的是一种跟 Emacs 有同样键绑定功能的
MicroEmacs。大家都是用编辑器编辑了程序文件，然后用 make
这样的自动工具调用 gcc 编译器完成编译工作的。&lt;br&gt;
我以前也编过 Windows 程序：应用程序，驱动程序。但是我没有用 VC 的
IDE。Linux 教育了我，我会在命令行调用 CL，我知道 CL 才是 VC
的编译器。我可以在 cygwin 的 Makefile 里使用 CL。我还知道 CL
的参数都有什么用处。但是这些不是一个从一开头就用 IDE
的人能很快理解到的。&lt;/p&gt;
&lt;p&gt;我相信: IDE is evil。我有一些用 Windows 的 IDE
写程序的朋友，他们对那套东西已经很精通了。但是我却惊奇的发现，他们竟然把编译器和汇编器的概念都分不清楚，甚至有的人连“编辑器”和“编译器”都搞混淆了！他们只知道在一个窗口里输入了代码，点击一个按钮就可以编译程序，但是这里面到底是怎么工作的，他们不知道！他们被盖在上面的窗口挡住了视线，甚至会以为那个按钮就是编译器！&lt;/p&gt;
&lt;p&gt;他们对那些 IDE
的热键背的滚瓜烂熟，但是我却看到他们在一个函数一个函数的把别人的 ANSI
风格的代码变成 VC 的风格。想想这件事在 VIM
里有多么简单，一瞬间就可以搞定。&lt;/p&gt;
&lt;p&gt;为什么 UNIX 程序员不用 IDE？明白了这个道理你就能体会到 UNIX
的设计思想了。首先，一个 IDE
集成了编辑器，编译器，汇编器，调试器，跟踪器…… 这个编辑器功能肯定比不上
VIM 或 Emacs，编译器比不上 GCC，汇编器比不上 as，调试器比不上 gdb, ddd,
跟踪器比不上 strace, ltrace,
truss。你得到的是一套整合的很好的低能的程序。如果你对调试器的功能不满意，你只好换用另外一套
IDE，但是这套 IDE 的热键，菜单，编辑器功能，按钮……
跟原来那个有很大不同。你不得不花很多时间来熟悉新的环境，而不能保持原来的某些东西。&lt;/p&gt;
&lt;p&gt;而在 UNIX 下就不一样了。你可以用你最喜欢的 VIM 编辑程序，你在 VIM
里可以调用 GNU make，make 可以调用 gcc, ld, … 实际上 make
能帮你很多忙。make 的出错信息可以被 VIM 捕获，VIM
能帮你在源程序里定位。你如果喜欢 icc, 你可以让 make 用 icc 而不是
gcc。你如果觉得 gdb 跟踪变量时比较麻烦，你可以用 ddd
来显示各种数据结构之间的关系。你还可以在 Emacs 里调用
gdb，那样就可以同步显示源代码了。而且 VIM 和 Emacs
还可以编辑很多其它东西，比如信件，LaTeX 文档，HTML，配置文件……
你不用另外找一个什么编辑器来干这些杂活了。很多程序比如 Mutt, tin
都可以在内部使用 VIM，这样就更方便了。&lt;/p&gt;
&lt;p&gt;释放内存&lt;br&gt;
我在 Windows 下做过的一件最傻的事情莫过于“释放内存”了。有一天我看到一个
Windows
程序说：“这个程序可以帮你把大量内存释放出来给一个很大的程序用。”我试了一下，居然一下把我的
64M 内存释放出来
48M！我高兴极了。现在想一想，那是多么傻的事情，那么多的内存留着干什么？不用白不用啊！一个操作系统，居然还需要别人写的程序来释放内存，那是什么样的操作系统？&lt;/p&gt;
&lt;p&gt;在 Linux 下用 free
命令，你会发现你的内存几乎每时每刻都快要被用完。那是因为 Linux
把大部分内存用来作为磁盘缓冲了。Linux 有比 Windows
先进的磁盘缓冲技术。你有没有发现你往硬盘写数据的时候，很快就完成了？那是因为
Linux
在内存里有很多磁盘缓冲区，你要写到硬盘上的数据先被写到了这些内存里，然后
Linux 就告诉你“拷贝完成”，当你马上又想删除刚才写入的某些数据时，Linux
只是把数据从内存里移除，然后报告“删除完成”。在一定的间隔时间后，Linux
才把数据写回硬盘，这样不但高效，避免了多次硬盘操作，而且减少了文件的不连续，也就是减少了“碎片”。Windows
当然也有磁盘缓冲，但是由于它内存管理的低效率，它不敢把大量内存都用来作为磁盘缓冲，因为它没有能力在用的时候随时把内存收回来。&lt;/p&gt;
&lt;p&gt;Linux 能干的高级的事情 Windows 都干不了&lt;br&gt;
当然有很多事情是 Linux/UNIX 的专利了。因为 Windows 只能装在 PC
机上，好像以前也有 Alpha 可以使用 Windows NT，但是就是没见到有人用。PC
机的能力是很低的，像我们编程序处理 NP-Hard 问题的人，用 Windows
的机器显然速度不够，而且有时一个问题算上几天甚至几个星期，Windows
机器是以“死机”著称的，我们怎么能放心？&lt;/p&gt;
&lt;p&gt;所以几乎所有科学计算程序，EDA 程序，高性能图像处理程序都不是 Windows
的。他们有时也会移植一些给 Windows，但是常常降低那些程序的能力。你比较过
Windows 版本的 Mathematica 和 Linux 的有什么区别吗？&lt;/p&gt;
&lt;p&gt;IBM 制造的最大的并行计算机有 8000 多个处理器，Windows
不可能有能力管理这么多处理器，它用的是什么操作系统？答案是 Linux。&lt;/p&gt;
&lt;p&gt;《泰坦尼克号》电影里的三维动画，那么细腻逼真，Windows 机器能做出来吗？不行。那也是
Linux 机器做的。&lt;/p&gt;
&lt;p&gt;民航总局用来训练地情人员的虚拟现实训练设备，Windows
当然无能为力。那都是商业的 IRIX 机器。&lt;/p&gt;
&lt;p&gt;UNIX 是最早支持 TCP/IP
网络协议的系统。它上面有很多可以互相协作的网络服务程序，它们经过多年的使用和修订，已经达到比较完善的程度。而就在 1997 年，微软的比尔盖茨还在扬言：“Internet
是没有前途的。”
微软的这个“远见卓识”大家应该都已见识，它后来加上的网络服务程序 IIS 漏洞之多，让公安部都频频发出警报，大家也是见识了的。&lt;/p&gt;
&lt;p&gt;其实你知道了，Windows 没有一样有用的事情能比 UNIX 干的更好。&lt;/p&gt;
&lt;p&gt;Linux 干不了的有用的事情 Windows 照样干不了&lt;br&gt;
当然 Linux 不是万能的。它也有不能干的事情，电脑也有干不了的事情。但是
Linux 干不了的事情，Windows
肯定也干不了。这些事情就是我们需要探索，需要努力的事情了。在你探索的过程中，Linux
必定是你的好伙伴。&lt;/p&gt;
&lt;p&gt;UNIX 的真谛何在？&lt;br&gt;
让聪明人干任何他们想干的事情。&lt;/p&gt;
&lt;p&gt;UNIX 的一个特点就是非常高的灵活性，Xwindow
也具有这种灵活性。这种灵活性体现在哪里呢？&lt;/p&gt;
&lt;p&gt;UNIX
的程序一般都有很多参数，不管你现在用的着用不着，总有人需要某些参数。它们的行为很多都可以用配置文件来改变。比如
GNU bash, 通常缺省的命令行输入方式是 Emacs 方式，但是只要我编辑一个
.inputrc 文件，就可以把它变成 vi
的输入方式，而且我还可以自己绑定键序列到某些操作。我可以用 shopt
来设置它的很多特点，比如是否进行通配符扩展，是否可以把一个变量当作一个目录来 cd，是否可以自动纠正某些明显的目录名打字错误
……&lt;/p&gt;
&lt;p&gt;UNIX
程序设计的思想是提供给用户“机制”，而不限制用户制定“政策”。这是一个重要的尊重用户的作法。&lt;/p&gt;
&lt;p&gt;我们再来看看 Xwindow。Xwindow
是一个出色的设计，它把显示服务器和客户程序分开。一个显示上既可以显示本机上的程序，也可以显示别的机器上的
X
程序，而它们都遵守你的窗口管理器的统一指挥，它们之间可以方便的传送剪贴版数据，各种事件
…… 比如有时我的 XFree86 上会出现四个不同机器上的 XTerm，两个不同机器上的
GVIM，…… 它们统一受本机上的 FVWM 指挥。&lt;/p&gt;
&lt;p&gt;Xwindow 程序都具有很多很多命令行参数和 resource
参数。你可以随意的在命令行或者 .Xdefaults
文件设置所有的颜色，字体，尺寸…… 而且如果你用 xrdb 把 .Xdefaults
导入到根窗口，那么其它机器上没有经过配置的同样的程序，显示到你的机器上的时候也会遵守同样的外观规定。&lt;/p&gt;
&lt;p&gt;Xwindow 的窗口具有 Property,
也就是一些可以自己定义的共享数据(原子)。正是因为这些 Property
的存在，使得 Xwindow 具有无比强大的生命力。X
的窗口管理器和其它客户程序之间并没有统一的协议，但是后来出现了
ICCCM(客户程序间通信规范)，这个规范就是通过 property
定义的。现在又有人定义了一套“扩展的窗口协议(EWM Hints)”，使得 Xwindow
可以具有某些 Windows
的特征，比如一个工具条程序可以告诉窗口管理器：“这个屏幕下面被我占据了 24 个像素的空间，你最大化程序的时候不要越过这个界线。”&lt;/p&gt;
&lt;p&gt;一个强大的窗口管理程序比如
FVWM，它收到这样的提示时，可以答应工具条程序的这个要求，也可以不答应。一切选择的权力在于谁？当然是用户了！一切窗口乖乖听话，FVWM
给予用户最大的尊重。&lt;/p&gt;
&lt;p&gt;你想想，是不是有些 Windows 程序常常弹出一个窗口要你选择 “Yes or
No”？你不点击它它就不下去。你觉不觉得你的程序在侵犯你的尊严？你是一个人，一个智慧的生物，怎能受到一个程序如此的待遇？&lt;/p&gt;
&lt;p&gt;还有就是很多 Windows
程序把人当成傻瓜，而它是“智能程序”。比如，有一个程序就是喜欢把你的每句话第一个字母都变成大写，我不说它是谁了，你遇到的时候就知道了。如果连“一句话开头一个字母要大写”这么明显的问题都需要程序帮你纠正的话，人脑还用来干什么？况且如果你故意想要不大写的话，那就更麻烦了，我楞是没有从它那一大堆菜单里找到怎么关闭这个愚蠢的选项。&lt;/p&gt;
&lt;p&gt;只有符号才能完全操纵计算机。&lt;/p&gt;
&lt;p&gt;我们来说说很多初学 Linux 的用户。虽然他们在用
Linux，但是他们打心眼儿里是觉得 Windows 的工作方式好，他们希望 Linux
有一天能“像 Windows 那样”。你说：“我鼠标一点，我菜单一拉，……
就可以完成我的操作。” 但是我要告诉你：“Linux 从来没有摹仿
Windows，将来也不会。Linux 从诞生之日起，它的工作方式就比 Windows
的先进。Linux 属于能勇敢面对符号的人。只有符号才能完全操纵计算机。”&lt;/p&gt;
&lt;p&gt;看看优秀的 UNIX 程序，XFree86, FVWM, VIM, Emacs, proftpd, Mutt, wget,
tin, …
没有一个不是用配置文件来设置选项的。为什么这些程序没有方便的菜单可以用来配置？难道它们的设计者就那么低能，连个图形配置界面也写不出来？&lt;/p&gt;
&lt;p&gt;当然不是。因为图形界面配置方式的能力是极其有限的，而配置文件和程序语言的表达能力却是无限的。用图形界面配置这些程序的话，如果你想达到配置文件的效果，你需要成百上千的菜单，checkbox,
radio button, …
到时候你根本没办法找到你需要修改的地方了！而各个程序的配置文件的语法都有很多相似之处，一般就是一些命令，设置一些变量，参数，……
一旦用会了一个，其它的也就容易理解了。如果你用惯了 awk, sed,
Perl，你会觉得那才是真正的自动化啊。&lt;/p&gt;
&lt;p&gt;鼠标虽然是很好的工具，但是它的表达能力是有限的。你不可能光用鼠标就让电脑完全明白你的意思，它毕竟只有 3 个按钮。看看我的 MetaPost 页你就能体会到鼠标的这一弱点。所以我们虽然很喜欢鼠标，但是却不能完全依赖它。&lt;/p&gt;
&lt;p&gt;各个小程序的完美配合&lt;/p&gt;
&lt;p&gt;这就是 UNIX 最重要的特点了，它就是 UNIX 设计的思想。让每个程序只具有一项专门的能力，然后让它们合作。Xwindow 也继承了这种好传统。&lt;/p&gt;
&lt;p&gt;这恐怕就是 Windows 和其它操作系统望尘末及的地方了。UNIX
程序设计之统一，配合之完美，真使我难以置信！shell, grep, find, awk, sed,
make, Perl, Emacs, vi, tin, Mutt, …
它们是那么的具有一致性！你一旦学会了 sed
的正则表达式，其它程序基本上都能用了。你一旦学会了 vi 和 VIM,
你会发现它的操作是那么的有规律性，似乎 vi 的设计者在几十年前就已经设计好了
VIM 在今天的完美而统一的操作方式！而且 vi 的操作还体现在 Mutt, tin
等很多程序中。你甚至可以把 bash 设置为 vi
的输入方式来输入命令行，我就是这么做的。一个程序可以调用另外一个程序来得到数据，可以把数据交给它处理后返回来，可以在自己的窗口里“嵌入”另外一个程序。&lt;/p&gt;
&lt;p&gt;在 Windows 和其它非 UNIX 操作系统中，这种合作是非常困难的。我曾经在
Windows 下使用 Perl 来进行一些自动工作。但是 Windows
的文件操作，管道是如此的不稳定，程序之间基本不能合作。你别想在 Visual
Studio 窗口里面嵌入 UltraEdit 编辑器，你别想用一个 expect 脚本来控制
telnet 到水木清华 BBS，这就是为什么 helloooo 诞生在 Linux 而不是
Windows。我曾经试图从 Windows + Exceed + SecureCRT ssh 登录到 Sun
机器，然后通过 ssh 的隧道(X11 tunnel)把 X 程序传到 Exceed
上运行，但是搞了两天都没有成功！而在 Linux
下这个事情根本就是不用怎么配置的，OpenSSH 和 XFree86
本来就是完美结合，只要打开 ssh 的 “forward X11” 选项就什么都搞定了。&lt;/p&gt;
&lt;p&gt;Windows
的程序都是大而全，大而杂，所有的电子邮件程序都需要自己提供编辑器，自己发送和收取邮件，自己显示邮件的附件。每一个 BBS 程序都提供自己的 Virtual
Terminal, 自己的通讯代码。每一个 IDE
都自己提供编辑器，编译器，汇编器，调试器。人们为了使用一种新的程序，需要适应所有这些它提供的界面，而不能使用自己喜欢的编辑器的键绑定，菜单组织……
不能 DIY！&lt;/p&gt;
&lt;p&gt;你要知道，最高级的电脑是定做的，自己想要什么什么 CPU，什么主板，多少内存，什么硬盘，键盘，鼠标，显示器都是自己选择的。最高级的滑板，自己想要什么牌子的版面，什么牌子的沙，什么桥，什么轮子，什么轴承，也都是自己选的。最高级的乒乓球拍，木板，胶皮，海绵，胶水都是可以自己选择……
而用 Windows
程序，你得到的是大杂烩，就像你去买“品牌机”，只有那么几种配置，而且附带很多你不需要的软件和服务；就像你去买组装好的滑板，你想要大一点的轮子和窄一点的板子，但是你没有这种选择余地！Windows
程序就相当于最廉价，最次的滑板。但是它却会花你更多的钱，因为一旦一个部件坏了，或者你不喜欢了，你不能另外找一个好的换掉它，你必需重新买全套配件！&lt;/p&gt;
&lt;p&gt;而 UNIX 和 Xwindow 就是高档的“组装货”。比如我用 Mutt 的时候，我可以用
VIM 也可以用 pico 来编辑邮件，我可以用 ImageMagick 也可以用 xv
来显示附件里的图片，我可以用 lynx 把 HTML
附件转成文本嵌入窗口中，我也可以把 HTML 附件交给 Mozilla
图形显示。我可以让 GnuPG 帮我把邮件进行数字签名和加密，我也可以用其它
PGP 程序。我想让 Postfix 而不是 sendmail 帮我发出邮件，我想让 fetchmail
帮我收邮件，转发给 postfix，然后被我自己写的 Perl 过滤器处理……
这一切我都可以办到！我可以选择我最喜欢的专门的程序来完成专门的工作，然后把它们结合在一起，我也可以分别得到它们的好处。&lt;/p&gt;
&lt;p&gt;结论&lt;br&gt;
我写这么多的目的是什么？我希望喜欢 Linux 的朋友，完全清除微软和 Windows
灌输在你脑子里的谬论，别再相信它们所谓的“新技术”，别再追赶
Windows，因为追赶 Windows ＝
倒退。马克思有一个思想很重要，“新生事物并不一定是在最近出现的。”
UNIX，Xwindow, TeX 虽然都比 Windows
先出现，但是它们才是先进生产力的代表。我们要清楚的认识到什么才是真正的现代化，什么才是真正的自动化。&lt;/p&gt;
&lt;p&gt;勇敢的拿起像 bash, FVWM, VIM, Emacs, Mutt, lftp ……
这样强大的程序，不要再埋怨“Linux 为什么不能像 Windows
那样”，不要再浪费时间试用这样那样的程序，不要再忙着升级。是你需要改变而不是
Linux 和 UNIX，Linux
现在就可以成为你的好朋友。你需要认识它，了解它，信任它，才能完全的靠它来高效的工作，省出时间来处理世界上更加值得处理的事情。&lt;/p&gt;
&lt;p&gt;附录: 我用来处理日常事务的 Linux 程序&lt;/p&gt;
&lt;p&gt;这里给出一些推荐使用的可以处理一般事情的程序。至于你的专业上要用到的科学和工程软件比如
Matlab, Mathematica, Maple, HSpice, Design Compiler, ……
还有其它物理上的，化学上的，生物上的 …… 都必然有 Linux 和 UNIX
的版本。当然他们很多不是免费的，不要总是觉得什么都应该免费，它们是经过很多人辛勤劳动的产物，是可靠的程序，他们物有所值。&lt;/p&gt;
&lt;p&gt;下面列出我常用的一些 Linux
程序。一个列表里可能有很多，那是为了方便你来选择，我列出了比较信得过的。但其实很多只有第一个是我真正在用的。我不喜欢试用程序。&lt;/p&gt;
&lt;p&gt;Shell: bash。我使用 bash 的 vi 命令行方式。&lt;br&gt;
编辑器： VIM, Emacs&lt;br&gt;
程序开发： GCC, make, ld, Scheme48, j2sdk, Perl, Python, Tcl/Tk …&lt;br&gt;
论文，幻灯工具：LaTeX, ConTeXt&lt;/p&gt;
&lt;p&gt;绘图工具：MetaPost。这个语言太强了，以至于我只用它了。你不熟悉的话可以用
dia 来画一些流程图之类的图片。&lt;br&gt;
图像处理：ImageMagick。其中的 import 程序可以屏幕抓图，convert
程序可以转换图像格式，display
可以显示图片和简单编辑(缩放，换质量，转格式，简单绘图，简单虑镜)。通常我就这么点需要。如果你要更强大的图像工具可以用
Gimp, 它几乎和 Photoshop 差不多。&lt;/p&gt;
&lt;p&gt;自动管理工具：make。我可以用 make 来自动编译程序，自动编译文档，自动更新插图……
全自动，而且不会重复劳动。&lt;br&gt;
加密程序：GnuPG。我的 PGP 密钥就是它搞出来的，我用了 2048 位加密。&lt;br&gt;
打包，压缩程序。什么都有: tar, gzip, bzip2, zip, rar, …&lt;br&gt;
虚拟光驱程序。Linux 不需要虚拟光驱程序，直接 mount 就行了。&lt;br&gt;
ftp 服务器：proftpd, vsftpd&lt;br&gt;
WWW 服务器：apache。(我一般没有开)&lt;br&gt;
ftp 客户程序：lftp&lt;br&gt;
自动下载工具：wget&lt;br&gt;
虚拟终端：rxvt, xterm, gnome-terminal, mlterm, …&lt;br&gt;
X server: XFree86&lt;br&gt;
窗口管理器：FVWM。编译加入了 libstroke。&lt;br&gt;
中文输入：XSIM。被我修改过以适应 FVWM 的需要。另外推荐你还可以用
SCIM。&lt;br&gt;
email 处理：Mutt + Postfix + fetchmail&lt;br&gt;
看 PDF, PS, DJVU 文件：Acrobat Reader, xpdf, GhostScript, gv,
djvu 工具包和 netscape 插件。&lt;/p&gt;
&lt;p&gt;看 CAJ 文档。我从来不看 CAJ 之类的文档，如果找不到 PDF 或 PS，直接去图书馆借最好。&lt;br&gt;
看网页：Mozilla, Phoenix, lynx。Mozilla-Xft 的显示效果比 IE 好很多。&lt;br&gt;
英汉字典：IBM 智能词典，星际译王。&lt;br&gt;
编辑网页：我用 VIM 直接写 HTML。你如果想要图形方式的可以用其它的比如
screem, BlueFish。&lt;br&gt;
登录其它 UNIX, Linux 机器：openSSH, telnet。 openSSH 还可以把其它机器的
X 程序通过 ssh 加密的隧道传到我机器上显示。&lt;br&gt;
上 BBS：rxvt(或任何一种终端) + telnet + chatbot(helloooo 机器人的程序)&lt;br&gt;
QQ, ICQ: 我没有 QQ 或 ICQ。不过你可以用 Gaim, 它同时支持 QQ, ICQ
和很多其它的即时通信方式。ICQ 用户也可以用 Licq。&lt;br&gt;
放录像：MPlayer, RealPlayer。MPlayer 太好了，直接就可以放 VCD, DVD,
divx, wma, wmv … 用 Windows 的同学都很羡慕我，说 Windows
要放这个需要大堆插件。rm 最好还是用 realplayer 放，它也是免费的。&lt;br&gt;
放音乐： xmms(mp3,ogg 都可以), mpg321(放 mp3), ogg123(放 ogg).&lt;br&gt;
看 Word 文档。请 Word 用户把文档全部转为 PDF 或 PS
再给我，文档里没有特殊的格式就用文本文件，要不我就不看其它程序：还有很多我需要用而你不一定用得着的。比如，Doctor
Scheme, Scheme48, Scsh, …这些程序只有 Doctor Scheme
有 Windows 版本。还有很多幕后工作但是你一般不察觉的：xinetd, telnetd,
sshd, crond, atd, lpd, … 他们都比 Windows 的对应者强的多。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[搜索引擎技巧之谷歌]]></title><description><![CDATA[十个值得推荐的 Google 搜索技巧 技巧一：使用正确的方法 无论你是使用一个简单或是高级的 Google…]]></description><link>https://xdays.me/搜索引擎技巧之谷歌/</link><guid isPermaLink="false">https://xdays.me/搜索引擎技巧之谷歌/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;十个值得推荐的 Google 搜索技巧&lt;/p&gt;
&lt;p&gt;技巧一：使用正确的方法&lt;/p&gt;
&lt;p&gt;无论你是使用一个简单或是高级的 Google 搜索，在此都存在你应该使用的某种可靠的方法。遵循适当的方法你就能获得非常准确的结果；要是忽略这条建议的话，你也许就会看到大量不相关的结果或是缺乏你想要的相关结果。&lt;/p&gt;
&lt;p&gt;虽然有很多不同（且同样有效的）方法用于网络搜索，我保证这个特别的方法将能带来最棒的结果。这是一个分六步骤的过程，如下：&lt;/p&gt;
&lt;p&gt;1、首先，想好你想要寻找什么。哪些词能够最好地描述你要寻找的信息或者概念？哪些词是你能够用来替换的？有没有那些词是可以不必包括在你想要搜索的更好定义你的需求之内？&lt;/p&gt;
&lt;p&gt;2、构建你的搜索要求。使用尽可能多你所需要的关键词；越多越好。如果皆存在可能的话，试着用适当的搜索操作来使你的搜索更精炼——或者，如果你愿意的话，可以使用高级搜索页面。&lt;/p&gt;
&lt;p&gt;3、点击“搜索”按钮进行搜索。&lt;/p&gt;
&lt;p&gt;4、评估一下搜索结果页面上的匹配程度。如果一开始的结果与你想要的不一致，再精炼你的搜索要求并重新搜索——或转向更合适的搜索站点再进行搜索。&lt;/p&gt;
&lt;p&gt;5、选择你想要查看的匹配的页面，点击进行浏览。&lt;/p&gt;
&lt;p&gt;6、保存这些最符合你需求的信息。&lt;/p&gt;
&lt;p&gt;换言之，这需要你在搜索之前思考清楚，接着在获得最初结果后精炼你的搜索。这些多做的努力都是轻微的，但确实很值得。&lt;/p&gt;
&lt;p&gt;技巧二：合理利用一个“与/或”的搜索&lt;/p&gt;
&lt;p&gt;大多数的用户都没有意识到，Google 会自动假定一次搜索要求中所有的词之间都是一种“和”的关系。也就是，如果你输入两个词，它就会假定你所寻找的页面是包含这两个词的。它不会反馈给你仅包含其中一个词的页面。&lt;/p&gt;
&lt;p&gt;这就使得你无须在输入搜索要求时输入一个“和”。如果你想要搜索的包括“Bob”和“Ted”，你所需要做的就是输入 bob
ted 即可。Google 会自己假定一个“和”，并自动地将它包括在内部的索引搜索内。&lt;/p&gt;
&lt;p&gt;这与在所要求的词之间假定“或”是不同的。例如，对比输入的要求“bob
ted”（记得，这个实际上是 bob 和 ted）与“bob 或 ted”。根据第一个要求所得的结果所包含的页面会共同提到 Bob 和 Ted.而后者，结果所包
含的页面会只单独提到 Bob，也有些页面是单独提到 Ted，还有一些是共同提到他们二者的。这是一个微妙的差异，但却是很重要的。&lt;/p&gt;
&lt;p&gt;因此，如果你想要一个“与/或”的搜索——搜索包括一个或另一个词的页面，但不一定是都包括二者——你必须在两个关键词之间插入一个带有“或
者”功能的操作。当你输入这个“OR”的表示“或者”操作时，请确保所输入的要大写，否则 Google 会将它忽视为一个忽略的单词（stop
word）——也我们接下去将要讲到的。&lt;/p&gt;
&lt;p&gt;技巧三：你的搜索中包括或不包括的词&lt;/p&gt;
&lt;p&gt;关于这些“and”和“or”的词，Google 会自动地将这些在你输入的搜索要求中的不重要的、普通的词忽略掉。这些被称作是“忽略的单
词”，包括“and”、“the，”、“where”、“how”、“what”、“or”（所有字母皆为小写，还有其它一些类似的词——包括一些单独的
数字或单独的字母（例如 “a”）。&lt;/p&gt;
&lt;p&gt;在搜索中包含忽略的单词并没有什么大碍，不过会使搜索速度有些下降，这就是 Google 将它们剔
除的原因。举一个例子，你想要搜索的是“how a toaster
works”（烤箱如何工作），Google 会移除“how”和“a”两个词，并自行按新的更短的关键词“toaster
works”进行搜索。&lt;/p&gt;
&lt;p&gt;如果你想要让这些一般的词包含在你的搜索要求内，你可以通过让 Google 必须在搜索中包含这些特定的词，使它不去排除“忽略的单词”。想要做
到这点，&lt;strong&gt;你可以在你确实需要的词之前加上一个“+”符号。例如，要在搜索要求中包含“how”，你应该输入“+how”。请确保在+符号之前有一个空格
符，而不是在它之后。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;从另一方面来说，有时你会想要通过排除一些包含特定词的页面来精炼你的搜索结果。你可以通过使用一个“-”号来
去掉搜索结果中不想要包括在内的
词；&lt;strong&gt;在你的搜索要求中任何之前加上了“-”符号的词都会自动地排除在搜索结果之外。同样地，也请记住在“-”符号之前留一个空格符。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如，如果你想要搜索“bass”，你所得到的页面可能会包括男歌手一类的或是关于鱼的一类的。如果你仅向搜索的是歌手这类的页面，输入搜索要求时应如下：“bass
-fish”。&lt;/p&gt;
&lt;p&gt;技巧四：搜索近似的词&lt;/p&gt;
&lt;p&gt;幸运的是，&lt;strong&gt;Google 能够让你搜索近似的词——叫做同义词——通过使用“~”符号。只要在想要搜索的词之前加上“~”符号，Google 就会搜索所有包括这个词以及合适的近义词的页面。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如，要搜索类似“elderly”的词，输入“~elderly”，所得到的页面就会不仅是包括“elderly”这个词，还会有包括“senior”、“older”、“aged”等等词的页面。&lt;/p&gt;
&lt;p&gt;在此还有个额外的技巧：如果要只是列出近义词的页面，而不需要给出许多原先输入的那个词的页面，可以用“-”符号来连接“~”操作，例如
“~keyword
-keyword”。这样就能在近义词所得的结果中排除原先输入的词。在先前的例子中，要得到仅有“elderly”近义词的搜索结果，就输入
“~elderly -elderly”即可。&lt;/p&gt;
&lt;p&gt;技巧五：搜索特定的词组&lt;/p&gt;
&lt;p&gt;当你搜索一个特定词组时，如果你只是简单地输入词组中所有的词你是无法得到最好的结果的。Google 也许能够反馈出包含这个词组的结果，但它也会列出包含你所输入所有词的结果，却未必让这些词按照正确的顺序。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;如果你要搜索一个特定的词组，你应该将整个词组放在一个引号内。这样就能让 Google 搜索规定顺序的精确的关键词。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;例如，如果你要搜索“Monty Python”，你可以输入 monty
python 作为你的搜索要求，接着你也许会获得可接受的结果；这些结果中会包含有着“monty”和“python”两个词的页面。但这些结果并不仅是
包含了关于英国喜剧团体的页面，还包括了名叫 Monty 的蛇以及名叫 Monty 的家伙，他养了蛇来当宠物，还有其它一些包括了“monty”和
“python”的词的页面，即使它们之间看起来似乎毫无关联。&lt;/p&gt;
&lt;p&gt;为了将搜索结果限定在只关于 Monty
Python 喜剧团之内，也就是你想要搜索的页面是按规定的顺序，将这两个词作为一个词组包含在内的，你就应该在输入搜索要求时输入”monty
python”——确保这个词组在引号之内。这样的话，如果没有按照规定的顺序将这两个次匹配为一个精确的词组，这个页面就不会被列在搜索结果当中。&lt;/p&gt;
&lt;p&gt;技巧六：列出相似的页面&lt;/p&gt;
&lt;p&gt;你是否有发现过一个网页是你确实很喜欢的，又想知道是否还有与它类似的其它网页呢？不需要再疑虑地思考了；你可以使用 Google 的相关来寻
找：这个操作算符所显示的页面会与特定的页面在某些方面是相似的。例如，如果你很喜欢 InformIT 上的文章，你可以通过输入“related:&lt;a href=&quot;http://www.informit.com/&quot;&gt;http://www.informit.com&lt;/a&gt;”来寻找类似的页面。&lt;/p&gt;
&lt;p&gt;技巧七：通过其它的操作算符调整你的搜索&lt;/p&gt;
&lt;p&gt;使用相关操作算符只是众多你可用来调整 Google 搜索结果的方法之一。所有的这些输入的操作算符都是以相同的方式工作的，将这些算符作为你搜
索请求的一部分输入，再将变量紧接在这些输入的操作算符之后的冒号之后（而不是空格），就像这样：“‘操作算符’:‘变量’”。&lt;/p&gt;
&lt;p&gt;有哪些搜索的操作算符是你可以利用的呢？以下是一个简短的清单：&lt;/p&gt;
&lt;p&gt;算符 用途 用法&lt;/p&gt;
&lt;p&gt;allinanchor:
限制搜索的词语是网页中链接内包含的关键词（可使用多个关键词）
allinanchor:keyword1 keyword2&lt;/p&gt;
&lt;p&gt;allintext: 限制搜索的词语是网页内文包含的关键词（可使用多个关键词）
allintext:keyword1 keyword2&lt;/p&gt;
&lt;p&gt;allintitle: 限制搜索的词语是网页标题中包含的关键词（可使用多个关键词）
allintitle:keyword1 keyword2&lt;/p&gt;
&lt;p&gt;allinurl: 限制搜索的词语是网页网址中包含的关键词（可使用多个关键词）
inurl:keyword1 keyword2&lt;/p&gt;
&lt;p&gt;filetype: 限制所搜索的文件一个特定的格式 filetype:extension&lt;/p&gt;
&lt;p&gt;inanchor: 限制搜索的词语是网页中链接内包含的关键词 inanchor:keyword&lt;/p&gt;
&lt;p&gt;intext: 限制搜索的词语是网页内文包含的关键词 intext:keyword&lt;/p&gt;
&lt;p&gt;intitle: 限制搜索的词语是网页标题中包含的关键词 intitle:keyword&lt;/p&gt;
&lt;p&gt;inurl: 限制搜索的网页的地址 inurl:keyword&lt;/p&gt;
&lt;p&gt;site: 限制所进行的搜索在指定的域名或网站内 site:domain&lt;/p&gt;
&lt;p&gt;技巧八：搜索特定的事实&lt;/p&gt;
&lt;p&gt;如果你要搜索一些客观事实，Google 也许能够帮得上忙。是的，Google 总是能够反馈给你一个匹配你指定的搜索要求的清单，但只要你能够
正确地描述了你的搜索要求，且接着搜索的事实是 Google 已经预先鉴定了额，你就能在搜索结果页面的最顶端得到你所需要的精确信息。&lt;/p&gt;
&lt;p&gt;我们在此谈到的有哪些类型的信息呢？是一些事实性的信息，例如诞生日、诞生地、人口等等。你所需要做的就是输入你想要知道的描述事实的搜索要求。例如：&lt;/p&gt;
&lt;p&gt;要查询圣弗朗西斯科的人口，则输入“人口 圣弗朗西斯科”。&lt;/p&gt;
&lt;p&gt;要查询马克·吐温在哪里出生，则输入“出生地 马克吐温”。&lt;/p&gt;
&lt;p&gt;要查询总统比尔·克林顿什么时候出生，则输入“生日 比尔克林顿”。&lt;/p&gt;
&lt;p&gt;要查询雷蒙德·钱德勒什么时候去世，则输入“去世 雷蒙德·钱德勒”。&lt;/p&gt;
&lt;p&gt;要查询谁是德国总统，则输入“总统 德国”。&lt;/p&gt;
&lt;p&gt;这些问题的答案就会显示在搜索结果页面的顶部。你能够获根据关联的网站得应对你的疑问的正确答案。点击相关的链接还能从这个资源里获悉更多的东西。&lt;/p&gt;
&lt;p&gt;技巧九：搜索 Google Directory&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Google 在它的搜索数据库中将成千上万的网页索引化——这就能使得不会产生压倒性数量的搜索结果。量确实已经够了，但有时你也许会更愿意得到一些高质量的结果。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;由于质量较数量更为重要，就可以绕过主要的 Google 搜索引擎而使用 Google
Directory 来代替。Google
Directory 是一个网页清单相对较小的数据库，它们都是通过一个人工编辑团队手动精心挑选的。Google
Directory 是有被注释和组织到相关的话题类目下的。你可以通过类目来浏览网页目录，或是搜索指定的项目。&lt;/p&gt;
&lt;p&gt;Google Directory 是一个可用来搜索大量 Google 网页索引实用选择。Google
Directory 的结果比起你在更大的搜索索引范围中的搜索结果更为集中且高质，也能够帮助你在任何给定的类目下更好地认识什么是可用的信息。另外，如
果你喜欢，你也可以利用浏览类目来替代搜索。&lt;/p&gt;
&lt;p&gt;要进入 Google
Directory，点击 Google 主页上的“更多”链接，在接下来的页面中选择类别。当然，你也可以直接进入 Google 的 Directory，只要在浏览器中输入 directory.google.com 即可。&lt;/p&gt;
&lt;p&gt;技巧十：使用 Google 的其它专业搜索&lt;/p&gt;
&lt;p&gt;Google
Directory 不仅仅是 Google 所提供的除了主搜索引擎之外的唯一选择。根据你所做的搜索类型，你也可以通过使用其中 Google 更为专业的搜索站点之一来得到更好的结果。它们包括：&lt;/p&gt;
&lt;p&gt;Froogle 可以用来搜索那些有着最低价格的特定商品的在线购物网站。&lt;/p&gt;
&lt;p&gt;Google
Answers 所提供的服务是直接让你的搜索需求面向专业人员的小组，大多数都是用于当你有着更为复杂的问题，而无法通过简单的搜索来解答的时候。&lt;/p&gt;
&lt;p&gt;Google Apple Macintosh
Search 主要是在 apple.com 域名中以及和其它与&lt;a href=&quot;http://product.pchome.net/mobile_phone/list_3_236_105.html&quot; title=&quot;苹果&quot;&gt;苹果&lt;/a&gt;相关的站点进行搜索。&lt;/p&gt;
&lt;p&gt;Google Blog Search 是用来搜索博客和博客文章的。&lt;/p&gt;
&lt;p&gt;Google Book
Search 可以搜索成千上万的小说和非&lt;a href=&quot;http://book.pchome.net/&quot; title=&quot;小说&quot;&gt;小说&lt;/a&gt;类图书的全文。&lt;/p&gt;
&lt;p&gt;Google BSD UNIX
Search 可以搜索到大量专门为 BSD 版本的 UNIX 操作系统专业化的站点。&lt;/p&gt;
&lt;p&gt;Google GroUPS 可以搜索到 Google Groups 档案的相关文章。&lt;/p&gt;
&lt;p&gt;Google Linux Search 用来搜索大量与 Linux 相关的网站。&lt;/p&gt;
&lt;p&gt;Google Microsoft
Search 可以搜索主要是 microsoft.com 域名中的内容以及其它&lt;a href=&quot;http://product.pchome.net/diy_mouse/list_8_86_616.html&quot; title=&quot;微软&quot;&gt;微软&lt;/a&gt;相关的站点。&lt;/p&gt;
&lt;p&gt;Google
News 可用来搜索大量有最新新闻和头条的新闻网站，也能够搜索历史的新闻资料，一直可以追溯到两个世纪之前。&lt;/p&gt;
&lt;p&gt;Google
Scholar 在一个有着学术杂志、文章、报纸、论文和书籍的数据库中进行搜索，也能够选择大学或研究书库。&lt;/p&gt;
&lt;p&gt;Google U.S. Government
Search 是用来搜索那些美国政府的网站——这是一个最好的用来搜索官方性政府举措、信息、报告等等的地方。&lt;/p&gt;
&lt;p&gt;Google University
Search 能在一个有着超过 600 所大学网站的数据库中进行搜索——能够用来查询课程安排、入学资料等等。&lt;/p&gt;
&lt;p&gt;本文转自：&lt;a href=&quot;http://article.pchome.net/content-400240-1.html&quot;&gt;http://article.pchome.net/content-400240-1.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[搜索引擎技巧之百度]]></title><description><![CDATA[官方高级技巧： 网页标题通常是对网页内容提纲挈领式的归纳。把查询内容范围限定在网页标题中，有时能获得良好的效果。使用的方式，是把查询内容中，特别关键的部分，用“intitle:”领起来。 例如，找林青霞的写真，就可以这样查询：写真
intitle:林青霞 注意，intitle…]]></description><link>https://xdays.me/搜索引擎技巧之百度/</link><guid isPermaLink="false">https://xdays.me/搜索引擎技巧之百度/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;官方高级技巧：&lt;/p&gt;
&lt;li&gt;
把搜索范围限定在网页标题中——intitle
&lt;p&gt;网页标题通常是对网页内容提纲挈领式的归纳。把查询内容范围限定在网页标题中，有时能获得良好的效果。使用的方式，是把查询内容中，特别关键的部分，用“intitle:”领起来。&lt;br&gt;
例如，找林青霞的写真，就可以这样查询：&lt;a href=&quot;http://www.baidu.com/s?wd=%D0%B4%D5%E6%20intitle:%C1%D6%C7%E0%CF%BC&quot;&gt;写真
intitle:林青霞&lt;/a&gt;&lt;br&gt;
注意，intitle:和后面的关键词之间，不要有空格。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
把搜索范围限定在特定站点中——site
&lt;p&gt;有时候，您如果知道某个站点中有自己需要找的东西，就可以把搜索范围限定在这个站点中，提高查询效率。使用的方式，是在查询内容的后面，加上“site:站点域名”。&lt;br&gt;
例如，天空网下载软件不错，就可以这样查询：&lt;a href=&quot;http://www.baidu.com/s?wd=msn%20site:skycn.com&quot;&gt;msn
site:skycn.com&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注意，“site:”后面跟的站点域名，不要带“http://”；另外，site:和站点名之间，不要带空格。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
把搜索范围限定在url链接中——inurl
&lt;p&gt;网页 url 中的某些信息，常常有某种有价值的含义。于是，您如果对搜索结果的 url 做某种限定，就可以获得良好的效果。实现的方式，是用“inurl:”，后跟需要在 url 中出现的关键词。&lt;br&gt;
例如，找关于 photoshop 的使用技巧，可以这样查询：&lt;a href=&quot;http://www.baidu.com/s?wd=photoshop%20inurl:jiqiao&quot;&gt;photoshop
inurl:jiqiao&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上面这个查询串中的“photoshop”，是可以出现在网页的任何位置，而“jiqiao”则必须出现在网页 url 中。&lt;br&gt;
注意，inurl:语法和后面所跟的关键词，不要有空格。&lt;br&gt;
&lt;strong&gt;&lt;a name=&quot;0904&quot;&gt;&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
精确匹配——双引号和书名号
&lt;p&gt;如果输入的查询词很长，百度在经过分析后，给出的搜索结果中的查询词，可能是拆分的。如果您对这种情况不满意，可以尝试让百度不拆分查询词。给查询词加上双引号，就可以达到这种效果。&lt;/p&gt;
&lt;p&gt;例如，搜索  &lt;a href=&quot;http://www.baidu.com/s?wd=%E4%B8%8A%E6%B5%B7%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6&quot;&gt;上海科技大学&lt;/a&gt;
，如果不加双引号，搜索结果被拆分，效果不是很好，但加上双引号后，&lt;a href=&quot;http://www.baidu.com/s?wd=%E2%80%9C%E4%B8%8A%E6%B5%B7%E7%A7%91%E6%8A%80%E5%A4%A7%E5%AD%A6%E2%80%9D&quot;&gt;“上海科技大学”&lt;/a&gt;，获得的结果就全是符合要求的了。&lt;/p&gt;
&lt;p&gt;书名号是百度独有的一个特殊查询语法。在其他搜索引擎中，书名号会被忽略，而在百度，中文书名号是可被查询的。加上书名号的查询词，有两层特殊功能，一是书名号会出现在搜索结果中；二是被书名号扩起来的内容，不会被拆分。
书名号在某些情况下特别有效果，例如，查名字很通俗和常用的那些电影或者小说。比如，查电影“&lt;a href=&quot;http://www.baidu.com/s?wd=%E6%89%8B%E6%9C%BA&quot;&gt;手机&lt;/a&gt;”，如果不加书名号，很多情况下出来的是通讯工具——手机，而加上书名号后，&lt;a href=&quot;http://www.baidu.com/s?wd=%E3%80%8A%E6%89%8B%E6%9C%BA%E3%80%8B&quot;&gt;《手机》&lt;/a&gt;结果就都是关于电影方面的了。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
要求搜索结果中不含特定查询词
&lt;p&gt;如果您发现搜索结果中，有某一类网页是您不希望看见的，而且，这些网页都包含特定的关键词，那么用减号语法，就可以去除所有这些含有特定关键词的网页。&lt;/p&gt;
&lt;p&gt;例如，搜  &lt;a href=&quot;http://www.baidu.com/s?wd=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3&quot;&gt;神雕侠侣&lt;/a&gt;，希望是关于武侠小说方面的内容，却发现很多关于电视剧方面的网页。那么就可以这样查询：&lt;a href=&quot;http://www.baidu.com/s?wd=%E7%A5%9E%E9%9B%95%E4%BE%A0%E4%BE%A3%20-%E7%94%B5%E8%A7%86%E5%89%A7&quot;&gt;神雕侠侣 -电视剧&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;注意，前一个关键词，和减号之间必须有空格，否则，减号会被当成连字符处理，而失去减号语法功能。减号和后一个关键词之间，有无空格均可。&lt;/p&gt;
&lt;/li&gt;
技巧总结：
&lt;li&gt;
『』查找论坛版块
&lt;p&gt;百度作为国人自己开发的搜索引擎，支持的中文标点符号最多。如果时常琢磨，就能发现一些奇妙的用处。『』是直行双引号。&lt;br&gt;
检索式形式如： 『论坛版块名称』&lt;br&gt;
实例：『影视交流』&lt;br&gt;
『美女图片』&lt;br&gt;
『超级女声』&lt;br&gt;
注意：『』用软键盘输入&lt;/p&gt;
&lt;/li&gt;</content:encoded></item><item><title><![CDATA[我的2009]]></title><description><![CDATA[今天是今年在学校呆的最后一天，基本上是在宿舍用上网来度过的。心里有种莫名的感觉，我想我应该写点什么来结束我的 200…]]></description><link>https://xdays.me/我的2009/</link><guid isPermaLink="false">https://xdays.me/我的2009/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;今天是今年在学校呆的最后一天，基本上是在宿舍用上网来度过的。心里有种莫名的感觉，我想我应该写点什么来结束我的 2009 了。&lt;/p&gt;
&lt;p&gt;翻开日志发现今年我很少写东西了，因为忙碌。只因这学期的开始我的决定，不会放弃机械但继续追随计算机，用做一件事的时间去做两件事情。我为自己选择了一条不一样的路，虽坎坷但充满了乐趣。既然是 2009 的结束了，那我应该记下些什么留待以后回忆吧！刚才出去买明天火车上的“午饭”的时候我就想今年有什么值得我写呢？首先想到的还是爱情，虽然现在看来它是那么的苍白。我很庆幸，我基本上从所谓的失恋中走出来了，不在消极不在怨恨不再心痛，对此也不想再多谈，有些事情真的只适合留在自己心里。另外，关于本专业，我终于没有那么狂妄，那种“大一发现好好学习没用，大二发现不好好学习也没用”的想法，终究在经历了挫败之后让我感到发自内心的自责。我当初的选择十部是盲目的错误的都已经不重要了，因为我没有再来一次的机会。于是我决定重新捡起我丢下的机械，给自己一条退路，毕竟如果我败了还不至于一无是处。今天成绩出来了，七十分到八十分之间，有些失落。对本专业给自己一个评价：我已经把它放在心上，却没有把心用在它上。剩下的就是我和我的计算机梦了，学期初去了网络中心，暑假学习 linux 架设服务器的部分东西，了解并打算开始学习思科，其间看了计算机网络这门专业课，最近又转向了网页制作。先说说网络中心的工作心得，我当初加入的初衷是对的，这不是一个学习的地方而是一次锻炼自己表达能力的机会，插拔网线和做水晶头基本上是我们需要的所有的技术。但是我觉得修网过程中能和用户（大部分是老师）说清楚是一种表达能力，接电话能让对方满意让自己舒服也需要锻炼，这也许是这学期我在网络中心的收获吧。此外，在我写我为我的梦想所做的事的时候发现，我的计算机梦仍然是盲目的。这也许是问题所在，也是理所当然。不知道这次选择了网页制作后会不会又有其他的事情让我继续盲目下去，但自始自终我不曾放弃，放弃那个梦。尽管曾经或者将来继续盲目，我会一如既往前行，因为当我做我想做的事情我是幸福的，我一直这么感觉。写到这里近 11 点了，该收拾东西准备明天回家了。&lt;/p&gt;
&lt;p&gt;我的 2009 就这样过去了，没有波澜，没有激情，没有爱情…&lt;/p&gt;</content:encoded></item><item><title><![CDATA[硬盘安装流行linux发行版]]></title><description><![CDATA[概述 比较流行的发行版本每隔一段时间都推出一个版本，不知不觉我也成了最求“时尚”的 linux 发烧友(虽然我最初的目的不在此))，每推出一个新版本总要试它一把。无奈没有刻录机还要花钱买空盘，刻盘无数消费也不低。于是最近突发总结硬盘安装 linux…]]></description><link>https://xdays.me/硬盘安装流行linux发行版/</link><guid isPermaLink="false">https://xdays.me/硬盘安装流行linux发行版/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;比较流行的发行版本每隔一段时间都推出一个版本，不知不觉我也成了最求“时尚”的 linux 发烧友(虽然我最初的目的不在此))，每推出一个新版本总要试它一把。无奈没有刻录机还要花钱买空盘，刻盘无数消费也不低。于是最近突发总结硬盘安装 linux 通用方法的想法，特此记录…&lt;/p&gt;
&lt;h3&gt;硬盘安装方法&lt;/h3&gt;
&lt;h4&gt;硬盘安装 fedora11&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;下载 grub4dos 文件（引导安装程序启动），将其中的 grldr、grub 和 menu.lst
复制到 C 盘&lt;/li&gt;
&lt;li&gt;改变 menu.lst 的内容，在最后加上：&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;title Install Fedora11
root (hd0,4)
kernel (hd0,4)/LiveOS/vmlinuz0 root=/dev/sda5 ro liveimg rhgb
initrd (hd0,4)/LiveOS/initrd0.img
#注意这里的/dev/sda5和(hd0,4)是kernel对应的分区，最好是fat32，ntfs不清楚。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;解压 livecd 中的 LiveOS 文件夹到对应的根分区下，并且把 vmlinuz0 和 initrd0.img 文件放到 LiveOS 目录下。&lt;/li&gt;
&lt;li&gt;打开 BOOT.INI ，在末尾填上 c:grldr=“GRUB4DOS”&lt;/li&gt;
&lt;li&gt;重启，安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;硬盘安装 ubuntu9.10&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;下载 grub4dos 文件（引导安装程序启动），将其中的 grldr、grub 和 menu.lst
复制到 C 盘&lt;/li&gt;
&lt;li&gt;改变 menu.lst 的内容，在最后加上&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt; title Install ubuntu9.10
 root (hd0,4)
 kernel (hd0,4)/vmlinuz boot=casper iso-scan/filename=/ubuntu-9.10-desktop-i386.iso ro quiet splash locale=zh_CN.UTF-8
 initrd (hd0,4)/initrd.lz
 #注意这里的(hd0,4)是kernel对应的分区，支持ntfs文件系统。&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;解压出 iso 文件中的 casper 目录下的 vmlinuz 和 initrd.lz 文件并且将这三个文件一并放到对应的分区的根目录下。&lt;/li&gt;
&lt;li&gt;打开 BOOT.INI ，在末尾填上 c:grldr=“GRUB4DOS”&lt;/li&gt;
&lt;li&gt;重启，安装。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;总结&lt;/h3&gt;
&lt;p&gt;其实各个版本的安装过程没有太大差别，都是先安装 grub4dos 在用其去引导内核，然后向内核传递响应的参数，使内核引导起来系统安装程序，最后开始安装。而问题的关键也就在，该向内核传递什么参数，具体不懂希望学习。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[简易vsftp搭建]]></title><description><![CDATA[一直以来都想总结一下关于 vsftp 搭建 ftp 的相关内容，今天历尽辛苦终于算是完成了一些基本的配置，在此记下以留作以后参考。 协议 首先，讨论一下 ftp 协议的主动模式和被动模式： 下面的内容主要参考一篇洋文：http://slacksite.com/other/ftp…]]></description><link>https://xdays.me/简易vsftp搭建/</link><guid isPermaLink="false">https://xdays.me/简易vsftp搭建/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;一直以来都想总结一下关于 vsftp 搭建 ftp 的相关内容，今天历尽辛苦终于算是完成了一些基本的配置，在此记下以留作以后参考。&lt;/p&gt;
&lt;h1&gt;协议&lt;/h1&gt;
&lt;p&gt;首先，讨论一下 ftp 协议的主动模式和被动模式：&lt;/p&gt;
&lt;p&gt;下面的内容主要参考一篇洋文：&lt;a href=&quot;http://slacksite.com/other/ftp.html&quot;&gt;http://slacksite.com/other/ftp.html&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;主动模式：&lt;/p&gt;
&lt;p&gt;1）客户端随即开启一个大于 1024 的端口连接服务器端的 21 号端口建立连接 1，连接成功就可以下达命令。&lt;br&gt;
2）当需要传送数据时，客户端通过连接 1 告诉服务器，客户端在端口 N 上监听。&lt;br&gt;
3）服务器通过 20 号端口与端口 N 连接建立连接 2。&lt;br&gt;
4）客户端与服务器用这两个连接传送命令和数据。&lt;/p&gt;
&lt;p&gt;被动模式：&lt;/p&gt;
&lt;p&gt;1）客户端随即开启一个大于 1024 的端口连接服务器端的 21 号端口建立连接 1，连接成功就可以下达命令。
2）当需要传送数据时，客户端通过连接 1 告诉服务器要通过被动模式建立连接 2。&lt;br&gt;
3）服务器启动特定范围内的一个端口 S 监听并告知客户端。&lt;br&gt;
4）客户端通过大于 1024 的随进端口，连接服务器的端口 S，从而建立连接 2。&lt;br&gt;
5）客户端与服务器用这两个连接传送命令和数据。&lt;/p&gt;
&lt;p&gt;为什么有主动没动模式之分？&lt;/p&gt;
&lt;p&gt;问题的关键就在防火墙上，防火墙一般是阻止外部端口主动连接的。所以可以看出主动模式基本上都被客户端的防火墙做掉了，而被动连接会被服务器的防火墙解决
掉（如果不采取措施）。但是在服务器上下手总比在客户端上下手合理，它本来就是为客户端服务的嘛。所以就采用被动模式，服务器端的解决办法，就是让防火墙
允许连接向特定端口的数据包通过。&lt;/p&gt;
&lt;p&gt;接下来把重点放在 vsftp 上，我这里搭建的一个很小的环境内的 ftp 服务器，只有基础设置的一些特别需要注意的地方，更为复杂的设置暂时用不到也就不去学习了，学以致用嘛。&lt;/p&gt;
&lt;h1&gt;安装&lt;/h1&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sudo apt-get install vsftpd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h2&gt;匿名登录&lt;/h2&gt;
&lt;p&gt;匿名登录(不要放到公网)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;anonymous_enable=YES
write_enable=YES
anon_umask=022
anon_upload_enable=YES
anon_mkdir_write_enable=YES
anon_other_write_enable=YES
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
listen=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;关于目录权限&lt;/p&gt;
&lt;p&gt;默认 vsftpd 是不允许根目录有写的权限的，所以要自己建立一个对 ftp（匿名用户的权限用户）有写的权限的目录。如下所示：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;drwxr-xr-x 2 ftp ftp 4096 Apr 11 11:26 pub-writable&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;关于配置匿名上传和下载的几个注意点：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;ftp 的匿名用户在 linux 系统内是 ftp 用户&lt;/li&gt;
&lt;li&gt;匿名用户的默认 umask 是 077，这说明 如果你要上传一个目录上去，连你自己都看不到你自己上传的东西，所以必须将它改成 022&lt;/li&gt;
&lt;li&gt;selinux 策略也会影响到匿名用户的上传功能（/etc/selinux/config 中把 enforcing 修改成 disabled）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;总之，权 限方面的设置是一个很关键的问题，包括 selinux 规则，系统用户权限和 vsftpd 配置，必须仔细考虑才能成功。&lt;/p&gt;
&lt;h2&gt;本地用户&lt;/h2&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;local_enable=YES
write_enable=YES
local_umask=022
dirmessage_enable=YES
xferlog_enable=YES
connect_from_port_20=YES
xferlog_std_format=YES
chroot_local_user=YES   //限制本地用户根目录
local_root=/var/ftp/pub    //限制本地用户根目录到特定目录
chroot_list_enable=YES
chroot_list_file=/etc/vsftpd/chroot_list  
//这两项设置不再限制范围内的用户
listen=YES

pam_service_name=vsftpd
userlist_enable=YES
tcp_wrappers=YES&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;注意：本地用户需要设置的很少，为了安全需要把本地用户限制在其家里或者特定目录下，
&lt;code class=&quot;language-text&quot;&gt;chroot_list_enable&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;local_root&lt;/code&gt;, &lt;code class=&quot;language-text&quot;&gt;chroot_list_enable&lt;/code&gt; 三个设置项相当重要。&lt;/p&gt;
&lt;h2&gt;虚拟用户&lt;/h2&gt;
&lt;p&gt;也就是说用户并不对应于系统用户，每个用户也可以有自己的独立目录&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;listen=YES
anonymous_enable=NO
local_enable=YES
write_enable=YES
local_umask=022
local_root=/web/www
chroot_local_user=YES
allow_writeable_chroot=YES
hide_ids=YES
user_config_dir=/web/vsftpd
guest_enable=YES
virtual_use_local_privs=YES
nopriv_user=www-data
guest_username=www-data&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;密码文件&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt-get install -y apache2-utils
htpasswd -c -p -b /web/vsftpd/passwd user1 $(openssl passwd -1 -noverify your-password-here)&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;安装 PAM 相关依赖&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;apt install -y libpam-pwdfile&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;修改 pam 配置&lt;code class=&quot;language-text&quot;&gt;/etc/pam.d/vsftpd&lt;/code&gt;，使其通密码文件来验证用户&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;auth required pam_pwdfile.so pwdfile /web/vsftpd/passwd
account required pam_permit.so&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;添加每个用户的特定配置，这里主要配置用户目录&lt;/p&gt;
&lt;p&gt;添加&lt;code class=&quot;language-text&quot;&gt;/web/vsftpd/user1&lt;/code&gt;，内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;local_root=/web/www/&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;最后，更改目录权限:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;chown -R www-data:www-data /web/www&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;systemctl restart vsftpd&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;h1&gt;其他&lt;/h1&gt;
&lt;p&gt;Selinux 的权限设置&lt;/p&gt;
&lt;p&gt;如果是 Redhat 系的系统，vsftpd 和系统权限设置均没有问题，但是无法列举目录下的内容，google 了一下有了思路，selinux 的默认权限不允许 ftp 传输，这里直接修改/etc/selinux/config 文件内容如下：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;SELINUX=disabled&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;参考文档：&lt;a href=&quot;http://bbs.chinaunix.net/thread-561183-1-1.html#&quot;&gt;http://bbs.chinaunix.net/thread-561183-1-1.html#&lt;/a&gt; （很全面）&lt;/p&gt;</content:encoded></item><item><title><![CDATA[网络中心面试旁听]]></title><description><![CDATA[…]]></description><link>https://xdays.me/网络中心面试旁听/</link><guid isPermaLink="false">https://xdays.me/网络中心面试旁听/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;昨天小刚打电话说网络中心纳新，晚上面试。我一听高兴，从来都是被别人面试今天终于可以面试一把别人了。&lt;/p&gt;
&lt;p&gt;匆匆吃完晚饭，六点半感到面试教室。还没来几个人，百川在最后一排站着。我过去和他聊了一会儿。七点左右，小刚，徐超他们都过来了。这时候我才知道让我来是来旁听的，学习他们怎么面试的，不禁有些失望，不过既然来了就要好好学习一下。&lt;/p&gt;
&lt;p&gt;大致的流程是这样的：&lt;br&gt;
1.每位来面试者在黑板上写下自己的名字和学院，然后做个自我介绍。&lt;br&gt;
2.面试官提问问题，根据自我介绍和回答打分，分技术和综合两部分。&lt;br&gt;
3.面试官讨论面试者的去留，公布结果。&lt;br&gt;
4.初试通过者签字留下联系电话。&lt;/p&gt;
&lt;p&gt;这个几个环节中最应该学习的就是提问问题了，我大致记了一下他们问的问题，也算是学习了。问题如下：&lt;/p&gt;
&lt;p&gt;1.有没有电脑，如果有说一下自己的配置。&lt;br&gt;
2.课多不多，一周有几节课，业余时间充足不充足。&lt;br&gt;
3.自己用不用校园网，对校园网了解多少，校园网的拓扑结构。&lt;br&gt;
4.看过多少计算机方面的书，大致说说。&lt;br&gt;
5.如果自己的电脑上不去网了，自己想没想过去解决，怎么解决。&lt;br&gt;
6.网络中心负责哪些事物，主要工作是做什么。&lt;br&gt;
7.网线内有几根线，大致线序。&lt;br&gt;
8.会不会重转系统，重装系统钱需要考虑哪些问题。&lt;br&gt;
9.假如你接电话，一个老师说话很冲，很难听你怎么解决。&lt;br&gt;
10.电脑上有哪些系统。&lt;/p&gt;
&lt;p&gt;另外我自己想到两个问题，觉得还不错：&lt;/p&gt;
&lt;p&gt;1.说一下路由器，交换机和集线器的区别。&lt;br&gt;
2.接触网络多久了，有没有上传过东西。&lt;br&gt;
3.如果用过 linux 就谈谈对开源的理解。&lt;/p&gt;
&lt;p&gt;当然，中间也闹了一些笑话，比如说一挺漂亮女生上台“背”了一些网络的知识，当问她如果上不去网怎么办，她的回答很干脆，给网络中心打电话~~
很明显，她掉陷阱里了，呵呵！虽然仅仅是一次简单的面试，但是还是学到了一些东西。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[运动心得]]></title><description><![CDATA[打一晚上台球,总结三个步骤: 1)将杆与两球确定的直线重合 2)根据球进袋的角度调整杆的偏移角度 3)根据距离掌握好力度 后两个步骤需要时间积累经验 篮球深得文卿指教： 1)屈膝，传递力量 2)抬头，瞄准 3)压腕，最重要的一点，试着手腕发力，这是最重要的]]></description><link>https://xdays.me/运动心得/</link><guid isPermaLink="false">https://xdays.me/运动心得/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;打一晚上台球,总结三个步骤:&lt;/p&gt;
&lt;p&gt;1)将杆与两球确定的直线重合&lt;/p&gt;
&lt;p&gt;2)根据球进袋的角度调整杆的偏移角度&lt;/p&gt;
&lt;p&gt;3)根据距离掌握好力度&lt;/p&gt;
&lt;p&gt;后两个步骤需要时间积累经验&lt;br&gt;
篮球深得文卿指教：&lt;/p&gt;
&lt;p&gt;1)屈膝，传递力量&lt;/p&gt;
&lt;p&gt;2)抬头，瞄准&lt;/p&gt;
&lt;p&gt;3)压腕，最重要的一点，试着手腕发力，这是最重要的&lt;/p&gt;</content:encoded></item><item><title><![CDATA[个人知识管理的29个原则]]></title><description><![CDATA[1、持续的学习是个人生存和发展的基础。 2、信息和知识爆炸，在一段时间和时期内，学习的内容必须聚焦。起码要在一个领域内成为专家。 3、你应该学习的内容取决于你的价值观、特长、个性和目标。…]]></description><link>https://xdays.me/个人知识管理的29个原则/</link><guid isPermaLink="false">https://xdays.me/个人知识管理的29个原则/</guid><pubDate>Sun, 06 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;1、持续的学习是个人生存和发展的基础。&lt;/p&gt;
&lt;p&gt;2、信息和知识爆炸，在一段时间和时期内，学习的内容必须聚焦。起码要在一个领域内成为专家。&lt;/p&gt;
&lt;p&gt;3、你应该学习的内容取决于你的价值观、特长、个性和目标。&lt;/p&gt;
&lt;p&gt;4、你必须学会如何有效的评估信息和知识，所以你必须根据你的价值观、特长、个性和目标确立自己对信息和知识的“过滤器”；&lt;/p&gt;
&lt;p&gt;5、人是知识获取的重要渠道，所以你应该知道谁最擅长什么？遇到问题时知道可以向谁学习和请教；&lt;/p&gt;
&lt;p&gt;6、你牛了你的朋友也一定牛，建立人际资源的基础是自己的知识基础、个性和激情、自己优势的合理展示和帮助别人的意愿；&lt;/p&gt;
&lt;p&gt;7、人际关系需要维护；捷径是找到那些愿意共享自己朋友资源的人，你也应该做这样的人；&lt;/p&gt;
&lt;p&gt;8、信息如果不经过处理，不能称为知识。所以你存储的知识起码你应该简单看过、知道是在讲什么；&lt;/p&gt;
&lt;p&gt;9、信息和知识存储前应该尽可能做规范化的工作，例如你做的摘要、感触、觉得最有价值的部分、将来能做什么用等等；&lt;/p&gt;
&lt;p&gt;10、建立自己的分类字典，而不是每次想起什么就建立什么样的文件夹或者标签。分类字典，持之以恒坚持，适当调整；&lt;/p&gt;
&lt;p&gt;11、知识存储中分类不宜过宽，过宽则等于没有分类；分类不宜过深，过深后你就不会再去看；&lt;/p&gt;
&lt;p&gt;12.充分利用各种工具，尤其是 web2.0 工具做知识存储和获取工作；&lt;/p&gt;
&lt;p&gt;13.知识存储时适当共享，听取和收集别人的意见和建议；&lt;/p&gt;
&lt;p&gt;14、有意识的做知识显性化的工作，既方便知识传播也促进知识学习和建立人际网络；&lt;/p&gt;
&lt;p&gt;15、知识传播中必须考虑传播的方式和效率；&lt;/p&gt;
&lt;p&gt;16、不能用简单朴素的语言表述的知识证明你还没有深入理解；&lt;/p&gt;
&lt;p&gt;17、多用举例子、讲故事的方法传播你的知识、见解。这个过程是你对知识的再深化过程；&lt;/p&gt;
&lt;p&gt;18、你的知识传播的越广，你的影响力越大；&lt;/p&gt;
&lt;p&gt;19、你的目的决定了你知识利用的方式。如果目的是要写论文，则你的知识就是明确、简洁的表达；如果是想要在市场上销售，就必须产品化、规范化或者专利化；&lt;/p&gt;
&lt;p&gt;20、知识本身没有价值，只有被利用时才能展现其价值；&lt;/p&gt;
&lt;p&gt;21、知识必须跟任务、项目结合起来才能发挥作用；&lt;/p&gt;
&lt;p&gt;22、单独的一个主题的知识很难被很好的利用，所以你必须将你的知识融入团队中或者找到自己的合作伙伴；&lt;/p&gt;
&lt;p&gt;23、知识创新最简单的方法是总结和分析；&lt;/p&gt;
&lt;p&gt;24、知识创新是一种习惯；&lt;/p&gt;
&lt;p&gt;25、学习或者实践—总结—-将总结出来的内容投入实践检验和请行家批评―继续总结和实践；&lt;/p&gt;
&lt;p&gt;26、不能光做，还要思考；&lt;/p&gt;
&lt;p&gt;27、个人竞争力的源泉不是你现在知道的或者掌握的，而是你选择方向和快速学习的能力，是你能够将知识用足用好的能力；&lt;/p&gt;
&lt;p&gt;28、环境造就人，太安逸的环境对个人的发展弊大于利。如果不能找到好的环境，那就自己给自己压力；&lt;/p&gt;
&lt;p&gt;29、既要会做，也要会展示自己做的，要有树立个人品牌的意识。&lt;/p&gt;
&lt;p&gt;来源：田志刚——个人知识管理的 29 个原则&lt;br&gt;
本文来源于：左岸读书_blog
,原文地址：&lt;a href=&quot;http://www.zreading.cn/archives/1313.html&quot;&gt;http://www.zreading.cn/archives/1313.html&lt;/a&gt;&lt;/p&gt;</content:encoded></item><item><title><![CDATA[CMD更改多个文件夹的系统属性]]></title><description><![CDATA[这个批处理放在哪运行,就把哪当前的所有子目录去掉系统属性.. 在 cmd 命令提示符下(对当前命令提示符的目录进行操作)]]></description><link>https://xdays.me/CMD更改多个文件夹的系统属性/</link><guid isPermaLink="false">https://xdays.me/CMD更改多个文件夹的系统属性/</guid><pubDate>Sat, 05 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;@echo off
for /d /r %%a in (*) do attrib -s &quot;%%a&quot;
pause&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这个批处理放在哪运行,就把哪当前的所有子目录去掉系统属性..&lt;/p&gt;
&lt;p&gt;在 cmd 命令提示符下(对当前命令提示符的目录进行操作)&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;for /d /r %a in (*) do attrib -s &quot;%a&quot;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content:encoded></item><item><title><![CDATA[Linux 账户设置]]></title><description><![CDATA[概述 有关用户帐户的配置文件主要有：/etc/passwd  /etc/shadow  /etc/group
/etc/gshadow，因为里面的一些栏目较多不容易记忆，这里总结一下以作备用。 /etc/passwd 截取两行: 解释如下： 用户名
：UID：GID…]]></description><link>https://xdays.me/Linux-账户设置/</link><guid isPermaLink="false">https://xdays.me/Linux-账户设置/</guid><pubDate>Sat, 05 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;概述&lt;/h3&gt;
&lt;p&gt;有关用户帐户的配置文件主要有：/etc/passwd  /etc/shadow  /etc/group
/etc/gshadow，因为里面的一些栏目较多不容易记忆，这里总结一下以作备用。&lt;/p&gt;
&lt;h3&gt;/etc/passwd&lt;/h3&gt;
&lt;p&gt;截取两行:&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;解释如下：&lt;br&gt;
用户名
：UID：GID（初始用户组，有效用户组用 groups 查看）：详细信息：家目录：shell 类型&lt;/p&gt;
&lt;h3&gt;/etc/shadow&lt;/h3&gt;
&lt;p&gt;截取两行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;sabayon:!!:14728:0:99999:7:::
 ease:$1$jp36MzdS$VjeTYbbtxe45vbkr9QK581:14728:0:99999:7:::&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;解释如下：&lt;/p&gt;
&lt;p&gt;用户名：密码（如!!是没有设密码，如!是被锁定）：更改密码日期：密码不可更改天数：密码需要重新更改天数：密码更改期限前的警告期限：密码过期的宽限时间：帐号失效日期：保留&lt;/p&gt;
&lt;p&gt;注意：这里的日期是一个相对天数，相对于 1970.1.1 这一天。（通常用 chage
－ldmMIE 显示和设置）&lt;/p&gt;
&lt;h3&gt;/etc/group&lt;/h3&gt;
&lt;p&gt;截取两行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ease:x:500:
oprofile:x:16:&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;解释如下：&lt;br&gt;
组名：密码：GID：组内成员&lt;/p&gt;
&lt;h3&gt;/etc/gshadow&lt;/h3&gt;
&lt;p&gt;截取两行：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;gdm:x::
sabayon:x::&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;解释如下：&lt;/p&gt;
&lt;p&gt;组名：密码（!表示不能登录）：管理员：组内成员&lt;/p&gt;
&lt;p&gt;另外再说明初始用户组和有效用户组的区别：初始用户组在/etc/passwd 中说明；有效用户组用 groups 查看，建立文档时用有效用户组，更改有效用户组用 newgrp 命令。&lt;/p&gt;</content:encoded></item><item><title><![CDATA[Windows网络命令]]></title><description><![CDATA[ping ping 命令用法和功能比较简单，主要总结 ping 不通的原因： 1.最常见的就是对方开防火墙给过滤掉了。 2.错误的 ip 地址设置，如果两个接口设置的 ip 地址在同一个网段，主机不知道从哪个接口发出数据包。 ipconfig 比较常用的选项有/all…]]></description><link>https://xdays.me/Windows网络命令/</link><guid isPermaLink="false">https://xdays.me/Windows网络命令/</guid><pubDate>Sat, 05 Jun 2010 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;ping&lt;/p&gt;
&lt;p&gt;ping 命令用法和功能比较简单，主要总结 ping 不通的原因：&lt;br&gt;
1.最常见的就是对方开防火墙给过滤掉了。&lt;/p&gt;
&lt;p&gt;2.错误的 ip 地址设置，如果两个接口设置的 ip 地址在同一个网段，主机不知道从哪个接口发出数据包。&lt;/p&gt;
&lt;p&gt;ipconfig&lt;/p&gt;
&lt;p&gt;比较常用的选项有/all（所有配置信息）
/release（释放通过 dhcp 获得地址参数） /renew
（从新获取地址）。另外还可以查看 dns 缓存的一些信息。&lt;/p&gt;
&lt;p&gt;route&lt;/p&gt;
&lt;p&gt;帮助文件就差不多了：&lt;/p&gt;
&lt;div class=&quot;gatsby-highlight&quot; data-language=&quot;text&quot;&gt;&lt;pre class=&quot;language-text&quot;&gt;&lt;code class=&quot;language-text&quot;&gt;ROUTE [-f] [-p] [command [destination]
[MASK netmask] [gateway] [METRIC metric] [IF interface]

-f           Clears the routing tables of all gateway entries. If this is
used in conjunction with one of the commands, the tables are
cleared prior to running the command.
-p           When used with the ADD command, makes a route persistent across
boots of the system. By default, routes are not preserved
when the system is restarted. Ignored for all other commands,
which always affect the appropriate persistent routes. This
option is not supported in Windows 95.
command      One of these:
PRINT     Prints a route
ADD       Adds    a route
DELETE    Deletes a route
CHANGE    Modifies an existing route
destination Specifies the host.
MASK         Specifies that the next parameter is the &apos;netmask&apos; value.
netmask      Specifies a subnet mask value for this route entry.
If not specified, it defaults to 255.255.255.255.
gateway      Specifies gateway.
interface    the interface number for the specified route.
METRIC       specifies the metric, ie. cost for the destination.&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;从打印的路由表中可以看出，本网段内和回环网段的默认网关就是本地地址，也就是自己充当网关。&lt;/p&gt;
&lt;p&gt;tracert&lt;/p&gt;
&lt;p&gt;一个比 ping 强大的工具，基本原理是 tracert 发送包含目的地址的数据包，只是生存时间 ttl 从 1 一直增大到能到达目的地址为止。从而收到沿途经过的路由器们的地址，打印显示。有个参数
-d 不解析 ip 地址。&lt;/p&gt;</content:encoded></item></channel></rss>