转:探索 AIX 6:在 AIX 6 上配置 iSCSI Target

引言

iSCSI(Internet Small Computer System Interface)被业界认为是非常廉价的 SAN 解决方案,一直在中低端应用领域被市场所看好。 iSCSI 客户端和服务端都既可以通过硬件方式实现,也能通过软件方式的,其优劣区别就是在于效能与成本各有优势。绝大多数操作系统都免费的附带了 iSCSI 的 sw initiator(软件方式)客户端组件,比如在 AIX5.2 以上的版本中就开始附带了 iSCSI sw initiator 组件。不过 iSCSI 服务端,也即 iSCSI target,一般都是收费软件,并且绝大多数都只能运行在 windows 平台。在 AIX 6.1 中集成了 iSCSI initiator 和 iSCSI target 了两种功能。另外,借助与 POWER6 以及部分 POWER5 机型其功能强大的底层硬件平台, AIX 6.1 还能够支持到使用软件方式的 iSCSI 磁盘启动,无需硬件 iSCSI HBA。

iSCSI 的基本介绍

iSCSI 可以简单理解为通过 TCP/IP 封装 SCSI 命令,实现在 IP 网络使用远端的 SCSI 设备的一种协议。 iSCSI 是 SCSI 协议的扩展, SCSI 使用物理 SCSI 电缆传递 SCSI 命令,而 iSCSI 使用了虚拟的 TCP/IP 网络。借助现有的 LAN、WAN 网络环境,iSCSI 提供了非常经济的数据存储的解决方案。

其基本结构可以参看下图,iSCSI 结构与 SCSI 结构一样,由客户端(Initiator)和服务端(Target)两部分组成。不同的是 SCSI 的数据链路是一条 SCSI 总线,连接和寻址都较简单;而 iSCSI 使用 TCP/IP 网络作为数据链路,其配置就相对复杂一些,但是其灵活性和扩展性则远高于传统的 SCSI 架构。iSCSI 其最底层是以太交换网络,是 iSCSI 协议通信的基础层,我们首先需要保证客户端与服务端的网络畅通。(注:不光是传统以太网络,目前高性能 InfiniBand 网络也是采用 iSCSI 协议作为存储设备的传输协议)。中间层是 iSCSI 协议层的封装,主要功能包括 iSCSI 连接的管理,访问控制等,本文的内容也是主要针对这一层的配置和管理。最上层是 SCSI 命令层,在配置好 iSCSI 设备后,系统即可透明的使用 SCSI 协议访问远端的设备。

图表 1 iSCSI 协议模型

探索 AIX 6:在 AIX 6 上配置 iSCSI Target

本文所配置案例的基本框架

本文所采用的案例,其逻辑结构图如下:右边是一台 AIX 6 服务器,我们将通过它来提供 iSCSI Tareget 服务。本案例中,使用了一个 lv (exlv)和一个磁盘(hdisk1)作为 Target LUN(Logical Unit Number) 设备,并通过 Target0 输出给客户端。在左边客户端这一侧,我们通过 initiator 连接到 AIX 6 服务器来访问 Target LUN 设备,并使用这两个远程的 iSCSI 磁盘创建一个 datavg。

图表 2 本案例逻辑架构

探索 AIX 6:在 AIX 6 上配置 iSCSI Target

软硬件测试环境

系统平台操作系统网络地址
System p 520 lpar 1 (服务端)

2 CPU 2G 内存

AIX 6.1192.168.21.134
System p 520 lpar 2 (客户端)

2 CPU 2G 内存

AIX 5.3L192.168.21.132

系统安装要求

操作系统版本要求:AIX 6.1.0.0

iSCSI target 软件包在 AIX 6.1 expansion pack 光盘中,放入光驱,通过 SMIT 安装下面第一个软件包。

devices.tmiscsw.rte 6.1.0.0

如遇到错误,请检查以下软件包是否正确安装,devices.tmiscsw.rte 依赖于此软件包,请放入第一张系统盘安装此包。

devices.common.IBM.iSCSI.rte 6.1.0.0

iSCSI Target 的配置

Target 的配置有三部分,一是创建 iSCSI Target 最底层的协议驱动设备;二是在协议驱动设备上创建虚拟的 Target 设备;最后将本地的磁盘映射到 Target 上,作为 Target LUN。

首先,通过 smit tmiscsi_proto 创建 iSCSI Target 协议设备。如下图:

iSCSI Target Protocol Device
Move cursor to desired item and press Enter.
List All iSCSI Target Protocol Devices
Add an iSCSI Target Protocol Device
Change / Show Characteristics of an iSCSI Target Protocol Device
Remove an iSCSI Target Protocol Device
F1=Help F2=Refresh F3=Cancel Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

选择 Add an iSCSI Target Protocol Device, 按回车到下一步。

Add an iSCSI Target Protocol Device
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
iSCSI Target Protocol Device Name tmsw0
Maximum number of sessions [200] +#
Maximum transfer size in one PDU [262144] +#
Access Control enabled    [off] +
Apply change to DATABASE only    no +
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

在此处配置 Target 的性能参数,我们一般使用默认值。 Access Control enabled 这一栏我们下面还会提到,打开或关闭取决于我们是否采用基于 iqn 的安全访问控制机制。在这里我们直接回车到下一步。

COMMAND STATUS
Command: OK stdout: yes stderr: no
Before command completion, additional instructions may appear below.
tmsw0 Available
F1=Help F2=Refresh F3=Cancel Esc+6=Command
Esc+8=Image Esc+9=Shell Esc+0=Exit /=Find

第二步,我们创建虚拟的 Target 设备。使用命令 smit tmtarget。

iSCSI Targets
Move cursor to desired item and press Enter.
List All iSCSI Targets
Add an iSCSI Target
Change / Show Characteristics of an iSCSI Target
Remove an iSCSI Target
F1=Help F2=Refresh F3=Cancel Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

选择 Add an iSCSI Target。

Add an iSCSI Target
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
iSCSI Target Protocol Device Name tmsw0
iSCSI Target Logical Name []
* iSCSI Target Name [com.ibm.cn.swtarget0]
Maximum Target LUNs allowed [512] +#
Paths                []
Force disconnection of iSCSI clients on remove [no] +
Initiator Reconnection delay          [] +#
Addressing method            [] +#
Apply change to DATABASE only          no +
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

在 iSCSI Target Name 一栏输入 Target 设备的 iqn 地址。其他保持默认值。我们设置其为 com.ibm.cn.swtarget0. 按回车下一步。

COMMAND STATUS
Command: OK stdout: yes stderr: no
Before command completion, additional instructions may appear below.
target0 Available

Target 设备即创建完成。

最后,我们将 LV exlv 和 hdisk1 两个块设备挂载(mapping)到 Target 设备下,作为 iSCSI Target LUN 设备。使用命令 smit tmlun

iSCSI Target LUNs
Move cursor to desired item and press Enter.
List all iSCSI Target Logical Units
Add an iSCSI Target Logical Unit
Change / Show Characteristics of an iSCSI Target Logical Unit
Remove an iSCSI Target Logical Unit
lqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqk
x iSCSI Parent Target Name x
x x
x Move cursor to desired item and press Enter. x
x x
x target0 Available iSCSI Target Mode Target x
x x
x F1=Help F2=Refresh F3=Cancel x
x Esc+8=Image Esc+0=Exit Enter=Do x
F1x /=Find n=Find Next x
Esmqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqqq

选择 Add an iSCSI Target Logical Unit,按回车然后选择 target0,再按回车到下一步。

Add an iSCSI Target Logical Unit
  
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
iSCSI Parent Target Name target0
Logical Unit Name    []
* Backing Device Type [disk] +
* Backing Device Name [hdisk1] +
Maximum Number of Commands to Queue to Device [3] +#
Apply change to DATABASE only no +
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

我们先添加 hdisk1,在 Backing Device type 中输入设备类型 disk。在 Backing Device Name 输入 hdisk1. 回车下一步。

COMMAND STATUS
Command: OK stdout: yes stderr: no
Before command completion, additional instructions may appear below.
lu0 Available
F1=Help F2=Refresh F3=Cancel Esc+6=Command
Esc+8=Image Esc+9=Shell Esc+0=Exit /=Find
n=Find Next

hdisk1 已添加好成为 Target LUN。下面我们继续添加 LV exlv。

Add an iSCSI Target Logical Unit
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
iSCSI Parent Target Name       target0
Logical Unit Name          []
* Backing Device Type          [lv] +
* Backing Device Name          [exlv] +
Maximum Number of Commands to Queue to Device    [3] +#
Apply change to DATABASE only        no +
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

在设备类型一栏选择 lv,在 Backing Device Name 一栏输入 exlv,按回车到下一步。

COMMAND STATUS
  
Command: OK stdout: yes stderr: no
Before command completion, additional instructions may appear below.
lu1 Available
F1=Help F2=Refresh F3=Cancel Esc+6=Command
Esc+8=Image Esc+9=Shell Esc+0=Exit /=Find
n=Find Next

通过以下命令,来检查刚创建的设备的状态是否正常 :

# lsdev -C -t target# 查看 target 状态
target0 Available iSCSI Target Mode Target
tmiscsi0 Defined iSCSI Target Mode Targets Container
# lsdev -C -t lu# 查看 Target LUN 的状态
lu0 Available iSCSI Target Mode Logical Unit
lu1 Available iSCSI Target Mode Logical Unit
#

到现在,我们已经在服务器端,配置好了 iSCSI 的 target 服务。并将 2 个块设备映射成为 target0 的 Target LUN 设备。默认的配置选项没有打开安全控制访问以及 CHAP 认证机制。所以我们目前不需要关心访问权限等内容。这部分内容在最后一个章节讨论。

iSCSI software Initiator 配置

客户端需要我们配置客户端的 iqn 地址,还有 iSCSI Target 端的信息,我们将通过以下两个步骤来完成。

首先配置客户端的 iqn 地址。在客户端系统中使用 smit 来配置,smit 路径:smit chgiscsisw。

Change / Show Characteristics of an iSCSI Protocol Device
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
iSCSI Protocol Device iscsi0
Description iSCSI Protocol Device
Status Available
iSCSI Initiator Name [iqn.aix01.hostid.c0a81582]
Maximum number of commands to queue to driver [200] +#
Discovery Policy file +
Maximum Targets Allowed [16] +#
Apply change to DATABASE only no +
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

在 iSCSI Initiator Name 一栏输入自定义的客户端 iqn,或使用自动生成的的 iqn 地址,我们在这里使用默认的生成的 iqn。下面我们通过编辑客户端 /etc/iscsi/targets 文件,添加 ISCSI target,也即配置 iSCSI 服务器信息。

# vi /etc/iscsi/targets
# The target line would look like:
# 10.2.1.105 3260 iqn.com.ibm-K167-42.fc1a "This is my password."
#
# EXAMPLE 3: iSCSI Target with CHAP(MD5) authentication and line continuation
# Assume the target is at address 10.2.1.106
# the valid port is 3260
# the name of the target is iqn.2003-01.com.ibm:00.fcd0ab21.shark128
# the CHAP secret is "123ismysecretpassword.fc1b"
# 字段格式为:“Server IP”端口“target iqn 地址”
192.168.21.134 3260 com.ibm.cn.swtarget0

在上面这个文件我们添加了最后一行,由三个字段组成,第一段指定服务器 IP 地址,第二段指定服务端口,第三段指定服务器 target 的 iqn 地址。我们配置好 target 信息之后,执行 cfgmgr 刷新一下,如果配置正确,我们就可以找到 iSCSI disk 了。如下图

# cfgmgr -l iscsi0# 刷新设备列表
# lsdev -Cc disk# 列出磁盘状态
hdisk0 Available Virtual SCSI Disk Drive
hdisk1 Available Other iSCSI Disk Drive
hdisk2 Available Other iSCSI Disk Drive

创建 Datavg

这一步较为简单,我们能够正确连接到 iSCSI 服务器端,访问到 iSCSI 磁盘后,可以通过下列命令创建一个 vg。

# mkvg -y datavg hdisk1 hdisk2
datavg
# lsvg -p datavg
datavg:
PV_NAME PV STATE TOTAL PPs FREE PPs FREE DISTRIBUTION
hdisk1 active 511 511 103..102..102..102..102
hdisk2 active 9 9 02..02..01..02..02

至此,我们已完成了在 AIX 平台上的关于 iSCSI 的一个基本的配置过程,包括:iSCSI 服务器配置,iSCSI 客户端的配置,以及使用 iSCSI 磁盘创建 vg。但是没有涉及到访问控制和认证等安全相关的内容,下面我们就 iSCSI 服务器安全机制做一个介绍。

iSCSI 访问安全控制

在 AIX 6 中,iSCSI 安全机制由两部分组成,一是使用 CHAP 握手协议对客户端连接请求做认证;二是通过访问列表(access list),控制客户端的访问权限。

CHAP 握手协议

CHAP 握手协议是一种应用广泛的身份验证的协议,可以对客户端进行身份验证。在 AIX 6 中,我们可以为每个 target 设置一个 CHAP 认证密钥,在服务器端的 /etc/tmiscsi/autosecrets 文件中配置。格式如下图:

# 字段格式为: target 名称 CHAP 用户名 CHAP 密钥
# 本文中 target 名为 target0
# 因为 AIX 的 iSCSI 客户端会自动使用本机的 iqn 地址作为 CHAP 的用户名,
# 所以我们在这里设置 chap 名为客户端的 iqn 地址
# CHAP 密钥:我们设定为 test1234
#
target0 iqn.aix01.hostid.c0a81582 test1234

相应的我们需要修改客户端的的配置文件,编辑 /etc/iscsi/targets 文件,在后面添加 CHAP 密钥信息。

vi /etc/iscsi/targets
# 字段格式为:“Server IP”端口“target iqn 地址”“CHAP 密钥”。注意密钥需要在两边使用引号标记。
192.168.21.134 3260 com.ibm.cn.swtarget0 “test1234”

我们通过 cfgmgr 命令刷新下设备。

# cfgmgr -vl iscsi0
----------------
attempting to configure device 'iscsi0'
Time: 0 LEDS: 0x25b0
invoking /usr/lib/methods/cfgiscsi -l iscsi0
Number of running methods: 1
----------------
Completed method for: iscsi0, Elapsed time = 1
return code = 0
****************** stdout ***********
hdisk1 hdisk2
****************** no stderr ***********
。。。( 略 )

访问控制列表

访问控制列表,是一个基于客户端 iqn 地址来控制访问权限的一个列表。它可以精确到设置每一个输出磁盘的访问权限。要使用访问控制功能,首先需要在创建 target 协议设备的时候需要激活该功能。或通过 smit tmiscsi_proto_change 来修改 Access Control enabled 为 on。修改必须要先删除该设备下的所有子设备,所以最好在创建的时候激活该功能。

Change / Show Characteristics of an iSCSI Target Protocol Device
Type or select values in entry fields.
Press Enter AFTER making all desired changes.
[Entry Fields]
iSCSI Target Protocol Device Name    tmsw0
Maximum number of sessions      [200] +#
Maximum transfer size in one PDU      [262144] +#
Access Control enabled [on] +
Apply change to DATABASE only    no +
F1=Help F2=Refresh F3=Cancel F4=List
Esc+5=Reset Esc+6=Command Esc+7=Edit Esc+8=Image
Esc+9=Shell Esc+0=Exit Enter=Do

访问权限的配置在 /etc/tmiscsi/access_lists 中设置,下面将提供一些配置例子以供参考。更详细的格式说明请参考 /etc/tmiscsi/access_lists 中的注释。

#vi /etc/tmiscsi/access_lists
# 基本命令格式为:
# target 名称 | LUN 名称客户端的 iqn 地址,客户端 iqn 地址…
# 例:Target0 下的所有磁盘可以被 iqn 地址为 iqn.aix01.hostid.c0a8 的客户端访问。
target0|all iqn.aix01.hostid.c0a8
#target0 的 LUN 名为 disk1 的磁盘可以被 iqn.aix01.hostid 和 iqn.aix02.hostid 访问
target0|disk1 iqn.aix01.hostid,iqn.aix02.hostid
# 所有的 target 中的所有的磁盘可以被任意一个客户端访问。
all|all any

小结

IBM 的 system p AIX 6 平台为中小企业的 iSCSI 应用提供了一种全新的解决方案。总体来说有以下三个优势。

AIX 6 的 iSCSI target 是集成在 AIX 安装光盘 expansion pack 里的一个软件包,无需额外费用。

借助 system p 强大的 IO 吞吐能力,能够保证稳定和高速的 iSCSI 流量。同时 system p 的先进的架构还能保证 IO 带宽的线性扩展能力。性能优势远非其他系统平台所能比拟。

作为 system p 的一贯特性:高可靠性,高可用性,高可服务性。这些特性不仅是在系统设计上得到保证,也一直被业界所认可。

我们看到依托于 system p 强大的硬件平台,AIX 6 提供的 iSCSI target 解决方案即高可靠又高性能。反过来说,AIX 6 进一步拓展了其 UNIX 平台的应用领域,将 system p 服务器打造成了一台“iSCSI 存储设备”。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/403431.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

uni-app微信小程序生成自定义参数二维码,跳转小程序指定页面,获取参数;uni-app微信小程序获取二维码自定义参数;微信小程序生成动态参数二维码;uni-app微信小程序获取动态参数二维码;

一、场景需求: 在小程序个人名片页面A页面,生成用户的个人名片二维码(该二维码携带用户的唯一标识id);微信扫一扫或长按图片识别这个二维码,可以跳转到小程序的B页面,并且在B页面拿到二维码上的…

【view桌面虚拟化系列】1-vSphere搭建

本系列一共三章,具体如下: 【view桌面虚拟化系列】1-vSphere搭建 【view桌面虚拟化系列】2-View搭建 【view桌面虚拟化系列】3-VDI实现 实验的目的:测试vsphere5.1a、view5.1测试整体运行状况。 首先介绍下环境(所使用域名:vmc.co…

uni-app微信小程序保存页面到相册;canvas保存小程序页面;微信小程序保存二维码活动页面到相册;微信小程序canvas 生成海报保存到相册;canvas绘制小程序页面保存及分享;

文末代码可以直接复制运行(只需要将中间的二维码图片、底部的微信和相册图片和微信头像配置白名单 改成你项目内的img图片即可成功运行) 一、场景:在微信小程序 个人名片页面 含有微信头像和个人信息二维码(识别可跳转小程序指定页…

面试经验谈架构

##################################################### #本文内容来自《老男孩linux运维实战培训》学生—郑东旭 #如有转载,请务必保留本文链接及本版权信息。 #欢迎广大运维同仁一起交流linux/unix网站运维技术! #QQ:919953500#E-mail:weilandeshanhuhai126.com …

微信小程序uni.switchTab传参获取不到;小程序跳转到tabBar页并传参;uni-app微信小程序获取tabBar页面参数失败;uni-app微信小程序tabBar页面onLoad不执行

需求场景:从非tabBar页面B跳转到tabBar页面A,并想要携带参数。 如果使用uni.switchTab传参,会导致tabBAE页面获取不到参数; 原因: 官方文档有说,uni.switchTab路径后不能带参数; uni.navigateT…

UIView的旋转iOS开发

更多阅读请访问http://www.hopean.com 有关UIView坐标变换的,但是经常不能得到自己想要的效果,今天就把它仔细研究了下。记下来等以后忘记的时候再复习 重写shouldAutorateToInterfaceOrientation:,限制某个方向会改变原点的位置,…

uni-app微信小程序uni.navigateTo跳转无效问题;记录一次uni-app页面跳转无效,来回跳转问题;wx.navigateTo ,跳转超过10次怎么点不动的解决办法。

场景需求:从小程序A页面跳转到小程序B页面,然后B页面还可以跳到A页面。 跳转失效原因: –1.uni.navigateTo只能跳转到非tabBar页面,tabBar导航栏页面只能用uni.switchTab方法跳转; –2.uni.navigateTo跳转的页面栈太多…

20160512关于mac安装caffe的记录

记得2015年在mac系统上安装过一次caffe,非常顺利,但是最近群里许多同学反映mac安装caffe出现了各种问题,同时我也在帮助别人安装caffe的时候也遇到了一些坑,不再像以前这么顺利了。估计与操作系统,caffe升级有关。 今晚…

Python学习笔记(二)

2019独角兽企业重金招聘Python工程师标准>>> pickle #腌制 pickle.dump() #保存数据 pickle.load() #恢复数据 locals() # 返回当前作用域中的变量集合 with语句会自动处理所有已打开文件的关闭工作,类似C#中的using() >>> data[5,78,3,45,7,1]…

mac:在当前文件夹打开terminal终端

From: http://www.cnblogs.com/yjmyzz/p/3662507.html System Preferences -> Keyboard -> Shortcuts -> Services -> New Terminal at Folders/New Terminal Tab at Folder 这二项都勾上 然后在Finder中,在任何目录上右击->service就能看到进入terminal的选项

自定义控件(视图)2期笔记13:View的滑动冲突之 内部拦截法

1. 内部拦截法: 父容器不拦截事件,所有的事件全部都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交给父容器进行处理。 这种方法和Android中的事件分发机制不一样,需要配合requestDisallowInterceptTouchEve…

微信小程序图片加载太慢;uni-app微信小程序加载图片优化;微信小程序图片image加载成功事件@load;图片加载成功触发@load事件

场景: 微信小程序,对于以下较大的图片(例如几M),在真机运行时候加载比较慢,此时会有一个比较长时间的白屏,体验很差。 解决方案:图片未加载成功前,进行loading…;图片加载…

循环队列及C语言实现一

循环队列是为了充分利用内存,进行数据操作的一种基本算法。具体实现方式可划分为:链式队列和静态队列,这里所谓的静态是指在一片连续的内存区域进行数据操作。本文只讲述静态队列,也是最简单的实现方式,链式队列以及链…

微信小程序自定义导航栏;uni-app微信小程序自定义顶部导航栏;微信小程序顶部导航栏高度;微信小程序左上角胶囊按钮;uni-app微信小程序左上角胶囊设置

本文是自定义微信小程序的顶部导航栏;自定义微信小程序底部导航栏tabBar看另外这篇 文末的两个文件代码可以直接复制使用 自定义导航栏页图 一、场景: 有些时候,微信小程序需要我们在导航栏做更多的操作样式(例如高度、颜色、加…

HTML5与HTML4的比较

HHTML5封装一些标签和属性&#xff0c;方便了开发。 1 <form> 2 <p> 3 <label>Username:<input name"search" type"text" id"search" autofocus></label> 4 </p> 5 &l…

[iOS]Unable to run app in Simulator

From: http://blog.csdn.net/snowwind/article/details/41099575 今天在试Admob的时候&#xff0c;发现在simulator上&#xff0c;程序突然不能运行了&#xff0c; 提示 [plain] view plaincopy Unable to run app in Simulator An error was encountered while running (…

uni-app微信小程序动态样式设置;微信小程序style行内式无效;微信小程序style行内式编译报错;微信小程序:style设置样式

场景&#xff1a;微信小程序设置动态样式&#xff0c;有些时候是需要用到变量来书写的&#xff1b;但是实际使用发现&#xff0c;行内式书写虽然有效&#xff0c;但是会使得微信小程序的编辑失败&#xff1b;故需要使用动态的v-bind来写动态变量行内式样式&#xff08;既使用:s…

循环队列及C语言实现二

在我的上一篇博文中已经讲到循环队列的特点作用以及C语言实现&#xff0c;当然实现和操作的方式比较简单&#xff0c;在实际项目应用中略显粗糙。因此&#xff0c;这一篇提供一个进阶篇的实现与操作接口。具体函数作用可以参见我的注释部分&#xff0c;使用的时候直接把里面的接…

MAC下secureCRT无法保存密码的解决方法

From: http://www.php230.com/securecrt-for-mac-store-password.html 在mac下新安装了secureCRT&#xff0c;取代系统自带的终端工具&#xff0c;主要是为了方便链接服务器。 mac下面的secureCRT默认保存不上密码&#xff0c;我们选择了保存密码后&#xff0c;下次登录还是提…