• [技术干货] 在linux服务器上搭建交叉编译环境
    搭建开发环境,首先必须具备运行软件开发相关工具的平台,我们这里使用的是云服务器。其次,需要具备对应用进行代码转换的工具。编译:通常指利用编译程序从源语言编写的源程序产生目标程序的过程或者动作。一般包括本地编译和交叉编译两种。本地编译可以理解为,在当前编译平台下,编译出来的程序只能放到当前平台下运行。平时我们常见的软件开发,都是属于本地编译: 比如,我们在x86平台上,编写程序并编译成可执行程序。这种方式下,我们使用x86平台上的工具,开发针对x86平台本身的可执行程序,这个编译过程称为本地编译。交叉编译可以理解为,在当前编译平台下,编译出来的程序能运行在体系结构不同的另一种目标平台上,但是编译平台本身却不能运行该程序: 比如,我们在x86平台上,编写程序并编译成能运行在ARM平台的程序,编译得到的程序在x86平台上是不能运行的,必须放到ARM平台上才能运行。Speed:目标平台的运行速度往往比主机慢得多,许多专用嵌入式硬件被设计为低成本和低功耗,没有太高的性能Capability:整个编译过程是非常消耗资源的,嵌入式系统往往没有足够的内存空间或磁盘空间Availability:即使目标平台资源很充足,可以本地编译,但是第一个在目标平台上运行的本地编译器总需要通过交叉编译获得Flexibility:一个完整的Linux编译环境需要很多支持包,交叉编译是我们不需要花时间将各种支持包移植到目标板上编译环境的搭建,通常包含以下三个步骤:安装基础环境,安装配置编译器,验证交叉编译器。首先,安装标准的C开发环境ubuntu:apt-get install build-essential  centos:yum groupinstall Development Tools在/usr/local下创建ARM-toolchain文件夹mkdir /usr/local/ARM-toolchain准备下载gccwget https://releases.linaro.org/components/toolchain/binaries/latest-5/aarch64-linux-gnu/gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz解压tar -xvf gcc-linaro-5.5.0-2017.10-x86_64_aarch64-linux-gnu.tar.xz后配置环境变量,修改配置文件,在配置文件最后一行加入PATH配置:ubuntu:vim /etc/bash.bashrc  centos:vim /etc/profile环境变量生效ubuntu:source /etc/bash.bashrc  centos:source /etc/profile交叉编译器验证:编写测试例子hello.c进行输出验证执行 aarch64-linux-gnu-gcc -o test hello.c进行交叉编译在x86服务器上 ./test 此时会报错 -bash:./est:cannot execute binary file将文件拷贝到ARM服务器上,./test 可正常显示输出内容。
  • [技术干货] 使用virt-manager基于aarch架构OS安装虚拟机
    宿主机(已配置网络):内核:Linux Malluma 4.19.90-23.8.v2101.ky10.aarch64 #1 SMP Mon May 17 17:07:38 CST 2021 aarch64 aarch64 aarch64 GNU/Linux操作系统:KylinV10(openEuler22.03SP1也可以)虚拟机:openEuler-22.03-LTS-SP1-everything-aarch64-dvd.iso(可以在openEuler官网获取镜像)操作步骤:1、首先将需要安装的虚拟机操作系统iso镜像上传到宿主机上,建议放到/home目录下2、在宿主机上安装virt-manager相应的组件执行命令yum install virt-manager qemu libvirt edk2-aarch64启动服务,执行命令systemctl start libvirtd3、在宿主机上安装X11图形化界面执行命令yum -y install xorg-x11-xauth xorg-x11-server-utils xorg-x11-server-Xnest libXtst编辑/etc/ssh/sshd_config文件,将X11Forwarding这一行取消注释并设为yes,将X11UseLocalhost这一行取消注释并设为no重启ssh服务,执行命令systemctl restart sshd4、重新打开一个shell终端,执行命令virt-manager,弹出可视化窗口,如下图​点击“File”,“New Virtual Machine”,默认选择“Local install media(ISO image or CDROM)”,点击“Forward”,如下图​点击“Browse”,点击“Browse Local”,选择刚刚上传到宿主机的镜像/home/openEuler-22.03-LTS-SP1-everything-aarch64-dvd.iso,选好后,把下面的“Automatically……”取消勾选,输入框选择“Generic default”,点击“Forward”,设置Memory和CPUs,建议设置为16384和8,点击“Forward”,如下图​选择“Select or create custom storage”,点击“Manage”,点击左下角“+”号,修改Name为虚拟机名称origin,Target Path为虚拟机目录(需保证有足够的存储空间),点击“Finish”,如下图​选择刚刚创建的origin,点击“+”号,如下图​修改Name为origin,将Max Capacity修改为200G(需要储存空间允许),点击“Finish”,如下图​选择刚刚创建好的origin.qcow2,点击“Choose Volume”,再点击“Forward”,如下图​修改Name为origin,点击“Finish”,如下图​然后会弹出可视化窗口,建议立刻关掉(因为在可视化窗口中操作可能会有bug),在宿主机中操作会更佳。PS:如果未及时关掉,已经进入了可视化窗口安装系统,如以下右图部分已经显示了安装系统的选项。​此时还需关掉可视化窗口,回到宿主机中执行命令virt-manager,选中orign,右键选择Delete删除,如下图,然后再回到步骤4重新操作。​5、当刚刚在及时关闭了可视化窗口后,此时就可进入到宿主机中安装了。在宿主机中执行命令virsh list -all可以看到当前的虚拟机,如下图​6、在宿主机中执行命令virsh console 接Name,进入到虚拟机,这里是virsh console origin输入进来后,按“↑”或者“↓”方向键,可以看到有3个选项,如下图​移动到第一个选项,按“e”键,改为文本模式安装(因为可视化界面会卡),如下图​将console=tty0 改成 console=ttyAMA0 inst.text,按Ctrl x保存退出,进去到装系统的界面,如下图​这里一般只需要修改4、5、7选项按4,可以选择最小化安装,也可以选择server安装,按c继续按5,按c继续按7,按c继续,自定义root密码最后按b开始安装系统,此时,系统安装中……直到安装完成,如下图​按enter键,最后出现下面界面就安装系统完成,如下图​7、在宿主机中执行命令virt-manager,选择“origin”右键选择“run”启动,然后关掉可视化窗口,如下图​8、稍等片刻大约1-2分钟,虚拟机在启动中……,然后在宿主机中执行命令virsh console origin ,按enter建,输入root ,输入密码,进入到虚拟机,如下图​输入exit可退出root用户,按ctrl ]可退出虚拟机,回到宿主机中,如下图​PS:如果虚拟机无法访问网络,在宿主机中执行sysctl -w net.ipv4.ip_forward=1后,再重新进入虚拟机重试此时虚拟机已安装完成!(可选)部分开发者,可能需通过同个虚拟机测试不同的软件,可能需要多个赶紧的虚拟机,此时可用到克隆的功能操作步骤:1、回到宿主机,执行命令virt-manager,打开可视化窗口,选中origin,此时的状态应该是running,右键选择Shut Down,如下图​等到origin的状态是Shutoff时,此时再次右键origin,选择Clone,如下图​弹出可视化窗口,点击Clone,如下图​等待克隆完成后,右键origin-clone,选择Run,此时克隆的新虚拟机已完成,回到步骤8中继续操作PS:注意,在进行clone操作时记得需要shutdown保证关机状态。
  • [问题求助] 在华为服务器部署自己的原生服务
    这是第三方伙伴部署自己的应用到华为服务器的过程,Euler操作系统基础镜像、CDNative安装包怎么获取。看了整个部署视频总体过程好像还蛮复杂的,是否有其它渠道在CUBE服务器部署伙伴应用服务
  • [技术干货] 小白学习Linux的学习建议和阶段
    inux 是一个开源、免费的操作系统 ,其稳定性、安全性 、处 理多并发已经得到业界的认可,目前很多中型,大型甚 至是集群项 目都在使用 linux, 很多软件公司考虑到开发成本 都首 选 linux, 在中国软件公司得到广泛的使用 。       近些年来linux在嵌入式领域的应用得到了飞速的提高linux 运行稳定、对网络的良好支持性、低成本,且可以根据需要进行软件裁剪,内核最小可以达到几百KB 等特点,使其近些年来在嵌入式领域的应用得到非常大的提高主要应用:机顶盒、数字电视、网络电话、程控交换机、手机、PDA、智能家居、智能硬件等都是其应用领域。以后再物联网中应用会更加广泛。我认为学习 linux 流程: 第1 阶段 : linux环境下的基本操作命令,包括 文件操作命令(rm mkdir chmod, chown) 编辑工具使用(vi vim)linux用户管理(useradd userdel usermod)等第2 阶段 : linux的各种配置(环境变量配置,网络配置,服务配置)第3 阶段 : linux下如何搭建对应语言的开发环境(大数据,JavaEE, Python等)第4 阶段 : 能编写shell脚本,对Linux服务器进行维护。第5 阶段 : 能进行安全设置,防止攻击,保障服务器正常运行,能对系统调优。第6 阶段 : 深入理解Linux系统(对内核有研究),熟练掌握大型网站应用架构组成、并熟悉各个环节的部署和维护方法。一些基本的指令:(1)cd命令cd :切换目录用法:cdcd ../ 切换到上级目录cd /   切换到根目录cd ~  (或只有cd )切换到当前用户主目录(home底下以用户名命名的文件夹) /root目录mkdir 创建目录mkdir 目录名  -p   递归创建目录(2)rm删除文件用法:rmdir 目录名也可用:rm -rf 目录名(3)ls命令查看目录或文件信息主要选项:-l 列出目录或者文件的详细信息。比如权限、修改时间等等-a 列出当前目录下所有文件,包括隐藏文件(已点开头的都是隐藏文件)(4)万能文本编辑vi/vim命令i 进入编辑状态退出编辑按ESC键不保存退出: :q!保存退出:   :wq输入/,进入搜索输入:set nu,显示每一行的行数按键盘G,可以直接定位到最末尾(5)cp复制和mv移动命令用法:cp [选项]文件名或目录  目标地址-R 拷贝目录及目录下所有目录和文件cp a.txt  b.txt   #将a文件复制,且另命名为b文件(目录名)(6)| 管道符 (竖线,英文输入法状态下shift+键盘上的的|\)在命令之间建立管道,将前面命令的输出作为后面命令的输入#通过命令查找tomcat进程 ps -ef | grep tomcat #通过命令查找到占用此端口的进程编号 netstat -apn|grep 3306(7)tar 解压,压缩tar.gz#将test文件夹压缩成 tar -czvf test.tar.gz test #将test.tar.gz解压得到test文件夹 test.tar.gztar -xzvf test.tar.gz(8)zip 解压,压缩zip#将test文件夹压缩成test.zip,必须带r 才会把文件压缩进去,不然会生成一个空的文件夹 zip –r test.zip test #将test.zip文件夹解压 unzip test.zip(9)关闭防火墙#开启 service iptables start #关闭 service iptables stop永久关闭防火墙#开启 chkconfig iptables on  #关闭 chkconfig iptables off
  • [技术干货] Minio入门系列【5】JAVA集成Minio之存储桶操作API使用详解
    1 前言 1.1 官方文档和SDK 官方文档:https://min.io/docs/minio/kubernetes/upstream/index.html?ref=docs-redirect SDK:https://github.com/minio/minio-java Minio 提供了多种语言的SDK,比如java、go、python等。JAVA开发平台可以选择JS和java SDK,也就是前端和后端都可以直接集成minio。  1.2 技术方案 每个OSS的用户都会用到上传服务。Web端常见的上传方法是用户在浏览器或App端上传文件到应用服务器,应用服务器再把文件上传到OSS。具体流程如下图所示。  和数据直传到OSS相比,以上方法有三个缺点: 上传慢:用户数据需先上传到应用服务器,之后再上传到OSS。网络传输时间比直传到OSS多一倍。如果用户数据不通过应用服务器中转,而是直传到OSS,速度将大大提升。而且OSS采用BGP带宽,能保证各地各运营商之间的传输速度。 扩展性差:如果后续用户多了,应用服务器会成为瓶颈。 费用高:需要准备多台应用服务器。由于OSS上传流量是免费的,如果数据直传到OSS,不通过应用服务器,那么将能省下几台应用服务器。 目前通过Web前端技术上传文件到OSS,有三种技术方案: 利用OSS js SDK将文件上传到OSS,也就是前端直连OSS,但是容易暴露认证信息,安全性不太高。 使用表单上传方式,将文件上传到OSS。利用OSS提供的接口临时接口,使用表单上传方式将文件上传到OSS。然后请求后端,告知上传完成,进行后续处理。 先上传到应用服务器,再请求OSS上传,这种安全性较高,可以对数据和认证进行管控,但是性能最差。 2 集成 JAVA SDK 因为一般的非互联网项目,对性能要求不高,所以采用JAVA SDK集成MInio,然后提供接口给Web端调用就行了。 2.1 环境搭建 首先搭建一个Maven基础工程,引入相关依赖,这里引入的是最新的8.3.1版本。还引入了okhttp的最新包,不然某些API会提示版本太低。  <dependency>               <groupId>io.minio</groupId>               <artifactId>minio</artifactId>               <version>8.3.1</version>         </dependency>         <dependency>             <groupId>com.squareup.okhttp3</groupId>             <artifactId>okhttp</artifactId>             <version>4.9.2</version>         </dependency> 2.2 初始化客户端 可以看到现在minio都是采用Builder构建者模式来构造对象,和之前有很大的区别,所以需要注意。  //url为地址,accessKey和secretKey为用户名和密码 MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build(); 2.3 存储桶基础操作 2.3.1 存储桶是否存在 检查存储桶是否存在。  public boolean bucketExists(BucketExistsArgs args) 示例代码:      /**      * 判断桶是否存在      */     public static boolean bucketExists(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());     } 2.3.2 创建存储桶 创建一个启用给定区域和对象锁定功能的存储桶。  public void makeBucket(MakeBucketArgs args) 示例代码:      /**      * 添加存储桶      */     public static void makeBucket(String url, String accessKey, String secretKey, String bucketName, String region, boolean objectLock)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).objectLock(objectLock).build());     } 创建后,就可以在控制台看到这些存储桶了,最后那个被锁定的存储桶,上传文件及删除后,发现还是会显示存在这些对象,实际磁盘上的文件并没有删除  2.3.3 查询存储桶信息列表 列出所有桶的桶信息。  public List<Bucket> listBuckets() 示例代码:      /**      * 查询存储桶信息列表      */     public static List<Bucket> listBuckets(String url, String accessKey, String secretKey) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         return minioClient.listBuckets();     }      public static void main(String[] args) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         List<Bucket> buckets = listBuckets("url", "accessKey", "secretKey");         for (Bucket bucket : buckets) {             System.out.println(bucket.creationDate() + ", " + bucket.name());         }     }  打印信息如下,返回的创建时间是美国时间,需要注意。  2.3.4 删除存储桶 删除一个空桶。 public void removeBucket(RemoveBucketArgs args)  示例代码:      /**      * 删除存储桶      */     public static void removeBucket(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());     } 注意:要确保存储桶存在,否则会报错,删除时最好调用bucketExists()方法判断是否存在  2.4 设置存储桶操作 2.4.1 加密配置 设置桶的加密配置,以允许在该桶中上传对象时,采用对应加密配置对数据进行加密。当前支持配置的服务端加密方式为KMS托管密钥的服务端加密(SSE-KMS),及AES256加密。 设置桶的加密配置: public void setBucketEncryption(SetBucketEncryptionArgs args) 获取桶的加密配置:  public SseConfiguration getBucketEncryption(GetBucketEncryptionArgs args) 2.4.2 生命周期 生命周期管理可适用于以下典型场景: 周期性上传的日志文件,可能只需要保留一个星期或一个月。到期后要删除它们。 某些文档在一段时间内经常访问,但是超过一定时间后便可能不再访问了。这些文档需要在一定时间后转化为低频访问存储,归档存储或者删除。 存储桶生命周期配置: public void setBucketLifecycle(SetBucketLifecycleArgs args) 获取桶的生命周期配置:  public LifecycleConfiguration getBucketLifecycle(GetBucketLifecycleArgs args)  示例代码:   // 5. 生命周期         List<LifecycleRule> rules = new LinkedList<>();         // 配置生命周期规则         rules.add(                 new LifecycleRule(                         Status.ENABLED, // 开启状态                         null,                         new Expiration((ZonedDateTime) null, 365, null), // 保存365天                         new RuleFilter("logs/"), // 目录配置                         "rule2",                         null,                         null,                         null));         LifecycleConfiguration lifecycleConfiguration = new LifecycleConfiguration(rules);         // 添加生命周期配置         minioClient.setBucketLifecycle(                 SetBucketLifecycleArgs.builder().bucket("my-bucketname").config(lifecycleConfiguration).build());         // 获取配置         LifecycleConfiguration lifecycleConfiguration1111 =                 minioClient.getBucketLifecycle(                         GetBucketLifecycleArgs.builder().bucket("my-bucketname").build());         List<LifecycleRule> rules1 = lifecycleConfiguration1111.rules();         for (int i = 0; i < rules1.size(); i++) {             System.out.println("Lifecycle status is " + rules1.get(i).status());             System.out.println("Lifecycle prefix is " + rules1.get(i).filter().prefix());             System.out.println("Lifecycle expiration days is " + rules1.get(i).expiration().days());         }  打印结果如下:  2.4.3 通知配置 可以使用存储桶事件通知来监控存储桶中对象上发生的事件。 MinIO 服务器支持的各种事件类型有:   存储桶配置通知:  public void setBucketPolicy(SetBucketPolicyArgs args) 获取桶的通知配置:  public NotificationConfiguration getBucketNotification(GetBucketNotificationArgs args) 代码示例:  // 6. 通知配置          // Add a new SQS configuration.         NotificationConfiguration notificationConfiguration = new NotificationConfiguration();         List<QueueConfiguration> queueConfigurationList = notificationConfiguration.queueConfigurationList();         QueueConfiguration queueConfiguration = new QueueConfiguration();         queueConfiguration.setQueue("arn:minio:sqs::1:webhook");          List<EventType> eventList = new LinkedList<>();         eventList.add(EventType.OBJECT_CREATED_PUT);         eventList.add(EventType.OBJECT_CREATED_COPY);         queueConfiguration.setEvents(eventList);         queueConfiguration.setPrefixRule("images");         queueConfiguration.setSuffixRule("pg");          queueConfigurationList.add(queueConfiguration);         notificationConfiguration.setQueueConfigurationList(queueConfigurationList);          // Set updated notification configuration.         minioClient.setBucketNotification(                 SetBucketNotificationArgs.builder().bucket("my-bucketname").config(notificationConfiguration).build());         System.out.println("Bucket notification is set successfully");          NotificationConfiguration minioClientBucketNotification =                 minioClient.getBucketNotification(                         GetBucketNotificationArgs.builder().bucket("my-bucketname").build());         System.out.println(minioClientBucketNotification);  2.4.4 策略配置 添加存储桶策略配置。 public void setBucketPolicy(SetBucketPolicyArgs args)  获取桶的桶策略配置。  public String getBucketPolicy(GetBucketPolicyArgs args) 2.4.5 复制配置 存储桶复制旨在将存储桶中的选定对象复制到目标存储桶,内容较多,后续补上 添加存储桶的复制配置 public void setBucketReplication(SetBucketReplicationArgs args) 获取桶的桶复制配置: public ReplicationConfiguration getBucketReplication(GetBucketReplicationArgs args) 2.4.6 存储桶标签 当为桶添加标签时,该桶上所有请求产生的计费话单里都会带上这些标签,从而可以针对话单报表做分类筛选,进行更详细的成本分析。例如:某个应用程序在运行过程会往桶里上传数据,我们可以用应用名称作为标签,设置到被使用的桶上。在分析话单时,就可以通过应用名称的标签来分析此应用的成本。 setBucketTags可以为存储桶设置标签。 public void setBucketTags(SetBucketTagsArgs args) getBucketTags获取桶的标签。  public Tags getBucketTags(GetBucketTagsArgs args) 示例代码:          // 1. 存储桶标签         Map<String, String> map = new HashMap<>();         map.put("Project", "Project One");         map.put("User", "jsmith");         // 设置标签         minioClient.setBucketTags(SetBucketTagsArgs.builder().bucket("my-bucketname").tags(map).build());         // 查询标签         Tags bucketTags = minioClient.getBucketTags(GetBucketTagsArgs.builder().bucket("my-bucketname").build());         System.out.println(bucketTags.get().toString());  返回结果:  2.4.7 多版本设置 若开启了多版本控制,上传对象时,OBS自动为每个对象创建唯一的版本号。上传同名的对象将以不同的版本号同时保存在OBS中。  若未开启多版本控制,向同一个文件夹中上传同名的对象时,新上传的对象将覆盖原有的对象。  某些功能(例如版本控制、对象锁定和存储桶复制)需要使用擦除编码分布式部署 MinIO。开启了版本控制后,允许在同一密钥下保留同一对象的多个版本。  设置存储桶的版本控制配置。  public void setBucketVersioning(SetBucketVersioningArgs args) 获取存储桶的版本控制配置。  public VersioningConfiguration getBucketVersioning(GetBucketVersioningArgs args) 代码示例:  // 2. 版本配置         // 'my-bucketname'启用版本控制         minioClient.setBucketVersioning(                 SetBucketVersioningArgs.builder()                         .bucket("my-bucketname")                         .config(new VersioningConfiguration(VersioningConfiguration.Status.ENABLED, null))                         .build());         System.out.println("Bucket versioning is enabled successfully");          //  'my-bucketname'暂停版本控制         minioClient.setBucketVersioning(                 SetBucketVersioningArgs.builder()                         .bucket("my-bucketname")                         .config(new VersioningConfiguration(VersioningConfiguration.Status.SUSPENDED, null))                         .build());         System.out.println("Bucket versioning is suspended successfully");  2.4.8 对象锁定配置 对象锁定设置后,删除对象后,会仍然存在磁盘中。  在存储桶中设置对象锁定配置。  public void setObjectLockConfiguration(SetObjectLockConfigurationArgs args)  获取存储桶中的对象锁配置。  public ObjectLockConfiguration getObjectLockConfiguration(GetObjectLockConfigurationArgs args) 需要先设置存储桶为对象锁定模式,示例代码:  // 3. 将保留模式设置为Compliance,且持续时间为100天         // 设置锁定对象的保留模式及时限         ObjectLockConfiguration config =                 new ObjectLockConfiguration(RetentionMode.COMPLIANCE, new RetentionDurationDays(100));         minioClient.setObjectLockConfiguration(                 SetObjectLockConfigurationArgs.builder()                         .bucket("my-bucketname-in-eu-with-object-lock")                         .config(config)                         .build());         System.out.println("object-lock configuration is set successfully");         // 获取锁定配置         ObjectLockConfiguration objectLockConfiguration =                 minioClient.getObjectLockConfiguration(                         GetObjectLockConfigurationArgs.builder()                                 .bucket("my-lock-enabled-bucketname")                                 .build());          System.out.println("Object-lock configuration of bucket");         System.out.println("Mode: " + objectLockConfiguration.mode());         System.out.println("Duration: " + objectLockConfiguration.duration());  2.5 删除配置 minio提供了一些列的delete方法用于删除配置,比较简单,就不举例说明了。  2.5.1 删除桶的加密配置 public void deleteBucketEncryption(DeleteBucketEncryptionArgs args) 2.5.2 删除存储桶的生命周期配置 public void deleteBucketLifecycle(DeleteBucketLifecycleArgs args) 2.5.3 删除桶的标签 public void deleteBucketTags(DeleteBucketTagsArgs args) 2.5.4 删除桶的桶策略配置 public void deleteBucketPolicy(DeleteBucketPolicyArgs args) 2.5.5 删除存储桶的存储桶复制配置 public void deleteBucketReplication(DeleteBucketReplicationArgs args) 2.5.6 删除桶的通知配置 public void deleteBucketNotification(DeleteBucketNotificationArgs args) 3 相关工具类 import io.minio.*; import io.minio.errors.*; import io.minio.messages.Bucket;  import java.io.IOException; import java.security.InvalidKeyException; import java.security.NoSuchAlgorithmException; import java.util.List;  /**  * minio工具类  *  * @author wuKeFan  * @date 2023-09-08 14:08:10  */ public class MinioUtil {      /**      * 判断桶是否存在      */     public static boolean bucketExists(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         return minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());     }      /**      * 添加存储桶      */     public static void makeBucket(String url, String accessKey, String secretKey, String bucketName, String region, boolean objectLock)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).objectLock(objectLock).build());     }      /**      * 指定地区添加存储桶      */     public static void makeBucket(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());     }      /**      * 指定地区添加存储桶并锁定对象      */     public static void makeBucket(String url, String accessKey, String secretKey, String bucketName, String region)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).region(region).build());     }      /**      * 删除存储桶      */     public static void removeBucket(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.removeBucket(RemoveBucketArgs.builder().bucket(bucketName).build());     }      /**      * 设置桶公有      */     public static void setBucketPublicPolicy(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         String sb = "{\"Version\":\"2012-10-17\"," +                 "\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":" +                 "{\"AWS\":[\"*\"]},\"Action\":[\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"," +                 "\"s3:GetBucketLocation\"],\"Resource\":[\"arn:aws:s3:::" + bucketName +                 "\"]},{\"Effect\":\"Allow\",\"Principal\":{\"AWS\":[\"*\"]},\"Action\":[\"s3:PutObject\",\"s3:AbortMultipartUpload\",\"s3:DeleteObject\",\"s3:GetObject\",\"s3:ListMultipartUploadParts\"],\"Resource\":[\"arn:aws:s3:::" +                 bucketName +                 "/*\"]}]}";         minioClient.setBucketPolicy(                 SetBucketPolicyArgs.builder()                         .bucket(bucketName)                         .config(sb)                         .build());     }      /**      * 设置桶私有      */     public static void setBucketPrivatePolicy(String url, String accessKey, String secretKey, String bucketName)             throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         minioClient.setBucketPolicy(                 SetBucketPolicyArgs.builder().bucket(bucketName)                         .config(                                 "{\"Version\":\"2012-10-17\",\"Statement\":[]}"                         )                         .build());     }      /**      * 查询存储桶信息列表      */     public static List<Bucket> listBuckets(String url, String accessKey, String secretKey) throws ServerException, InsufficientDataException, ErrorResponseException, IOException, NoSuchAlgorithmException, InvalidKeyException, InvalidResponseException, XmlParserException, InternalException {         MinioClient minioClient = MinioClient.builder().endpoint(url)                 .credentials(accessKey, secretKey).build();         return minioClient.listBuckets();     }  }  ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132964198 
  • [技术干货] Minio入门系列【4】对象存储 OSS概述
    1 对象存储 OSS 文档来源于阿里云对象存储 OSS,Minio也是对象存储 OSS,很多概念都是相通的,所以了解下。实际企业应用使用阿里OSS是一个很不错的选择。 对象存储服务(Object Storage Service,OSS)是一种海量、安全、低成本、高可靠的云存储服务,适合存放任意类型的文件。容量和处理能力弹性扩展,多种存储类型供选择,全面优化存储成本。 阿里云对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务可用性(或业务连续性)不低于99.995%。 2 基本概念 2.1 存储空间(Bucket) 存储空间是用户用于存储对象(Object)的容器,所有的对象都必须隶属于某个存储空间。存储空间具有各种配置属性,包括地域、访问权限、存储类型等。用户可以根据实际需求,创建不同类型的存储空间来存储不同的数据。 同一个存储空间的内部是扁平的,没有文件系统的目录等概念,所有的对象都直接隶属于其对应的存储空间。 每个用户可以拥有多个存储空间。 存储空间的名称在OSS范围内必须是全局唯一的,一旦创建之后无法修改名称。 存储空间内部的对象数目没有限制。 存储空间的命名规范如下: 只能包括小写字母、数字和短划线(-)。 必须以小写字母或者数字开头和结尾。 长度必须在3~63字符之间。 2.2 对象(Object) 对象是OSS存储数据的基本单元,也被称为OSS的文件。和传统的文件系统不同,对象没有文件目录层级结构的关系。对象由元信息(Object Meta),用户数据(Data)和文件名(Key)组成,并且由存储空间内部唯一的Key来标识。对象元信息是一组键值对,表示了对象的一些属性,比如最后修改时间、大小等信息,同时用户也可以在元信息中存储一些自定义的信息。 对象的生命周期是从上传成功到被删除为止。在整个生命周期内,除通过追加方式上传的Object可以通过继续追加上传写入数据外,其他方式上传的Object内容无法编辑,您可以通过重复上传同名的对象来覆盖之前的对象。 对象的命名规范如下: 使用UTF-8编码。 长度必须在1~1023字符之间。 不能以正斜线(/)或者反斜线(\)开头。 对象名称需要区分大小写。如无特殊说明,本文档中的对象、文件称谓等同于Object。 2.3 ObjectKey 在各语言SDK中,ObjectKey、Key以及ObjectName是同一概念,均表示对Object执行相关操作时需要填写的Object名称。例如向某一存储空间上传Object时,ObjectKey表示上传的Object所在存储空间的完整名称,即包含文件后缀在内的完整路径,如填写为abc/efg/123.jpg。 2.4 Region(地域) Region表示OSS的数据中心所在物理位置。用户可以根据费用、请求来源等选择合适的地域创建Bucket。一般来说,距离用户更近的Region访问速度更快。详情请参见OSS已经开通的Region。 Region是在创建Bucket的时候指定的,一旦指定之后就不允许更改。该Bucket下所有的Object都存储在对应的数据中心,目前不支持Object级别的Region设置。 2.5 Endpoint(访问域名) Endpoint表示OSS对外服务的访问域名。OSS以HTTP RESTful API的形式对外提供服务,当访问不同的Region的时候,需要不同的域名。通过内网和外网访问同一个Region所需要的Endpoint也是不同的。例如杭州Region的外网Endpoint是oss-cn-hangzhou.aliyuncs.com,内网Endpoint是oss-cn-hangzhou-internal.aliyuncs.com。具体的内容请参见各个Region对应的Endpoint。 2.6 AccessKey(访问密钥) AccessKey简称AK,指的是访问身份验证中用到的AccessKeyId和AccessKeySecret。OSS通过使用AccessKeyId和AccessKeySecret对称加密的方法来验证某个请求的发送者身份。AccessKeyId用于标识用户;AccessKeySecret是用户用于加密签名字符串和OSS用来验证签名字符串的密钥,必须保密。对于OSS来说,AccessKey的来源有: Bucket的拥有者申请的AccessKey。 被Bucket的拥有者通过RAM授权给第三方请求者的AccessKey。 被Bucket的拥有者通过STS授权给第三方请求者的AccessKey。 2.7 强一致性 Object操作在OSS上具有原子性,操作要么成功要么失败,不会存在有中间状态的Object。OSS保证用户一旦上传完成之后读到的Object是完整的,OSS不会返回给用户一个部分上传成功的Object。 Object操作在OSS同样具有强一致性,用户一旦收到了一个上传(PUT)成功的响应,该上传的Object就已经立即可读,并且Object的冗余数据已经写成功。不存在一种上传的中间状态,即read-after-write却无法读取到数据。对于删除操作也是一样的,用户删除指定的Object成功之后,该Object立即变为不存在。 2.8 数据冗余机制 OSS使用基于纠删码、多副本的数据冗余存储机制,将每个对象的不同冗余存储在同一个区域内多个设施的多个设备上,确保硬件失效时的数据持久性和可用性。 OSS Object操作具有强一致性,用户一旦收到了上传或复制成功的响应,则该上传的Object就已经立即可读,且数据已经冗余写入到多个设备中。 OSS会通过计算网络流量包的校验和,验证数据包在客户端和服务端之间传输中是否出错,保证数据完整传输。 OSS的冗余存储机制,可支持两个存储设施并发损坏时,仍维持数据不丢失。 当数据存入OSS后,OSS会检测和修复丢失的冗余,确保数据持久性和可用性。 OSS会周期性地通过校验等方式验证数据的完整性,及时发现因硬件失效等原因造成的数据损坏。当检测到数据有部分损坏或丢失时,OSS会利用冗余的数据,进行重建并修复损坏数据。 3 OSS与文件系统的对比  因此,将OSS映射为文件系统是非常低效的,也是不建议的做法。如果一定要挂载成文件系统的话,建议尽量只做写新文件、删除文件、读取文件这几种操作。使用OSS应该充分发挥其优点,即海量数据处理能力,优先用来存储海量的非结构化数据,比如图片、视频、文档等。  以下是OSS与文件系统的概念对比:  OSS术语表   ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132901713 
  • [技术干货] Minio入门系列【3】MinIO Client使用详解
    1 简介 简称mc,是minio服务器的客户端,对ls,cat,cp,mirror,diff,find等UNIX命令提供了一种替代方案,它支持文件系统和兼容Amazon S3的云存储服务(AWS Signature v2和v4)。  ls       列出文件和文件夹。 mb       创建一个存储桶或一个文件夹。 cat      显示文件和对象内容。 pipe     将一个STDIN重定向到一个对象或者文件或者STDOUT。 share    生成用于共享的URL。 cp       拷贝文件和对象。 mirror   给存储桶和文件夹做镜像。 find     基于参数查找文件。 diff     对两个文件夹或者存储桶比较差异。 rm       删除文件和对象。 events   管理对象通知。 watch    监听文件和对象的事件。 policy   管理访问策略。 session  为cp命令管理保存的会话。 config   管理mc配置文件。 update   检查软件更新。 version  输出版本信息。 2 Centos 7 安装mc [root@hadoop001 MinIOClient]# wget http://dl.minio.org.cn/client/mc/release/linux-amd64/mc [root@hadoop001 MinIOClient]# chmod +x mc  [root@hadoop001 MinIOClient]# mv mc /usr/bin/ # 查看帮助 [root@hadoop001 MinIOClient]# mc -h 添加服务器节点:  [root@hadoop001 MinIOClient]# mc config host add s3 http://192.168.58.201:9000  admin  admin123  --api s3v4 [root@hadoop001 MinIOClient]# mc config host ls # 查看s3下的所有存储桶 [root@hadoop001 MinIOClient]# mc ls s3 可以看到当前我们添加名称为s3的节点,及这个节点下的所有存储桶:  3 常用命令 3.1 ls 列出存储桶和对象 ls命令列出文件、对象和存储桶。使用–incomplete flag可列出未完整拷贝的内容。 用法:    mc ls [FLAGS] TARGET [TARGET ...] FLAGS:   --help, -h                       显示帮助。   --recursive, -r          递归。   --incomplete, -I         列出未完整上传的对象。 示例: 列出所有s3上的存储桶。 [root@hadoop001 MinIOClient]# mc ls s3 示例: 列出所有s3上的存储桶mall4cloud下的文件。 [root@hadoop001 MinIOClient]# mc ls s3/mall4cloud 3.2 mb命令 - 创建存储桶 mb命令在对象存储上创建一个新的存储桶。在文件系统,它就和mkdir -p命令是一样的。存储桶相当于文件系统中的磁盘或挂载点,不应视为文件夹。MinIO对每个​​用户创建的存储桶数量没有限制。 在Amazon S3上,每个帐户被限制为100个存储桶。 用法:    mc mb [FLAGS] TARGET [TARGET...] FLAGS:   --help, -h                       显示帮助。   --region "us-east-1"         指定存储桶的region,默认是‘us-east-1’. 示例:在s3上创建一个名叫"bucket"的存储桶。 [root@hadoop001 MinIOClient]# mc mb s3/bucket  3.3 cat命令 - 合并对象 cat命令将一个文件或者对象的内容合并到另一个上。你也可以用它将对象的内容输出到stdout。 用法:    mc cat [FLAGS] SOURCE [SOURCE...] FLAGS:   --help, -h                       显示帮助。 示例: 显示2a10430fc3134e2196fa06eadfe25b23文件的内容 [root@hadoop001 MinIOClient]# mc cat s3/mall4cloud/2023/09/08/2a10430fc3134e2196fa06eadfe25b23  3.4 pipe命令 - Pipe到对象 pipe命令拷贝stdin里的内容到目标输出,如果没有指定目标输出,则输出到stdout。 用法:    mc pipe [FLAGS] [TARGET] FLAGS:   --help, -h                    显示帮助。 示例: 将MySQL数据库dump文件输出到Amazon S3。 mysqldump -u root -p ******* accountsdb | mc pipe s3/sql-backups/backups/accountsdb-oct-9-2015.sql 3.5 cp命令 - 拷贝对象 cp命令拷贝一个或多个源文件目标输出。所有到对象存储的拷贝操作都进行了MD4SUM checkSUM校验。可以从故障点恢复中断或失败的复制操作。 用法:    mc cp [FLAGS] SOURCE [SOURCE...] TARGET FLAGS:   --help, -h                       显示帮助。   --recursive, -r          递归拷贝。 示例: 拷贝一个本地文本文件到对象存储s3/aaaa。 [root@hadoop001 MinIOClient]# mc cp starh.sh s3/aaaa 3.6 rm命令 - 删除存储桶和对象。 使用rm命令删除文件对象或者存储桶。 用法:    mc rm [FLAGS] TARGET [TARGET ...] FLAGS:   --help, -h                       显示帮助。   --recursive, -r              递归删除。   --force              强制执行删除操作。   --prefix             删除批配这个前缀的对象。   --incomplete, -I      删除未完整上传的对象。   --fake               模拟一个假的删除操作。   --stdin              从STDIN中读对象列表。   --older-than value               删除N天前的对象(默认是0天)。 示例1: 删除一个对象。 [root@hadoop001 MinIOClient]# mc rm s3/aaaa/starh.sh 示例2:删除一个存储桶并递归删除里面所有的内容。由于这个操作太危险了,你必须传–force参数指定强制删除。 [root@hadoop001 MinIOClient]# mc rm --recursive --force s3/qqqqq 示例3: 从mybucket里删除所有未完整上传的对象。 [root@hadoop001 MinIOClient]# mc rm  --incomplete --recursive --force s3/bucket 示例4: 删除一天前的对象。 [root@hadoop001 MinIOClient]# mc rm --force --older-than=1 s3/bucket/oldsongs 3.7 share命令 - 共享 share命令安全地授予上传或下载的权限。此访问只是临时的,与远程用户和应用程序共享也是安全的。如果你想授予永久访问权限,你可以看看mc policy命令。 生成的网址中含有编码后的访问认证信息,任何企图篡改URL的行为都会使访问无效。想了解这种机制是如何工作的,请参考Pre-Signed URL技术。 用法:    mc share [FLAGS] COMMAND FLAGS:   --help, -h                       显示帮助。 COMMANDS:    download   生成有下载权限的URL。    upload     生成有上传权限的URL。    list       列出先前共享的对象和文件夹。  3.8 子命令share download - 共享下载 share download命令生成不需要access key和secret key即可下载的URL,过期参数设置成最大有效期(不大于7天),过期之后权限自动回收。 用法:    mc share download [FLAGS] TARGET [TARGET...] FLAGS:   --help, -h                       显示帮助。   --recursive, -r          递归共享所有对象。   --expire, -E "168h"          设置过期时限,NN[h|m|s]。 示例: 生成一个对一个对象有4小时访问权限的URL。 [root@hadoop001 MinIOClient]# mc share download --expire 4h s3/aaaa/aa.txt 3.9 子命令share upload - 共享上传 share upload命令生成不需要access key和secret key即可上传的URL。过期参数设置成最大有效期(不大于7天),过期之后权限自动回收。 Content-type参数限制只允许上传指定类型的文件。 用法:    mc share upload [FLAGS] TARGET [TARGET...] FLAGS:   --help, -h                       显示帮助。   --recursive, -r              递归共享所有对象。   --expire, -E "168h"          设置过期时限,NN[h|m|s]. 示例: 生成一个curl命令,赋予上传到play/mybucket/myotherobject.txt的权限。 [root@hadoop001 MinIOClient]# mc share upload s3/bucket/myotherobject.txt 3.10 子命令share list - 列出之前的共享 share list列出没未过期的共享URL。 用法:    mc share list COMMAND COMMAND:    upload:   列出先前共享的有上传权限的URL。    download: 列出先前共享的有下载权限的URL。 3.11 mirror命令 - 存储桶镜像 mirror命令和rsync类似,只不过它是在文件系统和对象存储之间做同步。 用法:    mc mirror [FLAGS] SOURCE TARGET FLAGS:   --help, -h                       显示帮助。   --force              强制覆盖已经存在的目标。   --fake               模拟一个假的操作。   --watch, -w                      监听改变并执行镜像操作。   --remove             删除目标上的外部的文件。 示例: 将一个本地文件夹minio镜像到https://play.min.io上的’bucket’存储桶。 [root@hadoop001 MinIOClient]# mc mirror …/minio/MinIOClient/bucket 3.12 find命令 - 查找文件和对象 find命令通过指定参数查找文件,它只列出满足条件的数据。 用法:   mc find PATH [FLAGS] FLAGS:   --help, -h                       显示帮助。   --exec value                     为每个匹配对象生成一个外部进程(请参阅FORMAT)   --name value                     查找匹配通配符模式的对象。   ... 示例: 持续从s3存储桶中查找所有jpeg图像,并复制到minio "minio/MinIOClient/bucket"存储桶 [root@hadoop001 MinIOClient]# mc find s3/bucket --name "*.jpg" --watch --exec "mc cp {} minio/MinIOClient/bucket" 3.13 diff命令 - 显示差异 diff命令计算两个目录之间的差异。它只列出缺少的或者大小不同的内容。 它不比较内容,所以可能的是,名称相同,大小相同但内容不同的对象没有被检测到。这样,它可以在不同站点或者大量数据的情况下快速比较。 用法:   mc diff [FLAGS] FIRST SECOND FLAGS:   --help, -h                       显示帮助。 示例: 比较一个本地文件夹和一个远程对象存储服务 [root@hadoop001 minio]# mc diff localdir minio/MinIOClient/bucket 4 其他 其他命令不一一列出,请在官网详细阅读 https://minio.org.cn/docs/minio/linux/reference/minio-mc.html?ref=docs ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132900357 
  • [技术干货] Minio入门系列【2】纠删码
    1 纠删码 Minio使用纠删码erasure code和校验和checksum来保护数据免受硬件故障和无声数据损坏。 即便丢失一半数量(N/2)的硬盘,仍然可以恢复数据 1.1 什么叫纠删码 纠删码是一种用于重建丢失或损坏数据的数学算法。 纠删码(erasure coding,EC)是一种数据保护方法,它将数据分割成片段,把冗余数据块扩展、编码,并将其存储在不同的位置,比如磁盘、存储节点或者其它地理位置。  Minio采用Reed-Solomon code将对象拆分成N/2数据和N/2 奇偶校验块。 这就意味着如果是12块盘,一个对象会被分成6个数据块、6个奇偶校验块,你可以丢失任意6块盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的盘中的数据进行恢复。 1.2 为什么纠删码有用? 纠删码的工作原理和RAID或者复制不同,像RAID6可以在损失两块盘的情况下不丢数据,而Minio纠删码可以在丢失一半的盘的情况下,仍可以保证数据安全。 而且Minio纠删码是作用在对象级别,可以一次恢复一个对象,而RAID是作用在卷级别,数据恢复时间很长。 Minio对每个对象单独编码,存储服务一经部署,通常情况下是不需要更换硬盘或者修复。Minio纠删码的设计目标是为了性能和尽可能的使用硬件加速。  1.3 什么是位衰减bit rot保护? 位衰减又被称为数据腐化Data Rot、无声数据损坏Silent Data Corruption,是目前硬盘数据的一种严重数据丢失问题。硬盘上的数据可能会神不知鬼不觉就损坏了,也没有什么错误日志。正所谓明枪易躲,暗箭难防,这种背地里犯的错比硬盘直接咔咔宕了还危险。 不过不用怕,Minio纠删码采用了高速 HighwayHash 基于哈希的校验和来防范位衰减。 2 纠错码单机模式环境搭建 2.1 创建存储文件夹 这里直接在D盘下创建了四个文件夹,也可以在不同的盘符下创建。  2.2 启动 直接在启动命名最后添加多个存贮位置就可以了。 # 设置用户名 set MINIO_ROOT_USER=admin # 设置密码(8位) set MINIO_ROOT_PASSWORD=admin123 # 指定启动端口(未指定默认9000)、控制台端口90001及存储位置 minio.exe  server  --address :9000 --console-address :9001 D:\tools\minio\data01  D:\tools\minio\data02 D:\tools\minio\data03 D:\tools\minio\data04 启动命令后,控制台显示了警告信息,这里只配置了4个位置,所以两个以上损坏就会造成数据不可用。 警告:主机本地有2个以上的驱动器故障,将导致数据变得不可用。  Status显示当前4个驱动器在线,0个不在线。  登录后查看控制台,也能看到当前所有驱动器的状态。  2.3 测试 首先上传一张150K大小的照片。  查看硬盘中文件,发现这4个文件下都存在以上传文件名命名的文件夹,而不是直接的文件了,是以文件名创建文件夹,然后将文件分片为了文件块的元数据。  然后我们删除data03和data04文件夹,然后会发现,被删除的文件夹竟然马上自动恢复了过来。然后直接删除data03和data04文件夹下的元数据:  发现尽管删除了两份分片数据,依然可以正常下载。  接着再删了一个元数据,发现该文件就会找不到了,说明半数以上元数据丢失,这个文件就真的找不到了。。。  3 分布式MinIO 分布式Minio可以让你将多块硬盘(甚至在不同的机器上)组成一个对象存储服务。由于硬盘分布在不同的节点上,分布式Minio避免了单点故障。  3.1 分布式存储可靠性常用方法 分布式存储,很关键的点在于数据的可靠性,即保证数据的完整,不丢失,不损坏。只有在可靠性实现的前提下,才有了追求一致性、高可用、高性能的基础。而对于在存储领域,一般对于保证数据可靠性的方法主要有两类,一类是冗余法,一类是校验法。  3.1.1 冗余 冗余法最简单直接,即对存储的数据进行副本备份,当数据出现丢失,损坏,即可使用备份内容进行恢复,而副本备份的多少,决定了数据可靠性的高低。这其中会有成本的考量,副本数据越多,数据越可靠,但需要的设备就越多,成本就越高。可靠性是允许丢失其中一份数据。当前已有很多分布式系统是采用此种方式实现,如Hadoop的文件系统(3个副本),Redis的集群,MySQL的主备模式等。  3.1.2 校验 校验法即通过校验码的数学计算的方式,对出现丢失、损坏的数据进行校验、还原。注意,这里有两个作用,一个校验,通过对数据进行校验和( checksum )进行计算,可以检查数据是否完整,有无损坏或更改,在数据传输和保存时经常用到,如TCP协议;二是恢复还原,通过对数据结合校验码,通过数学计算,还原丢失或损坏的数据,可以在保证数据可靠的前提下,降低冗余,如单机硬盘存储中的RAID技术,纠删码(Erasure Code)技术等。MinlO采用的就是纠删码技术。  3.2 分布式Minio有什么好处? 在大数据领域,通常的设计理念都是无中心和分布式。Minio分布式模式可以帮助你搭建一个高可用的对象存储服务,你可以使用这些存储设备,而不用考虑其真实物理位置。  3.2.1 数据保护 分布式Minio采用 纠删码来防范多个节点宕机和位衰减bit rot。  分布式Minio至少需要4个硬盘,使用分布式Minio自动引入了纠删码功能。  3.2.2 高可用 单机Minio服务存在单点故障,相反,如果是一个有N块硬盘的分布式Minio,只要有N/2硬盘在线,你的数据就是安全的。不过你需要至少有N/2+1个硬盘来创建新的对象。  例如,一个16节点的Minio集群,每个节点16块硬盘,就算8台服務器宕机,这个集群仍然是可读的,不过你需要9台服務器才能写数据。  注意,只要遵守分布式Minio的限制,你可以组合不同的节点和每个节点几块硬盘。比如,你可以使用2个节点,每个节点4块硬盘,也可以使用4个节点,每个节点两块硬盘,诸如此类。  3.2.3 一致性 Minio在分布式和单机模式下,所有读写操作都严格遵守read-after-write一致性模型。 ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132872990 
  • [技术干货] Minio入门系列【1】Windows/Linux/K8S单机部署Minio
    1 Minio简介 MinIO 是一个基于Apache License v2.0开源协议的对象存储服务。它兼容亚马逊S3云存储服务接口,非常适合于存储大容量非结构化的数据,例如图片、视频、日志文件、备份数据和容器/虚拟机镜像等,而一个对象文件可以是任意大小,从几kb到最大5T不等。 MinIO是一个非常轻量的服务,可以很简单的和其他应用的结合,类似 NodeJS, Redis 或者 MySQL。目前支持JavaScript 、Java、Python、Golang、.NET。 MinIO 是一款高性能、分布式的对象存储系统. 它是一款软件产品, 可以100%的运行在标准硬件。即X86等低成本机器也能够很好的运行MinIO。 MinIO与传统的存储和其他的对象存储不同的是:它一开始就针对性能要求更高的私有云标准进行软件架构设计。因为MinIO一开始就只为对象存储而设计。所以他采用了更易用的方式进行设计,它能实现对象存储所需要的全部功能,在性能上也更加强劲,它不会为了更多的业务功能而妥协,失去MinIO的易用性、高效性。 这样的结果所带来的好处是:它能够更简单的实现局有弹性伸缩能力的原生对象存储服务。 MinIO在传统对象存储用例(例如辅助存储,灾难恢复和归档)方面表现出色。同时,它在机器学xi、私有云、混合云等方面的存储技术上也独树一帜。当然,也不排除数据分析、高性能应用负载、原生云的支持。 在中国:阿里巴巴、腾讯、百度、中国联通、华为、中国移动等等9000多家企业也都在使用MinIO产品 MinIO现在也是CNCF成员,在云原生存储部分和ceph等一起作为目前的解决方案之一。 2 Minio优点 2.1 Erasure Coding(消除编码) MinIO 使用以汇编代码编写的每个对象内联擦除编码来保护数据,以提供尽可能高的性能。 MinIO 使用 Reed-Solomon 代码将对象条带化为具有用户可配置冗余级别的数据和奇偶校验块。 MinIO 的纠删码在对象级别执行修复,可以独立修复多个对象。 在最大奇偶校验为 N/2 的情况下,MinIO 的实现可以确保部署中只有 ((N/2)+1) 个可操作驱动器的不间断读写操作。 例如,在 12 驱动器设置中,MinIO 将对象分片到 6 个数据驱动器和 6 个奇偶校验驱动器,并且可以可靠地写入新对象或重建现有对象,部署中只剩下 7 个驱动器 2.2 Bitrot 保护 静默数据损坏或比特腐烂是磁盘驱动器面临的一个严重问题,会导致数据在用户不知情的情况下损坏。 原因多种多样(驱动器老化、电流峰值、磁盘固件错误、幻写、误读/写入、驱动程序错误、意外覆盖)但结果是相同的 - 数据受损。 MinIO 对 HighwayHash 算法的优化实现确保它永远不会读取损坏的数据 - 它会即时捕获并修复损坏的对象。 通过在读取时计算散列并在写入时从应用程序、网络和内存/驱动器验证它,从端到端确保完整性。 该实现专为速度而设计,可以在 Intel CPU 的单核上实现超过 10 GB/秒的散列速度。  2.3 加密 在飞行中加密数据是一回事; 保护静态数据是另一回事。 MinIO 支持多种复杂的服务器端加密方案来保护数据——无论数据位于何处。 MinIO 的方法以可忽略的性能开销确保机密性、完整性和真实性。 使用 AES-256-GCM、ChaCha20-Poly1305 和 AES-CBC 支持服务器端和客户端加密。 加密对象使用 AEAD 服务器端加密进行防篡改。 此外,MinIO 与所有常用的密钥管理解决方案(例如 HashiCorp Vault)兼容并经过测试。 MinIO 使用密钥管理系统 (KMS) 来支持 SSE-S3。 如果客户端请求 SSE-S3,或者启用了自动加密,MinIO 服务器使用唯一的对象密钥加密每个对象,该对象密钥由 KMS 管理的主密钥保护。 鉴于极低的开销,可以为每个应用程序和实例打开自动加密。  2.4 蠕虫病毒 启用 WORM 后,MinIO 会禁用所有可能会改变对象数据和元数据的 API。 这意味着数据一旦写入就可以防篡改。 这对于许多不同的监管要求具有实际应用。  2.5 身份管理 MinIO 支持身份管理领域最先进的标准,与 OpenID connect 兼容提供商以及主要外部 IDP 供应商集成。这意味着访问是集中式的,密码是临时和轮换的,而不是存储在配置文件和数据库中。此外,访问策略是细粒度和高度可配置的,这意味着支持多租户和多实例部署变得非常简单。   2.6 连续复制 传统复制方法的挑战在于它们无法有效地扩展到几百 TiB 以上。 话虽如此,每个人都需要一个复制策略来支持灾难恢复,并且该策略需要跨越地域、数据中心和云。 MinIO 的连续复制专为大规模、跨数据中心部署而设计。 通过利用 Lambda 计算通知和对象元数据,它可以高效快速地计算增量。 Lambda 通知确保立即传播更改,这与传统的批处理模式不同。 连续复制意味着如果发生故障,数据丢失将保持在最低限度 - 即使面对高度动态的数据集。 最后,与 MinIO 所做的一切一样,连续复制是多供应商的,这意味着您的备份位置可以是从 NAS 到公共云的任何地方。  2.7 全球联盟 现代企业的数据无处不在。 MinIO 允许将这些不同的实例组合起来形成一个统一的全局命名空间。 具体来说,可以将任意数量的 MinIO 服务器组合成一个 Distributed Mode set,多个 Distributed Mode set 可以组合成一个 MinIO Server Federation。 每个 MinIO Server Federation 都提供统一的管理和命名空间。 MinIO 联合服务器支持无限数量的分布式模式集。 这种方法的影响是,对象存储可以为大型、地理分布的企业大规模扩展,同时保留从单个控制台容纳各种应用程序(Splunk、Teradata、Spark、Hive、Presto、TensorFlow、H20)的能力。 2.8 多云网关 所有企业都在采用多云战略。 这也包括私有云。 因此,您的裸机虚拟化容器和公共云服务(包括非 S3 提供商,如谷歌、微软和阿里巴巴)必须看起来完全相同。 虽然现代应用程序具有高度可移植性,但为这些应用程序提供支持的数据却并非如此。 让数据可用,无论它位于何处,是 MinIO 解决的主要挑战。 MinIO 在裸机、网络附加存储和每个公共云上运行。 更重要的是,MinIO 通过 Amazon S3 API 确保您对该数据的看法从应用程序和管理的角度来看完全相同。 MinIO,可以走得更远,使您现有的存储基础设施与 Amazon S3 兼容。 其影响是深远的。 现在,组织可以真正统一他们的数据基础设施 - 从文件到块,所有这些都显示为可通过 Amazon S3 API 访问的对象,而无需迁移。 3 Minio架构 MinIO 被设计为云原生,可以作为由外部编排服务(如 Kubernetes)管理的轻量级容器运行。 整个服务器是一个大约 40MB 的静态二进制文件,并且在使用 CPU 和内存资源方面非常高效 - 即使在高负载下也是如此。 结果是您可以在共享硬件上共同托管大量租户。  MinIO 在带有本地连接驱动器 (JBOD/JBOF) 的商用服务器上运行。 集群中的所有服务器都具有相同的能力(完全对称架构)。 没有名称节点或元数据服务器。 MinIO 将数据和元数据作为对象一起写入,从而消除了对元数据数据库的需求。 此外,MinIO 执行所有功能(擦除代码、位腐烂检查、加密)作为内联、严格一致的操作。 结果是 MinIO 非常有弹性。 每个 MinIO 集群都是分布式 MinIO 服务器的集合,每个节点有一个进程。 MinIO作为单进程运行在用户空间,使用轻量级协程实现高并发。 驱动器被分组为擦除集(默认情况下每组 16 个驱动器),并且使用确定性哈希算法将对象放置在这些集中。 MinIO 专为大规模、多数据中心的云存储服务而设计。 每个租户运行他们自己的 MinIO 集群,与其他租户完全隔离,使他们能够保护他们免受升级、更新和安全事件的任何中断。 每个租户通过跨地域联合集群独立扩展。 4 Windows安装 4.1 下载 下载地址:http://dl.minio.org.cn/server/minio/release/  4.2 在minio.exe目录打开cmd  4.3 配置参数并启动 # 设置用户名 set MINIO_ACCESS_KEY=admin # 设置密码(8位) set MINIO_SECRET_KEY=admin123 # 指定启动端口(未指定默认9000)及存储位置 minio.exe  server  --address 0.0.0.0:9999 D:/data 4.4 登录地址IP+9999,输入用户名及密码,搭建完成  5 Linux安装 5.1 下载   5.2 创建相关目录 # 创建文件存储目录 mkdir -p /data/minio/data # 创建程序存放目录,并上传minio至此目录 mkdir -p /data/minio cd /data/minio # 修改可读权限 chmod +x minio  # 设置用户名 export  MINIO_ACCESS_KEY=admin # 设置密码 export  MINIO_SECRET_KEY=admin123 5.3 启动并访问首页  ./minio server /data/minio/data --console-address ":33639" --address ":9000"  5.4 Docker docker run -p 9999:9000 -e "MINIO_ACCESS_KEY=admin" -e "MINIO_SECRET_KEY=admin123" -v /data/minio:/data -d minio/minio server /data 5.5 Docker compose version: '3' services:    minio:     container_name: minio     hostname: minio     image: "minio/minio:latest"     volumes:       - /data/minio:/data     ports:       - "9999:9000"     environment:       MINIO_ACCESS_KEY: admin       MINIO_SECRET_KEY: admin123       TZ: Asia/Shanghai     command: server /data     healthcheck:       test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"]       interval: 30s       timeout: 20s       retries: 3 6 K8S 要点:使用yml文件配置资源,使用PVC存储minio文件 6.1 在节点 192.168.58.103创建NFS # 安装nfs-utils rpcbind yum install nfs-utils nfs-common rpcbind  # 创建目录 mkdir -p /data/minio chmod 666 /data/minio/ chown nfsnobaby /data/minio/ # 添加访问策略 vi /etc/exports # 输入内容 /data/minio  *(rw,no_root_squash,no_all_squash,sync) # 启动 systemctl start rpcbind systemctl start nfs # 查看 showmount -e 6.2 创建PV(master执行) # vim minio-pv.yaml  # 添加 apiVersion: v1 kind: PersistentVolume metadata:     name: pv-minio spec:     capacity:       storage: 2Gi     accessModes:       - ReadWriteMany     persistentVolumeReclaimPolicy: Recycle     nfs:       path: /data/minio       server: 192.168.58.103 # 创建 kubectl create -f minio-pv.yaml  # 查看 kubectl get pv -o wide  6.3 创建PVC(master执行) #  vim minio-pvc.yaml  # 内容 apiVersion: v1 kind: PersistentVolumeClaim metadata:   name: pvc-minio spec:   accessModes:     - ReadWriteMany   resources:     requests:       storage: 1Gi # 查看 kubectl get pvc -o wide  6.4 创建pod及service(master执行) #  vim minio.yaml  # 添加 apiVersion: v1 kind: Service metadata:   name: minio-svc   labels:     app: minio spec:   type: NodePort   ports:   - name: minio-port     protocol: TCP     port: 9000     nodePort: 32600     targetPort: 9000   selector:     app: minio --- apiVersion: v1 kind: Pod metadata:   name: minio   labels:     app: minio spec:   containers:   - name: minio     env:     - name: MINIO_ACCESS_KEY       value: "admin"     - name: MINIO_SECRET_KEY       value: "admin123"     image: minio/minio:latest     args:     - server     - /data     ports:     - name: minio       containerPort: 9000     volumeMounts:     - name: data       mountPath: /data   volumes:   - name: data     persistentVolumeClaim:      claimName: pvc-minio # 创建 kubectl apply  -f minio.yaml  # 查看pod  kubectl get pods -o wide # 查看service kubectl get svc -o wide   6.5 验证 因为service采用的是NodePort,所以需要输入minio所在node的IP+32600访问  文件存放:页面上传一个文件,进入nfs所在服务器,然后发现文件已被存放在PVC中  ———————————————— 版权声明:本文为CSDN博主「吴名氏.」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/qq_37284798/article/details/132824064 
  • [技术干货] 多级部署LNMP项目
    多机部署LNMP是一个很重要的项目,L代表Linux系统,N代表Nginx服务, M代表Mysql服务,P代表PHP服务。LNMP平台应该是应用比较广泛的网站服务架构。随着Nginx在企业中的使用越来越多。LNMP架构也受到越来越多的linux系统工程师的青睐。因此,掌握多级部署LNMP是非常重要的。vim lnmp.sh#!/bin/bash#build lnmp#移除原有的yum仓库,并备份到/root/old目录下[-d /root/old] $$rm-rf /root/old;mkdir /root/old || mkdir /root/oldmv /etc/yum.repos.d/* /root/oldcp -r /root/old/*/etc/yum.repos.d/#更新安装epel源rpm -Uvh https://mirror.webtatic.com/yu,/e17/epel-release.rpmsleep 10#更新安装Centos源rpm -Uvh https://mirror.webtatic.com/yum/e17/webtatic-release.rpmyum clean allyum repolistsleep 10#安装依赖软件包yum -y install openssl-devel gcc-c++ gcc makeecho waiting install php......yum install -y php56w-fpm php56w-common pjp56w-mbstring php56w-mcrypt php56w-pdo php56w-mysqlnd php56w-bcmath php56w-xml php56w-ldap#修改相关配置sed -i 's/post_max_size=8M/post_max_size=16M/g' /etc/php.inised -i 's/max_execution_time=30/max_execution_time=300/g'/etc/php.inised -i 's/max_input_time=60/max_execution_time=300/g/etc/php.ini'sed -i 's/listen,allowed_clients=127.0.0.1/#listen.allowed_clients=127.0.0.1/g'/etc/php-fpm.d/www.conf#启动并设置开机自启动systemctl enable php-fpmsystemctl start pho-fpmsleep 10echo waiting for nginxyum -y install nginxnginx -tnginxsleep 10echo waiting for mysql15.6......[-d /usr/local/src]||mkdir -p /usr/local/srccd/usr/local/srcrpm -Uvh http://dev.mysql.com/get/mysql-community-release -e17-5.noarch.rpmyum repolist all |grep ''mysql.*-community.*''yum -y install mysql-community-serversystemctl enable mysqldsystemctl start mysqld.serviceecho $ip >> passwords.txtawk -F:'/temporary password""/{print $NF}' /var/log/mysqld.log>>passwords.txtsleep3以上是在一台服务器上实现部署LNMP,项目需求是要在多态服务器上实现,其思路和多级部署mysql一样,需要使用shell循环来实现多态机器的LNMP部署。vim ip.txt10.0.104.510.0.104.2710.0.104.3410.0.104.13610.0.104.108#!/bin/bash#mainwhile read ipdo{ping -c 1-w 2 $ ip>/dev/nullif [$?-eq 0];thenscp -r lnmp.sh root@ip:/tmp/ssh root@ip "/tmp/lnmp.sh"}&done <ip.txtwaitecho all finish以上代码是针对ip.txt文件中的主机ip地址进行多机部署LNMP。首先是先ping一下ip.txt文件中的ip地址,判断机器是否正常;然后把安装lnmp脚本复制到多态服务器上/tmp/下,远程使用管理员权限,执行安装LNMP脚本,如果显示 all finish 则表示所有服务器安装都已完成。
  • [问题求助] atlas 300,在开发环境中(x86),安装样例中samples/cplusplus/common/acllite库时,make报错
    报错如下:/usr/bin/ld: cannot find -lavdevice /usr/bin/ld: cannot find -lavfilter collect2: error: ld returned 1 exit status make: *** [out/x86_64/libacllite.so] Error 1 在路径下THIRDPART_PATH,目前只有安装好的ffmpeg包,/usr/local/Ascend/thirdpart/aarch64/ffmpeg/环境变量如下:开发端--x86export INSTALL_DIR=/usr/local/Ascend/ascend-toolkit/latest export INSTALL_DIR_ARM=/usr/local/Ascend/ascend-toolkit/ascend-toolkit_arm/latest/aarch64-linux export PATH=$PATH:/usr/local/bin/cmake:${INSTALL_DIR}/atc/ccec_compiler/bin:${INSTALL_DIR}/atc/bin:${INSTALL_DIR}/bin:${INSTALL_DIR}/compiler/ccec_compiler/bin export LD_LIBRARY_PATH=${INSTALL_DIR}/acllib/lib64:${INSTALL_DIR}/atc/lib64:/usr/local/Ascend/ascend-toolkit/6.3.RC1.alpha001/runtime/lib64/stub:$LD_LIBRARY_PATH export ASCEND_OPP_PATH=${INSTALL_DIR}/opp export ASCEND_AICPU_PATH=/usr/local/Ascend/ascend-toolkit/latest/aarch64-linux export PYTHONPATH=${INSTALL_DIR}/atc/python/site-packages:${INSTALL_DIR}/opp/built-in/op_impl/ai_core/tbe:$PYTHONPATH export TOOLCHAIN_HOME=${INSTALL_DIR}/toolkit export ASCEND_HOME_PATH=${INSTALL_DIR} export DDK_PATH=/usr/local/Ascend/ascend-toolkit/latest/arm64-linux export NPU_HOST_LIB=${DDK_PATH}/runtime/lib64/stub export CPU_ARCH=`arch` export THIRDPART_PATH=/usr/local/Ascend/thirdpart/${CPU_ARCH} 
  • [问题求助] 在arm中,将数据写入device时,报错malloc device data buffer failed, aclRet is 107002
    报错代码如下:void* AtlasEngine::CopyDataToDevice(void* data, uint32_t dataSize, aclrtMemcpyKind policy) {    void* buffer = nullptr;    aclError aclRet = aclrtMalloc(&buffer, dataSize, ACL_MEM_MALLOC_HUGE_FIRST);    if (aclRet != ACL_SUCCESS) {        ERROR_LOG("malloc device data buffer failed, aclRet is %d", aclRet);        return nullptr;    }根据错误码,也检查了context,返回的是create context success,是创建成功的;aclrtSetDevice(deviceId_);也是成功的, ret = aclrtCreateContext(&context_, deviceId_);    if (ret != ACL_SUCCESS) {        ERROR_LOG("acl create context failed, deviceId = %d, errorCode = %d",            deviceId_, static_cast<int32_t>(ret));        return FAILED;    }    INFO_LOG("create context success");
  • [技术干货] linux运维应会
    运维工程师(Operations)在国内又称为运维开发工程师(Devops),在国外称为 SRE(SiteReliability Engineering)。负责维护并确保整个服务的高可用性,同时不断优化系统架构、提升部署效率、优化资源利用率提高整体的ROI。作为工作几年的Linux运维老司机,总结了Linux命令行的常用的一些用法,希望对您有所收获。搜索在vi和vim中如果打开一个很大的文件,不容易找到对应的内容,可以使用自带的搜索关键字进行搜索定位:在vi和vim界面中输入:"/"(反斜杠),之后会出现一个输入框让你输入,当你输入的关键字在文件中存在就会以高亮的形式显示出来,之后按回车就确定定位到当前高亮位置,如果不是你要找的,则可以按:"n",意即寻找下一个输入关键字的内容。vim恢复以及乱码问题(1) 在vi和vim中如果不小心误删除了一些东西,想要恢复怎么办?首先要退出编辑状态,即按Esc键,之后再按u撤销之前的修改的内容。(2) 在用vi或vim打开一个文件的时候,如果有些地方出现一些特殊符号或是乱码,可以通过以下命令尝试:vim -b mytest.php(其中-b一般是用来查看对应的二进制文件的)管道命令,即竖杠-->'|'上面的意思是:将查询出来的内容交给管道后面的命令装饰之后再展示出来例如:cat install.log | more (more的意思是将一屏放不下的内容以分页的形式显示)ls -l /etc | more如果想看上一页的内容,可以通过:Shift + PageUp 来查看管道配合grep(过滤)可以达到很好用的组合例如:cat -n hello.txt | grep "hello" (查看hello.txt文件内容,并过滤出来带有hello的内容) ,-n 表示显示出来第几行的内容find 搜寻文件或目录find /home -name hello* (查找home目录下的文件名或目录为hello的)find / -name h?m* (在跟目录下查找h开头第二个字符是任意的,第三个是m,后面的是任意的字符)find / -size +1000000k (表示在根目录下查询文件大于1000000K的文件)5 字符串替换命令:s/well/good/替换当前行第一个well 为 good:s/well/good/g 替换当前行所有well 为 good:n,$s/well/good/ 替换第 n 行开始到最后一行中每一行的第一个 well 为 good:n,$s/well/good/g 替换第 n 行开始到最后一行中每一行所有 well 为 goodn 为数字,若 n 为 .,表示从当前行开始到最后一行:%s/well/good/ (等同于 :g/well/s//good/) 替换每一行的第一个 well 为 good:%s/well/good/g (等同于 :g/well/s//good/g) 替换每一行中所有 well 为 good特殊符号转义:可以使用#作为分隔符,此时中间出现的 / 不会作为分隔符:s#well/#good/#    替换当前行第一个 well/ 为 good/:%s#/usr/bin#/bin#g可以把文件中所有路径/usr/bin换成/bin6. 重定向命令ls -l /etc/ 希望ls -l /etc > /home/myback.txt (覆盖重定向)把显示的结果覆盖到/home/myback.txt中去ls -l /etc >> /home/myback.txt (追加重定向)把显示的结果追加到/home/myback.txt中去7. 删除多行删除多行步骤如下:首先要显示对应的行数这样方能知道从第几行到第几行删除: set nu按Esc键退出,在命令行中输入:190,6233d(即[190 , 6233]都删除掉)如果想要情况整个文件内容,在直接运行以下命令:清空文件内容:> log.txt8. 行位定位直接定位到最后一行:按Esc键退出,在命令行中输入:G直接定位到第一行:按Esc键退出,在命令行中输入:1 G直接定位到某一行:(第17行)按Esc键退出,在命令行中输入:17 G9. 复制一行或多行<1. 复制一行yy   复制当前行p   粘贴<2. 复制多行7yy  从当前行开始复制7行p   粘贴Linux中查看python的版本python -V或者python --versiongrep 的用法<1. 显示匹配的后n行 (after)grep -A n<2. 显示匹配的前n行 (before)grep -B n<3. 显示匹配的前后n行 (context)grep -C n<4. 忽略大小写grep -i strll或ls显示说明ll -ht (h会按照标准格式自动转换大小即:456M,1.2G等,t 表示显示内容按照时间倒序排列)应用案例:清空8月份的日志文件:rm -rf ll -ht | awk '/8月/ {print6,6,NF}' | awk '{print $NF}'说明:awk '/pattern/action'--> awk '/8月/{print6,6,NF}',只显示第六行与最后一行的内容且只保留8月的列表内容显示。ls中文件颜色的显示代表的意义为:1.蓝色--> 目录2.绿色--> 可执行文件3.红色--> 压缩文件4.浅蓝色--> 链接文件5.灰色--> 其他文件
  • [技术干货] 2个好用的 Linux 监控工具
    身为一个运维开发人员,如果你不知道眼下当前服务器底层操作系统中正在发生什么,那就有点合眼摸象了。其实,你可以根据相应数据做出一定的推测,但是要做到这一点,就需要原始数据,并且数据要有一定的实时性。你需要能够根据操作系统当前的运行状态,结合监控数据来做出合理判断,采取相应措施。你是否曾经遇到过一台服务器运行缓慢,但是 CPU 使用率看起来不是很高的情况?你是否遇到过服务器的网络利用率很高,但是定位不到导致高网络利用率的进程情况?下面介绍的这些工具可以给你提供帮助。最重要的是,它们中的大多数都可以在没有 GUI 的情况下使用,并且能轻松安装在大多数服务器上。以下就是我每天用到的一些不错的 Linux 监控工具,它们可以帮助我快速准确地诊断和定位问题。1、iotop如果你想知道到底哪些进程消耗了服务器宝贵的 I/O 资源,那么请使用 iotop!我无数次地使用它通过 IOPS 参数来定位那些疯狂占用磁盘 IO 的耗时进程。图片你只是无法从传统工具(如 top)中获取原始数据。当使用 iotop 时,你会发现正如工具的名字所描述的一样,它会展示进程和系统的 I/O 资源使用情况。你可以将其用于多种目的,但最关键的是查看磁盘使用情况并标记潜在的性能瓶颈。将此工具与 top 或 htop 等其他工具结合使用,能帮你更全面地了解服务器当前负载情况。我不建议将 iotop 用于基准测试。尽管你能清楚地了解每个进程占用多少 I/O 资源,但它更适合实时监控而不是重复的性能测试。如果你对 I/O 基准测试感兴趣,我推荐一个名为 fio 的工具。2、htop这是我本人的最爱的监控工具之一。该工具比 top 工具更具视觉吸引力,并且拥有出色的默认配色方案。使用它,你就可以马上对系统当前运行情况有一个清晰了解。你能清晰地在水平条形图中查看计算机内核数目以及它们的利用率。同样的,你还可以获得内存使用情况的简单统计信息,并且在底部也有经典的 top 进程列表。我热衷于 htop 的主要原因是它能快速地提供我所关注的信息。我就是想看看服务器每核 CPU 使用率和内存使用率在图形上是怎样的 - 而不是一个无聊的百分比。如果你肯定某个进程正在耗尽系统上的所有核心从而打开 htop 进行查看,那么就会发现大片红色,整个过程快速而简单。
  • [技术干货] Linux命令 su 和 sudo 的区别
    在 Linux 系统中,有两个常用的命令用于切换用户身份和执行特权操作,它们分别是 su 和 sudo。虽然它们都可以实现权限提升,但在使用方式、安全性和适用场景等方面存在一些区别。本文将介绍 su 和 sudo 命令的区别,以帮助用户正确选择和使用这两个命令。su 命令 su(切换用户)命令是在 Linux 系统中切换到其他用户身份的命令。通常,它需要超级用户(root)的密码才能切换到其他用户。使用 su 命令时,用户可以切换到其他用户的账户,并获得该账户的权限。例如,可以使用以下命令切换到超级用户(root):su在输入密码后,用户将切换到 root 用户,并获得 root 用户的权限。sudo 命令 sudo(以超级用户身份执行命令)命令是在 Linux 系统中以超级用户(root)的权限执行特定命令的命令。与 su 命令不同,sudo 命令允许普通用户以其自己的密码执行特权操作,而无需知道超级用户的密码。使用 sudo 命令时,用户需要在命令前加上 sudo 关键字,并输入自己的密码以确认身份。例如,以下命令将以超级用户的权限执行 apt-get update 命令:sudo apt-get update在输入密码后,用户将获得执行特权操作的权限。区别对比3.1 用户身份 su 命令需要超级用户(root)密码,用户可以切换到其他用户的身份并获得其权限。而 sudo 命令允许普通用户以其自己的密码执行特权操作。3.2 权限范围 su 命令切换到其他用户后,用户将获得该用户的全部权限。而 sudo 命令可以通过配置文件(sudoers 文件)控制特权操作的范围,可以精确指定用户可以执行哪些命令以及以哪些用户的身份执行。3.3 安全性 由于 su 命令需要共享 root 密码,这可能存在一些安全风险。如果其他人知道 root 密码,他们就可以切换到 root 用户,并拥有完全控制系统的权限。而 sudo 命令通过使用自己的密码来执行特权操作,可以避免共享 root 密码,提高系统的安全性。3.4 记录日志 sudo 命令会记录每个特权操作的日志,包括执行的命令和执行者的身份。这可以帮助系统管理员进行安全审计和追踪。而 su 命令没有内置的日志功能,无法追踪用户切换和执行的命令。3.5 使用方式 su 命令可以在命令行中直接输入,然后输入目标用户的密码即可切换用户。而 sudo 命令需要在命令前加上 sudo 关键字,然后输入自己的密码确认身份。适用场景 使用 su 命令切换用户适用于需要长时间以其他用户身份操作的情况,比如需要在其他用户的环境下执行一系列命令或长时间工作。 使用 sudo 命令适用于临时需要执行特权操作的情况,比如安装软件、更新系统或执行重要的系统维护任务。结论 su 命令和 sudo 命令是在 Linux 系统中用于切换用户身份和执行特权操作的常用命令。它们在使用方式、安全性和适用场景等方面存在一些区别。su 命令需要超级用户密码来切换用户身份,而 sudo 命令允许普通用户以自己的密码执行特权操作。使用 sudo 命令可以避免共享 root 密码和记录特权操作的日志,提高系统的安全性和可追踪性。在选择使用 su 命令或 sudo 命令时,需要根据具体需求和安全考虑来进行选择。希望本文对您了解 su 命令和 sudo 命令的区别有所帮助,并能在实际使用中正确选择和使用这两个命令。