OP手机系统升级后开机始终处于状态开机状态?

前段时间在DockerOne回复了一个仔细琢磨来,这个问题还有不少可深入之处因此有了此文,供已经在国内使用 CoreOS 的玩家们参考

具有CoreOS特色的系统升级

CoreOS的设计初衷之一就是“解决互联网上普遍存在的服务器系统及软件由于没有及时升级和应用补丁,造成已知漏洞被恶意利用导致的安全性问题”因此,它的升级方式在各种Linux发型版中可以说是独树一帜的特别是与主流的服务器端系统相比。

一方面来说常用的服务器系统如RedHat、CentOS、Debian、Ubuntu甚至FreeBSD和Windows Server都存在明确嘚版本界限,要么不能支持直接在线升级至新的发行版本要么(如Debian/Ubuntu和Windows 7以后的版本)虽能够跨版本升级却容易出现兼容性风险,一旦升级後出现故障往往面临进退两难的局面

这个问题在一些新兴的Linux发行版,如Arch Linux已经有了较先进的解决方法:将过去累计许多补丁再发行一次大蝂本的做法变为以月或更短周期的快速迭代更新并由系统本身提供平滑升级和回滚的支持。这样用户可以在任何时候、从任何版本直接更新至修了最新安全补丁的系统。然而这些以 Arch 为代表的平滑升级系统还是带来了一些更新系统后无法使用的事故,不妨在百度以“Arch 升級问题”关键字搜索会发现许多类似的抱怨事实上,Arch的目标用户主要是喜爱尝鲜的Linux爱好者而不是服务器管理员或者服务端应用架构师

那么平滑升级的思路是不是在服务器系统就走不通了呢。其实仔细分析平滑升级出现问题的原因当中最关键的一个因素在于,系统设计時最多只能确保从一个干净的系统顺利升级的途径如果用户对系统中的某些核心组件做了修改(比如将系统中的Python2升级成了Python3),它就不属於操作系统设计者控制范围内的工作了这样相当于设定了一个售后服务霸王条款(只是个比喻,这些Linux系统其实都是免费的):自行改装不予保修。

在过去用户要使用服务器系统,他就必然需要在上面安装其他的提供对外服务软件和程序因此对系统本身有意无意的修妀几乎是无法避免的。这个问题直到近些年来应用容器(特别是Docker)的概念被大规模的推广以后才出现了新的解决思路而CoreOS就是通过容器巧妙的避开了用户篡改系统的问题,提出了另一种解决思路:让系统分区只读用户通过容器运行服务。不得不说这简直就是以一个霸王條款替代了另一个霸王条款,然而这个新的“条款”带来的附加好处使得它被对稳定性安全性都要求很高的服务器领域而言接受起来偠心安理得的多。

“反正许多东西都要自动化的套个容器又何妨。” 恩就这么愉快的决定了。

另一方面来说除了系统的大版本升级,平时的系统和关键软件的小幅补丁更新也时常由于系统管理员的疏忽而没有得到及时运用这同样是导致系统安全问题的一个重要因素(比如2014年BrowserStack中招的)。

这个解决思路就比较简单了:自动更新这么简单的办法当然早就被人用过了。即便在操作系统层面还见得不多在應用软件上早都是烂熟的套路。那么为了不落俗套,怎样把自动更新做得创意一些呢先来看看系统升级都会有哪些坑。

乍一看来操莋系统这个东东和普通应用在升级时候会遇到的问题还是有几分相似。比如软件正在使用的时候一般是不可以直接热修补的系统也一样(Linux

其中只有group一项是必须的,它指定了系统的升级通道升级策略 reboot-strategy的默认值是best-effort,而升级服务器server的默认值是CoreOS的官方升级服务器

对于已经启动嘚集群,可以在/etc/coreos/

同样大多数情况下用户只会看到GROUP这一个值,因为只有它是必须的其余的两行可以没有,此时会使用默认值代替

  • 修改┅个节点的配置并不会影响集群其他节点的升级配置,需要逐一单独修改
  • 最好让集群中的节点使用相同的升级通道方便管理,虽然混用通道一般不会直接导致问题
  • 优先选择用cloud-init在初始化时就将系统参数设计好,减少额外修改的工作量

升级通道间接的定义了CoreOS每次升级的目标蝂本号这个思路大概是从Chrome浏览器借鉴来的,官方提供三个升级通道:Alpha(内测版)、Beta(公测版 )和 Stable(正式发行版)举个例子来说,如果鼡户配置的是Alpha通道那么他的每次更新就会升级到当前最新的内测系统版本上。内存版本类似于Chrome浏览器的所谓“开发版”会第一时间获嘚新的功能更新,稳定性一般还是蛮可以的但不适合做为产品服务器,主要面向的对象是喜爱新鲜的开发者和玩家公测版稳定性略高,也会比较快的获得新功能的推送适合作为项目开发测试环境把玩。正式发行版中的组件往往都不是最新版本的但其稳定性最高,适匼作为产品服务器使用CoreOS目前采用一个整数数字来表示版本号,数字越大则相对发布时间越新

各通道发布更新的频率依次为(见声明):

  • Alpha:每周星期四发布
  • Beta:每两周发布一次
  • Stable:每个月发布一次

每个通道当前的系统版本号及内置组件版本号可以在上查看到。

除了三个公开的通道订阅了的用户还可以定制升级自己的通道,但这个服务是付费的此外,使用了企业版托管CoreOS系统的用户也可以免费使用此功能企業版的起步费用是10个节点以内 $100/月,见还有另一个土豪企业版服务起步价是25个节点以内 $2100/月,差别就是提供额外的人工技术支持服务果然技术人才是最贵的东东。

  • etcd-lock:自动升级后自动重启使用LockSmith 服务调度重启过程
  • reboot:自动升级后立即自动重启系统
  • off:自动升级后等待用户手工重启

通过设定固定数量的锁,只有获得锁的主机才能够进行重启升级否则就继续监听锁的变化。重启升级后的节点会释放它占用的锁从而通知其他节点开始下一轮获取升级锁的竞争。

查看升级锁的状态信息:

其中获得锁的节点就是已经已经下载部署好新版本系统等待或即將重启(与升级策略有关)的节点的Machine ID。用locksmithctl set-max 命令可用修改升级锁数量(即允许同时重启升级的节点数量):

此外locksmithctl unlock 命令可以将升级锁从获得鎖的节点上释放,这个命令很少会用到除非一个节点获得锁后由于特殊的原因无法重启(例如磁盘错误等硬件故障),因而始终占用这個锁这种情况下才会需要手工释放。

许多希望在内网中使用CoreOS的用户都比较关心能否在内网搭建自己的升级服务器答案是肯定的。

比较鈳惜的是CoreOS 升级服务器是属于的一部分,也就是说它是需要付费使用的。不过考虑到通常会在自己内网搭建服务器集群的大都是企业级鼡户收费也还算公道。

从文档资料来看CoreOS所用升级服务器协议与Google的ChromeOS升级服务器是完全兼容的,甚至可以相互替代比较有趣的是,两者嘟开源了各自的操作系统但都没有开源其升级服务器实现,这个中意思仿佛是如果让用户去自己架设升级服务器谁来保证这些升级服務器的镜像是最新的呢,那么自动升级提供的系统安全性的意义又何在了呢

顺带说一句,在CoreOS的中有一个  用于测试部署用户自己构建的CoreOS镜潒(系统是开源的嘛)因此如果用户直接下载官方镜像提供给这个工具,应当是可以自己构建内网升级服务器的但是官方文档对这方媔的介绍比较模糊,我暂且抛砖引玉了待高人给出具体方案。

CoreOS始终会自动在后台下载和部署新版本系统即使将升级策略设为off(这样只昰禁止自动重启)。因此在绝大多数情况下除非处于状态测试目的和紧急的版本修复,用户是不需要手动触发系统升级的不过,大概昰考虑到总是有新版本强迫症用户的需求(其实主要是系统测试的需求啦)CoreOS还是提供了手动更新的途径。

相比手动更新用户也许更想看到的仅仅是:现在的系统到底是部署的哪个版本啦。方法很简单查看一下etc目录下面的 os-release 文件就可以了。

这个文件实际上是一个软链接指向系统分区的 /usr/lib/os-release 文件,而后者是只读分区的一部分因此不用担心这个文件中的内容会被外部篡改。

CoreOS会在 启动后10分钟 以及之后的 每隔1个小時 自动检测系统版本如果检查到新版本就会自动下载下来放到备用分区上,然后依据之前的那个升级策略决定是否自动重启节点OK,就這么简单

恩,下面这个命令是给升级强迫症用户准备滴

命令非常简单:update_engine_client -update,如果提示 "Update failed" 则表示当前已经是最新版本(搞不懂CoreOS那班人为啥不弄个友好点的提示信息)如果检测到有新版本的系统则会立即将其下载和部署到备用系统分区上。

部署完成后如果用户的升级策略不昰 off,系统会发送消息给所有登录当前的用户:“5分钟后系统将重启”当然,你自己也会在5分钟后被踢出SSH登录等再次登录回来的时候,僦会发现系统已经变成新的版本了

在看到CoreOS的4种升级策略时候,不晓得读者有没发现一个问题前3种策略都会让新的系统版本下载部署后馬上重启服务器,如果这个时候恰好是系统访问的高峰期即使重启过程中,服务会自动迁移到其他的节点继续运行仍然可能会造成短暫的服务中断的情况。而第4种策略索性等待管理员用户来重启系统完成升级又引入了额外的人工干预,如果重启不及时还会使得集群得鈈到必要的安全更新

有没有办法既让服务器不要在服务高峰期重启,又不至于很长时间没有更新呢CoreOS给出了一种。我将它称为第5种升级筞略:基于定时检测的自动重启

这种升级策略没有在内置的选项当中,我们需要做些额外的工作:

  • 将升级策略设置成 off
  • 增加一个服务用来檢测备用分区是否已经部署新的系统版本如果部署了就进行重启
  • 增加一个定时器在集群的低峰时段触发执行上面那个服务

这个脚本首先使用 update_engine_client -status 检测了备份分区是否已经部署好了新版本的系统。如果发现新的版本已经部署好就根据 Etcd 服务是否启动来选择通过 Locksmith 调度重启节点(先獲取锁然后重启动)或延迟一个随机的时间后重启节点,这样做的目的是防止太多节点在同一个时间重启导致集群不稳定

接下来添加定時器update-window.timer在集群访问的低峰时段触发前面那个服务,

这个定时器Unit文件的功能类似于一个crontab记录只不过对于用了Systemd启动的系统比较推荐使用这样的方式。上面的配置表示每天早上的5:00, 5:30, 6:00 和 6:30

既然是每个节点都要有的东东,当然要放到cloud-init 配置里面把上面的内容统统写进去,看起来就是这个樣子的了:

到这里CoreOS升级相关的事儿已经侃得差不多了。不过总觉得还差点什么

具有国内特色的CoreOS升级问题

在国内服务器用过CoreOS的用户大约嘟会发现一个比较忧伤的现象:好像CoreOS的自动升级没有生效捏?

相信不少用户大概已经猜到原因了吧为了验证猜测,不妨做个手动升级试試下面是我在国内的一个CoreOS集群上得到的结果:

看到最后输出Giving up的时候,整个人都不好了现在来说说怎么解决这个问题。

既然是访问不到升级服务器解决办法就很干脆了:翻墙。

首先得找一个能用的墙外HTTP代理服务器这个...大家各显神通吧,记录下找到的地址和端口下面來配置通过代理升级服务器。

ALL_PROXY的值换成实际的代理服务器地址重启一下update-engine服务即可:

这个工作也可以在cloud-config里面用write_files命令在节点启动时候就完荿:

其实一直有小道消息说,CoreOS公司已经在积极解决这个问题预计2015年下半年会在国内架设专用的升级服务器。只能是期待一下了

“平滑洏安全的滚动升级”和“无需干预的自动更新”既是CoreOS系统设计的初衷,也是一直是许多用户青睐CoreOS的原因特别是在需要长期运行的服务器集群上,这些特性不仅节省了手工安装补丁和升级系统的成本更避免了系统和核心软件升级不及时带来的安全性隐患。

希望这篇文章中介绍的内容能对大家理解CoreOS的系统升级相关问题提供一定参考和帮助欢迎通过评论参与讨论。

订阅“Linux 中国”官方小程序来查看

安卓手机可通过以下方式进行刷機:

关机模式下按【音量下键】+【开机键】进入recovery模式;

选择【清除数据、恢复出厂设置】及【清除系统缓存】进行双清;

选择【从储存鉲安装刷机包】刷入刷机包;

刷机结束后,选择【重启手机】结束刷机。

不同手机进入recovery模式不同若步骤一进不去,可尝试自行百度进叺方法其他常用进入recovery模式的操作有:【音量上键】+【开机键】、【音量下键】+【HOME键】+【开机键】。

你对这个回答的评价是

下载百度知噵APP,抢鲜体验

使用百度知道APP立即抢鲜体验。你的手机镜头里或许有别人想知道的答案

我要回帖

更多关于 处于状态 的文章

 

随机推荐