CINXE.COM
Life is different
<!DOCTYPE html> <html class="theme-next muse use-motion" lang="zh-CN"> <head><meta name="generator" content="Hexo 3.9.0"> <meta charset="UTF-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=2"> <meta name="theme-color" content="#222"> <meta http-equiv="Cache-Control" content="no-transform"> <meta http-equiv="Cache-Control" content="no-siteapp"> <link href="/lib/font-awesome/css/font-awesome.min.css?v=4.6.2" rel="stylesheet" type="text/css"> <link href="/css/main.css?v=6.4.2" rel="stylesheet" type="text/css"> <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon-next.png?v=6.4.2"> <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32-next.png?v=6.4.2"> <link rel="icon" type="image/png" sizes="16x16" href="/images/favicon-16x16-next.png?v=6.4.2"> <link rel="mask-icon" href="/images/logo.svg?v=6.4.2" color="#222"> <script type="text/javascript" id="hexo.configurations"> var NexT = window.NexT || {}; var CONFIG = { root: '/', scheme: 'Muse', version: '6.4.2', sidebar: {"position":"left","display":"post","offset":12,"b2t":false,"scrollpercent":false,"onmobile":false}, fancybox: false, fastclick: false, lazyload: false, tabs: true, motion: {"enable":true,"async":false,"transition":{"post_block":"fadeIn","post_header":"slideDownIn","post_body":"slideDownIn","coll_header":"slideLeftIn","sidebar":"slideUpIn"}}, algolia: { applicationID: '', apiKey: '', indexName: '', hits: {"per_page":10}, labels: {"input_placeholder":"Search for Posts","hits_empty":"We didn't find any results for the search: ${query}","hits_stats":"${hits} results found in ${time} ms"} } }; </script> <meta property="og:type" content="website"> <meta property="og:title" content="Life is different"> <meta property="og:url" content="http://ideal.github.io/index.html"> <meta property="og:site_name" content="Life is different"> <meta property="og:locale" content="zh-CN"> <meta name="twitter:card" content="summary"> <meta name="twitter:title" content="Life is different"> <link rel="canonical" href="http://ideal.github.io/"> <script type="text/javascript" id="page.configurations"> CONFIG.page = { sidebar: "", }; </script> <title>Life is different</title> <noscript> <style type="text/css"> .use-motion .motion-element, .use-motion .brand, .use-motion .menu-item, .sidebar-inner, .use-motion .post-block, .use-motion .pagination, .use-motion .comments, .use-motion .post-header, .use-motion .post-body, .use-motion .collection-title { opacity: initial; } .use-motion .logo, .use-motion .site-title, .use-motion .site-subtitle { opacity: initial; top: initial; } .use-motion { .logo-line-before i { left: initial; } .logo-line-after i { right: initial; } } </style> </noscript> </head> <body itemscope itemtype="http://schema.org/WebPage" lang="zh-CN"> <div class="container sidebar-position-left page-home"> <div class="headband"></div> <header id="header" class="header" itemscope itemtype="http://schema.org/WPHeader"> <div class="header-inner"><div class="site-brand-wrapper"> <div class="site-meta "> <div class="custom-logo-site-title"> <a href="/" class="brand" rel="start"> <span class="logo-line-before"><i></i></span> <span class="site-title">Life is different</span> <span class="logo-line-after"><i></i></span> </a> </div> <p class="site-subtitle">ideal's blog</p> </div> <div class="site-nav-toggle"> <button aria-label="切换导航栏"> <span class="btn-bar"></span> <span class="btn-bar"></span> <span class="btn-bar"></span> </button> </div> </div> <nav class="site-nav"> <ul id="menu" class="menu"> <li class="menu-item menu-item-home menu-item-active"> <a href="/" rel="section"> <i class="menu-item-icon fa fa-fw fa-home"></i> <br>首页</a> </li> <li class="menu-item menu-item-archives"> <a href="/archives/" rel="section"> <i class="menu-item-icon fa fa-fw fa-archive"></i> <br>归档</a> </li> </ul> </nav> </div> </header> <main id="main" class="main"> <div class="main-inner"> <div class="content-wrap"> <div id="content" class="content"> <section id="posts" class="posts-expand"> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2020/02/26/cross-compling-nginx-for-armv8/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2020/02/26/cross-compling-nginx-for-armv8/" itemprop="url"> cross compling Nginx for ARMv8 </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2020-02-26 15:39:27" itemprop="dateCreated datePublished" datetime="2020-02-26T15:39:27+08:00">2020-02-26</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2020/02/26/cross-compling-nginx-for-armv8/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2020/02/26/cross-compling-nginx-for-armv8/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>首先我们需要一个工具链,目前有很多可以选择,此处我们选择<a href="https://www.linaro.org/" target="_blank" rel="noopener">Linaro</a>,这是一种预先构建好的工具链。甚至也可以通过工具构建一个工具链,比如<a href="https://buildroot.org/" target="_blank" rel="noopener">Buildroot</a>,但此处我们不需要那么复杂。</p> <p>其次按照自己的需求从<a href="https://www.linaro.org/downloads/" target="_blank" rel="noopener">这里</a>来选择一个工具链下载,比如我期望将Nginx运行在<a href="http://wiki.friendlyarm.com/wiki/index.php/NanoPi_NEO2/zh#.E5.AE.89.E8.A3.85.E7.B3.BB.E7.BB.9F" target="_blank" rel="noopener">NanoPI Neo2</a>上面,处理器属于ARMv8,其上运行的系统是基于Ubuntu Core构建(使用glibc),所以我应该选择aarch64-linux-gnu。这个三项代表cpu-vendor-os,在<a href="https://www.gnu.org/software/autoconf/manual/autoconf-2.65/html_node/Specifying-Target-Triplets.html" target="_blank" rel="noopener">这里</a>有说明。</p> <p>另外要注意具体的工具链版本,比如这个版本 <a href="https://releases.linaro.org/components/toolchain/binaries/latest-7/" target="_blank" rel="noopener">https://releases.linaro.org/components/toolchain/binaries/latest-7/</a> 里面提到glibc是2.25,但是我那个系统里面的glibc版本并没有这么高,如果用这个来编译,再放到我的NanoPI Neo2里面去运行,会导致运行时GLIBC_2.25符号找不到的错误。所以这里我选择<a href="https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/aarch64-linux-gnu/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz" target="_blank" rel="noopener">https://releases.linaro.org/components/toolchain/binaries/6.5-2018.12/aarch64-linux-gnu/gcc-linaro-6.5.0-2018.12-x86_64_aarch64-linux-gnu.tar.xz</a> 。</p> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2020/02/26/cross-compling-nginx-for-armv8/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/10/18/access-multiple-clusters-with-kubernetes-context/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/10/18/access-multiple-clusters-with-kubernetes-context/" itemprop="url"> access multiple clusters with kubernetes context </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-10-18 16:02:59" itemprop="dateCreated datePublished" datetime="2019-10-18T16:02:59+08:00">2019-10-18</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/10/18/access-multiple-clusters-with-kubernetes-context/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/10/18/access-multiple-clusters-with-kubernetes-context/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>有时候往往需要和多个Kubernetes集群交互,我之前一直是每个集群一个config文件,然后通过<code>cp ~/.kube/config.xxxx ~/.kube/config</code>这样来切换🤦♂️。</p> <p>其实通过Kubernetes的<a href="https://kubernetes.io/zh/docs/tasks/access-application-cluster/configure-access-multiple-clusters/" target="_blank" rel="noopener">Context</a>,就不用这么麻烦了。不过按照文档操作有点繁琐,其实自己编辑<code>~/.kube/config</code>就行了,不过记得先备份一下。就是把其他集群的cluster、user、context分别添加一份到<code>~/.kube/config</code>,注意改下名字之类。</p> <p>之后就可以这样<code>kubectl config use-context minikube</code>来切换context为minikube了。执行<code>kubectl config current-context</code>可以显示当前的context。但是这个命令还是太长了,不友好。可以安装<a href="https://github.com/ahmetb/kubectx" target="_blank" rel="noopener">kubectx</a>,支持交互式操作(配合<a href="https://github.com/junegunn/fzf" target="_blank" rel="noopener">fzf</a>)来选择并切换context和namespace。在macOS只要执行<code>brew install kubectx</code>就能安装了。</p> <p>下面是执行<code>kubectx</code>的效果:</p> <p><img src="/images/kubectx.png" alt="kubectx"></p> <p>同样,执行<code>kubens</code>可以列出当前context指定集群的可用namespace,然后通过方向键选择。之后执行<code>kubectl get pod</code>就不用指定<code>--context=xxx -n=yyy</code>来操作了。</p> <p>更进一步,由于kubectl支持插件机制,我们只要执行:</p> <figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">ln -s /usr/local/bin/kubectx /usr/local/bin/kubectl-ctx</span><br><span class="line">ln -s /usr/local/bin/kubens /usr/local/bin/kubectl-ns</span><br></pre></td></tr></table></figure> <p>然后只要运行<code>kubectl ctx</code>和<code>kubectl ns</code>就行了,不需要再敲kubectx和kubens。</p> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/10/17/nginx-unit-introduction/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/10/17/nginx-unit-introduction/" itemprop="url"> nginx unit introduction </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-10-17 17:43:39" itemprop="dateCreated datePublished" datetime="2019-10-17T17:43:39+08:00">2019-10-17</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/10/17/nginx-unit-introduction/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/10/17/nginx-unit-introduction/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>前几天发现NGINX又搞了个<a href="https://unit.nginx.org/" target="_blank" rel="noopener">Unit</a>,简单来说是一个web应用容器,特点是可以通过RESTful风格的API进行动态配置(不需要NGINX那样该配置然后重启),并且支持Python、Go、PHP、Java等等一大堆语言。不知道是不是受了<a href="https://www.phusionpassenger.com/docs/tutorials/what_is_passenger/" target="_blank" rel="noopener">Passenger</a>的启发。</p> <p>这里记录一下试用的笔记。</p> <h3 id="安装"><a href="#安装" class="headerlink" title="安装"></a>安装</h3><p>ArchLinux可以通过<a href="https://aur.archlinux.org/packages/nginx-unitd" target="_blank" rel="noopener">PKGBUILD</a>安装,<code>makepkg</code>之后<code>sudo pacman -U *.xz</code>即可。</p> <h3 id="启动"><a href="#启动" class="headerlink" title="启动"></a>启动</h3><p>执行<code>sudo systemctl start unit</code>即可。</p> <h3 id="配置"><a href="#配置" class="headerlink" title="配置"></a>配置</h3><p>写一个config.json,内容如下:</p> <figure class="highlight json"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line">{</span><br><span class="line"> <span class="attr">"listeners"</span>: {</span><br><span class="line"> <span class="attr">"*:8000"</span>: {</span><br><span class="line"> <span class="attr">"pass"</span>: <span class="string">"applications/phalcon-test"</span></span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> <span class="attr">"applications"</span>: {</span><br><span class="line"> <span class="attr">"phalcon-test"</span>: {</span><br><span class="line"> <span class="attr">"type"</span>: <span class="string">"php"</span>,</span><br><span class="line"> <span class="attr">"processes"</span>: <span class="number">5</span>,</span><br><span class="line"> <span class="attr">"user"</span>: <span class="string">"vagrant"</span>,</span><br><span class="line"> <span class="attr">"group"</span>: <span class="string">"vagrant"</span>,</span><br><span class="line"> <span class="attr">"script"</span>: <span class="string">"index.php"</span>,</span><br><span class="line"> <span class="attr">"root"</span>: <span class="string">"/home/vagrant/project/mvc/multiple-volt/public"</span></span><br><span class="line"> }</span><br><span class="line"> },</span><br><span class="line"></span><br><span class="line"> <span class="attr">"routes"</span>: [</span><br><span class="line"> {</span><br><span class="line"> <span class="attr">"action"</span>: {</span><br><span class="line"> <span class="attr">"pass"</span>: <span class="string">"applications/phalcon-test"</span></span><br><span class="line"> }</span><br><span class="line"> }</span><br><span class="line"> ]</span><br><span class="line">}</span><br></pre></td></tr></table></figure> <p>表示启动一个PHP类型的应用,并让Unit监听8000端口,将所有请求抛给那个PHP应用。</p> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2019/10/17/nginx-unit-introduction/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/10/08/login-screen-black-after-upgrading/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/10/08/login-screen-black-after-upgrading/" itemprop="url"> login screen black after upgrading </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-10-08 21:29:57" itemprop="dateCreated datePublished" datetime="2019-10-08T21:29:57+08:00">2019-10-08</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/10/08/login-screen-black-after-upgrading/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/10/08/login-screen-black-after-upgrading/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>10.7号<code>pacman -Syu</code>了一把,重启发现手动编译的内核系统登录界面停在了启动图形系统,然后一直没反应。不过ALT-F2可以登录tty,然后执行<code>systemctl status sddm</code>发现sddm并没有启动X。如果手动启动X,会看到两个报错:<br><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">Internal error: Could not resolve keysym XF86MonBrightnessCycle</span><br><span class="line">Internal error: Could not resolve keysym XF86RotationLockToggle</span><br></pre></td></tr></table></figure></p> <p>不过这两个报错并不会影响X的功能。X启动之后依然黑屏。</p> <p>切换到archlinux自带的内核,却又没问题。sddm最近也没有更新过。KDE倒是进行了大更新。由于只剩下内核的差异(手动编译的内核只是增加了CONFIG_DEBUG_INFO=y),于是我将archlinux内核新的config文件复制一份,重新编译了4.18.12,然而重启依然黑屏。</p> <p><code>sudo journal -u -e sddm</code>可以看到黑屏的情况,缺少了Adding new display on vt1。</p> <p><img src="/images/archlinux-sddm-log.png" alt="sddm log"></p> <p>还未解决。。</p> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/08/04/display-command-execute-logs-in-html-pages/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/08/04/display-command-execute-logs-in-html-pages/" itemprop="url"> display command execute logs in html pages </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-08-04 21:45:29" itemprop="dateCreated datePublished" datetime="2019-08-04T21:45:29+08:00">2019-08-04</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/08/04/display-command-execute-logs-in-html-pages/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/08/04/display-command-execute-logs-in-html-pages/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>有些时候需要把命令行程序的日志在页面中展示,比如<a href="https://travis-ci.org/python/mypy/jobs/565354133" target="_blank" rel="noopener">这种场景</a>。通常日志里可能含有进度的展示,比如curl的输出,这种展示依赖于\r这种<a href="https://en.wikipedia.org/wiki/Control_character" target="_blank" rel="noopener">控制字符</a>来起作用。遗憾的是如果直接作为html来输出,\r会被当作换行,导致进度变成了无数行,比如<a href="https://travis-ci.org/python/mypy/jobs/565354133#L514" target="_blank" rel="noopener">这里</a>的样子(虽然可能也不是大问题)。另外终端里也会有很多依赖<a href="https://en.wikipedia.org/wiki/ANSI_escape_code" target="_blank" rel="noopener">转义序列</a>来实现的带色彩的输出,比如<code>git log</code>的输出。题外话,有时候stdout的类型,会影响这个特性,比如<code>git log | less</code>当加上了管道之后,彩色输出会消失。<a href="https://wiki.archlinux.org/index.php/Color_output_in_console#Reading_from_stdin" target="_blank" rel="noopener">这里</a>有一些绕过的方法。</p> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2019/08/04/display-command-execute-logs-in-html-pages/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/08/02/kubernetes中通过subPath挂载子目录/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/08/02/kubernetes中通过subPath挂载子目录/" itemprop="url"> kubernetes中通过subPath挂载子目录 </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-08-02 14:14:20" itemprop="dateCreated datePublished" datetime="2019-08-02T14:14:20+08:00">2019-08-02</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/08/02/kubernetes中通过subPath挂载子目录/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/08/02/kubernetes中通过subPath挂载子目录/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>kubernetes支持很多种<a href="https://kubernetes.io/docs/concepts/storage/volumes/" target="_blank" rel="noopener">Volume</a>,比如NFS,甚至AWS的EBS,阿里云的OSS等。某些时候,我们可能需要针对不同的容器,挂载一个存储卷的不同子目录,以达到控制权限等目的。比如将用户数据放在一个NFS文件系统上,不同的用户区分不同的子目录。如果每个用户的容器,都直接挂载了整个NFS,同时又不能封禁容器的外网访问,那么这样是不安全的,如果被<a href="https://www.cnblogs.com/ssooking/p/5900664.html" target="_blank" rel="noopener">反弹Shell</a>之后,会存在安全隐患。我们可以通过subPath来解决这个问题。以hostPath类型的Volume为例,假设我们需要挂载/srv/aaa/bbb这个目录到/mnt/aaa/bbb,以及/srv/ccc/ddd目录到/mnt/ccc/ddd,而/srv下面的其他目录和文件,希望在容器中不可见,那么这样就可以做到:</p> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2019/08/02/kubernetes中通过subPath挂载子目录/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/07/01/cpu-and-memory-limit-in-kubernetes/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/07/01/cpu-and-memory-limit-in-kubernetes/" itemprop="url"> kubernetes中的容器cpu和内存限制 </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-07-01 15:28:48" itemprop="dateCreated datePublished" datetime="2019-07-01T15:28:48+08:00">2019-07-01</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/07/01/cpu-and-memory-limit-in-kubernetes/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/07/01/cpu-and-memory-limit-in-kubernetes/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>K8S部署容器时可以<a href="https://kubernetes.io/zh/docs/tasks/administer-cluster/cpu-memory-limit/" target="_blank" rel="noopener">指定CPU和内存的资源限制</a>,其真正实现也是通过CGroups做到的。我们来看个例子:</p> <figure class="highlight yaml"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="attr">apiVersion:</span> <span class="string">v1</span></span><br><span class="line"><span class="attr">kind:</span> <span class="string">Pod</span></span><br><span class="line"><span class="attr">metadata:</span></span><br><span class="line"> <span class="attr">labels:</span></span><br><span class="line"> <span class="attr">app:</span> <span class="string">nginx</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line"><span class="attr">spec:</span></span><br><span class="line"> <span class="attr">containers:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">image:</span> <span class="string">nginx</span></span><br><span class="line"> <span class="attr">name:</span> <span class="string">nginx</span></span><br><span class="line"> <span class="attr">ports:</span></span><br><span class="line"> <span class="bullet">-</span> <span class="attr">containerPort:</span> <span class="number">80</span></span><br><span class="line"> <span class="attr">resources:</span></span><br><span class="line"> <span class="attr">limits:</span></span><br><span class="line"> <span class="attr">cpu:</span> <span class="string">500m</span></span><br><span class="line"> <span class="attr">memory:</span> <span class="string">400Mi</span></span><br><span class="line"> <span class="attr">requests:</span></span><br><span class="line"> <span class="attr">cpu:</span> <span class="string">200m</span></span><br><span class="line"> <span class="attr">memory:</span> <span class="string">200Mi</span></span><br></pre></td></tr></table></figure> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2019/07/01/cpu-and-memory-limit-in-kubernetes/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2019/02/18/mysql-embedded-server-example/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2019/02/18/mysql-embedded-server-example/" itemprop="url"> mysql embedded server example </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2019-02-18 22:33:28" itemprop="dateCreated datePublished" datetime="2019-02-18T22:33:28+08:00">2019-02-18</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2019/02/18/mysql-embedded-server-example/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2019/02/18/mysql-embedded-server-example/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>MySQL有一种作为嵌入运行服务器的<a href="https://dev.mysql.com/doc/refman/5.7/en/libmysqld.html" target="_blank" rel="noopener">方式</a>。此处做个记录。<br>另外5.7的<a href="https://dev.mysql.com/doc/refman/5.7/en/mysql-library-init.html" target="_blank" rel="noopener">mysql_library_init()</a>还有相关的说明,<a href="https://dev.mysql.com/doc/refman/8.0/en/mysql-library-init.html" target="_blank" rel="noopener">8.0的</a>已经没有了。</p> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2019/02/18/mysql-embedded-server-example/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2018/11/30/separate-executable-file-and-debug-infomation/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2018/11/30/separate-executable-file-and-debug-infomation/" itemprop="url"> separate executable file and debug infomation </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2018-11-30 01:34:21" itemprop="dateCreated datePublished" datetime="2018-11-30T01:34:21+08:00">2018-11-30</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2018/11/30/separate-executable-file-and-debug-infomation/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2018/11/30/separate-executable-file-and-debug-infomation/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>很多发行版会将包含调试符号信息的文件拆分到另外的安装包里,所以相应的wiki也会教你遇到进程崩溃时,如何获取完整的调用栈信息,其中一步便是安装带有调试信息的软件包,比如<a href="https://wiki.ubuntu.com/DebuggingProgramCrash#Installing_debug_symbols_manually" target="_blank" rel="noopener">这里</a>、<a href="https://wiki.debian.org/HowToGetABacktrace#Installing_the_debugging_symbols" target="_blank" rel="noopener">这里</a>。</p> <p>至于为什么可以这么做,这其实是GDB的机制。按照<a href="https://sourceware.org/gdb/onlinedocs/gdb/Separate-Debug-Files.html" target="_blank" rel="noopener">这里</a>的描述,GDB支持独立于可执行文件的调试符号信息。</p> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2018/11/30/separate-executable-file-and-debug-infomation/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> <article class="post post-type-normal" itemscope itemtype="http://schema.org/Article"> <div class="post-block"> <link itemprop="mainEntityOfPage" href="http://ideal.github.io/2018/10/28/simple-way-to-compile-kernel-on-archlinux/"> <span hidden itemprop="author" itemscope itemtype="http://schema.org/Person"> <meta itemprop="name" content="<a href=" https: github.com ideal">ideal"> <meta itemprop="description" content> <meta itemprop="image" content="/images/avatar.gif"> </span> <span hidden itemprop="publisher" itemscope itemtype="http://schema.org/Organization"> <meta itemprop="name" content="Life is different"> </span> <header class="post-header"> <h1 class="post-title" itemprop="name headline"> <a class="post-title-link" href="/2018/10/28/simple-way-to-compile-kernel-on-archlinux/" itemprop="url"> simple way to compile kernel on archlinux </a> </h1> <div class="post-meta"> <span class="post-time"> <span class="post-meta-item-icon"> <i class="fa fa-calendar-o"></i> </span> <span class="post-meta-item-text">发表于</span> <time title="创建时间:2018-10-28 20:53:38" itemprop="dateCreated datePublished" datetime="2018-10-28T20:53:38+08:00">2018-10-28</time> </span> <span class="post-comments-count"> <span class="post-meta-divider">|</span> <span class="post-meta-item-icon"> <i class="fa fa-comment-o"></i> </span> <a href="/2018/10/28/simple-way-to-compile-kernel-on-archlinux/#comments" itemprop="discussionUrl"> <span class="post-meta-item-text">评论数:</span> <span class="post-comments-count valine-comment-count" data-xid="/2018/10/28/simple-way-to-compile-kernel-on-archlinux/" itemprop="commentCount"></span> </a> </span> </div> </header> <div class="post-body" itemprop="articleBody"> <p>实际上ArchLinux的<a href="https://wiki.archlinux.org/index.php/Kernel/Traditional_compilation" target="_blank" rel="noopener">Wiki</a>已经写得非常清楚了,这里只是记录、简化和补充。</p> <p>首先下载一份源代码,比如<a href="https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.tar.xz" target="_blank" rel="noopener">这个</a>。同时下载对应的签名,比如<a href="https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.tar.sign" target="_blank" rel="noopener">这个</a>。</p> <p>验证签名:</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ gpg --list-packets linux-4.19.tar.sign</span><br><span class="line">$ gpg --recv-keys <上一步输出的keyid></span><br></pre></td></tr></table></figure> <p>第二步之后可以通过<code>gpg --list-public-keys</code>查看导入的公钥。</p> <p>然后进行验证:</p> <figure class="highlight bash"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">$ unxz linux-4.19.tar.xz</span><br><span class="line">$ gpg --verify linux-4.19.tar.sign linux-4.19.tar</span><br></pre></td></tr></table></figure> <!--noindex--> <div class="post-button text-center"> <a class="btn" href="/2018/10/28/simple-way-to-compile-kernel-on-archlinux/#more" rel="contents"> 阅读全文 » </a> </div> <!--/noindex--> </div> <footer class="post-footer"> <div class="post-eof"></div> </footer> </div> </article> </section> <nav class="pagination"> <span class="page-number current">1</span><a class="page-number" href="/page/2/">2</a><a class="extend next" rel="next" href="/page/2/"><i class="fa fa-angle-right" aria-label="下一页"></i></a> </nav> </div> </div> <div class="sidebar-toggle"> <div class="sidebar-toggle-line-wrap"> <span class="sidebar-toggle-line sidebar-toggle-line-first"></span> <span class="sidebar-toggle-line sidebar-toggle-line-middle"></span> <span class="sidebar-toggle-line sidebar-toggle-line-last"></span> </div> </div> <aside id="sidebar" class="sidebar"> <div class="sidebar-inner"> <section class="site-overview-wrap sidebar-panel sidebar-panel-active"> <div class="site-overview"> <div class="site-author motion-element" itemprop="author" itemscope itemtype="http://schema.org/Person"> <p class="site-author-name" itemprop="name"><a href="https://github.com/ideal">ideal</a></p> <p class="site-description motion-element" itemprop="description"></p> </div> <nav class="site-state motion-element"> <div class="site-state-item site-state-posts"> <a href="/archives/"> <span class="site-state-item-count">14</span> <span class="site-state-item-name">日志</span> </a> </div> <div class="site-state-item site-state-tags"> <span class="site-state-item-count">12</span> <span class="site-state-item-name">标签</span> </div> </nav> <div class="links-of-author motion-element"> <span class="links-of-author-item"> <a href="https://github.com/ideal" target="_blank" title="GitHub"><i class="fa fa-fw fa-github"></i>GitHub</a> </span> <span class="links-of-author-item"> <a href="https://twitter.com/idealities" target="_blank" title="Twitter"><i class="fa fa-fw fa-twitter"></i>Twitter</a> </span> </div> </div> </section> </div> </aside> </div> </main> <footer id="footer" class="footer"> <div class="footer-inner"> <div class="copyright">© <span itemprop="copyrightYear">2020</span> <span class="with-love" id="animate"> <i class="fa fa-user"></i> </span> <span class="author" itemprop="copyrightHolder"><a href="https://github.com/ideal">ideal</a></span> </div> </div> </footer> <div class="back-to-top"> <i class="fa fa-arrow-up"></i> </div> </div> <script type="text/javascript"> if (Object.prototype.toString.call(window.Promise) !== '[object Function]') { window.Promise = null; } </script> <script type="text/javascript" src="/lib/jquery/index.js?v=2.1.3"></script> <script type="text/javascript" src="/lib/velocity/velocity.min.js?v=1.2.1"></script> <script type="text/javascript" src="/lib/velocity/velocity.ui.min.js?v=1.2.1"></script> <script type="text/javascript" src="/js/src/utils.js?v=6.4.2"></script> <script type="text/javascript" src="/js/src/motion.js?v=6.4.2"></script> <script type="text/javascript" src="/js/src/bootstrap.js?v=6.4.2"></script> <script src="//cdn1.lncld.net/static/js/3.0.4/av-min.js"></script> <script src="//unpkg.com/valine/dist/Valine.min.js"></script> <script type="text/javascript"> var GUEST = ['nick','mail','link']; var guest = 'nick,mail,link'; guest = guest.split(',').filter(function (item) { return GUEST.indexOf(item)>-1; }); new Valine({ el: '#comments' , verify: false, notify: false, appId: 'qn6yKlVOCoD4lqhtJrDPvTT3-gzGzoHsz', appKey: '8kU5of34PXpb4OkWxucxboxg', placeholder: 'Write a comment', avatar:'mm', meta:guest, pageSize:'10' || 10, visitor: false }); </script> </body> </html>