iOS逆向 – 环境搭建

学习笔记主要基于

《iOS 应用逆向与安全之道》
《iOS 应用逆向工程 第二版》
相关网站:

https://www.chinapyg.com
iosre.com
bbs.pediy.com
手机型号:iphone5s
手机版本: 12.5.1
系统版本:10.15.7
Xcode 版本:12.3

MacOS工具
爱思助手
https://www.i4.cn/

MachOView
https://github.com/fangshufeng/MachOView

010 editor

iOS App Signer
https://dantheman827.github.io/ios-app-signer/

越狱工具:unc0ver

越狱环境
什么是越狱
iOS 越狱是利用系统漏洞获取设备 Root 权限的一种技术手段
从越狱的完美度来看,主要有:

引导式越狱:设备重启后需连接电脑再次使用越狱工具引导开机
非完美越狱:设备重启后失去 Root 权限,可通过手机越狱程序再次越狱
完美越狱:重启后依旧保持越狱状态,根据书中的写法,止于 iOS 9.1
永久越狱:基于 iOS 设备的 BootROM 漏洞,不受系统更新影响
iOS 越狱设备
了解各个版本的 越狱支持情况
综合考虑:

选择支持 ARM64 架构,iPhone 5S 及以上
选择 iOS 9 以上版本
优先考虑 完美越狱 设备
越狱
获取证书
将手机连接到电脑,Xcode 创建一个空项目,在连接设备上运行

此时会报错,不能正确运行
这是因为设备还没有添加信任证书

在设备中,以此打开
设备 -> 通用 -> 设备管理
在开发者应用下选择已登陆的账号,并选择信任

%title插图%num

越狱应用签名
打开 iOS App Signer
选择下载好的新鲜 unc0ver 和新鲜证书

%title插图%num
进行越狱
在 Xcode 中查看连接的设备

%title插图%num

安装签名好的应用

%title插图%num

%title插图%num
在手机上打开应用点击越狱,不一定一次成功
当屏幕显示 JailBreak Completed 时,则设备已越狱(注:一定要标题和内容都显示没错误,否则依旧失败,如图)

%title插图%num
逆向环境配置
首先打开 Cydia 进行一波更新,随后安装需要的软件

Apple File Conduit “2”
用来激活助手类工具对 iOS 设备所有路径的访问权限

AppSync Unifined
用来绕过系统对应用的签名验证,可以随意安装和运行脱壳后的 ipa
软件源 :https://cydia.akemi.ai/

Filza File Manager
文件管理器,用来浏览手机文件、修改文件的权限

New Term 2
手机终端,可以执行命令、下载文件、编辑文件等

OpenSSH
方便在 Windows 或 macOS 上远程输入命令操作 iOS 设备

# 直接无线连接
$ ssh root@192.168.xxx.xxx
密码为:alpine
%title插图%num

# 免密码登陆 : 如果 iOS 设备上不存在 .ssh 目录,则需要手动创建
$ ssh-keygen -t rsa
$ scp ~/.ssh/id_rsa.pub root@192.168.xxx.xxx:/var/root/.ssh/authorized_keys
$ ssh root@192.168.xxx.xxx
%title插图%num

# USB连接设备
$ brew install usbmuxd
## 端口映射
$ iproxy 2222 22 [device UDID]
## 连接到设备
$ ssh -p 2222 root@127.0.0.1
%title插图%num

注意
1.当显示 An error occurred while installing a package from local apt repo. 时,有可能是因为之前使用过其他越狱软件,导致环境不纯净,这时需要使用先前的越狱软件将越狱操作清空,即 Restore RootFS

2.当显示 An error occurred while Jailbreak, Please reboot and try again 时,这些是因为各种奇怪的原因,这是不要再疯狂点击 JailBreak,按照指示重启,基本就能解决

大家在 Linux 服务器上会配置那些 alias 提升效率?

先说我的(公司): alias cp=”cp -i” alias rm=”rm -i” alias mv=”mv -i” alias ll=”ls -l –color=auto” …

alias auto color Linux7 条回复 • 2021-07-15 13:41:35 +08:00
xunandotme 1
xunandotme 15 分钟前
set -o vi
defunct9 2
defunct9 7 分钟前
啥也不配
dzdh 3
dzdh 7 分钟前
gp – git push
gl – git pull
gr – git rebase
gs – git stash
gsl – git stash list
gsp – git stash pop
gc – git checkout
gcn – git checkout -b
gn – git branch –show-current
ronman 4
ronman 6 分钟前 via Android
up=”sudo pacman -Syyu” ??
zeroDev 5
zeroDev 5 分钟前 via Android
ll 和 l. 此外还有 sudo -E vim 缩写 sim,vim 定义成 nvim
zeroDev 6
zeroDev 4 分钟前 via Android
@ronman 直接 syyu, 真的有点猛
jingslunt 7
jingslunt 4 分钟前
啥也不配,麻烦的写脚本,简单的放快捷命令里头

现在哪家的邮箱,还支持 smtp? 可以网站调用用来发邮件的?

以前一直用的 126 邮箱,发现现在已经不能用了,因为网易邮箱对 smtp 和 pop 功能加了一个授权码功能, 网页上没法直接调用了

windows 服务器,还有什么方法,可以发送邮件的? 就是那种注册邮件和找回密码邮件之类的

还有哪家邮箱 支持调用 smtp ?

SMTP 邮箱 调用 邮件18 条回复 • 2019-03-01 20:57:02 +08:00
Qzier 1
Qzier 2019-01-04 14:03:25 +08:00 via iPhone
授权码不就是 smtp 密码吗?
lycc 2
lycc 2019-01-04 14:04:01 +08:00 via Android
企业邮箱吧,要么就邮件推送服务
ThirdFlame 3
ThirdFlame 2019-01-04 14:13:00 +08:00
我想知道 有哪家不支持 SMTP、POP 的么? gmail 算一家
zilaijuan 4
zilaijuan 2019-01-04 14:29:31 +08:00 via Android
刚好我这两天也在找这个,昨天找到了一个。
mail.yandex.com
俄罗斯的邮箱
kukumao 5
kukumao 2019-01-04 14:58:10 +08:00
@zilaijuan 好的 谢谢 我试试
xiri 6
xiri 2019-01-04 15:01:27 +08:00 via Android
加了授权码为啥就不能用了?

那个授权码就是专门为保障邮箱的 stmp 和 pop 功能安全搞的啊,你调用 stmp 的时候密码一项填授权码就行了啊。

个人猜测这样是为了防止第三方获取到密码?毕竟授权码只有 stmp 之类功能的权限,而密码可以直接改账户设置
kernel 7
kernel 2019-01-04 15:03:35 +08:00
胡扯了
baiyuxiong 8
baiyuxiong 2019-01-04 15:05:15 +08:00
用个收费的云服务好了,一般都有免费额度,小规模使用够了
xiri 9
xiri 2019-01-04 15:06:49 +08:00 via Android
@xiri lz 应该没有用第三方客户端登录过网易、QQ 邮箱吧,这两家的授权码就相当于 stmp 功能的密码,第三方客户端登录和网页调用的时候密码一栏填授权码就行了,填邮箱密码是无效的
ipwx 10
ipwx 2019-01-04 15:11:46 +08:00
@xiri 你这么说我还真不知道。我有个 163 邮箱当备胎,某天开始就不能用 smtp 了。原来是有了 app 密码机制啊。。。

11
whwq2012 2019-01-04 15:13:21 +08:00 via Android
用专用的 sendgrid ?不过基本都支持调用 smtp 吧,能设置成客户端的都行
luojianxhlxt 12
luojianxhlxt 2019-01-04 15:31:04 +08:00
mailgun 直接搞呗
dishonest 13
dishonest 2019-01-04 17:45:36 +08:00
@ThirdFlame gmail 怎么不支持了。。
uuair 14
uuair 2019-01-04 20:04:20 +08:00 via iPad
@zilaijuan 好是好,而且还支持自建域名,可惜就是经常被扔垃圾邮件里面
tankren 15
tankren 2019-01-10 10:04:11 +08:00
outlook 不行?
lenling 16
lenling 2019-01-15 22:19:54 +08:00
QQ 邮箱
liuxyon 17
liuxyon 2019-02-12 01:36:18 +08:00
需要找我
kejxp1993 18
kejxp1993 2019-03-01 20:57:02 +08:00 via Android
网易邮箱,在程序中将原来的密码的位置填授权码就行了。

日常提问:适合 Jupyter notebook\写着玩的机器人脚本\RStudio server 的服务器配置?

有这个想法两个多月了,现在有了空闲时间可以深入研究一下了。

主要需求

在云上装 Jupyter notebook 和微博机器人之类的瞎写脚本,可能还会装 RStudio server-docker 玩一下
至于挂个静态博客啥的就不说了,与性能无关。
可能就 Python 对计算性能要求高一点,以及 RStudio 的 docker 可能也会吃一部分性能,所以请问各位推荐的服务器配置?

1 核 1G 感觉不太够,1 核 2G 感觉差不多?另外在哪家买呢(腾讯阿里学生机?)

第 1 条附言 · 2019-01-14 12:57:35 +08:00
细节更新:

Jupyter Notebook主要是用来跑测试用的爬虫。
RStudio Server的话只是为了装一下玩一玩,毕竟真跑数据直接上集群了,VPS这点算力不够塞牙缝。
所以…1核2G差不多够用了?_?

Rstudio jupyter notebook 脚本6 条回复 • 2019-01-14 14:34:19 +08:00
saluton 1
saluton 2019-01-14 12:06:13 +08:00
看拿 Jupyter 写啥了,小东西随便都能跑,大的上 GPU 都不够。。。
szetrov 2
szetrov 2019-01-14 12:14:53 +08:00
@saluton 谢谢,Jupyter 主要是测试用的爬虫程序加上少量的数据处理,用 Jupyter 是本地可以通过浏览器直接与云上交互。
JackieMe 3
JackieMe 2019-01-14 12:43:18 +08:00 via Android
RStudio server 不要钱?
szetrov 4
szetrov 2019-01-14 12:54:21 +08:00
@JackieMe https://www.rstudio.com/products/RStudio/
saluton 5
saluton 2019-01-14 13:19:27 +08:00
国内的话就阿里轻量吧,1H2G5M,114/年
JackieMe 6
JackieMe 2019-01-14 14:34:19 +08:00
@szetrov 一直以为 Server 都要钱,原来也有社区版

云筏 CloudRaft 是一个*不负责任的云服务厂商

事件发生在 1 月,现在有时间写一下。

在 hostloc 上搜索云筏可以搜索到它家的差评。年初至今发生了两件事,一件是无预警删除用户 cf 解析,一件是 kvm 故障无通知无道歉甚至无赔偿(赔偿下面会讲到)。

第二件发生在我两个月前购买的一台机子上,当时刚好有台服务器过期,看到它在 V2EX 上发推广,就购买了一台测试一下。然后有一天就挂了。

它家的不负责体现在:

1. 是宿主机的故障但是没有通知用户,我提的工单过了接近 9 个小时才回复说在紧急修复中。

2. 说是在紧急修复中,但故障时间从北京时间 1 月 18 号早上 10 点至 1 月 20 号早上 10 点。

3. 不会主动告知进展,要在工单中问,而且问了也得过非常久才会回。

4. 没有一点道歉的姿态,也没有一点提到赔偿以安慰用户的意思。直接我提出质疑,才发来一条表示抱歉。

我问赔偿方案,其间回复我需要与领导沟通,在某个时间点会回复我,但实际上并没有按照约定回复我。
后面又回复会帮我延期服务,但实际上没有看到有变化。

5. 提出未使用金额退款诉求,回复可以,需要确认,还没等我确认, [把还在运行的服务器直接删除了] 。

6. 我问为什么未确认就删除,其回复 24 小时没回复就会删除。我问哪条服务协议上规定,没有得到回复。期间我本来也可以去后台看到并确认,但是他们后台 SSL 证书配置错误,导致有近半天无法访问。

7. 我问退款如何计算,是否把赔偿时间算上。其回复需要转交财务,直到现在 3 月 5 号,期间我催促 3 次,一次次都说转交财务,但没有回复。直到今天我想起来一看,工单变成已处理,原因是工单超时了。

8. 退款不是原路返还而是退到了余额,提现无法提现小数部分,提现需要扣手续费,提现需要实名。我今天又提了工单。

9. 发现退款后已消费金额无法开发票。

我认为这样一个*不负责的厂商不应该能继续在 V2EX 发推广,甚至已有帖子也不应该还展示出来,避免让用户入坑。

@livid

让我们再看一次它家口号:「云筏科技 CloudRaft 重塑国人云厂商形象」。

以及它家官网上写的:7X24 小时多渠道服务支持,双倍故障赔偿。

以上内容都体现在工单中,后面我会把工单截图 append 出来。

珍惜生命,远离云筏 CloudRaft 。
回复 云筏 工单 赔偿16 条回复 • 2021-04-13 18:24:15 +08:00
lyhiving 1
lyhiving 131 天前 via iPhone
云筏这个坑我也踩了,凌晨四点收到监控说站访问不了,立刻排查,重新上。

云筏这个算是彻底在圈内挂了,另外一个是企鹅小屋。

数据很重要不要用小厂商
guizhihu 2
guizhihu 131 天前 via Android ❤️ 1
重塑(负面)形象
efaun 3
efaun 131 天前
小众的云服务还是不要用的好,有点钱就跑路了
wdhwg001 4
wdhwg001 131 天前
去看了一下官网,标称 99.99%的高可用性,一年挂了 48 个小时,就离谱。
ushio 5
ushio 131 天前 via iPhone
云筏是学生创业搞出来的,技术不行,而且感觉有点玩票的性质
Kinnice 6
Kinnice 131 天前 via Android
这可能就是他们理解的 国人云厂商形象
Livid 7
Livid V2EX Moderator 131 天前
我*次听说这个名字,V2EX 和这个公司没有任何广告服务关系。发布到 /go/promotions 节点的主题是他们的自发行为。

谢谢你分享的使用体验。

@CloudRaft 你们有什么回应吗?
airyland 8
airyland 131 天前
@Livid 我明白是他们自己发的推广帖子。

在体验过他们服务后,我认为如果他们继续以免费赠送的形式发推广帖会让更多不知情用户入坑(毕竟我就是这样去尝试他们的服务),并因此可能影响到本站的 Credit 。所以我上面表达只是从用户角度提一个建议,不清楚从管理员角度具体如何看待和是否会处理这样的问题。
ragnaroks 9
ragnaroks 131 天前
国内有个专有名词“小学生云”,指的就是这类没有任何实际保障的“云”;

选用国内的 vps 服务,需要先去 hostloc 搜下有没有真实负面情况,如果有的话就可以忽略了(当然你会发现国内没有能用的了)
Livid 10
Livid V2EX Moderator 130 天前 via iPhone
@airyland 我已经 @ 他们。如果他们继续没有回应,那我们会彻底处理这个帐号。

11
tms 129 天前
同被半夜删过解析的路过。还不止一次。
chenjies 12
chenjies 128 天前
号称独享一核的 1C2G VPS 盒子,安装 ubuntu desktop 用了一个多小时,以及这家提供的 ubuntu 系统,ufw 竟然还要自己 ufw reset 与设置自启动。
CloudRaft 13
CloudRaft 92 天前
@Livid 感谢 @
@airyland 请问是否允许我们公开您的工单记录呢?
CloudRaft 14
CloudRaft 92 天前
服务器故障处理部分的工单因为不能断章取义,所以题主授权后我们可以公开,或者题主自己公开完整的记录?

财务情况我们这边在收到工单后 1 小时就回复了,题主没有任何答复…
![image.png]( https://i.loli.net/2021/04/13/Sg9VFcXlivBEOIo.png)
CloudRaft 15
CloudRaft 92 天前
财务的回复原文:

“`
客户您好,非常抱歉我们的服务没有使您满意。针对您的问题,我将具体回答:由于订单日期或者部分退款等原因,系统有时会判定为无法自主申请开票的情形,如有需求可工单联系要求我们为您开具;提现手续费的收取是用于平衡支付宝平台收取的手续费,烦请谅解;系统目前不支持含小数的提现,实属无奈,我们将会竭力升级。客户余额内的所有金额均可用于正常产品购买,如确有全额提现需求,可工单至财务为您提现至支付宝。
“`
CloudRaft 16
CloudRaft 92 天前
另外客户提交的是技术工单,然后又在技术工单里咨询财务问题,工单系统可以转交至其他部门,但是一次只能一个部门。

这边翻出来工单记录查看了一下,全部都是客户这边 7 天没有回复,然后工单自动被关闭的

![image.png]( https://i.loli.net/2021/04/13/IfSMFyqGjgAVvXr.png)

Windows Server 的 RDP 连接能否做两部验证?

有没有类似手机安全令,短信验证码之类的东西实现两部验证?
验证 rdp 验证码 Server6 条回复 • 2021-07-11 17:56:11 +08:00
tsungkang 1
tsungkang 29 天前
市面上据说有些跳板机可以实现,不过貌似都需要使用配套客户端?有种变通的办法就是先 ssh 进跳板机然后再转发到 rdp
yzwduck 2
yzwduck 29 天前
有,比如 Duo Authentication for Windows Logon and RDP
trepwq 3
trepwq 29 天前 via iPhone
不知道 rdp 支持第三方账号系统不
flymeteor 4
flymeteor 29 天前 via Android ❤️ 1
https://github.com/multiOTP/multiOTPCredentialProvider
cheng6563 5
cheng6563 28 天前
@flymeteor 这玩意貌似可用,只是每次验证都要老半天,让人害怕。

国家统计局新闻发言人就2021年上半年国民经济运行情况答记者问

(2021年7月15日) 中央广播电视总台央视记者: 从刚刚发布的数据来看,我们看到中国上半年的经济两年平均增速比一季度有所加快,您认为有哪些因素在带动经济的增长?您如何评价上半年我国国民经济的总体表现?谢谢。 刘爱华: 谢谢你的提问。从刚才介绍的各个方面的数据来看,今年上半年,统筹疫情防控和经济社会发展的成果得到了持续拓展和巩固,经济运行持续稳定恢复,稳中加固、稳中向好。从特点上来讲,主要反映在五个方面: 一、经济持续恢复增长。上半年国内生产总值同比增长12.7%,其中二季度同比增长7.9%,环比增长1.3%,两年平均增长5.5%,比一季度加快0.5个百分点。从相关指标看,上半年全社会货运量同比增长24.6%,两年平均增长7.2%;初步统计,全社会用电量同比增长16.2%,两年平均增长7.1%左右。 二、经济结构调整优化。首先,产业支撑得到加强。上半年服务业增加值对经济增长的贡献率达到了53%,比一季度提高2.1个百分点;制造业占比得到提升,上半年制造业增加值占国内生产总值的比重为27.9%,比上年同期提高1.3个百分点。其次,消费拉动作用增强。上半年,*终消费支出对经济增长的贡献率达到61.7%,高于资本形成总额42.5个百分点;升级类商品消费较快增长,上半年限额以上单位体育娱乐用品类、通讯器材类、化妆品类的商品零售额两年平均增速都超过了10%。三是短板领域投资较快增长。上半年,高技术产业投资、社会领域投资两年平均分别增长14.6%和10.7%,分别快于全部投资10.2和6.3个百分点。四是城乡居民收入的比值缩小。上半年城乡居民人均可支配收入之比为2.61,比上年同期缩小0.07。 三、创新动能持续增强。首先,新市场主体较快增长。6月末,根据我局基本单位名录库统计,法人单位数首次突破3000万个,同比增长了16.6%。其次,新产业新产品较快增长,上半年,规模以上高技术制造业增加值两年平均增长13.2%,比一季度加快了0.9个百分点。1-5月份,规模以上高技术服务业企业利润总额同比增长27.4%,两年平均增长12.5%,快于全部规模以上服务业4.2个百分点。从产品看,上半年,新能源汽车、工业机器人、集成电路的产量同比都保持了较快增长。三是新业态新模式成长壮大。上半年,实物商品网上零售额两年平均增长16.5%,占社会消费品零售总额的比重达到了23.7%。七月初,全国快递业务量已经突破了500亿件,接近2018年全年水平。 四、质量效益总体提升。首先,企业盈利增强。1-5月份,规模以上工业企业利润总额同比增长83.4%,两年平均增长21.7%;营业收入利润率达到7.11%,比上年同期提高了2.05个百分点。1-5月份,规模以上服务业企业利润总额同比增长1.5倍。其次,财政收入继续增加,1-5月份,全国一般公共预算收入同比增长24.2%。三是产能利用率上升。二季度全国工业产能利用率为78.4%,比上年同期提高4个百分点,比一季度提高了1.2个百分点。 五、民生保障持续改善。首先,就业形势总体稳定。上半年,全国城镇调查失业率平均为5.2%,比上年同期下降0.6个百分点,比一季度下降0.2个百分点,低于5.5%左右的预期目标。全国城镇新增就业698万人,完成全年目标任务的63.5%。二季度末,外出务工农村劳动力1.8亿人,基本恢复到了2019年同期水平。其次,居民消费价格温和上涨。上半年,居民消费价格同比上涨0.5%,涨幅处于比较低的水平。三是居民收入增长与经济增长基本同步。上半年,全国居民人均可支配收入同比实际增长12%,两年平均增长5.2%,与经济增长基本同步。 从上述五个方面看,上半年国民经济可以说是持续稳定恢复,稳中加固,稳中向好。但同时也要看到,目前全球疫情仍在持续演变,外部不稳定、不确定因素比较多,国内经济恢复仍然不均衡,巩固稳定恢复发展的基础仍需努力。下一步,按照中央经济工作会议精神和政府工作报告决策部署,持续深化供给侧结构性改革,着力释放内需潜力,大力助企纾困发展,扎实推进高质量发展,努力完成全年经济社会发展的目标任务。谢谢。 彭博新闻社记者: 刚才您提到了上半年全国居民人均实际收入两年平均增长5.2%,略低于经济增速。我们之前从商务部了解到,在“十四五”时期,全国零售品销售总额预期目标是要提升5%,这是从今年到2025年之间设定的一个目标。就您刚才所发布的数据显示,居民的人均可支配收入略低于经济增速,这种情况下如何实现中国经济的再平衡?如何成功实现双循环的目标?谢谢。 刘爱华: 谢谢您的提问。从刚才公布的数据来看,今年上半年全国居民人均可支配收入实际增速两年平均达到了5.2%,这个速度和上半年GDP的两年平均增速5.3%是基本同步的。考虑到去年以来经济运行遭受疫情冲击,可以说实现5.2%的人均收入增速是相当不容易的。从具体的结构上来看,推动收入实现5.2%的增长,主要是三个方面的结构性因素。 *,随着经济持续稳定恢复,就业形势保持了总体稳定,带动了工资性收入增长比较快。今年上半年,工资性收入同比名义增长12.1%,两年平均名义增长7.2%。 第二,随着各地持续加大民生保障力度,提高了养老金标准,加强困难群体基本生活保障,及时做好社会救济和临时救助,人均转移性净收入名义增长9%,两年平均名义增长8.6%。 第三,随着疫情防控形势逐步好转,经营活动逐步恢复,经营净收入上半年同比名义增长17.5%,两年平均名义增长5.6%。实现这个增长,可以说既有经济恢复的因素,带动了就业增加,进而带动收入增加,同时也有政策支持的因素,各个地方都加大了民生保障力度。同时也有各个经济主体自身的努力。所以从这些方面来讲,5.2%的增速和经济增长基本同步,而且可以说成果是非常显著的。 从这几个方面判断,目前中国经济整体上内生动力是在持续增强的,市场主体活力也不断增强,下阶段收入增长仍然会得到比较好的支撑,从而对消费形成有力的支撑。谢谢。 香港紫荆杂志记者: 国家统计局发布的数据显示,近年来,“三新”经济增加值在GDP的占比不断提升,如何评价“三新”经济对我国经济的拉动作用?未来将如何促进“三新”经济持续快速发展?谢谢。 刘爱华: 谢谢你的提问。我们前一段时间公布了2020年“三新”经济占GDP比重的数据,首先我向大家介绍一下2020年“三新”经济基本情况。 总体上看,2020年,尽管受到了新冠肺炎疫情的巨大冲击和严峻复杂的国际形势的影响,但新产业、新业态、新商业模式继续保持了比较快的增长。全年“三新”经济增加值占比17.08%,比上年提高了0.7个百分点;“三新”经济的增加值比上年名义增长4.5%,比同期的GDP增速高1.5个百分点。“三新”经济持续加速、占比提高,可以归结于四个方面因素。 *,科技投入大幅增加。2020年,我国R&D(研究与试验发展)经费支出与GDP之比达到了2.4%,比2015年提高了0.34个百分点。 第二,科技人才队伍持续壮大。我国研发人员总量连续8年稳居世界首位。 第三,科技产业化步伐不断加快。工业化和信息化的融合不断深化,科技成果转化应用加快,带动新产业快速发展。“十三五”期间,高技术制造业增加值年均增长10.3%,明显快于全部规模以上工业增加值。 第四,政策支持力度不断加大。疫情对新产业的发展既是挑战也是机遇,我国积*应对挑战,努力化危为机,针对重点领域出台了一系列有针对性的支持举措。比如,加快完善以企业为主体的技术创新体系、采取研发费用加计扣除减免税等创新支持政策,加大“双创”力度,创新引领作用显著增强,有力地促进了新产业、新业态的成长壮大。 从今年上半年情况看,“三新”经济的快速成长发展态势得到了延续。刚才我给大家介绍了高技术产业增加值、新产品的增长情况,还有新商业模式的增长状况,可以看出,“三新”经济的快速增长对今年上半年国民经济的持续稳定恢复发挥了重要作用。从更长期的角度来看,对加快构建新发展格局也提供了强有力的战略支撑。谢谢。 香港经济导报记者: 请问怎么看待“双碳”目标对经济运行的压力?一些地方为了降能耗会采取比较激进的措施,比如对高耗能企业实施限产,以煤电为例,短期内如果限产量过大,可能会对煤电的供应造成不稳定,造成部分地方出现电力紧张的局面,也会影响到经济稳定增长。您认为地方该如何处理好绿色转型和稳增长的关系?谢谢。 刘爱华: 谢谢你的提问。当前中国经济已经由高速增长阶段转向高质量发展阶段,碳达峰、碳中和既是我们向世界的一个庄严承诺,也是高质量发展的必然要求,是现代化进程的必由之路。从我们当前的发展阶段看,目前仍然是世界上*大的发展中国家,还没有完成工业化的进程。在这个阶段,我们要实现碳达峰、碳中和,确实是任务很重,压力很大。 但是也要看到,推动绿色转型发展,可能会抑制部分高耗能行业、高排放行业的短期增长。但与此同时,绿色转型发展也将创造新的需求,催生新的产业,像节能环保、清洁能源这样的绿色行业,将迎来新的发展机遇,传统行业的绿色转型升级也将创造巨大的市场需求,所以我们还是要抓住这个历史机遇,积*应对挑战,推动中国经济行稳致远。谢谢。 封面新闻记者: 想请问发言人如何评价上半年的就业数据,今年高校毕业生的就业形势如何?数据显示,16-24岁人口的调查失业率达到了15.4%,比一季度末增加了近2个百分点。请问如何看待这一趋势的变化?谢谢。 刘爱华: 谢谢您的提问。从今年上半年总体来看,就业形势总体稳定。上半年在一系列减负稳岗扩就业政策的作用下,全国城镇调查失业率上半年平均是5.2%,比上年同期下降了0.6个百分点,比一季度下降了0.2个百分点。从各月的情况看,除了2月份是5.5%之外,其他的几个月都在5.5%以下。5、6月份全国城镇调查失业率都是5%,均比上年同月低了0.7个百分点。城镇调查失业率的回落,主要归因于经济持续稳定恢复和稳就业政策。从主要劳动年龄人口失业率来看,25-59岁主要劳动年龄人口失业率6月份下降到了4.2%,比上年同月低了1个点。从月度之间看,也是持续回落的。 当然,在看到总量稳定的同时,也要看到就业结构性矛盾凸显。就像您刚才提到的,随着6月份毕业季的到来,进入劳动力市场求职的高校毕业生不断增多,就业压力明显增加,带动青年失业率明显上升。6月份,16-24岁城镇的青年调查失业率为15.4%,比上个月上升了1.6个百分点,和上年同月持平。其中,20-24岁的大专及以上人员失业率还要更高一些。 从下阶段看,一方面要看到在疫情防控常态化的形势下,随着经济持续稳定恢复,劳动力市场在不断回暖,从目前了解的情况看,今年高校毕业生的就业志愿和去年相比更加趋于稳定,求职活跃度也明显上升。但是另外一方面,今年高校应届毕业生规模达到了909万人,再创历史新高,总量的就业压力确实比较大。所以,下一阶段我们还是要坚持就业优先政策,延续实施减负稳岗扩就业政策,加强对重点群体的就业帮扶,优化就业服务,扩大就业容量,巩固就业稳定的态势。谢谢。 中央广播电视总台央广记者: 我们注意到上半年固定资产投资在持续恢复,您怎么看待当前投资对经济增长的拉动作用?另外,当前投资两年平均增速和疫情前增长水平相比还是有较大差距,从下阶段来说,应该如何扩大有效投资?谢谢。 刘爱华: 谢谢你的提问。从今年上半年投资月度变化态势来看,投资呈现了持续稳定恢复的态势。上半年,固定资产投资两年平均增长4.4%,比一季度加快1.5个百分点,总体是在加快的。投资对优化供给结构的关键作用也得到了进一步的发挥,体现在三个方面:一是高技术产业投资增长比较快。上半年,高技术产业投资两年平均增长14.6%,比一季度加快4.7个百分点,其中高技术制造业投资和服务业投资增长都是在加速的。二是社会领域投资增长比较快。上半年社会领域投资两年平均增长10.7%,比一季度加快1.1个百分点;其中,卫生和社会工作投资增长20%以上。三是民间投资增速加快。上半年,民间投资两年平均增长3.8%,比一季度加快2.1个百分点。强动能的高技术投资、补短板的社会领域投资,还有反映市场活力的民间投资都是在加快的。所以总体上,有效投资对优化供给结构的关键作用得到了进一步发挥。 从下阶段判断,目前支持投资持续恢复的有利因素在不断增多。一是市场活力在逐步增强。从今年1-5月份的规上工业企业利润和服务业企业利润可以看到,企业效益普遍好转,有利于增强企业投资的信心和能力。二是资金保障比较有力。上半年固定资产投资到位资金同比增长16.8%,增速超过投资增速。三是稳投资政策持续发力。“十四五”规划确定的一批重大工程项目在陆续部署推进。从我们掌握的情况看,6月份新入库的5000万元及以上的大项目1万多个,环比增长11.6%。四是从长期看,新型工业化、信息化、城镇化、农业现代化都蕴藏了巨大的投资空间。推动城市基础设施更新改造、实施乡村振兴战略、优化和稳定产业链供应链、加快传统产业的转型升级都蕴藏着很大的投资潜力。总体上,下阶段投资将会继续保持持续恢复的态势。谢谢。 CNBC记者: 我的问题是关于数据对于下半年的影响,比如出口会不会持续增长?在消费方面,我看到汽车类有增长,这和汽车行业6月份的数据有些不一样,背后有什么主要的因素?谢谢。 刘爱华: 谢谢您的提问。*,关于外贸的走势,前两天有关部门已经发布了上半年的数据,从总体的数据情况来看,在国内外经济持续复苏以及去年基数比较低这些因素的共同作用下,今年上半年进出口实现了比较快的增长,上半年货物进出口总额同比增长27.1%,和2019年同期相比增长22.8%,两年平均增速10%以上。上半年外贸形势总体不错,展望下半年,要关注到两个方面的因素:*方面,目前全球疫情走势仍然错综复杂,大宗商品价格上涨压力仍然比较大,外部环境不稳定、不确定因素比较多,这会对我们的外贸环境造成一定影响。另外一方面,海外需求目前处于复苏态势,国内需求也在继续回升。同时企业应对外部变化的调整能力是在日益增强的,发展的韧性比较强,所以外贸出口也拥有比较多的有利条件。综合判断,全年外贸进出口有望保持一个比较快的增长。 第二,关于您提到的汽车行业的问题,今年上半年汽车行业增加值同比增长21.8%,两年平均增长8.6%,这两个速度都是快于整体工业增加值增速的。但是,目前汽车行业的增长也受到了一定制约,比如大家普遍关注的芯片短缺,还有一些政策的调整,在短期内可能会对汽车产业的发展造成一定制约,比如带来供货周期长、成本上升这样的阶段性影响。但是也要看到,目前从总体来看,我国的千人汽车保有量和发达国家相比还有比较大的差距,汽车行业发展潜力还是比较大的。从短期来看,目前在需求上升、价格上涨的市场信号带动下,集成电路的生产在逐步加快。当然也要看到外部的环境比较复杂严峻,全球生产能力的恢复也需要假以时日。总体上看,汽车行业长期发展潜力还是比较大的。谢谢。 *财经记者: 今年以来,大宗商品价格持续上涨,对产业链中下游造成了一定的冲击,中小企业利润承压。请问您对接下来大宗商品走势怎么看?中小企业如何应对?另外,猪肉价格在持续下行,成为CPI的主要拖累项。您认为当前猪肉价格是否已经触底,对全年的通胀怎么看?谢谢。 刘爱华: 谢谢你的问题。关于大宗商品价格走势,今年上半年工业生产者出厂价格(PPI)平均上涨5.1%,涨幅比一季度扩大3个百分点。工业生产者出厂价格在二季度涨幅扩大,主要有几个因素的影响。一是经济在持续恢复,需求在不断回升。二是国际大宗商品价格上涨的输入性影响。今年6月份,国际能源价格指数同比上涨92.6%,非能源价格指数上涨43.2%,涨幅都是比较高的。三是去年同期低基数的影响。受新冠肺炎疫情的影响,从去年2月份开始PPI持续下降,二季度每个月都同比下降3%以上。今年二季度PPI的同比涨幅明显扩大,给很多中下游企业、中小微企业带来了比较大的成本压力。下阶段,虽然国际大宗商品价格输入性的上涨压力仍然存在,但我国的工业生产能力比较强,工业品的供应能力比较充足。与此同时,近期有关部门实施国内大宗商品价格保供稳价的政策,效果在初步显现。6月份工业生产者出厂价格同比上涨8.8%,比5月份回落0.2个百分点。总体上工业品价格上涨的影响是可控的。 第二个问题是关于CPI的走势和对猪肉价格的判断。今年上半年CPI处于温和上涨的态势,上半年CPI平均上涨0.5%,涨幅比上年同期回落3.3个百分点,处于近年来比较低的水平。从月度变化看,6月份当月居民消费价格同比上涨1.1%,比5月份回落0.2个百分点。从结构看,食品价格由涨转降,是影响CPI涨幅回落*主要的原因。今年上半年,食品价格同比下降0.2%,去年同期食品价格上涨16.2%,食品价格从上拉居民消费价格的主要因素转为下拉居民消费价格的因素,影响今年上半年居民消费价格下降0.04个百分点。您刚才提到的猪肉价格同比已经连续9个月下降,上半年平均下降19.3%,影响CPI下降约0.45个百分点。 从非食品价格来看,今年上半年非食品价格上涨0.7%,涨幅和去年同期相同,影响了CPI上涨0.57个百分点。在非食品中主要还是能源价格上涨比较多,今年上半年汽油和柴油价格分别上涨8.5%和9.2%,合计影响CPI上涨约0.24个百分点。总的看今年上半年居民消费价格温和上涨有食品价格由涨转降的因素,也有非食品价格涨幅比较平稳的因素。 从下阶段影响CPI的三个板块来看,*个板块,食品价格来看。我们昨天刚刚公布了夏粮产量,夏粮再获丰收,所以粮食价格有望继续保持稳定。猪肉价格随着生猪生产持续恢复、国家收储政策又有支撑,所以价格有望保持稳定态势。总体上看,食品价格在粮食再获丰收、猪肉价格保持稳定的情况下,总体上涨压力不大。 第二个板块,工业消费品价格来看。国际大宗商品价格的上涨会带来部分工业消费品有所上涨,但从长期看,我国的供给能力比较强,工业生产能力比较强,产业体系比较完整,工业消费品的市场供应总体比较充足,工业消费品价格不存在持续大幅上涨的基础。 第三个板块,服务价格来看。今年上半年服务价格持续受到散发疫情的影响,目前处于近年来的低位,今年上半年服务价格同比上涨0.3%。下阶段,随着国内疫情防控形势的持续向好,餐饮、住宿、旅游的消费需求将会逐渐恢复,市场信心不断增强,加上居民收入增速也是在加快的,服务价格将会有一定程度的回升。但总体上看,考虑到疫情防控常态化的因素,服务价格有望保持小幅上涨。 综合上面三个板块未来发展的态势判断,全年物价保持温和上涨是有基础、有条件的,实现全年3%左右的调控目标也同样有基础、有条件。谢谢。 21世纪经济报道记者: 前几天央行进行全面降准,市场上有解读说是因为下半年我国经济面临较大的下行压力,所以提前让政策更加宽松,对这块您怎么看?前几天总理召开的经济座谈会上提到,我们要加强跨周期调控,尤其要注意应对一些周期性风险,跨周期调控应该怎么调控?当前我国经济主要面临哪些周期性风险?谢谢。 刘爱华: 谢谢你的提问。首先回答*个问题,经济未来的走势会怎么样?从刚才公布的数据来看,今年上半年经济持续稳定恢复,供需循环畅通,为下半年经济运行打下了比较好的基础。从影响下半年经济走势的因素来看,支持经济进一步恢复、进一步向好的因素在逐渐累积、逐渐增多。一是经济的内生动力逐步增强。今年上半年,内需对经济增长的贡献率达到80.9%,比一季度上升了4.9个百分点。其中市场销售稳步回升,今年上半年社会消费品零售总额两年平均增长4.4%,比一季度加快了0.2个百分点。投资也在持续稳定恢复,上半年固定资产投资两年平均增长4.4%,比一季度加快了1.5个百分点,说明内需对经济增长的支撑作用逐步增强。二是市场主体信心不断增强。6月份,制造业采购经理指数(PMI)为50.9%,已经连续16个月位于景气区间。非制造业商务活动指数和综合PMI产出指数也都位于比较高的景气区间,反映了市场主体对未来经济增长的信心、对未来增长活力的信心是在持续改善的。三是全球经济目前延续了复苏的态势,为外需的增长奠定了基础。6月份全球综合PMI是56.6%,保持在15年以来的高位,据WTO*新的预计,2021年全球货物贸易量有望增长8%,反映了全球贸易复苏步伐在加快,这有利于外需保持较快的增长。 在经济基本面、供需各方面稳中向好的同时,宏观政策继续保持了对实体经济的支持力度,支持小微企业和个体工商户的政策在不断落实落地,这有利于为企业纾困解难,为市场注入生机活力。同时也要看到,下半年外部不稳定、不确定因素也比较多。从国内来讲,经济恢复仍不均衡,比如您刚才提到的原材料价格上涨对小微企业、尤其是中下游的企业带来了生产经营压力。但是从总的基本面来讲,从供需循环、市场信心、内需持续增强来看,下半年中国经济有望保持持续稳定复苏的态势。 关于宏观政策,一方面要看到今年总体经济稳中加固、稳中向好,另外一方面也要看到,目前国内外环境错综复杂,特别是大宗商品价格的上涨,给中小微企业带来的成本压力比较大。针对运行中存在的突出问题,还是要按照党中央、国务院的决策部署,立足当前、着眼长远,做好跨周期调节,应对好可能发生的周期性风险。尤其是要把培育壮大市场主体放在重要位置,通过深化“放管服”改革,优化营商环境,给中小微企业更多的成长空间,为推动经济平稳健康运行奠定坚实基础。谢谢。 大公报香港文汇报记者: 我们看数据显示,1-6月,外商及港澳台商投资企业同比增长达到17%,您如何评价这一数据?谢谢。 刘爱华: 谢谢你的提问。今年上半年外商及港澳台商投资企业增加值同比增长17%,这个增速快于规模以上工业增加值增速。今年上半年,规模以上工业增加值同比增长15.9%。说明外商及港澳台商投资企业在应对疫情冲击、适应市场环境变化中,充分发挥了应变的能力。同时,宏观政策也在不断给予各类企业和实体经济更多的支持。总体上来讲,外商及港澳台商投资企业的增长也印证了我们总体经济的恢复,说明市场主体的经营状况在不断好转。谢谢。

存储进阶:怎么才能保证 IO 数据的安全?

 

%title插图%num

%title插图%num

写成功了数据就安全了吗?

思考一个问题:写数据做到什么程度才叫安全了?

就是:用户发过来一个写 IO 请求,只要你给他回复了 “写成功了”,那么无论机器发生掉电,还是重启等等之类的,数据都还能读出来。

所以,在我们不考虑数据静默错误的前提下,数据安全的*本质要求是什么?

划重点:那就是数据一定要在非易失性的存储介质里,你才能给用户回复“写成功”。请一定要记住这句话,做存储开发的人员,80% 的时间都在思考这句话。

那么常见的易失性介质和非易失性介质有哪些呢?

易失性介质:寄存器,内存 等;非易失性介质:磁盘,固态硬盘 等;

%title插图%num

从上到下,速度递减,容量递增,价格递减。

%title插图%num

Linux IO 简述

我们前面提到一个文件的读写方式,标准库的方式和系统调用的方式。无论是哪一种,本质上都是基于文件的一种形式,下面承接了一层文件系统,主要层次:系统调用 -> vfs -> 文件系统 -> 块设备 -> 硬件驱动 。

%title插图%num

我们 open 了这个文件,然后 write 数据进去。好,现在思考一个问题,当 write 返回成功之后,数据到磁盘了吗?

答案是:不确定。

因为有文件系统的 cache ,默认是 write back 的模式,数据写到内存就返回成功了,然后内核根据实际情况(比如定期或者脏数据达到某个阈值),异步刷盘。

这样的好处是保证了写的性能,貌似写的性能非常好(可不好嘛,数据写内存的速度),坏处是存在数据风险。因为用户收到成功的时候,数据可能还在内存,这个时候整机掉电,由于内存是易失性介质,数据就丢了。丢数据 是存储*不能接受的事情,相当于丢失了存储的生命线。

动画演示:

%title插图%num

那么,怎么保证数据的可靠?

划重点:还是那句话,一定要确保数据落盘之后,才向用户返回成功。

那么怎么才能保证这一点?有以下 3 种方法。

  1. open 文件的时候,用 O_DIRECT 模式打开,这样 write/read 的时候,文件系统的 IO 会绕过 cache,直接跟磁盘 IO;
  2. open 文件的时候,使用 O_SYNC 模式,确保每一笔 IO 都是同步落盘的。或者 write 之后,主动调用一把 fsync ,强制数据落盘;
  3. 读写文件的另一种方式是通过 mmap 函数把文件映射到进程的地址空间,读写进程内存的地址的数据其实是转发到磁盘上去读写,write 之后主动调用一把 msync 强制刷盘;

%title插图%num

三种安全的 IO 姿势

1   O_DIRECT 模式

DIRECT IO 模式能够保证每次 IO 都直接访问磁盘数据,而不是数据写到内存就向用户返回成功的结果,这样才能确保数据安全。因为内存是易失性的,掉电就丢了,数据只有写到持久化的介质才能安心。

动画演示:

%title插图%num

读的时候也是直接读磁盘,而不会缓存到内存中,从而也能节省整机内存的使用。

缺点也同样明显,由于每次 IO 都要落盘,那么性能肯定看起来差(但你要明白,其实这才是真实的磁盘性能)。

划重点:使用了 O_DIRECT 模式之后,必须要用户自己保证对齐规则,否则 IO 会报错,有 3 个需要对齐的规则:

  1. 磁盘 IO 的大小必须扇区大小(512字节)对齐
  2. 磁盘 IO 偏移按照扇区大小对齐;
  3. 内存 buffer 的地址也必须是扇区对齐;

c 语言示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <stdint.h>
  8. extern int errno;
  9. #define align_ptr(p, a) \
  10.     (u_char *)(((uintptr_t)(p) + ((uintptr_t)a – 1)) & ~((uintptr_t)a – 1))
  11. int main(int argc, char **argv)
  12. {
  13.     char timestamp[8192] = {0,};
  14.     char *timestamp_buf = NULL;
  15.     int timestamp_len = 0;
  16.     ssize_t n = 0;
  17.     int fd = -1;
  18.     fd = open(“./test_directio.txt”, O_CREAT | O_RDWR | O_DIRECT, 0644);
  19.     assert(fd >= 0);
  20.     // 对齐内存地址
  21.     timestamp_buf = (char *)(align_ptr(timestamp, 512));
  22.     timestamp_len = 512;
  23.     n = pwrite(fd, timestamp_buf, timestamp_len, 0);
  24.     printf(“ret (%ld) errno (%s)\n”, n, strerror(errno));
  25.     return 0;
  26. }

编译命令:

  1. gcc -ggdb3 -O0 test.c -D_GNU_SOURCE

生成二进制文件,执行下就知道了,这个是成功的。

  1. sh-4.4# ./a.out
  2. ret (512) errno (Success)

如果为了验证对齐导致的错误,读者朋友可以故意让 io 的偏移或者大小,或者内存 buffer 地址不按照 512 对齐(比如故意让 timestamp_buf 对齐之后的地址减 1,再试下运行),会得到如下:

  1. sh-4.4# ./a.out
  2. ret (-1) errno (Invalid argument)

思考问题:有些童鞋可能会好奇问了?IO 大小和偏移按照 512 对齐我会,但是怎么才能保证 malloc 的地址是 512 对齐的呢?

是啊,我们无法用 malloc 来控制生成的地址。这对这个需求,我们有两个解决办法:

方法一:分配大一点的内存,然后在这个大块内存里找到对齐的地址,只需要确保 IO 大小不会超过*后的边界即可;

我上面的 demo 例子就是如此,分配了 8192 的内存块,然后从里面找到 512 对齐的地址。从这个地址开始往后 512 个字节是*对到不了这个大内存块的边界的。对齐的目的安全达成。

%title插图%num

这种方式实现简单且通用,但是比较浪费内存。

方法二:使用 posix 标准封装的接口 posix_memalign 来分配内存,这个接口分配的内存能保证对齐;

如下,分配 1 KiB 的内存 buffer,内存地址按照 512 字节对齐。

  1. ret = posix_memalign (&buf, 5121024);
  2. if (ret) {
  3.     return -1;
  4. }

思考一个问题:O_DIRECT 模式 的 IO 一般是哪些应用场景?

  • *常见的是数据库系统,数据库有自己的缓存体系和 IO 优化,无需内核消耗内存再去完成相同的事情,并且可能好心办坏事;
  • 不格式化文件系统,而是直接管理块设备的场景;

2   标准 IO + sync

sync 功能:强制刷新内核缓冲区到输出磁盘。

在 Linux 的缓存 I/O 机制中,用户和磁盘之间有一层易失性的介质——内核空间的 buffer cache

  • 读的时候会 cache 一份到内存中以便提高后续的读性能;
  • 写的时候用户数据写到内存 cache 就向用户返回成功,然后异步刷盘,从而提高用户的写性能。

读操作描述如下

  1. 操作系统先看内核的 buffer cache 有缓存不?有,那么就直接从缓存中返回;
  2. 否则从磁盘中读取,然后缓存在操作系统的缓存中;

写操作描述如下

  1. 将数据从用户空间复制到内核的内存 cache 中,这时就向用户返回成功,对用户来说写操作就已经完成;
  2. 至于内存的数据什么时候才真正写到磁盘由操作系统策略决定(如果此时机器掉电,那么就会丢失用户数据);
  3. 所以,如果你要保证落盘,必须显式调用了 sync 命令,显式把数据刷到磁盘(只有刷到磁盘,机器掉电才不会导致丢数据);

划重点:sync 机制能保证当前时间点之前的数据全部刷到磁盘。。而关于 sync 的方式大概有两种:

  1. open 的使用使用 O_SYNC 标识;
  2. 显式调用 fsync 之类的系统调用;

方法一:open 使用 O_SYNC 标识

c 语言示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <assert.h>
  4. #include <fcntl.h>
  5. #include <errno.h>
  6. #include <string.h>
  7. #include <stdint.h>
  8. extern int errno;
  9. int main(int argc, char **argv)
  10. {
  11.     char buffer[512] = {0,};
  12.     ssize_t n = 0;
  13.     int fd = -1;
  14.     fd = open(“./test_sync.txt”, O_CREAT | O_RDWR | O_SYNC, 0644);
  15.     assert(fd >= 0);
  16.     n = pwrite(fd, buffer, 5120);
  17.     printf(“ret (%ld) errno (%s)\n”, n, strerror(errno));
  18.     return 0;
  19. }

这种方式能保证每一笔 IO 都是同步 IO,一定是刷到磁盘才返回,但是这种使用姿势一般少见,因为这个性能会很差,并且不利于批量优化。

动画演示:

%title插图%num

方法二:单独调用函数 fsync

这个则是在 write 之后 fsync 一把数据到磁盘,这种方式实际生产环境用的多些,因为方便业务优化。这种方式对程序员提出了更高的要求,要求必须自己掌握好 fsync 的时机,达到既保证安全又保证性能的目的,这里通常是个权衡点。

比如,你可以 write 10 次之后,*后才调用一把 fsync,这样既能保证刷盘,又达成了批量 IO 的优化目的。

关于这种使用姿势,有几个类似函数,其中有些差异,各自体会下:

  1. // 文件数据和元数据部分都刷盘
  2. int fsync(int fildes);
  3. // 文件数据部分都刷盘
  4. int fdatasync(int fildes);
  5. // 整个内存 cache 都刷磁盘
  6. void sync(void);

动画演示:

%title插图%num

3   mmap + msync

这是一个非常有趣的 IO 模式,通过 mmap 函数将硬盘上文件与进程地址空间大小相同的区域映射起来,之后当要访问这段内存中一段数据时,内核会转换为访问该文件的对应位置的数据。从使用姿势上,就跟操作内存一样,但从结果上来看,本质上是文件 IO

%title插图%num

  1. void *
  2. mmap(void *addr, size_t len, int prot, int flags, int fd, off_t offset)
  3. int
  4. munmap(void *addr, size_t len);

mmap 这种方式可以减少数据在用户空间和内核空间之间的拷贝操作,当数据大的时候,采用内存映射方式去访问文件会获得比较好的效率(因为可以减少内存拷贝量,并且聚合 IO,数据批量下盘,有效的减少 IO 次数)。

当然,你 write 数据也还是异步落盘的,并没有实时落盘,如果要保证落盘,那么必须要调用 msync ,调用成功,才算持久化落盘。

mmap 的优点:

  • 减少系统调用的次数。只需要 mmap 一次的系统调用,后续的操作都是内存拷贝操作姿势,而不是 write/read 的系统调用;
  • 减少数据拷贝次数;

c 语言示例:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/mman.h>
  4. #include <sys/types.h>
  5. #include <unistd.h>
  6. #include <sys/stat.h>
  7. #include <assert.h>
  8. #include <fcntl.h>
  9. #include <string.h>
  10. int main()
  11. {
  12.     int ret = -1;
  13.     int fd = -1;
  14.     fd = open(“test_mmap.txt”, O_CREAT | O_RDWR, 0644);
  15.     assert(fd >= 0);
  16.     ret = ftruncate(fd, 512);
  17.     assert(ret >= 0);
  18.     char *const address = (char *)mmap(NULL512, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
  19.     assert(address != MAP_FAILED);
  20.     // 神奇在这里(看起来是内存拷贝,其实是文件 IO)
  21.     strcpy(address, “hallo, world”);
  22.     ret = close(fd);
  23.     assert(ret >= 0);
  24.     // 落盘确保
  25.     ret = msync(address, 512, MS_SYNC);
  26.     assert(ret >= 0);
  27.     ret = munmap(address, 512);
  28.     assert(ret >= 0);
  29.     return 0;
  30. }

编译运行看看吧。

  1. gcc -ggdb3 -O0 test_mmap.c -D_GNU_SOURCE

是不是生成了一个 test_mmap.txt 文件,里面有一句 “hello,world”。

动画演示:

%title插图%num

%title插图%num

硬件缓存

以上方式保证了文件系统那一层的落盘,但是磁盘硬件其实本身也有缓存,这个属于硬件缓存,这层缓存也是易失的。所以*后一点是,为了保证数据的落盘,硬盘缓存也要关掉。

  1. # 查看写缓存状态;
  2. hdparm -W  /dev/sda
  3. # 关闭 HDD Cache,保证数据强一致性;避免断电时数据未落盘;
  4. hdparm -W  0 /dev/sda
  5. # 打开 HDD Cache(断电时可能导致丢数据)
  6. hdparm -W  1 /dev/sda

按照内核保证数据落盘,硬件保证关闭缓存,综合以上的 IO 姿势,当你写一笔 IO 落盘之后,才能说数据写到磁盘了,才能保证数据是掉电非易失的。

%title插图%num

总结

  1. 数据一定要写在非易失性的存储介质里,你才能给用户回复“写成功”。其他的取巧的方式都是耍流氓、走钢丝;
  2. 本文总结 3 种*根本的 IO 安全的方式,分别是 O_DIRECT 写,标准 IO + Sync 方式,mmap 写 + msync 方式。要么每次都是同步写盘,要么就是每次写完,再调用 sync 主动刷,才能保证数据安全
  3. O_DIRECT 对使用者提出了苛刻的要求,必须要满足 IO 的 offset,length 扇区对齐,内存 buffer 地址也要扇区对齐;
  4. 注意硬盘也有缓存,这个也是易失性的,必须要考虑在内,可以通过 hdparm 命令开关;

到底是谁发明了物联网?

1965年的越南战场,美军正深陷战争泥潭。

突然有一天,北越士兵在胡志明小道发现了一些奇怪的东西。这些东西看上去像树枝,但实际上由金属构成,里面包含一些神秘的电子元件。

这些士兵还发现,近来美军对小道的轰炸越来越频繁,而且轰炸的准确率比之前有大幅的提升,给己方带来了不小的损失。

越军意识到,这些小玩意很可能就是美军空投到胡志明小道的“眼线”。

他们没有猜错,这些小玩意确实是美军的“杰作”。

当时,战争愈演愈烈,美军伤亡人数不断攀升,达到7000人。为了扭转局面、加快战争进程,美军对北越战略要道胡志明小道进行了更大规模的轰炸和封锁。

%title插图%num

胡志明小道

除了大量使用燃烧弹和化学毒剂之外,美方智库贾森小组提出了一种新的构想——可以设计一些能够伪装成树叶、树枝和自然物的传感器,投放到胡志明小道,通过声波和震动识别北越士兵的行动,从而进行精准轰炸。

这个行动,被美军命名为“白色冰屋(Igloo Whiter)”行动。而这些被投放过去的传感器,则被称之为“热带树”。

%title插图%num

“热带树”传感器

除了热带树之外,美军还投放了伪装成动物粪便的T-1511“狗粪”(Dog Doo)传感器。

%title插图%num

T-1511“狗粪”(Dog Doo)传感器

这是一种内置内置无线电信标的震动传感器,空投后激活,感测到地面震动时就会发出无线电信号。

%title插图%num

传感器X光透视图

在小道上空巡逻的美军OP-2E“海王星”电子侦察机收到信号之后,就能得知北越士兵的精确位置,然后召唤轰炸机进行定点打击。

整个越战期间,美军大约空投了几百万个战场传感器,耗资7亿美元。

这些传感器在早期对北越战略物资运输造成了很大的影响。但是,随着时间的推移,效果很快减弱。

原因是多方面的。首先,部分传感器外型突兀,掉在地上容易被识别清除。其次,传感器容易受野生动物和自然环境(风雨)的影响,导致误报,严重影响轰炸效率。再则,传感器自身的故障率也比较高。

%title插图%num

北越方面甚至训练了一支由3000只猴子组成的“部队”,专门对这些传感器进行定点清除。

总而言之,美军的这次“白屋行动”并不成功。尽管如此,这些传感器却打开了传感网世界的大门。世界各国不管是军用还是民用,纷纷开始效仿。

从某种意义上来说,这个传感器网络是物联网的*早期模型。

时间继续推移,我们来到1982年的美国宾夕法尼亚州匹兹堡。著名的卡内基梅隆大学,就坐落于此。

有一天,卡内基梅隆大学计算机科学系的研究生大卫·尼科尔斯(David Nichols)坐在办公室里,突然想喝可乐。

当时,学校在这栋大楼里确实设置了一个可口可乐自动售货机。不过,因为需求旺盛,所以经常缺货。

这位老兄虽然很想喝可乐,但是,作为宅男程序员,他*不愿意白跑一趟。

“于是,我想起了斯坦福大学的*台电脑控制自动售货机‘Prancing Pony’的故事”,尼科尔斯回忆道,“我意识到,我们完全可以通过技术来解决这个问题呀!”

%title插图%num

他把自己的想法告诉了他的同学。很快,另外两位学生迈克·卡扎尔(Mike Kazar)、伊沃·达勒姆(Ivor Durham)以及学校的研究工程师约翰·扎尔奈(John Zsarnay)开始了对技术细节的研究。

他们把关注点放在了可乐机的指示灯上。这台机器有6个可乐瓶位置。当有人购买可乐时,对应位置的红色指示灯会闪烁几秒钟,然后灭掉。

于是,约翰·扎尔奈设计并安装了一块能感应指示灯状态的主板,并通过一条线路将主板连接到部门的主计算机上。这台计算机也连接到了ARPANET上。ARPANET,也就是我们今天互联网的前身。

后来,小组成员们在主计算机上添加了代码,允许连接到ARPANET或卡内基梅隆大学本地以太网的任何计算机访问可乐机的信息。只需要按几个键,他们就可以知道机器里是否还有可乐。

“我从来没有用过它,只是看看它是否起作用”,卡扎尔兴奋地说,“我从来不喜欢可乐。”

不过,卡内基梅隆大学喜欢可乐的人那是非常的多,这个程序受到了热烈的欢迎。也有很多人对这个创意进行了效仿。

这个远程监控自动可乐机,可以算是民用物联网领域的一次探索。此后的很长时间里,卡内基梅隆大学都保留着这台可乐机,也有不少学生在它身上进行着各种改进和实验。

更有趣的是,大学还给这个可乐机专门建了一个网页,介绍它的传奇历史。(链接:https://www.cs.cmu.edu/~coke/)

%title插图%num

虽然这个可乐机很神奇,但并没有被公认为是世界上*台物联网设备。那么,*台物联网设备是什么时候出现的呢?

1990年。

那一年,美国计算机网络工程师约翰·罗姆奇(John Romkey )发明了一台可以通过互联网打开和关闭的烤面包机。他打算带着这台面包机去参加那一年的INTEROP大会。

大会主席丹·林奇(Dan Lynch)向他承诺:“如果你的烤面包机能够通过网络启动,我就会给你整个楼层*明星的展位”。结果,他真的做到了。

%title插图%num

约翰·罗姆奇和他的“网络烤面包机”

烤面包机通过TCP/IP网络连接到一台电脑上,然后通过SNMP MIB打开工作电源。

这个网络烤面包机,被普遍认为是世界上*台“物联网设备”。(网上还有一种说法,说施乐公司推出的网络可乐贩售机是*台物联网设备,可是小枣君实在没有找到相关的资料。)

1995年,比尔盖茨出版了自己的新书《未来之路》。在书中,比尔盖茨对信息技术的未来进行了大胆预言,其中就包括很多和现在物联网应用类似的奇妙想法。

例如:

“用户遗失或遭窃的照相机将自动发回信息,告诉用户所处的具体位置,甚至当它已经身处不同的城市。”

他认为,未来越来越多的物体将连入网络,可以通过网络进行控制。

%title插图%num

《未来之路》

除了写书之外,比尔盖茨还将自己的想法付诸实践。那一年,比尔盖茨为自己新建的房子设计了一整套的物联网系统来进行智能调控。他本人也成为了*早的智能家居用户。

此后,关于“万物联网”的思潮愈演愈烈。1999年(网上很多资料说是1991年,那是错误的),麻省理工学院的凯文·阿什顿(Kevin Ashton)教授首次提出物联网(Internet of Things)的概念。同年,他在麻省理工学院领导建立了“自动识别中心(Auto-ID)”,提出“万物皆可通过网络互联”,阐明了物联网的基本含义。

%title插图%num

Kevin Ashton

凯文·阿什顿也因此被称为“物联网之父”。

2003年,美国《技术评论》杂志提出,传感网技术将是未来改变人们生活的十大技术之首。也是从这一年起,英国卫报、科学美国人和波士顿环球报等主流媒体开始使用“物联网(Internet of Things)”这一叫法取代传感网,两者开始明确划分界限。

2005年11月17日,在突尼斯举行的信息社会世界峰会上,国际电信联盟(ITU)发布了《ITU互联网报告2005:物联网》。这份报告,算是从官方层面正式给“物联网(IoT)”授予了一个合法的身份。

从此,物联网世界的大门正式打开,人类真正进入了物联网时代!

参考文献:

1、https://www.cs.cmu.edu/~coke/

2、https://www.ibm.com/blogs/industries/little-known-story-first-iot-device/

3、https://new.qq.com/omn/20190131/20190131A0WQ5I.html

4、《先进武器并非无所不能 电子传感器败走胡志明小道》,人民网

5、《未来之路》,比尔盖茨

6、https://en.wikipedia.org/wiki/Kevin_Ashton

何为“边缘计算”?

云原生除了K8S、微服务,还有…?中和大家聊了下关于云原生的话题,在云原生的概念中比较明确的一个特点就是云原生是基于云计算的。在这种模式下用户的计算请求会被发送到云端服务进行处理,由云端完成复杂的数据计算后,再将结果以同步或异步方式返回调用客户端。

这就是典型的互联网”客户端/服务端”处理模式。但这并不是说只有云原生架构的应用才是这种模式,传统非云场景下的*大多数互联网应用也都是这种模式,而这种方式也是互联网技术发展到今天*主流的计算场景。

只不过在这个过程中,随着用户数据计算规模越来越大,传统的非云场景要支撑日益增长的数据计算规模,所需的计算资源成本会大幅上升。而在这个时候,具备弹性伸缩能力的云计算服务,就应运而生了!相对于传统自建机房模式,使用云计算可以大大降低运维成本。

但这也只是从服务器计算资源的角度在看问题,要充分发挥云端服务的计算能力,还需要在系统架构上进行更合理的设计。而云原生架构模式就是从系统架构本身对整个软件系统的应用结构、部署模式等进行结构性优化,这一切的核心目的都是为了提高在”客户端/服务端”这种云端计算模式下服务的计算效率、提升用户响应速度。

然而云原生架构也并不是终*解决方案,在目前以移动互联网为主流的大数据时代,以及正在或即将到来的物联网、AI时代,数据的增长规模将达到PB级别(1TB=1024GB,1PB=1024TB),面对如此海量数据,分析计算结果所要求的时间却越来越短,在这种趋势之下,云端集中式数据处理方式将越来越难以满足这种需求。

我们也将被迫走到”边缘计算”这条路上,这也是为什么*近两年关于”边缘计算”、”Serverless”这些新概念讨论越来越多的原因。在今天的文章中,就和大家一起聊聊”边缘计算”这个话题。

%title插图%num

边缘计算是什么

通过前面的叙述,相信你大概理解了边缘计算到底缘何而来,那么它到底是什么,在现阶段有何具体的落地场景及技术呢?

说起边缘计算*常见的举例就是章鱼,作为无脊椎动物中智商*高的一种动物,章鱼拥有巨量的神经元,但这些神经元中60%都分布在章鱼的八条腿上,而大脑中的神经元只占40%。如下图所示:

%title插图%num

在这种生物结构下,章鱼在捕猎时异常灵巧迅速,腕足之间配合*好,从不会缠绕打结。而这种类似于“多个小脑+一个大脑”的分布式协作方式,就是边缘计算非常形象的表达。

回到我们所讲的边缘计算,它也是一种分布式计算:”在网络边缘侧的智能网关上就近处理采集的数据,而不是将大量数据上传到远端的数据中心进行集中处理”。边缘计算可以带来明显的计算优势,具体如下:

  • 边缘计算可以更实时地进行数据处理和分析,让数据处理更靠近数据源,而不是外部数据中心或者云,这样可以缩短延迟时间;
  • 减少网络流量。在物联网、AI时代随着各类设备数量的增加,数据的生产速度飞快,如果将这些数据都传回云端处理,那么将大大挤占网络带宽,造成更大的数据瓶颈;
  • 降低预算成本。利用边缘计算所要采取的本地设备采购及数据处理方案所花费的成本,要大大低于使用云或者数据中心处理所花费的成本。

按照上述说法,既然边缘计算有这么多优势,那么它是否就能取代云端计算了呢?实际上边缘计算更适合物联网和AI计算场景,边缘计算准确的说是对云端集中式计算方式的一种补充和优化。以下我列举了几种有代表性的边缘计算场景,具体如下:

%title插图%num

其实还有很多其他场景,随着物联网、AI时代的到来,边缘计算所延伸的场景将更加丰富。但说到这里,似乎边缘计算与咱们做互联网服务端的好像没有啥关系啊!但实际上技术都是相通的,虽然目前边缘计算更侧重于物联网/AI等领域,但是边缘计算的思想其实早就在互联网“客户端/服务端模式”中出现过,例如以Ajax为代表的“富客户端”技术,其本质就是一种减少服务端计算量的边缘计算思想。

只不过目前我们所谈论的边缘计算所涉及的层次要更加复杂,而不仅仅只是单个客户端的简单分散计算。就现阶段来说边缘计算的关键技术主要集中在以下两个方面:

%title插图%num

在上述两个关键技术方向中,边缘网关技术更多的是偏向于网络边缘设备的计算能力,例如5G基站。所以这方面技术的发展由于行业及场景的不同,目前也没有一个统一的标准,另外这方面的内容也的确超出了咱们做互联网所涉及的技术范围。

因此,关于边缘网关技术的内容就不过多讨论了,接下来我们重点看下与互联网相关性更多的Serverless技术。

%title插图%num

Serverless

从严格意义上来说,边缘计算与Serverless从定义及概念上并没有直接的关系。这主要是因为边缘计算与Serverless当前的应用场景还没有凸显出来,但从目前业界活跃的讨论氛围来看,Serverless技术未来有*大的可能会被应用于边缘计算场景。因为边缘计算的核心目的就是把原先必须在云端计算的逻辑放到边缘设备上去,从而更快地响应用户的操作需求,但要做到这一切就必须让边缘设备具备灵活执行用户计算代码的能力。

而以Serverless为代表的”云函数”技术,可以让用户在云端以比微服务粒度更细的单元去编写逻辑计算代码,但这种代码与传统云端运行的服务不同,它本身并不是一个持久存在并固定运行在某个服务器或容器中的进程,而是可以根据真正的用户事件进行触发式运算。在这个过程中,云服务所做的只是提供代码和配置的托管,以及根据事件触发运算调度,而真正的计算则是将”云函数”代码具体下放到某个具体的边缘设备去运行和使用。

这种无服务器计算的方式,能够非常巧妙的将云计算的调度能力与边缘具体算力有机结合起来,从而形成一个”大脑+多个小脑”的分布式计算系统。接下来我们具体看下Serverless的概念:

%title插图%num

如上图所示Serverless从架构上主要可以分为:BaaS(后端即服务)、FaaS(函数即服务)两部分。

后端即服务(BaaS)说的是尽量使用现成的第三方服务来替换我们原来自己编码实现或搭建的服务器组件,它从概念上更类似于SaaS服务,例如直接使用云服务所提供的各类技术服务——COS对象存储、CDN容分发、CDB云数据库等。从技术实质上说Baas本身并没有什么新奇之处,更多的是一种尽量使用第三方服务来减少自己构建通用基础服务的概率,而尽量做到无服务或少服务。

而函数即服务(SaaS)则是一种构建和部署软件的全新方法,它为云中运行的应用程序提供了一种新的系统体系结构。在这种结构之下,再也不用在服务器上持续运行服务进程以等待HTTP请求或调用,而是可以通过某种事件机制来具体触发函数代码执行,这是一种更节省成本的云计算方式。

目前许多云服务厂商都在抓紧布局Serverless技术,可见Serverless技术的发展将是大势所趋。下图为腾讯云所提供的云函数产品界面示意图:

%title插图%num

现阶段Serverless技术还处于早期发展阶段,相信随着更多应用场景的落地,在不久的将来Serverless技术必将被广大企业和开发者所接受,从而成为改变现有软件开发部署模式的新一代技术潮流。

以上就是本文想要表达的全部内容,感兴趣的朋友可以找个Serverless云服务产品(如腾讯云云函数或Serverless Framework)具体体验下Serverless的开发流程!如果觉得本文对你有所帮助,欢迎点赞关留言~

参考资料:https://blog.csdn.net/qcloudcommunity/article/details/79388590