<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Lyra</title><description>鬼鬼的个人博客</description><link>https://onioni.cn/</link><language>zh-cn</language><item><title>音乐</title><link>https://onioni.cn/posts/music/</link><guid isPermaLink="true">https://onioni.cn/posts/music/</guid><description>心之所向，愿之所系</description><pubDate>Fri, 19 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;&amp;lt;style&amp;gt;
.aplayer {
margin: 0 auto;
}
@media screen and (max-device-width: 400px) {
.aplayer {
width: 100%;
}
}
&amp;lt;/style&amp;gt;&lt;/p&gt;
</content:encoded></item><item><title>TEST</title><link>https://onioni.cn/posts/test/</link><guid isPermaLink="true">https://onioni.cn/posts/test/</guid><description>测试中的废案</description><pubDate>Thu, 18 Aug 2022 00:00:00 GMT</pubDate><content:encoded>&lt;h4&gt;404动画PixiJS代码&lt;/h4&gt;
&lt;p&gt;本意在hexo测试中的废案，是个很好看的404粒子特效效果的画面，但是由于各种原因，放弃使用，搁置了代码如下：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&amp;lt;script src=&quot;https://cdnjs.cloudflare.com/ajax/libs/pixi.js/4.5.5/pixi.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;

&amp;lt;div id=&quot;yun&quot;&amp;gt;&amp;lt;/div&amp;gt;

&amp;lt;script&amp;gt;
    /**
     *  404 页面
     */
    (function() {
         var lastTime = 0;
         var vendors = [&apos;ms&apos;, &apos;moz&apos;, &apos;webkit&apos;, &apos;o&apos;];
         for (var x = 0; x &amp;lt; vendors.length &amp;amp;&amp;amp; !window.requestAnimationFrame; ++x) {
           window.requestAnimationFrame = window[vendors[x] + &apos;RequestAnimationFrame&apos;];
           window.cancelAnimationFrame = window[vendors[x] + &apos;CancelAnimationFrame&apos;] || window[vendors[x] + &apos;CancelRequestAnimationFrame&apos;];
         }

         if (!window.requestAnimationFrame)
           window.requestAnimationFrame = function(callback, element) {
             var currTime = new Date().getTime();
             var timeToCall = Math.max(0, 16 - (currTime - lastTime));
             var id = window.setTimeout(function() {
                 callback(currTime + timeToCall);
               },
               timeToCall);
             lastTime = currTime + timeToCall;
             return id;
           };

         if (!window.cancelAnimationFrame)
           window.cancelAnimationFrame = function(id) {
             clearTimeout(id);
           };
       }());

    //math2 utils
    var Math2={};
    Math2.random = function (t, n) {
      return Math.random() * (n - t) + t
    }, Math2.map = function (t, n, r, a, o) {
      return (o - a) * ((t - n) / (r - n)) + a
    }, Math2.randomPlusMinus = function (t) {
      return t = t ? t : .5, Math.random() &amp;gt; t ? -1 : 1
    }, Math2.randomInt = function (t, n) {
      return n += 1, Math.floor(Math.random() * (n - t) + t)
    }, Math2.randomBool = function (t) {
      return t = t ? t : .5, Math.random() &amp;lt; t ? !0 : !1
    }, Math2.degToRad = function (t) {
      return rad = t * Math.PI / 180, rad
    }, Math2.radToDeg = function (t) {
      return deg = 180 / (Math.PI * t), deg
    }, Math2.rgbToHex = function (t) {
      function n(t) {
        return (&quot;0&quot; + parseInt(t).toString(16)).slice(-2)
      }
      t = t.match(/^rgb\((\d+),\s*(\d+),\s*(\d+)\)$/);
      var r = n(t[1]) + n(t[2]) + n(t[3]);
      return r.toUpperCase()
    }, Math2.distance = function (t, n, r, a) {
      return Math.sqrt((r - t) * (r - t) + (a - n) * (a - n))
    };
    //mouse
    var mousePos={
      x:0,
      y:0
    };
    window.onmousemove = function(e) {
      e = e || window.event;

      var pageX = e.pageX - 300;
      var pageY = e.pageY + 350;
      if (pageX === undefined) {
        pageX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft - 300;
        pageY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop + 350;
      }
      mousePos = {
        x: pageX,
        y: pageY,
      };
    };

    var options = {
      width: 1000,
      height: 1000,
      keyword: &quot;404&quot;,
      density: 8,
      densityText: 2,
      minDist: 20,
    };

    // initialize canvas
    var canvas = document.createElement(&apos;canvas&apos;);
    canvas.width = options.width;
    canvas.height = options.height;
    canvas.style.width = options.width/2;
    canvas.style.height = options.height/2;
    canvas.getContext(&apos;2d&apos;).scale(2,2)

    var renderer = new PIXI.autoDetectRenderer(options.width, options.height, {
      transparent: true
    });
    var stage = new PIXI.Container(&quot;0X000000&quot;, true);
    document.getElementById(&quot;yun&quot;).appendChild(renderer.view);
    renderer.view.id = &quot;notFound&quot;;

    var imageData = false;
    var particles =[];

    function init() {
      positionParticles();
      positionText();
    }

    function positionParticles() {
      var canvas = document.createElement(&quot;canvas&quot;);
      canvas.width = 500;
      canvas.height = 350;
      var context = canvas.getContext(&quot;2d&quot;);
      context.fillStyle = &quot;#000000&quot;;
      context.font = &quot;300px &apos;Arial&apos;, sans-serif&quot;;
      context.fillText(options.keyword, 0, 250);

      var imageData = context.getImageData(0, 0, 350, 500);
      data = imageData.data;

      // Iterate each row and column
      for (var i = 0; i &amp;lt; imageData.height; i += options.density) {
        for (var j = 0; j &amp;lt; imageData.width; j += options.density) {

          // Get the color of the pixel
          var color = data[((j * (imageData.width * 4)) + (i * 4)) - 1];

          // If the color is black, draw pixels
          if (color == 255) {
            var newPar = particle();
            newPar.setPosition(i, j);
            particles.push(newPar);
            stage.addChild(newPar);
          }
        }
      }
    }

    function positionText() {
      var canvas = document.createElement(&quot;canvas&quot;);
      canvas.width = 400;
      canvas.height = 120;
      var context = canvas.getContext(&quot;2d&quot;);
      context.fillStyle = &quot;#000000&quot;;
      context.font = &quot;80px &apos;Arial&apos;, sans-serif&quot;;
      context.fillText(&quot;Not Found&quot;, 0, 80);

      var imageData = context.getImageData(0, 0, 400, 400);
      data = imageData.data;

      // Iterate each row and column
      for (var i = 0; i &amp;lt; imageData.height; i += options.densityText) {
        for (var j = 0; j &amp;lt; imageData.width; j += options.densityText) {

          // Get the color of the pixel
          var color = data[((j * (imageData.width * 4)) + (i * 4)) - 1];

          // If the color is black, draw pixels
          if (color == 255) {
            var newPar = particle(true);
            newPar.setPosition(i, j);
            particles.push(newPar);
            stage.addChild(newPar);
          }
        }
      }
    }

    function particle(text) {
      $this = new PIXI.Graphics();

      if (text == true) {
        $this.text = true;
      }

      $this.beginFill(0X5CC9F5);

      var radius;
      $this.radius = radius = $this.text ? Math.random() * 3.5 : Math.random() * 10.5;

      $this.drawCircle(0, 0, radius);

      $this.size = this.radius;
      $this.x = -this.width;
      $this.y = -this.height;
      $this.free = false;

      $this.timer = Math2.randomInt(0, 100);
      $this.v = Math2.randomPlusMinus() * Math2.random(.5, 1);
      $this.hovered = false

      $this.alpha = Math2.randomInt(10, 100) / 100;

      $this.vy = -5 + parseInt(Math.random() * 10) / 2;
      $this.vx = -4 + parseInt(Math.random() * 8);

      $this.setPosition = function(x, y) {
        if ($this.text) {
          $this.x = x + (options.width / 2 - 180);
          $this.y = y + (options.height / 2 + 100);
        } else {
          $this.x = x + (options.width / 2 - 250);
          $this.y = y + (options.height / 2 - 175);
        }
      };

      return $this;
    }

    function update() {
      renderer.render(stage);

      for (i = 0; i &amp;lt; particles.length; i++) {
        var p = particles[i];

        if (mousePos.x &amp;gt; p.x &amp;amp;&amp;amp; mousePos.x &amp;lt; p.x + p.size &amp;amp;&amp;amp; mousePos.y &amp;gt; p.y &amp;amp;&amp;amp; mousePos.y &amp;lt; p.y + p.size) {
          p.hovered = true;
        }

        p.scale.x = p.scale.y = scale = Math.max(Math.min(2.5 - (Math2.distance(p.x, p.y, mousePos.x, mousePos.y) / 160), 160), 1);


        p.x = p.x + .2 * Math.sin(p.timer * .15)
        p.y = p.y + .2 * Math.cos(p.timer * .15)
        p.timer = p.timer + p.v;

      }
      window.requestAnimationFrame(update);
    }

    init();
    update();
&amp;lt;/script&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;修改样式: themes/yelee/source/css/_partial/article.styl，在 .article-entry 子级中加上如下样式:&lt;/h4&gt;
&lt;h5&gt;注：如果没有该文件可以可另外添加&lt;/h5&gt;
&lt;pre&gt;&lt;code&gt;#notFound {
  position: absolute;
  top: 50%;
  left: 50%;
  transform: translateY(-50%) translateX(-50%);
  width: 80%;
  height: auto;
}
#yun {
  height: 320px;
  width: 100%;
  position: relative;
}
@media only screen and (max-width: 768px) {
  #yun {
    height: 300px;
  }
  #notFound {
    width: 100%;
  }
}
@media only screen and (max-width: 425px) {
  #yun {
    height: 200px;
  }
  #notFound {
    width: 120%;
  }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;如果不想主题文件修改你添加的单页面内容，需要在站点配置文件中配置如下：&lt;/h4&gt;
&lt;pre&gt;&lt;code&gt;//  单个文件夹下全部文件：skip_render: test/*
//  单个文件夹下指定类型文件：skip_render: test/*.html
//  单个文件夹下全部文件以及子目录:skip_render: test/**
//  多个文件夹以及各种复杂情况：
//  skip_render:
//      - `test1/*.html`
//      - `test2/**`
比如 skip_render: pages/** 代表 source/pages/ 目录下所有东西都不会被修改
&lt;/code&gt;&lt;/pre&gt;
</content:encoded></item><item><title>套用 Cloudflare CDN</title><link>https://onioni.cn/posts/cloudflare/</link><guid isPermaLink="true">https://onioni.cn/posts/cloudflare/</guid><description>使用 Hexo 套用 Cloudflare 免费 CDN</description><pubDate>Tue, 03 Dec 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;使用 Hexo 套用 Cloudflare 免费 CDN&lt;/h1&gt;
&lt;h2&gt;Cloudflare&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://cloudflare.com&quot;&gt;https://cloudflare.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Cloudflare 是什么？&lt;/h3&gt;
&lt;p&gt;Cloudflare 是一间总部位于旧金山的美国跨国 IT 企业，以向客户提供基于反向代理的内容分发网络及分布式域名解析服务为主要业务。 Cloudflare 可以帮助受保护站点抵御包拒绝服务攻击等网络攻击，确保该网站长期在线，同时提升网站的性能、加载速度以改善访客体验。&lt;/p&gt;
&lt;p&gt;因为 GitHub Pages 的服务器都远在美国，而且被 &lt;em&gt;照顾&lt;/em&gt; 的厉害，所以导致在中国直接访问速度非常慢。使用免费的 Cloudflare 反代 + 缓存 GitHub Pages ，可以明显的提高全球访问速度，包括中国。&lt;/p&gt;
&lt;h3&gt;Cloudflare 添加域名&lt;/h3&gt;
&lt;p&gt;进入 &lt;a href=&quot;https://dash.cloudflare.com&quot;&gt;https://dash.cloudflare.com&lt;/a&gt; ，点击 Add a Site ， 输入域名然后点击 Add site 。在购买域名服务商处，设置域名的解析 DNS 服务地址为：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cleo.ns.cloudflare.com
lila.ns.cloudflare.com
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;等待全球 DNS 缓存刷新，绑定成功后会收到 Cloudflare 的确认邮件。&lt;/p&gt;
&lt;h4&gt;添加 A 记录&lt;/h4&gt;
&lt;p&gt;添加 A 记录，绑定 GitHub Pages 地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;185.199.108.153
185.199.109.153
185.199.110.153
185.199.111.153
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;HTTPS 配置&lt;/h4&gt;
&lt;p&gt;在 Cloudflare Dash 点击域名进入配置，点击顶部 SSL/TLS ，点击 SSL 一栏右侧下拉菜单选择 Flexible 。
在 GitHub Pages 仓库网页点击 Settings ，下拉到 GitHub Pages ，点击取消勾选 Enforce HTTPS 。&lt;/p&gt;
&lt;h4&gt;添加缓存规则&lt;/h4&gt;
&lt;p&gt;在 Cloudflare Dash 点击域名进入配置，点击顶部 Page Rules ，然后点击 Create Page Rule ， If the URL matches 一栏中填写你的域名，不带 wwww ，域名结尾 /* ，比如 &lt;code&gt;abc.com/*&lt;/code&gt; 。然后在下方点击 Add a Setting 添加规则：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Auto Minify / HTML CSS JavaScript&lt;/li&gt;
&lt;li&gt;Rocket Loader On&lt;/li&gt;
&lt;li&gt;Browser Cache TTL 2 hours&lt;/li&gt;
&lt;li&gt;Always Online On&lt;/li&gt;
&lt;li&gt;Cache Level Cache Everything&lt;/li&gt;
&lt;li&gt;Edge Cache TTL 2 hours&lt;/li&gt;
&lt;li&gt;Automatic HTTPS Rewrites On&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;然后点击右下方 Save and Deploy ，保存与部署规则。&lt;/p&gt;
&lt;h4&gt;访问测试&lt;/h4&gt;
&lt;p&gt;等待 Cloudflare HTTPS 证书下发，然后在游览器输入绑定的域名地址访问。如果一切设置正确，应该会打开发布到 GitHub Pages 的 Hexo Blog 。&lt;/p&gt;
</content:encoded></item><item><title>使用 Hexo 搭建 Blog</title><link>https://onioni.cn/posts/hexo/</link><guid isPermaLink="true">https://onioni.cn/posts/hexo/</guid><description>使用 Hexo 在 GitHub Pages 搭建 Blog</description><pubDate>Mon, 25 Nov 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h1&gt;使用 Hexo 在 GitHub Pages 上免费搭建 Blog&lt;/h1&gt;
&lt;h2&gt;Hexo&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://hexo.io&quot;&gt;https://hexo.io&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;Hexo 是什么？&lt;/h3&gt;
&lt;p&gt;Hexo 是一个快速、简洁且高效的博客框架。 Hexo 使用 Markdown（或其他渲染引擎）解析文章，在几秒内，即可利用靓丽的主题生成静态网页。&lt;/p&gt;
&lt;h3&gt;环境依赖&lt;/h3&gt;
&lt;p&gt;安装 Hexo 相当简单。然而在安装前，必须先在电脑中安装：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;p&gt;Node.js / 至少需要 &lt;code&gt;6.9&lt;/code&gt; 版本
&lt;a href=&quot;https://nodejs.org/en/&quot;&gt;https://nodejs.org/en/&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Git / 用来同步生成好的静态页面
&lt;a href=&quot;https://git-scm.com/download/win&quot;&gt;https://git-scm.com/download/win&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;验证 Node.js 与 Git 安装&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;pre&gt;&lt;code&gt;$node -v
$git --version
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;安装 Hexo CLI 工具&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;npm install -g hexo-cli&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;创建 Blog&lt;/h3&gt;
&lt;p&gt;在电脑桌面新建一个文件夹 Blog ，用来存放博客。然后打开 PowerShell 进入刚才新建的文件夹初始化并创建一个新的 Blog :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cd ~/Desktop/Blog # 进入 Blog 目录
hexo init  # 初始化
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;Blog 目录介绍&lt;/h3&gt;
&lt;pre&gt;&lt;code&gt;├── _config.yml # 网站的配置信息
├── package.json
├── scaffolds # 模版文件夹
├── source  # 资源文件夹
|   ├── _drafts # 草稿文件
|   └── _posts # 文章 Markdowm 文件
└── themes  # 主题文件夹
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;设置语言&lt;/h3&gt;
&lt;p&gt;打开目录中的 &lt;code&gt;_config.yml&lt;/code&gt; 文件，修改：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;language: zh-Hans
&lt;/code&gt;&lt;/pre&gt;
&lt;h3&gt;创建新文章&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;在博文根目录的 Source 文件夹的 Post 文件夹下直接新建一个 .md 文件。&lt;/li&gt;
&lt;li&gt;在博文根目录打来 PowerShell ，然后输入 &lt;code&gt;hexo new &quot;你的标题&quot;&lt;/code&gt; 回车在你的 Post 文件夹下就新建了一个 .md 文件，打开编辑即可。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;生成静态页面&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hexo g # 本地生成静态文件&lt;/code&gt;&lt;/p&gt;
&lt;h3&gt;本地访问测试&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;hexo s # 启动 Hexo 本地 HTTP 服务&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;打开游览器进入 &lt;a href=&quot;http://localhost:4000&quot;&gt;http://localhost:4000&lt;/a&gt; ,就可以即时预览 Blog  。返回 PowerShell 使用快捷键 &lt;code&gt;Ctrl+c&lt;/code&gt; 即可关闭 &lt;code&gt;hexo s&lt;/code&gt; 。&lt;/p&gt;
&lt;h2&gt;GitHub&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com&quot;&gt;https://github.com&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;GitHub 是什么？&lt;/h3&gt;
&lt;p&gt;GitHub 是通过 Git 进行版本控制的软件源代码托管服务平台，由GitHub公司的开发者 Chris Wanstrath 、 PJ Hyett 和 Tom Preston-Werner 使用 uby on Rails 编写而成。&lt;/p&gt;
&lt;h3&gt;GitHub Pages 是什么？&lt;/h3&gt;
&lt;p&gt;GitHub Pages 是 GitHub 提供的一个网页寄存服务，可以用于存放静态网页，包括博客、项目文档甚至整本书。 Jekyll 软体可以用于将文档转换成静态网页，该软体提供了将网页上传到 GitHub Pages 的功能。&lt;/p&gt;
&lt;h4&gt;部署到Coding以及GitHub上&lt;/h4&gt;
&lt;p&gt;部署之前需要安装 Git 部署插件，否则会提示 Deployer not found 错误。
&lt;code&gt;npm install hexo-deployer-git --save&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;在 Github 上创建名字为 &lt;code&gt;****.github.io&lt;/code&gt; 的项目， &lt;code&gt;****&lt;/code&gt; 为自己的 Github 用户名，打开本地的 Blog 文件夹项目内的 &lt;code&gt;_config.yml&lt;/code&gt; 配置文件，将其中的 &lt;code&gt;type&lt;/code&gt; 设置为 &lt;code&gt;git&lt;/code&gt; 。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;deploy:
  type: git
  repository: https://github.com/****/****.github.io.git
  branch: master
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;code&gt;hexo d # 将本地静态文件推送至Github&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;注：要配置好配置 SSH key ， &lt;code&gt;id_rsa&lt;/code&gt; 是你这台电脑的私人秘钥， &lt;code&gt;id_rsa.pub&lt;/code&gt; 是公共秘钥。把公钥放在 GitHub 上，当你连接自己的 Github 账号时，它就会根据公钥匹配你的私钥，当能够相互匹配时，才能够顺利的通过 Git 上传你的文件到 GitHub 上。&lt;/p&gt;
&lt;h3&gt;绑定域名&lt;/h3&gt;
&lt;p&gt;网站已经搭建好，虽然能通过 GitHub 的域名访问，但是如果想要用自己的域名，我们还需要设置将自己的域名绑定到 GitHub 这个博客项目上。&lt;/p&gt;
&lt;p&gt;在 GitHub Pages 仓库网页点击 Settings ，下拉到 GitHub Pages ，在 Custom domain 中填入自己的域名地址，然后点击 Save 保存。&lt;/p&gt;
&lt;h4&gt;添加 A 记录&lt;/h4&gt;
&lt;p&gt;添加 A 记录，绑定 GitHub Pages 地址：&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@       A       185.199.108.153
@       A       185.199.109.153
@       A       185.199.110.153
@       A       185.199.111.153
&lt;/code&gt;&lt;/pre&gt;
&lt;h4&gt;添加 CNAME 记录，绑定 GitHub Pages 地址：&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;www       CNAME       username.github.io&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;添加 CNAME 文件&lt;/h4&gt;
&lt;p&gt;添加完 A 记录和 CNAME 记录解析后，进入博客目录，在 &lt;code&gt;source&lt;/code&gt; 目录下新建 &lt;code&gt;CNAME&lt;/code&gt; 文件，写入你自己的域名，然后重新然后再部署到 GitHub 上。&lt;/p&gt;
&lt;h4&gt;HTTPS 配置&lt;/h4&gt;
&lt;p&gt;在 GitHub Pages 仓库网页点击 Settings ，下拉到 GitHub Pages ，勾选 Enforce HTTPS 可设置强制 Https 访问，一般为默认开启不需要设置。&lt;/p&gt;
&lt;h4&gt;访问测试&lt;/h4&gt;
&lt;p&gt;在游览器输入绑定的域名地址访问，如果一切设置正确，会打开发布到 GitHub Pages 的 Hexo Blog 。&lt;/p&gt;
</content:encoded></item><item><title>WLAN笔记（五）</title><link>https://onioni.cn/posts/wifi05/</link><guid isPermaLink="true">https://onioni.cn/posts/wifi05/</guid><description>AP上线过程</description><pubDate>Fri, 31 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;FAT AP能够独自承担无线用户接入、用户数据加密和转发等功能，而FIT AP必须依赖于AC才能共同完成这些功能。AC在协同FIT AP共同工作之前，必先要实现FIT AP在AC中上线的过程。FIT AP就必须到DHCP Server获取IP地址。&lt;/p&gt;
&lt;p&gt;AP获取IP地址：
AP的IP地址可以是静态配置的，也可以是通过DHCP动态获取的。如果是静态配置的，AP的IP地址立即就确定了，这一步也就结束了。如果是通过DHCP动态获取，AP不知道谁是DHCP Server，会以广播discovery报文的方式去发现DHCP Server，所有收到这个广播信息的DHCP Server都会单播offer回应AP。AP只接收第一个到达的offer，并广播request告诉所有人，我已经选择好了一个DHCP Server了，其他人不需要再准备为我提供DHCP Server服务了。AP选择的DHCP Server会把AP的IP地址、租期日期、网关地址、DNS Server的IP地址等信息用ACK报文反馈给AP。值得注意的是这个ACK报文里面有个option43字段，里面可以用来填充AC的IP地址。作用就是直接告诉AP有AC的IP地址可用。有的时候AP与DHCP Server不在同一个VLAN中，AP通过广播discovery报文不能直接发现DHCP Server，这个时候，可以通过DHCP Relay来发现DHCP Server。AP获取IP地址的流程就变成原来只需要直接和DHCP Server交流，现在变成了和DHCP Relay直接交流，由DHCP Relay将AP的请求单播给DHCP Server，DHCP Server回复给AP的消息也要通过DHCP Relay来转达。&lt;/p&gt;
&lt;p&gt;AP发现AC:&lt;/p&gt;
&lt;p&gt;静态方式：
AP上是支持静态配置AC的IP地址的，如果静态配置了AC的IP地址，AP就会向所有配置的AC单播发送发现请求报文，然后根据AC的回复，根据优先级，选择一个AC，准备进行下一个阶段的建立CAPWAP隧道。&lt;/p&gt;
&lt;p&gt;动态方式：
如果AP上没有配置AC的IP地址，AP会根据当前的情况来决定是使用单播方式还是广播方式来发现AC。首先，AP会查看AP获取IP地址阶段中DHCP Server回复的ACK报文中的option43字段是否存在AC的IP地址，这个字段是可选择配置的，如果有AC的IP地址，AP就会向这个地址单播发送发现请求报文。在AC和网络都正常的情况下，AC会回应AP的请求，至此，AP就完成了发现AC的过程。我们可以把这种发现AC的方式称为DHCP方式。与DHCP方式类似的还有DNS方式，与DHCP方式不同的是，DNS方式中，DHCP Server回复的ACK报文中存放的不是AC的IP地址，而是AC的域名和DNS服务器的IP地址，并且报文中携带的option15字段用来存放AC的域名，AP先通过获取的域名和DNS服务器进行域名解析，获取AC IP地址，然后向AC单播发送发现请求。之后的过程就和DHCP方式一致了。无论是DHCP方式还是DNS方式，都是属于单播方式，AP都是发送的单播报文给AC。&lt;/p&gt;
&lt;p&gt;如果AP上没有配置静态的AC IP地址、DHCP Server回复的ACK报文中没有AC的信息、或者AP单播发送的发现请求报文都没有响应，此时AP就会通过广播报文来发现AC。和AP处于同一个网段的所有AC都会响应AP的请求，AP会选择优先级最高的AC来作为待关联的AC，如果优先级相同，则继续比较AC的负载，负载轻的作为待关联AC，如果负载也相同，则选择IP地址小的作为待关联AC。然后准备进行下一阶段的CAPWAP隧道建立。&lt;/p&gt;
&lt;p&gt;注：Option 43在AC和AP间的网络是二层的场景下，存在的作用不明显，因为通过单播发现不了AC，可以再次通过广播来发现，但是如果AC和AP间的网络是三层的，广播报文是无法直接传递到AC的，所以必须要通过Option43来告知AP要找的AC是哪个。&lt;/p&gt;
&lt;p&gt;CAPWAP隧道建链：&lt;/p&gt;
&lt;p&gt;CAPWAP全称是Control And Provisioning of Wireless Access Points，中文名叫无线接入点控制与规范，CAPWAP是由RFC5415协议定义的实现AP和AC之间的互通的通用封装和传输机制。CAPWAP隧道又细分为控制隧道和数据隧道。控制隧道是用来传输AC管理控制AP的报文、业务配置以及AC与AP间的状态维护报文；数据隧道则只有在隧道转发（又称集中转发）方式下才用来传输业务数据。AP发现了AC后，就可以开始CAPWAP隧道的建立了。&lt;/p&gt;
&lt;p&gt;AP接入控制：&lt;/p&gt;
&lt;p&gt;不是每一个AP都是符合入门要求的AP。为了保证入门AP的合法性，防止有外人或间谍（非法AP）混入，AC设置了一系列的考核要求进行检验，AP在找到AC后，会向AC发送加入请求，（如果配置了CAPWAP隧道的DTLS加密功能，会先建立DTLS链路，此后CAPWAP控制报文都要进行DTLS加解密。）请求的内容中会包含AP的版本和胖瘦模式信息。AC收到AP的加入请求后，会判断是否允许AP接入，然后AC进行回应。如果AC上有对应的升级配置，则AC还会在回应的报文中携带AP的版本升级信息（升级版本、升级方式等）。&lt;/p&gt;
&lt;p&gt;AC判断AP是否能够接入的流程：&lt;/p&gt;
&lt;p&gt;第一关，首先查看AP是否被列入了黑名单，如果在黑名单中能匹配上AP，则不允许AP接入，然后就没有然后了。如果很幸运，没有匹配上黑名单，那么将进入第二关。&lt;/p&gt;
&lt;p&gt;第二关，判断AP的认证模式，如果AC上对AP上线要求不严格，认证方式为不认证，则到这一关的AP都将闯关成功，允许接入。实际使用场景还是建议使用MAC或SN认证，严格控制AP的接入。如果是MAC或SN认证，还需要继续闯关。&lt;/p&gt;
&lt;p&gt;第三关，本关MAC或SN认证分别要验证MAC或SN对应的AP是否离线添加，如果已添加，则允许AP接入，否则进入下一关。&lt;/p&gt;
&lt;p&gt;第四关，查看AP的MAC或SN是否能在白名单中匹配上，如果匹配上，则允许接入，否则AP被放入到未认证列表中。&lt;/p&gt;
&lt;p&gt;第五关，未认证列表中的AP可以通过手动配置的方式，允许其接入，如果不对其进行手动确认，AP也无法接入。&lt;/p&gt;
&lt;p&gt;AP版本升级：&lt;/p&gt;
&lt;p&gt;AP收到前一阶段AC回应的报文后，如果发现里面有指定了AP的版本，并且指定的版本与AP当前的版本不一致，会进行AP版本升级。升级完成后，AP自动重新启动，并且重复之前的所有上线过程。如果AP发现AC回应的报文里面指定的AP版本和自身的版本一致，或者没有指定AP的版本，则AP不需要进行版本升级。直接进入下一个阶段。&lt;/p&gt;
&lt;p&gt;CAPWAP隧道维持：&lt;/p&gt;
&lt;p&gt;根据CAPWAP协议的要求，AP和AC间还需要进行一些其它报文的交互，然后AP和AC间开始通过keepalive和echo报文来检测数据隧道和控制隧道的连通性。Keepalive报文的出现，标志着数据隧道已经建立起来，echo报文的出现，则标志着控制隧道的已经建立。配置下发，CAPWAP隧道建立完成后，AC就可以把配置下发给AP了。AP收到AC的配置信息后，就能以AC上配置的业务来展开WLAN业务了。&lt;/p&gt;
</content:encoded></item><item><title>WLAN笔记（四）</title><link>https://onioni.cn/posts/wifi04/</link><guid isPermaLink="true">https://onioni.cn/posts/wifi04/</guid><description>WLAN常用概念</description><pubDate>Sat, 18 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WLAN术语SSID，SSID的全称是Service Set Identifier，也就是服务集标识符，用于标识一个服务集，按照大部分人的理解，也就是用来标识一个可用的网路。而所谓服务集，就是一组互相有联系的无线设备。在提供的无线网络中，我们的无线终端（在WLAN中称之为工作站STA，Station）只要连上AP，实际上就构成了一个服务集。在这个服务集内，只要终端和AP关联，终端就能够相互通信，也可以通过AP访问外部网络。如果只有一个AP，也就是说这个服务集中只有一个AP，那么这个服务集就可以被认为一个基本服务集BSS。BSS是无线网络的基本服务单元。所有的终端关联到一个AP上，该AP连接其他有线设备，并且控制和主导整个BSS中的全部数据的传输过程。如果存在多个AP，一个BSS所覆盖的地理范围有限，直径不超过100米，这个时候就会有一个扩展服务集ESS（Extend Service Set）的概念。&lt;/p&gt;
&lt;p&gt;ESS简单理解，就是多个使用相同SSID的BSS组成，但是这中间隐含2个条件：&lt;/p&gt;
&lt;p&gt;1.这些BSS是要比邻安置。
2.这些BSS通过各种分布系统互联，有线无线都可以，不过一般都是以太网。&lt;/p&gt;
&lt;p&gt;只有满足上述条件后，才认为这些BSS可以被统一为一个ESS。由于使用的是相同的SSID，我们根本感觉不到我们是接在多个BSS上，而是如同接在同一个AP上一样。终端在ESS内的通信和在BSS中类似，不过如果BSS中终端A想和另一个BSS中的终端B通信，则是需要经过2个接入点AP1和AP2，即A-&amp;gt;AP1-&amp;gt;AP2-&amp;gt;B。特别的，在同一个ESS中的不同BSS之间切换的过程称为漫游。上图也画出了终端A从BSS1域漫游到BSS2（图上的A’的位置），此时A仍然可以保持和B的通信，不过A在漫游前后的接入点AP改变了。SSID通常是一个不超过32个字符的字符串，这个SSID又叫ESSID，是对ESS的标识。在同一个ESS中，我们是不知道接在哪个BSS上，但终端设备会用BSSID标识BSS得知你所在哪一个BSS，这个标识符是一个长度为48位的二进制标识符，通常是这个BSS里面AP的MAC地址。&lt;/p&gt;
&lt;p&gt;有些设备还可以配置VAP，为用户提供差异化的WLAN业务。所谓VAP就是在一个物理实体AP上虚拟出多个虚拟的AP，每一个被虚拟出的AP就是一个VAP，每个VAP提供和物理实体AP一样的功能。VAP的优势显而易见，多个虚拟的AP工作在同一个硬件平台，提高了硬件的利用率；网络管理员可以为不同VAP设置不同SSID，安全设置，QoS设置等策略和功能，也增加了网络的灵活性。那VAP在一个ESS中怎么区分BSS，其实VAP也是用BSSID来区分的，但是这是BSSID不是用的物理AP的MAC地址，而是用的VAP的MAC地址。而这个VAP的MAC地址实际上和物理AP的MAC地址是有影射关系的。一般第一个VAP的MAC是跟AP的MAC地址一样的，后面的VAP的MAC地址是在AP的MAC的最后一位顺序加一。当然BSSID没有ESSID来的好记，毕竟是一串无序数据，所以也会为VAP添加一个SSID来方便记忆。&lt;/p&gt;
&lt;p&gt;补充：
基本服务集BSS（Basic Service Set）无线网络的基本服务单元，通常由一个AP和若干无线终端组成。
扩展服务集ESS（Extend Service Set）由多个使用相同SSID的BSS组成，解决BSS覆盖范围有限的问题。
服务集标识符SSID（Service Set Identifier）用来区分不同的无线网络。
扩展服务集标识符ESSID（Extended Service Set Identifier）一个或一组无线网络的标识，和SSID是相同的。
基本服务集标识符BSSID（Basic Service Set Identifier）在链路层上用来区分同一个AP上的不同VAP，也可以用来区分同一个ESS中的BSS。
虚拟接入点VAP（Virtual Access Point）AP设备上虚拟出来的业务功能实体。用户可以在一个AP上创建不同的VAP来为不同的用户群体提供无线接入服务。&lt;/p&gt;
</content:encoded></item><item><title>WLAN笔记（三）</title><link>https://onioni.cn/posts/wifi03/</link><guid isPermaLink="true">https://onioni.cn/posts/wifi03/</guid><description>WLAN标准协议</description><pubDate>Fri, 03 May 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WLAN领域被大规模推广和商用是IEEE 802.11系列标准协议，WLAN也被定义成基于IEEE 802.11标准协议的无线局域网。802.11主要的具有里程碑意义的标准协议：802.11a、802.11b、802.11g、802.11n和802.11ac。WLAN和有线局域网最大的区别就是“无线”，WLAN通信媒介是射频，射频和有线局域网的媒介（电缆或光纤）相比具有完全不一样的物理特性，这就导致WLAN的物理层（PHY）和媒介访问控制层（MAC）不同于有线局域网。所以，802.11协议主要定义的就是WLAN的物理层和MAC层。&lt;/p&gt;
&lt;p&gt;在20世纪90年代初为了满足人们对WLAN日益增长的需求，IEEE成立了专门的802.11工作组，专门研究和定制WLAN的标准协议，并在1997年6月推出了第一代WLAN协议——IEEE 802.11-1997，协议定义了物理层工作在ISM的2.4G频段，数据传输速率设计为2Mbps。该协议由于在速率和传输距离上的设计不能满足人们的需求，并未被大规模使用。随后，IEEE在1999年推出了802.11a和802.11b。802.11a工作在5GHz的ISM频段上，并且选择了正交频分复用OFDM（Orthogonal Frequency Division Multiplexing）技术，能有效降低多路径衰减的影响和提高频谱的利用率，使802.11a的物理层速率可达54Mbps。802.11b则依然工作在2.4GHz的ISM频段，但在802.11的基础上进行了技术改进，使802.11b的通信速率达到11Mbps。OFMD是一种多载波调制技术，主要是将指定信道分成若干子信道，在每个子信道上使用一个子载波进行调制，并且各子载波是并行传输，可以有效提高信道的频谱利用率。虽然802.11b提供的接入速率比802.11a低，但当时5GHz芯片研制过慢，待芯片推出时802.11b已被广泛应用。由于802.11a不能兼容802.11b，再加上5GHz芯片价格较高和地方规定的限制等原因，使得802.11a没有被广泛采用。在2000年初，IEEE 802.11g工作组开始开发一项既能提供54Mbps速率，又能向下兼容802.11b的协议标准。并在2001年11月提出了第一个IEEE 802.11g草案，该草案在2003年正式成为标准。802.11g兼容了802.11b，继续使用2.4GHz频段。为了达到54Mbps的速率，802.11g借用了802.11a的成果，在2.4GHz频段采用了正交频分复用（OFDM）技术。IEEE 802.11g的推出。&lt;/p&gt;
&lt;p&gt;注：在1999年讨论802.11b的时候，OFDM技术确实被提出应用到802.11b标准中，但当时美国联邦通信协会（FCC）禁止在2.4GHz频段使用OFDM，这条禁令直到2001年5月才被撤销，6个月后，采用OFDM技术的802.11g草案才得以顺利出台。&lt;/p&gt;
&lt;p&gt;在急速发展的网络世界54Mbps的速率不会永远满用户需求。在2002年一个新的IEEE工作组——IEEE 802.11任务组N即TGn（Task Group n）成立，开始研究一种更快的WLAN技术，目标是达到100Mbps的速率。该目标的实现一波三折，由于小组内两个阵营对协议标准的争论不休，新的协议直到2009年9月才被敲定并批准，这个协议就是802.11n。在长达7年的制定过程中，802.11n的速率也从最初设计的100Mbps，完善到了最高可达600Mbps，802.11n采用了双频工作模式，支持2.4GHz和5GHz，且兼容802.11a/b/g。802.11n标准刚刚尘埃落定后， IEEE就开始了下一代的WLAN标准协议——802.11ac的制定工作。并在2013年正式推出了802.11ac标准协议，802.11ac工作在5GHz频段，向后兼容802.11n和802.11a，80.211ac沿用了802.11n的诸多技术并做了技术改进，使速率达到1.3Gbps。当前在802.11各协议中由于802.11ac刚推出，大众终端产品支持802.11ac的还不多，802.11n产品仍旧是主流产品。802.11n较之前的标准协议主要有如下优势：更多的子载波、更高的编码率、更短的GI（Guard Interval）、更宽的信道、更多的空间流和MAC层的报文聚合功能等，而获取这些优势的技术802.11ac也有沿用。&lt;/p&gt;
&lt;p&gt;更多的子载波：802.11n比802.11a/g多了4个有效子载波（802.11b没有使用OFMD技术不做对比），用户无需配置只要使用802.11n通信即可获得802.11n的此项优势。下图中58.5Mbps是802.11n较之前的标准更多的子载波可以带来的理论速率。&lt;/p&gt;
&lt;p&gt;更高的编码率：WLAN使用射频传输数据时，除了用户的有效传输数据外，还需附有更错码FEC（Forward Error Correction），当有效数据在传递过程中因衰减、干扰等因素而导致数据错误时，通过更错码可将数据更正、还原成正确数据。802.11n将之前3/4的有效编码率提高到5/6，此项改进点使得802.11n的速率提升了11%。用户无需配置只要使用802.11n通信也可以直接获得802.11n的此项优势。&lt;/p&gt;
&lt;p&gt;更短的GI（Short Guard Interval）：使用802.11a/b/g发送数据时，必须要保证在数据之间存在800 ns的时间间隔以避免数据帧间的干扰，这个间隔被称为Guard Interval (GI)。802.11n缺省仍然使用800ns的GI，但在空间环境较好时，可以将该间隔配置为400ns，此项改进可以将吞吐提高近10%（约72.2Mbps）。&lt;/p&gt;
&lt;p&gt;更宽的信道：802.11n支持将相邻两个20MHz的信道绑定成40MHz的信道，信道更宽传输能力就更大，可以带来2倍以上的提升。在射频视图下执行命令channel命令可以配置40MHz信道。&lt;/p&gt;
&lt;p&gt;更多的空间流：802.11a/b/g技术的无线接入点和客户端是通过单个天线单个空间流以单入单出SISO（Single Input Single Output）的方式来实现数据传送的。在802.11n支持最大4个空间流的多入多出MIMO（Multiple Input and Multiple Output）方式传输数据（802.11ac最大支持8&lt;em&gt;8的MIMO）。华为多天线AP都支持MIMO，如AP5130、AP7110、AP5030支持3&lt;/em&gt;3 MIMO，AP3010、AP6510、AP6610支持2*2 MIMO。&lt;/p&gt;
&lt;p&gt;MAC层的报文聚合：在802.11的MAC层协议中，有很多固定的开销，尤其在两个帧之间的确认信息。在最高数据率的传输下，这些多余的开销甚至比需要传输的整个数据帧还要长。例如：802.11g理论传输速率为54Mbps，实际上却只有22Mbps，将近有一半多的速率浪费了。802.11n的MAC协议数据单元MPDU（MAC Protocol Data Unit）帧汇聚功能，可以将多个MPDU聚合为一个物理层报文，只需要进行一次信道竞争或退避，就可完成N个MPDU的同时发送，从而减少了发送N-1个MPDU报文所带来的信道资源消耗。执行命令80211n a-mpdu enable可以使能802.11n的MPDU帧汇聚功能，然后执行80211n a-mpdu max-length-exponent命令可以配置汇聚帧的最大长度，802.11n的汇聚帧最大长度为65535字节。&lt;/p&gt;
&lt;p&gt;注:并不是所有的环境都适合配置short GI。在复杂的空间环境里，射频遇到障碍物可能会产生反射等现象，会造成AP和STA之间的多路径传输（多径效应）。在多径环境中，前一个数据块还没有发送完成，后一个数据块可能通过不同的路径先到达了，合理的GI长度能够避免相互干扰。如果GI时长不合理，会降低链路的使用效率。&lt;/p&gt;
&lt;p&gt;802.11ac默认支持MPDU功能，且支持最大长度为1048575字节的汇聚帧。另外，802.11ac还支持MAC服务数据单元MSDU（Mac Service Data Units）汇聚，大大提高了数据的传输效率，除了802.11标准协议外，在WLAN领域还有一个更常见更常用的名词——Wi-Fi。WiFi是无线保真（Wireless Fidelity）的英文缩写。在802.11b时代，虽然所有的802.11b产品都使用相同的802.11b标准，但为了保证不同厂商的产品能够具有良好的兼容性，1999年一些WLAN设备生产厂商一起成立了一个工业联盟——无线以太网兼容性联盟WECA（Wireless Ethernet Compatibility Alliance），后更名为Wi-Fi联盟。Wi-Fi联盟建立了一套验证802.11b产品兼容性的测试程序，称为Wi-Fi认证，通过该程序认证的产品可以使用Wi-Fi认证标签。后来，Wi-Fi认证的范围逐步扩展到802.11a，802.11g和802.11n。另外，由于忍受不了802.11n漫长的标准化进程和市场需求的推动，Wi-Fi联盟以802.11n 2.0版草案作为产品认证的依据，在802.11n标准推出之前已经认证批准了数百个802.11n产品。&lt;/p&gt;
</content:encoded></item><item><title>WLAN笔记（二）</title><link>https://onioni.cn/posts/wifi02/</link><guid isPermaLink="true">https://onioni.cn/posts/wifi02/</guid><description>WLAN射频和信道</description><pubDate>Mon, 22 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WLAN跟日常生活中的无线广播、无线电视、手机通信一样，都是用射频作为载体。射频是频率介于3赫兹（Hz）和约300G赫兹（Hz）之间的电磁波，也可以称为射频电波或射电。人们为这段电磁波又定义了无线频谱，按照频率范围划分为极低频、超低频、中频、高频、超高频等，WLAN使用的射频频率范围是2.4GHz频段（2.4GHz～2.4835GHz）和5GHz频段（频率范围是5.150GHz～5.350GHz和5.725GHz～5.850GHz），分别属于特高频(300**z～3GHz)和超高频(3GHz～30GHz)，各个国家使用的频宽范围不一样，5GHz频段的5.150GHz～5.350GHz和5.725GHz～5.850GHz为中国使用。&lt;/p&gt;
&lt;p&gt;WLAN使用的2.4GHz频段和5GHz频段属于ISM频段。ISM，即工业（Industrial）、科学（Scientific）与医疗（Medical）。ISM频段主要开放给工业、科学、医疗三个机构使用，只要设备的功率符合限制，不需要申请许可证（Free License）即可使用这些频段。&lt;/p&gt;
&lt;p&gt;过射频传输信息的基本调制方式：调频、调相和调幅，发送端将信息调制到载波上，通过改变载波的频率、相位和振幅传递信息，接收端收到信息后，再解调还原信息。通过这样一个调制解调的过程，就实现了信息的传递。WLAN射频传输信息的基础也是调频、调相或调幅。只不过调频、调相和调幅通常用在模拟信号的传输，在数字通信领域射频的调制方式较为复杂，主要有：振幅键控、频率键控、相位键控和正交幅度调制（一种幅度、相位联合调制的技术，它同时利用了载波的幅度和相位来传递信息）。&lt;/p&gt;
&lt;p&gt;有线通信其实也是将信号调制成电脉冲或光脉冲，然后放到电缆或光缆上传输。只不过射频需要解决更多的问题，如射频的反射、衍射等问题。无论是使用射频通信还是使用有线媒介的通信，其过程都可以简单的看成是信源-&amp;gt;信道-&amp;gt;信宿，信源是信息的发送者，信宿是信息的接收者。那有线的信道我可以简单的理解为线缆，WLAN的信道是不是可以简单的理解为射频呢？根据“信源-&amp;gt;信道-&amp;gt;信宿”的描述，信道就是发送者和接收者的中间部分，那可不就是射频了。&lt;/p&gt;
&lt;p&gt;WLAN的信道是具有一定频宽的射频，以便可以承载要传输的信息。对于2.4GHz频段来说，2.4GHz频段的频宽是2.4835GHz-2.4GHz=0.0835GHz=83.5**z，WLAN不是使用全部的83.5**z的频宽作为一个信道，同一条波如果遇到频率相同的波会产生干扰，会根据相位差进行叠加或衰减（如：频率相同，相位相差180°的波彼此会抵消）。如果WLAN使用整个2.4GHz频段作为一个信道，当同一覆盖范围内有两个及两个以上的AP，大家都用相同的信道，会造成严重的干扰，两个AP都无法有效提供WLAN服务。所以，在WLAN标准协议里将2.4GHz频段划分出13个相互交叠的信道，每个信道的频宽是20**z（802.11g、802.11n每个信道占用20**z，802.11b每个信道占用22**z），每个信道都有自己的中心频率。&lt;/p&gt;
&lt;p&gt;14信道是特别针对日本定义的，各个国家2.4GHz频段开放的信道不一样，北美地区（美国，加拿大）开放1～11信道，欧洲开放1～13信道，中国同样开放1～13信道。一般，我们更多的讲述是2.4GHz频段分13个相互交叠的信道。这13个信道可以找出3个独立信道，即没有相互交叠的信道。独立信道由于没有频率的交叠区，相邻AP使用这3个独立信道不会彼此产生干扰。在部署WLAN时，为避免相邻AP产生同频干扰，多采用蜂窝式信道布局。蜂窝式布局中相邻AP间使用不交叠的独立信道，可以有效避免同频干扰。2.4GHz频段射频在各个国家已经放开使用，越来越多的无线设备都工作在2.4GHz频段（如蓝牙设备），使得2.4GHz频段日益拥挤，信道干扰严重，有时会影响WLAN用户的正常业务。&lt;/p&gt;
&lt;p&gt;华为AP产品2.4G射频默认使用1信道，如果用户在部署WLAN时忘了配置信道，可能会造成某些AP覆盖重合的区域产生同频干扰，使用户无法上线。但是，为众多AP配置信道也是件很累人的事情，华为产品支持射频信道的自动模式。AP上线后，AC会根据AP周围的无线环境，自动为AP射频设置信道，避免了用户为多个AP配置信道的繁杂工作。还支持射频调优功能，可以根据射频周围的无线环境自动调整信道和发射功率，保持整个无线网络处于一个最佳的状态。在WLAN初次部署完成后，建议执行一次射频调优。比如周围的卖场也有WLAN，很可能会和我们自己部署的WLAN有部分区域的射频冲突，射频调优可以让WLAN自己根据无线环境调整信道部署和发射功率，减少射频的冲突。而且无线环境可能是变化的，在低峰时段执行定期的射频调优也是有必要的。华为产品在V2R3C00版本开始支持频谱分析功能，频谱分析可以分析出AP周围存在的干扰设备，如婴儿监视器、微波炉、蓝牙设备等。&lt;/p&gt;
&lt;p&gt;WLAN 可以使用的另一个频段——5GHz频段，有更高的频率和频宽，可以提供更高的速率和更小的信道干扰。WLAN标准协议将5GHz频段分为24个20**z宽的信道，且每个信道都为独立信道。这为WLAN提供了丰富的信道资源，更多的独立信道也使得信道绑定更有价值，信道绑定是将两个信道绑定成一个信道使用，能提供更大的带宽。如两个20**z的独立信道绑定在一起可以获得20**z两倍的吞吐量，这好比将两条道路合并成一条使用，自然就提高了道路的通过能力。802.11n支持通过将相邻的两个20**z信道绑定成40**z，使传输速率成倍提高。802.11n也同时定义了2.4GHz频段的信道绑定，但由于2.4GHz频段较拥挤的信道资源，降低了2.4GHz频段信道绑定的实用性，一般不推荐使用2.4GHz频段的信道绑定。&lt;/p&gt;
&lt;p&gt;UNII-2e为5GHz新增频段，该频段中国尚未放开使用。目前中国已放开使用的信道有36, 40, 44, 48, 52, 56, 60, 64, 149, 153, 157, 161, 165。各个国家开放的信道不一样，可以参照国家信道顺从表。5GHz频段并非只有WLAN设备在使用，很多国家的军用雷达也在使用5GHz频段，使用该频段的民用无线设备很可能对雷达等重要设施产生干扰。为了解决这一安全顾虑，在一些国家出售的WLAN产品必须具备TPS和DFS这两个功能，即发射功率控制和动态频率选择。TPS是为了防止无线产品发放过大的功率来干扰军方雷达。DFS是为了使无线产品能主动探测军方使用的频率，如频率冲突并主动选择另一个频率，以避开军方频率。在这些国家这两个功能是属于强制性的，不符合标准的产品将不会获得这些国家的上市许可。&lt;/p&gt;
&lt;p&gt;dBm和dB的含义：
dBm的含义是分贝毫瓦，通俗的说就是每1毫瓦产生多少分贝能量。dB是个相对值是增益的意思，X (dBm) - Y (dBm) = Z (dB)，如:10dB=20dBm-10dBm。
dBm和毫瓦的换算关系是：P(dBm)=10logP(mW)，也就是100mW=10Log102=20dBm。
功率减少10倍，换算出来的dBm降低10dB。功率减少一半，换算出来的dBm降低3dB。如：50mW=17dBm，25mW=14dBm，5mW=7dBm。&lt;/p&gt;
</content:encoded></item><item><title>WLAN笔记（一）</title><link>https://onioni.cn/posts/wifi01/</link><guid isPermaLink="true">https://onioni.cn/posts/wifi01/</guid><description>WLAN定义和基本架构</description><pubDate>Mon, 08 Apr 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;WLAN的定义：
WLAN的全称是Wireless Local Area Network，中文含义是无线局域网，WLAN的定义有广义和狭义两种：广义上讲WLAN是以各种无线电波（如激光、红外线等）的无线信道来代替有线局域网中的部分或全部传输介质所构成的网络。WLAN的狭义定义是基于IEEE 802.11系列标准，利用高频无线射频（如2.4GHz或5GHz频段的无线电磁波）作为传输介质的无线局域网。我们日常生活中的WLAN，就是指的WLAN的狭义定义。现技术标准有很多，如蓝牙、802.11系列、HyperLAN2等。而802.11系列标准由于其实现技术相对简单、通信可靠、灵活性高和实现成本相对较低等特点，成为了WLAN的主流技术标准，且802.11系列标准也成为了WLAN技术标准的代名词。&lt;/p&gt;
&lt;p&gt;WLAN有两种基本架构&lt;/p&gt;
&lt;p&gt;FAT AP架构：
FAT AP架构又称自治式网络架构。FAT AP英文全称是FAT Access Point，中文称为胖接入点，也有很多人直接称为胖AP。FAT AP不仅可以发射射频提供无线信号供无线终端接入，还能独立完成安全加密、用户认证和用户管理等管控功能。密码WLAN设置，配置黑名单或白名单控制用户接入，管理接入的用户（如设置用户的接入速率）等这些都符合FAT AP的特征。FAT AP功能强大，独立性强，具备自治能力，因此FAT AP架构人们又称为自治式网络架构。不需要介入专门的管控设备，独自就可以完成无线用户的接入，业务数据的加密和业务数据报文的转发等功能。
独立自治是FAT AP的特点，也是FAT AP的缺点。当单个部署时，由于FAT AP具备较好的独立性，不需要另外部署管控设备，部署起来很方便，成本也较低廉，在类如家庭WLAN或者小企业WLAN的使用场景中，FAT AP往往是最适合的选择。给我们感受最深刻的就是我们在家里使用一个无线路由器就能享受WLAN带给我们的便捷。但是，在大的使用场景中，如我们上面提到的候车厅，FAT AP的独立自治就变成了自身的缺点。由于WLAN覆盖面积较大，接入用户较多，需要部署许多FAT AP设备，而每个FAT AP又是独立自治的，缺少统一的管控设备，管理这些设备就变得十分麻烦。不说别的，光为这些FAT AP升一次级就是一场灾难。所以，在大量部署的情况下，FAT AP会带来巨大的管理维护成本。而且由于独自控制用户的接入，FAT AP无法解决用户的漫游问题。&lt;/p&gt;
&lt;p&gt;AC+FIT AP架构：
AC+FIT AP又称集中式网络架构。FIT AP英文全称是FIT Access Point，中文称为瘦接入点，也有很多人直接称为瘦AP。和胖AP不同，瘦AP除了提供无线射频信号外，基本不具备管控功能。也正是因为这一点，它被称为瘦AP，而上面具备管控功能的AP被称为了胖AP。为了实现WLAN的功能，除了FIT AP外，还需要具备管理控制功能的设备——AC。AC英文全称是Access Controller，中文称为无线接入控制器。AC的主要功能是对WLAN中的所有FIT AP进行管理和控制，AC不具备射频（AC只是管理控制设备，不能发射无线射频信号），它和FIT AP配合共同完成WLAN功能。根据AC所管控的区域和吞吐量的不同，AC可以出现在汇聚层，也可以出现在核心层。而FIT AP一般部署在接入层和企业分支。这种层级分明的协同分工，更能体现出AC+FIT AP架构的集中控制的特点，这种架构又被大家称为集中式网络架构。使用AC+FIT AP架构为大型场所部署WLAN时，比使用FAT AP架构更经济、高效。在AC+FIT AP架构下，可以统一为FIT AP下发配置，统一为FIT AP进行软件升级，还可以按照时段控制FIT AP的工作数量等等，这些大大降低了WLAN的管控和维护的成本。而且，由于用户的接入认证可以由AC统一管理，解决用户漫游的问题就变得很容易。&lt;/p&gt;
&lt;p&gt;综上所述，AC+FIT AP架构适用于中大型使用场景，而FAT AP架构适用于小型使用场景。AP根据应用场景可分为室内AP、室分AP和室外AP。&lt;/p&gt;
&lt;p&gt;室内AP:室内放装型AP设备。对于建筑结构较简单、面积相对较小、用户相对集中的场合及对容量需求较大的区域，如小型会议室、酒吧、休闲中心等场景宜选用室内放装型AP设备，该类型设备可根据不同环境灵活实施分布，也可同时工作在AP和桥接等混合模式下。室内AP都有一个共同的特点，就是美观大方，因为它们要做到布放在室内不影响室内装潢的美观。&lt;/p&gt;
&lt;p&gt;室分AP：这里我们需要解释下什么叫室分AP，室分AP即室内分布型AP设备。对于建筑面积较大、用户分布较广且已建有多系统合用的室内分布系统的场合，如大型办公楼、商住楼、酒店、宾馆、机场、车站等场景宜选用室内分布型AP设备，该类型设备接入室内分布系统作为WLAN系统的信号源，以实现对室内WLAN信号的覆盖。&lt;/p&gt;
&lt;p&gt;室外AP：室外分布型AP设备。对于接入点多，用户量大，且用户分布较为集中的场合下，如学校、大型会展中心等大型场所，宜选用室外AP设备组网。室外AP都具有卓越的室外覆盖性能及超强的防护，以适应风吹雨淋的室外环境，具有IP67的防护等级。&lt;/p&gt;
</content:encoded></item><item><title>电源内部笔记</title><link>https://onioni.cn/posts/computer-power-supply02/</link><guid isPermaLink="true">https://onioni.cn/posts/computer-power-supply02/</guid><description>双管正激是什么东东怎么看？山寨电源为啥不能买？</description><pubDate>Fri, 22 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;电源内部&lt;/p&gt;
&lt;p&gt;电源之所以难挑，就是因为他是一个黑盒子，零件全部在内部，有很多东西，比如输出稳定性、安全保护、用料等，在盒子外面是看不出来的。而且众所周知，还有虚标这个的问题。&lt;/p&gt;
&lt;p&gt;首先220v的电进来会先经过一次emi滤波，由圆形的电容(Y电容）和方形的电容（X电容）组成，主要用途如名字，就是滤掉市电中的杂波。作为输入的第一道屏障来说是非常重要的。 根据电源的设计，这部分可能放放在主板上，也有可能和二次合并。到达主板之后会进行第二次滤波，一般由几个电感（线圈）方形电容圆形电容组成。一般来说零件越多是越好的。同样保险丝或者自动恢复保险丝也在这附近，不过不用太在意，因为emi明显比保险丝贵多了，山寨电源有见过省EMI的但是保险丝还是会有。然后要达到整流桥，将220V的交流电变为直流，方便后面处理。然后到达PFC，这个主要是减少电网的供电需求，PFC目前来说分两种，主动PFC和被动PFC。&lt;/p&gt;
&lt;p&gt;被动PFC：
这个实际上就是一大块电感，然后用两根线接到主板上。国家3C认证的要求是主机电源不管被动还是主动，必须要有PFC。如果这玩意没有，那么说明这个电源八成就是作假实际上没过3C认证。更有严重的比如水泥PFC，那对于电源来说就是非常危险的。一般低于150块的全新电源用的都是被动PFC，因为这玩意制作成本较低，不需要芯片什么的，一个大线圈就行。&lt;/p&gt;
&lt;p&gt;主动pfc：
比较明显确定的就是在EMI滤波和大大的主电源中间的PFC电感。但是怎么确定是PFC电感而不是EMI的电感呢？自然就是找整流桥了，除非特殊设计的奇葩电路，不然主动PFC会设置在整流桥的后面。&lt;/p&gt;
&lt;p&gt;PFC再过来是主电容（也可以说是PFC电容），基本上电源内部最大的电容就是它了，根据电路设计会有一个或者多个主电容。它的作用一是滤波，二是把一定的电存起来，万一突然断电，它就持续供电一定的时候确保机器进行一些保护性的操作，也就是说前面的保持时间和他直接关联，容量过小的话保持时间自然达不到合格标准。电容主要分几个参数：耐压值、容量、耐高温。耐压如名字，能承认多大电压，我们市电是220v，但是滤波电容有个副作用会升压，实际上到达这里之后会变成300V多点（但是我没有找到任何资料说明主电容是专门为了升压而设置的），所以一般都会采用400V左右耐压的电容。容量指的是存电的量，一般来说450W的标准配置是270μf，600W大概450μf，到了850W、1000W以上，很多大牌子都是采用1W 1μf的配置。 按照比例算的话极限最低的数值是每瓦0.5μf，不过只要极个别电源这么低还能达标，实际要看电路设计，很多0.6μf / W都不一定能过关。于是0.5都达不到的基本要boom。耐高温，这个不用说也是越高越好，主要有105度和85度。主电容是看电源拆解最容易看清楚参数的，本身也有较高的成本，所以对于电源用料如何、有没缩水来说，是一个很有参考价值的地方。除了上面说的容量以外，电容由谁生产也很重要，基本上是日本电容 &amp;gt; 台湾电容 &amp;gt; 大陆电容。当然主电容不缩不代表其他地方不缩，只不过是这个最容易看而已。很多时候你好不容易找到拆解，会发现只有这一个东西能看清楚。对于多个电容的，会有并联和串联两种方式（实际上还是作为一个来用）。两电容并联耐压为两者中耐压最低的那个值，容量为二者之和。两电容串联耐压为两者之和，容量为两者的倒数和分之一，实际上，在这里要变压之前要先将直流重新打为高频脉冲电流，而且频率要比市电220V的60hz高很多。这一点是使用开关管来实现的，这也是它们的完整名字叫作“开关电源”的原因。&lt;/p&gt;
&lt;p&gt;老式半桥：老式半桥的特征就是一大两小的三个变压器，是很老的一种电源结构，它的转换率不理想，但是生产简单，技术水平要求较低，成本也低，同时一般也会使用同样成本较低的被动PFC，或者因为出厂时间久远而没有PFC。自然也拿不到80plus认证。&lt;/p&gt;
&lt;p&gt;单管正激和双管正激：
它们最明显特征就是一大一小两个变压器。其中单管正激和双管正激实际说的并不是电压器的数量，而是开关管。正是通过它（们）的通断来实际直流到高频的变化。双管要强于单管。开管关会锁在散热片上面。双管正激架构对比老式半桥有明显提升，一般都能拿到80plus铜牌，甚至好一点的都会有银牌，但是要做到更高的金牌和白金就比较困难。正激结构也用一种叫有源钳位正激 的“加强版，做到金牌以上效率也没问题，但是实际使用可能因为成本或者效率或者其他原因，现在只有比较少的电源使用。这种在外观上普通的双管正激是很像的，还以评测为准。&lt;/p&gt;
&lt;p&gt;LLC半桥：
一大两小三个变压器，使用LLC半桥的电源很容易做到金牌以上的效率，LLC的弱点是动态性能不好，不过这几年随着技术发展，而且实际影响也不是那么大。在这方面正激结构反而有一定优势，所以做到高瓦数的正激结构也不是不可以的，LLC的外观和老式半桥有点像，不过使用这种结构的一般会和同步整流以及DC-DC配合这样的高配置，所以结合起来还是比较好判断的。&lt;/p&gt;
&lt;p&gt;LLC全桥：
而LLC全桥因为结构复杂，基本上没几个电源在用，看起来和LLC半桥很难区分&lt;/p&gt;
&lt;p&gt;最后就是输出部分。&lt;/p&gt;
&lt;p&gt;这里有几个步骤要做。一是整流，之前在变压的时候的高频脉冲电流显然是不能供给硬件用的，需要重新变回直流。二是稳压，确保输出电压稳定。三是滤波，和前面主电容的功能一样，整流之后不够干净的电流需要重新过滤一次。他们的顺序根据结构会有些差异。整流目前主要是两种方案：&lt;/p&gt;
&lt;p&gt;肖特基整流：
主要由锁在散热片上面的多枚肖特基二极管完成。&lt;/p&gt;
&lt;p&gt;同步整流：
简单来讲可以认为就是MOS管代替肖特基管来整流，使用这种的主要目的是为了提升转换效率，肖特基管的电阻还是要高一些的。&lt;/p&gt;
&lt;p&gt;这方面其实不用太在意，因为对于性能来说是直接体现在转换率上的，只要能达到金牌管他是啥了。另外一个部分就是稳压，目前主要有三个方案，单路磁放大、双路磁放大、DC-DC。这里要重点注意。&lt;/p&gt;
&lt;p&gt;单路磁放大：
这个实际上就是将3.3V单独一路输出，特征是一小两大三个线圈。而12V和5V都是由PWM芯片来管理，所以瓦数大了之后交叉负载会非常差，比如12V高负载之后5V就会电压过高或者过低这样，有可能你单机玩的正爽突然间硬盘就挂了或者特别快出坏道。单路磁的极限基本是在500W这样。&lt;/p&gt;
&lt;p&gt;双路磁放大：
这个就是将3.3v和5v都独立出来，稳定性对面上面的会更好一些，特征是两小三大 五个线圈。双路磁放大可以做到1000W以上，在dc-dc出来之前是高瓦数电源的标准方案。&lt;/p&gt;
&lt;p&gt;DC-DC（直流转直流）：
3.3v和5v都从12V转出来，这样12V可以做到最大，都是12V出来的，也不用担心交叉负载的问题了。特征是在输出侧会有一个竖起来的PCB版，上面有双线圈和一堆元件。&lt;/p&gt;
&lt;p&gt;输出的最后一个工序就简单了
通过电容进行滤波，电容容量大、牌子好、数量多，那自然出来的纹波就小，电源使用寿命也长。这边只要确认产地即可，实际输出性能直接参考纹波方面的评测就好了。&lt;/p&gt;
&lt;p&gt;总结：
无PFC / 假PFC &amp;lt; 被动PFC &amp;lt; 主动PFC
老式半桥 &amp;lt; 单管正激 &amp;lt; 双管正激 、LLC半桥/全桥 （效率成本动态响应等各方面互有胜负）
单路磁放大 &amp;lt; 双路磁放大 &amp;lt; DC-DC&lt;/p&gt;
</content:encoded></item><item><title>电源参数指标笔记</title><link>https://onioni.cn/posts/computer-power-supply01/</link><guid isPermaLink="true">https://onioni.cn/posts/computer-power-supply01/</guid><description>额定瓦数越大越好吗？80plus是什么东东？网站评测怎么看？</description><pubDate>Thu, 21 Mar 2019 00:00:00 GMT</pubDate><content:encoded>&lt;p&gt;1.电源参数&lt;/p&gt;
&lt;p&gt;要选购一个合适的电源，最最最基本的要求就是输出功率能达到主机配置的需求，带得动你的硬件。 很多之前已经有主机想升级的人，都会问自己的电源实际是多少瓦，升级能带动什么等等，而这些都会标在电源的铭牌上面，所以先来讲一下电源的参数怎么看。在不考虑虚标的情况实际使用中不能把电脑各种硬件的功率加起来然后觉得不超过实际功率就OK，因为主机电源将交流电转换之后会分为几种不同电压的输出，不同硬件使用的电压是不一样的。
电源输出分为：
+12V、+5V、+3.3V、-12V、+5VSB
台式主机中：
CPU 全部为+12V供电
显卡 绝大部分+12V电脑中电力消耗最大的地方
主板 12V、+5V、+3.3V都有，不过较小，一般也就几十瓦的功耗
3.5寸硬盘 +12V和+5V
2.5寸硬盘 +5V 和 +3.3V
USB设备 +5V供电
PCI设备 5V和3.3V供电
PCIE设备 主要使用12V供电，也留有3.3V的供电供其他设备使用，PCIE槽至少要给显卡提供75W的+12V供电&lt;/p&gt;
&lt;p&gt;注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;-12V只有部分电路会使用，5VSB是待机电压，这两个功率都很小，不需要太多关注。&lt;/li&gt;
&lt;li&gt;tdp实际上是散热设计功耗，一般是极限满负载的情况下的最大发热量，根据能量守恒，供给CPU的电力除了极小的部分变为电磁辐射外，基本上都会转化为热能，所以一般也和极限功耗相近，是一种粗略的估算方式&lt;/li&gt;
&lt;li&gt;机械硬盘，虽然运行起来之后只有10W左右的功率，但是启动的时候最大功率会上到30W左右，主要是+12V，马达启动功耗，所以如果是带多个硬盘这点也要考虑进去的。当然开机的时候CPU和显卡负载比较低，并不会和硬盘一起产生较大的功率需求，电源输出满足硬盘数*30 + 100W这样基本就不会出现开了机的问题了。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;额定输出和峰值的问题
国内讲的额定就是指在这个功率范围内，可以连续长时间输出，而峰值或者最大功率，则是在较短的时间内可以提供输出（国际上铭牌比较正规的标识方法是要写上时间的，一般不会长于一分钟），高于这个时间就会断电保护，所以对我们来说只看额定即可，峰值可以说几乎没有参考意义。另外这里的输出不需要考虑转换率的问题，标明100W就必须能输出这么多，转换率是用来计算插座那边的功率，也即是要交多少电费的。&lt;/p&gt;
&lt;p&gt;注：某些电源的12V与众不同，12v分成了12V1和12V2。做成这样是为了防止12V电流过大烧线，也是一种出于安全的考虑，其中12v1是给显卡供电，12V2是给CPU供电（按照intel的标准，12v2只能供给cpu，不能供给其他东西）。不过上面这个电源12V1依然限制了最大电流输出，所以如果要上大火炉显卡的话依然没这么方便。选电源的话挑单路输出的用起来可以不用考虑这么多。至于烧线的问题，早期大瓦数的电源都会分多路，现在新标准新技术之后，已经可以说比较安全，不需要考虑太多了。对于更多的三路或者四路甚至六路+12V的电源，这个情况就比较混乱了。&lt;/p&gt;
&lt;p&gt;2.80PLUS / 牌。&lt;/p&gt;
&lt;p&gt;平时买电源的时候，经常会看到铜牌 银牌 金牌什么的，这个其实指的是80plus认证。台式机电源有一个转换率的问题，假如你的电脑功耗是300W，那么插座那边占用的功率实际要比这个大，电源自身要消耗一些功率，常见的电源的转换率会是80%+。而80plus就是美国定制的一套环保标准，如果你的电源转换率较高，那么考虑到对环保的供献会有奖励同时给你发个牌子。这里有一个常见的误区，很多人买电源会优先看金牌的，但是，80plus仅仅是一个节能的认证，对于做工用料输出稳定性等其他东西，一概不会去管。80plus金牌不等于电源是一个好电源。&lt;/p&gt;
&lt;p&gt;早期80plus基本来说有两个要求：
1.同时支持110V和220V
2.在不同负载下达到要求转换效率&lt;/p&gt;
&lt;p&gt;以白牌为例，假如你的电脑硬件是300W功耗，那么插座那边的消耗会是300 / 0.8 = 375W。14年的时候推出了新版的80plus认正，增加了230V的版本，也就是说有牌的也不一定就是110~220V全幅。使用新标准的电源都是15年才出的，数量比较少，但是确实是有的，购买的时候一定要仔细看铭牌和参数介绍。同时可以说80plus的含金量也开始变少，越来越不能反应电源内部的用料情况了。&lt;/p&gt;
&lt;p&gt;3.线材&lt;/p&gt;
&lt;p&gt;CPU供电
一般来说分为4pin和8pin两种。之所以有两种，是因为早期CPU功耗较小，只使用4pin就足够，随着CPU性能提长，电力要求也越来越大，所以标准改为8pin，实际目的是为了将供电线加粗，减少线阻和发热，降低烧线的可能性。
所以除非主板有特殊规定，不然只插一半的4pin依然是可以正常启动。8pin的电源线插4pin主板一样是只插能插进去的一半就行。这个问题主要是在老电源带新主板或者反过来，新出的一般都是按照8pin标准了。 对于要求一定要插够8pin的主板而你又只有4pin电源，也可以去购买转换线。很多双路主板都会要求两个，当然有些只插一个也能工作，具体要看主板。对于只用一个CPU插头但是主板需要两个的同样有转换线可以买，当然电源原生支持依然是最好的。&lt;/p&gt;
&lt;p&gt;主板供电插头
同样考虑到新老标准的问题，很老的主板和电源都是20pin供电，后来额外增加了4pin。因为考虑到兼容性，新出的电源都是采用魔术扣，额外的4针可以拆下来，给老主板供电的时候只插20pin就可以了。对于老电源带新主板，也是靠一边将20针插上，额外的4针空出来即可。新增的这4pin主要是给pcie槽进行供电，里面包含3.3V和+12V，不插的话如果要上不带外接供电的独立显卡有可能会出现带不起的情况，实际上连24pin都不提供的老电源，一般+12V输出也比较低，可以考虑让他退休了。&lt;/p&gt;
&lt;p&gt;大4PIN或者说D型供电头
主要是用来给IDE硬盘或者光驱供电，现在IDE基本上已经淘汰，更多是用来给机箱风扇供电，也有部分主板为了满足PCIE槽供电在主板上设置这个供电口，看到这个口最好插上，防止不带外置供电的显卡供电不足。还有一些pci扩展卡（比如usb3.0)，也会用他来确保额外的电力。&lt;/p&gt;
&lt;p&gt;sata供电口
主要是给硬盘和光驱供电，其他用途的见得比较少。sata口和大4pin可以互转&lt;/p&gt;
&lt;p&gt;PCIE接头
一般是6针或者是 6针外加一个2针的魔术扣，这个主要是给显卡进行供电。对于具体多少针支持多少功率其实不用刻意去记，因为电源带的起的都会提供对应的插头，只要显卡上面的供电插头插满就行了。550W以内一般只提供两个6+2。这是因为单个6pin或者8pin是有供电限制的，厂家不提供这么多也是怕你用低瓦数电源去带多卡，具体可以看参数和介绍页的说明。pcie也可以由大4pin转过来，显卡也会附带转换线，但是少一层转接还是少一点风险（做工好的转换线一般问题不大，差一点的时间久了可能会生锈接触不良等等）。&lt;/p&gt;
&lt;p&gt;软驱供电，
这种已经用的很少了，IDE转SATA卡上会用到。&lt;/p&gt;
&lt;p&gt;4.模组&lt;/p&gt;
&lt;p&gt;随着供电的增加，也会提供更多的接口，这个时候如果一台机器用不上那么多接口，多出来的线就会很麻烦，于是就有了模组这样的设计，将线材独立出来，同时电源本身做好插头，这样只接上需要的线材，那么对于机箱理线会方便非常非常多。主要来说分为三种：非模组、半模组、全模组。&lt;/p&gt;
&lt;p&gt;非模组：所有的线材都是焊死在电源PCB上，不能拆，500W以内大部分都是这样的设计。&lt;/p&gt;
&lt;p&gt;半模组：CPU和主板线这种肯定要插上的依然留焊死，剩下的硬盘显卡等线材设计成插头的模式。&lt;/p&gt;
&lt;p&gt;全模组：包括CPU、主板全部设计成插拔式，高端高瓦数的电源基本上都是全模组设计，对于想使用定制线的DIY玩家，全模组的效果明显更统一一些，同时使用特殊机箱的话也能更换更长的线材防止够不到。&lt;/p&gt;
&lt;p&gt;5.电源的性能指标和评测应该怎么看&lt;/p&gt;
&lt;p&gt;除了上面功率等参数外，衡量电源性能的其他还有其他的一些数据，而这些东西铭牌是不会标上的，需要经过仪器来检测，主要有下面这些：&lt;/p&gt;
&lt;p&gt;转换效率：虽然标有80plus的能大致知道转换率，但是实际上电源在不同负载的时候转换效率是不一样的，一般来说负载在中间位置的时候效率最高，在220V下转换效率比110V下高。&lt;/p&gt;
&lt;p&gt;电压偏离：或者说电压稳定性，虽然铭牌上面标了+12V，+5V什么的，但是实际因为电路等问题，输出会有一定的偏差，比如+12V可能是12.15V这样。Intel规定的偏移是上下不超过5%越好的电源电压输出越准确。&lt;/p&gt;
&lt;p&gt;纹波：因为电源在变压过程中要把电流转换成高频脉冲，所以实际输出的时候虽然要经过滤波，但是不一定能滤的干净。Intel规定，+12V上限120mv，+5V和3.3V是50mv。&lt;/p&gt;
&lt;p&gt;交叉负载：这个测试的目的就是检查，当12V 5V 3.3V功耗占用比例不同的时候，他们是不是还能保持准确的电压。&lt;/p&gt;
&lt;p&gt;保持时间：在外部断电之后，电源还需要提供一段时间的供电。一是用来确保硬件进行一些保护性操作，比如硬盘磁头归位，SSD掉电保护等等。还有就是UPS响应是有时间的，大概是市电一个周期，也就是16ms，intel标准也正是16ms，电源必须要坚持到UPS过来救场。如果保持时间不足，是有可能影响到硬件寿命的，以及就算上了UPS也可能导致自动关机以致于不能保存你重要的文件。&lt;/p&gt;
&lt;p&gt;动态响应：也就是当功耗发生变化的时候电源“跟上”的速度，表现为负载变化之后电压的稳定性，不过这项目前来说其实影响不是特别大，大牌子电源基本上都是合格的，我也想像不出正常使用有什么场景会让功率“快速抽搐”。&lt;/p&gt;
&lt;p&gt;注：除了电压之外，其他的都需要专门的仪器，比如纹波要用示波器等（贵）。另外电压是不能用软件测的，主板那边的电压识别不是特别准确，还有识别错误的可能性。所以要看上面这些“隐藏”但是又比较重要的参数，只能看大网站的评测，国内来说，比较靠谱的是 超能网、玩家堂、泡泡网、CHH这几个网站，当然还是国外比较严谨，比如tech power up、junny guru这几家。&lt;/p&gt;
</content:encoded></item><item><title>Linux 指令笔记（五）</title><link>https://onioni.cn/posts/linux05/</link><guid isPermaLink="true">https://onioni.cn/posts/linux05/</guid><description>解压缩 操作</description><pubDate>Mon, 25 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;解压缩 操作&lt;/h3&gt;
&lt;h4&gt;在Linux中经常会下载到压缩文件，而压缩文件的格式有很多，比如 zip、rar、gz、xz、tar.gz、tar.xz等。&lt;/h4&gt;
&lt;h4&gt;比较常见的就是各种 .tar、.tar.xz、.tar.gz、.tar.bz、.tar.bz2、.tar.Z 后缀压缩包，这几个的解压缩命令基本一样，说明一下参数的意义。&lt;/h4&gt;
&lt;h5&gt;tar 本身只是一个打包的作用，而 .tar 后面的 .zx / .gz / .bz 等等才是压缩格式，也就是比如 log.tar.gz 压缩包，就是先用 .tar 把指定文件/文件夹打包到一起，然后再用 gz 来压缩打包后的 .tar 为 .tar.gz 。&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;-x 是从压缩文件提取(解压)文件出来，所以在解压命令中都有这个参数。&lt;/code&gt;
&lt;code&gt;-c ：创建一个新的压缩包文件，所以在压缩命令中都有这个参数。&lt;/code&gt;
&lt;code&gt;-f ：指定要解压的压缩包文件或要压缩的文件/文件夹，所以这个参数必须放在 解压缩命令参数的最后，然后后面跟着 要解压到压缩包文件或要压缩的文件/文件夹。&lt;/code&gt;
&lt;code&gt;-j ：解压缩 bz / bz2 格式的参数&lt;/code&gt;
&lt;code&gt;-J ：解压缩 xz / lzip 格式的参数&lt;/code&gt;
&lt;code&gt;-z ：解压缩 gz / tgz 格式的参数&lt;/code&gt;
&lt;code&gt;-Z ：解压缩 Z 格式的参数&lt;/code&gt;
&lt;code&gt;-v ：详细列出解压缩过程中处理的文件&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 tar --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;tar gz zip等 解压 压缩包 示例&lt;/h3&gt;
&lt;h4&gt;解压压缩包说明&lt;/h4&gt;
&lt;h6&gt;解压后缀为 .tar 的压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -xf log.tar&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .tar.xz 的压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -xJf log.tar.xz&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .tar.gz 的压缩包，两个方法&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -xzf log.tar.gz&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .gz 的压缩包，两个方法，如提示命令不存在，请安装 yum install gzip -y / apt-get install gzip -y&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;gzip -d log.gz&lt;/code&gt;
&lt;code&gt;gunzip log.gz&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .bz / .bz2 / tar.bz2 的压缩包，两个方法&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;bzip2 -d log.bz&lt;/code&gt;
&lt;code&gt;bunzip2 log.bz&lt;/code&gt;
&lt;code&gt;tar -jxf log.tar.bz&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;bzip2 -d log.bz2&lt;/code&gt;
&lt;code&gt;bunzip2 log.bz2&lt;/code&gt;
&lt;code&gt;tar -jxf log.tar.bz2&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .Z / tar.Z 的压缩包，两个方法&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;uncompress log.Z log.txt&lt;/code&gt;
&lt;code&gt;uncompress log.Z log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tar xZf log.tar.Z log.txt&lt;/code&gt;
&lt;code&gt;tar xZf log.tar.Z log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .rar 的压缩包，如提示命令不存在，请安装 yum install unrar -y / apt-get install unrar -y ，注意 rar 和 unrar 是分开的&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;unrar x log.rar&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;解压后缀为 .zip 的压缩包，如提示命令不存在，请安装 yum install unzip -y / apt-get install unzip -y，注意 zip 和 unzip 是分开的&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;unzip log.zip&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 tar --help / gzip --help / unrar --help / unzip --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;压缩 文件/文件夹 示例&lt;/h3&gt;
&lt;h4&gt;压缩文件/文件夹说明&lt;/h4&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.tar 压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -cf log.tar log.txt&lt;/code&gt;
&lt;code&gt;tar -cf log.tar log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;如果要压缩多个文件和文件夹，那么只需要在后面一直加下去即可&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -cf log.tar log.txt doub.txt log bash&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.tar.xz 压缩包，以下的其他后缀压缩命令都是一样&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -cJf log.tar.xz log.txt&lt;/code&gt;
&lt;code&gt;tar -cJf log.tar.xz log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.tar.gz 压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tar -czf log.tar.gz log.txt&lt;/code&gt;
&lt;code&gt;tar -czf log.tar.gz log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.gz 压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;gzip log.gz log.txt&lt;/code&gt;
&lt;code&gt;gzip log.gz log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.tar.bz 压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;暂时没找到解决方法&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.bz / log.tar.bz / log.bz2 / log.tar.bz2压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;bzip2 -z log.txt&lt;/code&gt;
&lt;code&gt;bzip2 -z log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tar cjf log.tar.bz2 log.txt&lt;/code&gt;
&lt;code&gt;tar cjf log.tar.bz2 log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.Z / log.tar.Z 压缩包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;compress log.txt&lt;/code&gt;
&lt;code&gt;compress log&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;tar cZf log.tar.Z log.txt&lt;/code&gt;
&lt;code&gt;tar cZf log.tar.Z log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.rar 压缩包，如提示命令不存在，请安装 yum install rar -y / apt-get install rar -y ，注意 rar 和 unrar 是分开的&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;unrar a log.rar log.txt&lt;/code&gt;
&lt;code&gt;unrar a log.rar log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;分别压缩当前目录下的 log.txt文件 / log文件夹为 log.zip 压缩包，如提示命令不存在，请安装 yum install zip -y / apt-get install zip -y ，注意 zip 和 unzip 是分开的&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;zip log.zip log.txt&lt;/code&gt;
&lt;code&gt;zip log.zip log&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 tar --help / gzip --help / rar --help / zip --help 来查看。&lt;/h4&gt;
</content:encoded></item><item><title>Linux 指令笔记（四）</title><link>https://onioni.cn/posts/linux04/</link><guid isPermaLink="true">https://onioni.cn/posts/linux04/</guid><description>查看/编辑文件 操作</description><pubDate>Thu, 07 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;查看/编辑文件 操作&lt;/h3&gt;
&lt;h4&gt;ls 显示目录中文件&lt;/h4&gt;
&lt;h4&gt;ls命令说明&lt;/h4&gt;
&lt;h5&gt;显示当前目录下的所有文件&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;ls -a&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;命令后面加上 绝对路径/相对路径 就会显示指定文件夹内的所有文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;ls -a bash/log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;相对路径，当前目录是 /root ，欲查看的目录是 /root/bash/log&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;ls -a /root/bash/log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;绝对路径， 当前目录是 /root ，欲查看的目录是 /root/bash/log&lt;/h6&gt;
&lt;h4&gt;更多的命令可以用 ls --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;du 查看 文件/文件夹 占用磁盘空间的大小&lt;/h3&gt;
&lt;p&gt;####du命令说明&lt;/p&gt;
&lt;p&gt;#####参数介绍：
&lt;code&gt;-h ：以人类易读的方式显示&lt;/code&gt;
&lt;code&gt;-a ：显示 目录占用的磁盘空间大小，并显示其下目录和文件占用磁盘空间的大小&lt;/code&gt;
&lt;code&gt;-s ：显示 目录占用的磁盘空间大小，但不显示其下子目录和文件占用的磁盘空间大小&lt;/code&gt;
&lt;code&gt;-c ：显示几个目录或文件占用的磁盘空间大小，还要统计它们的总和&lt;/code&gt;
&lt;code&gt;--apparent-size：显示目录或文件自身的大小&lt;/code&gt;
&lt;code&gt;-l ：统计硬链接占用磁盘空间的大小&lt;/code&gt;
&lt;code&gt;-L ：统计符号链接所指向的文件占用的磁盘空间大小&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 du --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h5&gt;使用示例：&lt;/h5&gt;
&lt;h6&gt;假设当前位于 /root 目录下，则显示 /root 文件夹的大小，但不显示其子目录和文件的大小&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;du -sh&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;假设当前位于 /root 目录下，则显示 /root 文件夹的大小，并显示其子目录和文件的大小&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;du -ah&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;假设当前位于 /root 目录下，则显示 /root 文件夹下的所有文件夹的大小及其总和&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;du -lh --max-depth=1&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 du --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;cat 查看文件内容&lt;/h3&gt;
&lt;h4&gt;cat命令说明&lt;/h4&gt;
&lt;h5&gt;查看文件：&lt;/h5&gt;
&lt;h6&gt;查看 log.txt文件的所有内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cat log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的所有内容，并对所有行编号&lt;/h6&gt;
&lt;p&gt;cat -n log.txt&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的所有内容，并对非空行编号&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cat -b log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的所有内容，并对非空行编号，且不输出多行空行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cat -bs log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;清空文件：&lt;/h5&gt;
&lt;h6&gt;清空当前目录中的 log.txt 文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cat /dev/null &amp;gt; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h1&gt;清空 /var目录中的 log.txt 文件&lt;/h1&gt;
&lt;p&gt;&lt;code&gt;cat /dev/null &amp;gt; /var/log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;写入文件：&lt;/h5&gt;
&lt;h6&gt;写入文本到当前目录中的 log.txt文件中(加入文本到文件内容最后)&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cat &amp;gt;&amp;gt; log.txt &amp;lt;&amp;lt;-EOF&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;清空文件并写入文本到 /var目录中的 log.txt文件中(先清空后写入)&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cat &amp;gt; /var/log.txt &amp;lt;&amp;lt;-EOF&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 cat --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h4&gt;head 查看文件内容（主要用于正查）&lt;/h4&gt;
&lt;h5&gt;点击展开 查看 head命令说明&lt;/h5&gt;
&lt;h5&gt;参数介绍：&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;-c 数字：显示指定文件的前 xx 字节的内容（bytes）&lt;/code&gt;
&lt;code&gt;-n 数字：显示指定文件的前 xx 行的内容&lt;/code&gt;
&lt;code&gt;-q ：不显示包含指定文件名的文件头（当使用 head打开多个文件的时候，会去在每个文件输出结果的顶部添加一个包含文件名的文件头用于区分&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 head --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h4&gt;使用示例：&lt;/h4&gt;
&lt;h6&gt;查看 log.txt文件的全部内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;head log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的前 3字节的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;head -c 3 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;输出示例&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;dou&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的前 2行的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;head -n 2 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的从倒数第2行到行首的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;head -n -2 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt log1.txt log2.txt文件的前 3行内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;head -n 3 log.txt log1.txt log2.txt&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 head --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h5&gt;tail 查看文件内容（主要用于倒查）&lt;/h5&gt;
&lt;h6&gt;查看 tail命令说明&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;-c 数字：如果数字为正数(例如 -c +5)，显示指定文件从行首第 xx 字节到最后的内容；如果数字为负数(例如 -c -5)，显示指定文件从行尾第 xx 字节到最后内容。&lt;/code&gt;
&lt;code&gt;-n 数字：如果数字为正数(例如 -c +3)，显示指定文件从行首第 xx 行到最后的内容；如果数字为负数(例如 -c -3)，显示指定文件从行尾第 xx 行到最后的内容。&lt;/code&gt;
&lt;code&gt;-f ：即时输出文件变化后增加的内容，也就是监视一个文件的内容变化（常用于监视日志输出），使用 Ctrl＋C 终止&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 tail --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h5&gt;使用示例：&lt;/h5&gt;
&lt;h6&gt;查看 log.txt文件的全部内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件从行首 第25字节到最后的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail -c +25 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件从行尾 第4字节到最前面的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail -c -4 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的从第2行到最后一行的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail -n +2 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt文件的后 2行的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail -n -2 log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;持续查看（监视） log.txt文件的变化内容（新增加的内容），使用 Ctrl＋C 终止&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail -f log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt log1.txt log2.txt文件的前 3行内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;tail -n 3 log.txt log1.txt log2.txt&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 tail --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;sed 查看/编辑文件内容&lt;/h3&gt;
&lt;h4&gt;查看 sed命令说明&lt;/h4&gt;
&lt;h6&gt;参数介绍：&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;-i ：操作后应用保存到原文件（如果不加这个参数，那么任何修改都不会影响原文件里的内容，只会把结果输出）&lt;/code&gt;
&lt;code&gt;-e ：仅显示处理后的结果&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 sed --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h4&gt;使用示例：&lt;/h4&gt;
&lt;h4&gt;查看 log.txt 第3行的内容&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;sed -n &apos;3p&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;查看 log.txt 第2-8行的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -n &apos;2,8p&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 第1行（首行）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;1d&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 第3-7行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;3,7d&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 最后1行（尾行）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;$d&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 中所有空白行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;/^$/d&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 开头是 doubi 的行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;/^doubi/&apos;d log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 结尾是 doubi 的行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;/doubi$/&apos;d log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 文件中所有包含 233内容的行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;/233/d&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 文件中第一个 233文本&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;s/233//&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 文件中所有 233文本(g 代表操作所有匹配规则的文本)&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;s/233//g&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除 log.txt 文件中所有 第5个233文本(5g 代表第五个匹配规则的文本)&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;s/233//5g&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;替换 log.txt 文件中第一个 233为666&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;s/233/666/&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;替换 log.txt 文件中所有 233为666(g 代表操作所有匹配规则的文本)&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &apos;s/233/666/g&apos; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;替换 log.txt 文件中所有 /ver 为 doubi/，因为有斜杠，所以需要使用 \ 转义，但是单引号会导致无法转义，所以要改成双引号。&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -i &quot;s/\/ver/doubi\//&quot; log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;显示 log.txt 文件中的奇数行或偶数行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;sed -n &apos;p;n&apos; log.txt #奇数行&lt;/code&gt;
&lt;code&gt;sed -n &apos;n;p&apos; log.txt #偶数行&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 sed --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;VI、VIM、Nano 编辑文件内容&lt;/h3&gt;
&lt;h4&gt;vi vim none命令说明&lt;/h4&gt;
&lt;h4&gt;VI 介绍&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;VI 是Linux很棒的一个文本编辑器，不过也存在一些缺点，比如操作麻烦。而 vim就相当于 VI 的加强版，主要介绍 VIM。&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;VIM 介绍&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;使用教程：Linux 文本编辑器 VIM 真 · 简单使用教程&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;打开当前目录下的 log.txt文件，如果没有那么会新建 log.txt文件（安装vim后，使用 vi和 vim打开文件没区别）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;vi log.txt&lt;/code&gt;
&lt;code&gt;vim log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;在命令行模式下，直接输入以下 符号和字母(区分大小写)&lt;/h5&gt;
&lt;h6&gt;进入编辑模式（插入模式，按 Esc键 即可返回命令行模式）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;i&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除光标当前所在的一行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;dd&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除文件内所有内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;dddG&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制光标当前所在的一行&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yy&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;粘贴刚才复制的一行内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;p&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;撤销上个操作（误操作可以用这个恢复）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;u&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;保存当前文件（ : 是英文的冒号）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;:w&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;另存当前文件内容为 log2.txt&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;:w log2.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;退出当前文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;:q&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;不保存 并强制退出当前文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;:q!&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;保存并退出当前文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;:wq&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 vi --help / vim --help 来查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;Nano 介绍&lt;/h3&gt;
&lt;h4&gt;使用教程：Linux 更适合新手的文本编辑器&lt;/h4&gt;
&lt;h6&gt;打开当前目录下的 log.txt文件，如果没有那么会新建 log.txt文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;nano log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;进入后直接就可以输入修改文本内容了，修改后我们可以使用这个 按键保存内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;Ctrl+O&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;如果不需要编辑了，那么可以用这个 按键退出当前文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;Ctrl+X&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;如果你在退出前已经修改但没有保存，那么会提醒你是否保存，如果保存就输入 y ，不保存输入 n&lt;/h6&gt;
&lt;h6&gt;然后就会让你输入要保存的文件名（默认原文件名，所以直接按 Enter回车即可，除非你要另存为其他文件名）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;Enter&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以在 nano 编辑界面中按 F1键 查看。&lt;/h4&gt;
</content:encoded></item><item><title>Linux 指令笔记（三）</title><link>https://onioni.cn/posts/linux03/</link><guid isPermaLink="true">https://onioni.cn/posts/linux03/</guid><description>文件/文件夹 操作</description><pubDate>Wed, 06 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;文件/文件夹 操作&lt;/h3&gt;
&lt;p&gt;&lt;code&gt;以下除特殊说明，都以当前目录为 /root 示例。&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;mkdir 新建 文件夹&lt;/h4&gt;
&lt;h6&gt;在当前文件夹新建一个 bash 文件夹，完整的绝对路径就是 /root/bash&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;mkdir bash&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;更多的命令可以用 mkdir --help 查看。&lt;/h5&gt;
&lt;hr /&gt;
&lt;h4&gt;cp 复制或重命名 文件/文件夹&lt;/h4&gt;
&lt;h5&gt;cp命令说明&lt;/h5&gt;
&lt;h6&gt;复制当前目录内的 log.txt文件到 /var目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp log.txt /var/log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 bash文件夹到 /home目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp -R bash /home/bash&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的所有.txt后缀的文件到 /var/log目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp *.txt /var/log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的所有以 onioni开头的文件到 /var/log目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp onioni* /var/log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的所有以 onioni开头 以.txt后缀结尾的文件到 /var/log目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp onioni*.txt /var/log&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;假设当前目录是 /root/onioni/log，要把这个目录中的所有.txt后缀的文件复制到上一级目录 /root/onioni，那么这样做&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp *.txt ..&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;.. 就是相对路径，代表上一级目录，当然你也可以用绝对路径，这样更不容易出错&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp *.txt /root/onioni&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;重命名当前目录内的 log.txt文件为 log2.txt&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp log.txt log2.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 log.txt文件到 /var目录并重命名为 log1.txt&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp log.txt /var/log1.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 bash文件夹到 /home目录并重命名为 bash2&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp -R bash /home/bash2&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 log.txt文件到 /var目录，但是 /var 目录中已经存着 log.txt，那么会提示 cp: overwrite `/var/log.txt&apos;? 可以用 -f 强制覆盖&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp -f log /var/log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;大家可能会发现，当你使用 cp -f 强制覆盖的时候，依然会询问你是否覆盖，这是因为 CP 为了避免你手误，默认加上了 -i 参数（该参数代表每次覆盖必须询问）。&lt;/h6&gt;
&lt;h6&gt;所以想要避免 CP 默认的 -i 参数，只需要在 CP 命令前面加上斜杠即可 “/”&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;/cp -f log /var/log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 log.txt log1.txt log2.txt文件和 log233目录到 /home/log目录中&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;cp -R log.txt log1.txt log2.txt log233 /home/log&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 cp --help 查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h4&gt;mv 移动或重命名 文件/文件夹&lt;/h4&gt;
&lt;h5&gt;mv命令说明&lt;/h5&gt;
&lt;h5&gt;关于 mv 命令，可以参考上面 cp 的使用方法，没什么区别，只是一个是复制，一个是移动，把上面 cp 命令改成 mv 就能套用了。&lt;/h5&gt;
&lt;h6&gt;移动当前目录内的 log.txt文件到 /var目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;mv log.txt /var/log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;移动当前目录内的 bash文件夹到 /home目录&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;mv bash /home/bash&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;重命名当前目录内的 log.txt文件为 log2.txt&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;mv log.txt log2.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 log.txt文件到 /var目录并重命名为 log1.txt&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;mv log.txt /var/log1.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;复制当前目录内的 bash文件夹到 /home目录并重命名为 bash2&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;mv bash /home/bash2&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 mv --help 查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h4&gt;rm 删除 文件/文件夹&lt;/h4&gt;
&lt;h5&gt;rm命令说明&lt;/h5&gt;
&lt;h6&gt;删除当前目录下的 log.txt文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm log.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除当前目录下所有.txt后缀的文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm *.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;使用 rm 命令删除时，会提示你是否确定删除，输入 y 即删除，输入 n 则取消&lt;/h6&gt;
&lt;h6&gt;rm: remove regular file `log.txt&apos;? y&lt;/h6&gt;
&lt;h6&gt;删除当前目录下所有.txt后缀的文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm *.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除当前目录下所有以 onioni开头的文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm onioni*&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;删除当前目录下所有以 onioni开头 以.txt后缀结尾的文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm onioni*.txt&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;当你用 rm 删除目录的时候会发现提示这不是一个文件&lt;/h6&gt;
&lt;h6&gt;rm bash&lt;/h6&gt;
&lt;h6&gt;rm: cannot remove `bash&apos;: Is a directory&lt;/h6&gt;
&lt;h6&gt;可以加上 -r 来归递删除目录及其目录下的内容&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm -r bash&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;因为为了避免手误删除错误，rm默认加上了 -i 的参数，每一次删除文件/目录都会提示，如果觉得烦可以用 -rf 参数&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;rm -rf bash&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;&amp;lt;font color=&quot;#dd0000&quot;&amp;gt;rm -rf 这个命令请慎重使用，而且千万不要使用 rm -rf / 或者 rm -rf /* 之类的命令(系统自杀)，可能会让你直接跑路，所以使用请慎重！&amp;lt;/font&amp;gt;&lt;/h6&gt;
&lt;h4&gt;更多的命令可以用 rm --help 查看。&lt;/h4&gt;
</content:encoded></item><item><title>Linux 指令笔记（二）</title><link>https://onioni.cn/posts/linux02/</link><guid isPermaLink="true">https://onioni.cn/posts/linux02/</guid><description>包管理器：yum CentOS系统包管理器</description><pubDate>Tue, 05 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;包管理器&lt;/h3&gt;
&lt;h4&gt;yum CentOS系统包管理器&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;yum 是CentOS系统中 一个用于快速下载/安装的简单命令行管理工具！&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;yum 参数介绍&lt;/h4&gt;
&lt;h5&gt;命令:&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;update - 检索 新的包列表&lt;/code&gt;
&lt;code&gt;upgrade - 升级 软件包&lt;/code&gt;
&lt;code&gt;search - 搜索 软件包&lt;/code&gt;
&lt;code&gt;install - 安装 软件包&lt;/code&gt;
&lt;code&gt;list - 列出 软件包或者软件包组&lt;/code&gt;
&lt;code&gt;info - 显示软件包或者软件包组的详细信息&lt;/code&gt;
&lt;code&gt;erase - 删除 软件包（这两个命令一样）&lt;/code&gt;
&lt;code&gt;remove - 删除 软件包（这两个命令一样）&lt;/code&gt;
&lt;code&gt;groupinfo - 显示 有关包组的详细信息&lt;/code&gt;
&lt;code&gt;groupinstall - 安装 软件包组（就像一种软件合集）&lt;/code&gt;
&lt;code&gt;grouplist - 列出 可用的软件包组&lt;/code&gt;
&lt;code&gt;groupremove - 删除 软件包组&lt;/code&gt;
&lt;code&gt;check - 检查 软件包&lt;/code&gt;
&lt;code&gt;check-update - 检查 可更新的软件包&lt;/code&gt;
&lt;code&gt;clean - 清除 缓存目录内的软件包&lt;/code&gt;
&lt;code&gt;deplist - 列出 一个包的依赖关系&lt;/code&gt;
&lt;code&gt;distribution-synchronization - 同步 已安装的软件包到最新的版本&lt;/code&gt;
&lt;code&gt;downgrad - 降级 一个软件包&lt;/code&gt;
&lt;code&gt;reinstall - 重新安装 软件包（自动删除重装）&lt;/code&gt;
&lt;code&gt;repolist - 显示 配置的软件包仓库&lt;/code&gt;
&lt;code&gt;resolvedep - 确定 软件包需要的依赖关系&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;选项：&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;-t ：容忍错误&lt;/code&gt;
&lt;code&gt;-C ：完全从系统缓存运行，不要更新缓存&lt;/code&gt;
&lt;code&gt;-R 分钟 ：最大命令等待时间&lt;/code&gt;
&lt;code&gt;-q ：安静的操作&lt;/code&gt;
&lt;code&gt;-y ：对于所有问题回答是&lt;/code&gt;
&lt;code&gt;--nogpgcheck ：禁用gpg签名检查&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;更多的命令可以用 apt-get --help 查看。&lt;/h5&gt;
&lt;hr /&gt;
&lt;h4&gt;使用示例：&lt;/h4&gt;
&lt;h6&gt;检索 新的包列表&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum update&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;安装 Nginx 软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum install nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;安装 Development Tools 软件包组（这个软件包组中包含了编译所需的软件）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum groupinstall &quot;Development Tools&quot;&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;卸载 Nginx 软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum erase nginx / yum remove nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;卸载 Development Tools 软件包组&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum groupremove &quot;Development Tools&quot;&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;升级 所有可更新的软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum upgrade&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;升级 Nginx 可更新的软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum upgrade nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;安装 Nginx 软件包 并不显示确定提示&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum install nginx -y&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;卸载 Nginx 软件包 并不显示确定提示&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum erase nginx -y / yum remove nginx -y&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;搜索 Nginx 软件包是否存着&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum search nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;列出 可用的软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum list&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;列出 可用的软件包组&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum grouplist&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;清除 缓存目录中的所有软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum clean&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;清除 缓存目录中的 Nginx 软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum clean nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;重装 Nginx 软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;yum reinstall nginx&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 yum --help 查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;h3&gt;注：&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h6&gt;&amp;lt;font color=&quot;#dd0000&quot;&amp;gt;在安装软件和卸载的时候，为了避免误操作，都会询问是否继续，每次都要输入 y 来确定会很麻烦，可以加上 -y 参数&amp;lt;/font&amp;gt;&lt;/h6&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;h6&gt;&amp;lt;font color=&quot;#dd0000&quot;&amp;gt;当软件包或者软件包组的名字中包含空格的时候，软件包或软件包组需加上双引号！&amp;lt;/font&amp;gt;&lt;/h6&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Linux 指令笔记（一）</title><link>https://onioni.cn/posts/linux01/</link><guid isPermaLink="true">https://onioni.cn/posts/linux01/</guid><description>包管理器：apt-get Debian/Ubuntu系统包管理器</description><pubDate>Mon, 04 Feb 2019 00:00:00 GMT</pubDate><content:encoded>&lt;h3&gt;包管理器&lt;/h3&gt;
&lt;h4&gt;apt-get Debian/Ubuntu系统包管理器&lt;/h4&gt;
&lt;p&gt;&lt;code&gt;apt-get 是Debian/Ubuntu系统中 一个用于快速下载/安装的简单命令行管理工具！&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;apt-get命令说明&lt;/h4&gt;
&lt;h5&gt;命令:&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;update - 检索 新的包列表&lt;/code&gt;
&lt;code&gt;upgrade - 升级 可更新的所有软件包&lt;/code&gt;
&lt;code&gt;install - 安装 新软件包（pkg是libc6不是libc6.deb）&lt;/code&gt;
&lt;code&gt;remove - 删除 软件包&lt;/code&gt;
&lt;code&gt;autoremove - 自动删除 所有未使用的软件包&lt;/code&gt;
&lt;code&gt;purge - 删除 软件包和配置文件&lt;/code&gt;
&lt;code&gt;clean - 清除 已下载的归档文件&lt;/code&gt;
&lt;code&gt;autoclean - 清除 旧的下载的档案文件&lt;/code&gt;
&lt;code&gt;check - 验证 是否有损坏的依赖&lt;/code&gt;
&lt;code&gt;download - 下载 二进制包到当前目录&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;选项：&lt;/h5&gt;
&lt;p&gt;&lt;code&gt;-q ：不输出任何信息&lt;/code&gt;
&lt;code&gt;-qq ：除了错误之外，没有输出&lt;/code&gt;
&lt;code&gt;-d ：仅下载，不要安装或解压缩存档&lt;/code&gt;
&lt;code&gt;-y ：对所有确定询问都选择 Yes，并且不提示&lt;/code&gt;
&lt;code&gt;-f ：尝试纠正 被破坏依赖关系的系统&lt;/code&gt;
&lt;code&gt;-m ：如果存档是可定位的，则尝试继续&lt;/code&gt;
&lt;code&gt;-u ：显示升级包的列表&lt;/code&gt;
&lt;code&gt;-b ：在获取源代码包后构建源包&lt;/code&gt;&lt;/p&gt;
&lt;h5&gt;更多的命令可以用 apt-get --help 查看。&lt;/h5&gt;
&lt;hr /&gt;
&lt;h4&gt;使用示例：&lt;/h4&gt;
&lt;h6&gt;检索 新的包列表&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get update&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;升级 可更新的所有软件包（注意这个命令会升级所有的软件包，所以会升级很长时间）&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get upgrade&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;安装 Nginx 软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get install nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;卸载 Nginx 软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get remove nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;卸载 Nginx 软件包 并删除所有相关配置文件&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get remove --purge nginx&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;安装 Nginx 软件包 并不显示确定提示&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get install nginx -y&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;卸载 Nginx 软件包，删除所有相关配置文件 并不显示提示&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get remove --purge nginx -y&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;清除 旧的/无用 的软件包&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get clean &amp;amp;&amp;amp; apt-get autoclean&lt;/code&gt;&lt;/p&gt;
&lt;h6&gt;下载 Nginx 二进制软件包到当前目录，但不解压和安装&lt;/h6&gt;
&lt;p&gt;&lt;code&gt;apt-get download nginx -d&lt;/code&gt;&lt;/p&gt;
&lt;h4&gt;更多的命令可以用 apt-get --help 查看。&lt;/h4&gt;
&lt;hr /&gt;
&lt;p&gt;###注：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
&lt;h6&gt;&amp;lt;font color=&quot;#dd0000&quot;&amp;gt;在安装软件和卸载的时候，为了避免误操作，都会询问是否继续，每次都要输入 y 来确定会很麻烦，可以加上 -y 参数&amp;lt;/font&amp;gt;&lt;/h6&gt;
&lt;/li&gt;
&lt;/ul&gt;
</content:encoded></item><item><title>Black Clover Ending 11 Full</title><link>https://onioni.cn/posts/answer-kaf_lyrics/</link><guid isPermaLink="true">https://onioni.cn/posts/answer-kaf_lyrics/</guid><description>アンサー</description><pubDate>Tue, 24 Apr 2018 00:00:00 GMT</pubDate><content:encoded/></item><item><title>Promise Full Version</title><link>https://onioni.cn/posts/promise_full_version/</link><guid isPermaLink="true">https://onioni.cn/posts/promise_full_version/</guid><description>Epic Seven</description><pubDate>Sat, 14 Apr 2018 00:00:00 GMT</pubDate><content:encoded/></item><item><title>ミオン降臨！道中</title><link>https://onioni.cn/posts/kofwfe-a1h4/</link><guid isPermaLink="true">https://onioni.cn/posts/kofwfe-a1h4/</guid><description>パズドラBGM</description><pubDate>Fri, 30 Mar 2018 00:00:00 GMT</pubDate><content:encoded/></item><item><title>ミカヅキBIGWAVE FRESH!!</title><link>https://onioni.cn/posts/av21173145/</link><guid isPermaLink="true">https://onioni.cn/posts/av21173145/</guid><description>from Waifu Wednesdays.</description><pubDate>Sat, 24 Mar 2018 00:00:00 GMT</pubDate><content:encoded/></item></channel></rss>