IP-SAN客户端配置及使用


做ISCSI发起程序我们分为一下几个步骤

将网卡设置为静态IP地址
配置YUM软件仓库
添加4块硬盘
创建RAID磁盘阵列和备份盘
配置ISCSI服务端

在虚拟机中添加4块新硬盘,用于创建RAID 5磁盘阵列和备份盘

执行fdisk-l命令查看一下硬盘是否添加成功

[root@linuxprobe ~]# fdisk -l
	Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes
	Disk label type: dos
	Disk identifier: 0x000b6f38

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048     1026047      512000   83  Linux
/dev/sda2         1026048    41943039    20458496   8e  Linux LVM

	Disk /dev/sde: 21.5 GB, 21474836480 bytes, 41943040 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes


	Disk /dev/sdd: 21.5 GB, 21474836480 bytes, 41943040 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes


	Disk /dev/sdc: 21.5 GB, 21474836480 bytes, 41943040 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes


	Disk /dev/sdb: 21.5 GB, 21474836480 bytes, 41943040 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes


	Disk /dev/mapper/rhel_linuxprobe-swap: 2147 MB, 2147483648 bytes, 4194304 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes


	Disk /dev/mapper/rhel_linuxprobe-root: 18.8 GB, 18798870528 bytes, 36716544 sectors
	Units = sectors of 1 * 512 = 512 bytes
	Sector size (logical/physical): 512 bytes / 512 bytes
	I/O size (minimum/optimal): 512 bytes / 512 bytes

创建RAID磁盘阵列

        启动虚拟机系统,使用mdadm命令创建RAID磁盘阵列。其中,-Cv参数为创建阵列并显示过程,/dev/md0为生成的阵列组名称,-n 3参数为创建RAID 5磁盘阵列所需的硬盘个数,-l 5参数为RAID磁盘阵列的级别,-x 1参数为磁盘阵列的备份盘个数。在命令后面要逐一写上使用的硬盘名称。

    [root@linuxprobe ~]# mdadm -Cv /dev/md0 -n 3 -l 5 -x 1 
    /dev/sdb /dev/sdc /dev/sdd /dev/sde
    	mdadm: layout defaults to left-symmetric
    	mdadm: layout defaults to left-symmetric
    	mdadm: chunk size defaults to 512K
    	mdadm: size set to 20954624K
    	mdadm: Defaulting to version 1.2 metadata
    	mdadm: array /dev/md0 started.

        在上述命令成功执行之后,得到一块名称为/dev/md0的新设备,这是一块RAID 5级别的磁盘阵列,并且还有一块备份盘为硬盘数据保驾护航。大家可使用mdadm -D命令来查看设备的详细信息。另外,由于在使用远程设备时极有可能出现设备识别顺序发生变化的情况,因此,如果直接在fstab挂载配置文件中写入/dev/sdb、/dev/sdc等设备名称的话,就有可能在下一次挂载了错误的存储设备。而UUID值是设备的唯一标识符,可以用于精确地区分本地或远程设备。于是我们可以把这个值记录下来,一会儿准备填写到挂载配置文件中。

    [root@linuxprobe ~]# mdadm -D /dev/md0 
    /dev/md0:
     Version : 1.2
      Creation Time : Sat Nov 10 16:14:34 2018
         Raid Level : raid5
         Array Size : 41909248 (39.97 GiB 42.92 GB)
      Used Dev Size : 20954624 (19.98 GiB 21.46 GB)
       Raid Devices : 3
      Total Devices : 4
        Persistence : Superblock is persistent
    
        Update Time : Sat Nov 10 16:15:15 2018
              State : clean, degraded, recovering 
     Active Devices : 2
    Working Devices : 4
     Failed Devices : 0
      Spare Devices : 2
    
             Layout : left-symmetric
         Chunk Size : 512K
    
     Rebuild Status : 22% complete
    
               Name : linuxprobe:0  (local to host linuxprobe)
               UUID : 98f05f16:dac9c7d1:e3f34bae:827c568a
             Events : 4
    
        Number   Major   Minor   RaidDevice State
           0       8       16        0      active sync   /dev/sdb
           1       8       32        1      active sync   /dev/sdc
           4       8       48        2      spare rebuilding   /dev/sdd
    
           3       8       64        -      spare   /dev/sde
           

        第1步:配置好Yum软件仓库后安装iSCSI服务端程序以及配置命令工具。通过在yum命令的后面添加-y参数,在安装过程中就不需要再进行手动确认了:

[root@linuxprobe ~]# yum install targetd targetctl
Loaded plugins: langpacks, product-id, subscription-manager
………………省略部分输出信息………………
Installing:
 targetcli noarch 2.1.fb34-1.el7 rhel 55 k
 targetd noarch 0.7.1-1.el7 rhel 48 k
Installing for dependencies:
 PyYAML x86_64 3.10-11.el7 rhel 153 k
 libyaml x86_64 0.1.4-10.el7 rhel 55 k
 lvm2-python-libs x86_64 7:2.02.105-14.el7 rhel 153 k
 pyparsing noarch 1.5.6-9.el7 rhel 94 k
 python-configshell noarch 1:1.1.fb11-3.el7 rhel 64 k
 python-kmod x86_64 0.9-4.el7 rhel 57 k
 python-rtslib noarch 2.1.fb46-1.el7 rhel 75 k
 python-setproctitle x86_64 1.1.6-5.el7 rhel 15 k
 python-urwid x86_64 1.1.1-3.el7 rhel 654 k
………………省略部分输出信息………………
Installed:
 targetcli.noarch 0:2.1.fb34-1.el7 targetd.noarch 0:0.7.1-1.el7 
Dependency Installed:
 PyYAML.x86_64 0:3.10-11.el7 
 libyaml.x86_64 0:0.1.4-10.el7 
 lvm2-python-libs.x86_64 7:2.02.105-14.el7 
 pyparsing.noarch 0:1.5.6-9.el7 
 python-configshell.noarch 1:1.1.fb11-3.el7 
 python-kmod.x86_64 0:0.9-4.el7 
 python-rtslib.noarch 0:2.1.fb46-1.el7 
 python-setproctitle.x86_64 0:1.1.6-5.el7 
 python-urwid.x86_64 0:1.1.1-3.el7 
Complete!

    安装完成后启动iSCSI的服务端程序targetd,然后把这个服务程序加入到开机启动项中,以便下次在服务器重启后依然能够为用户提供iSCSI共享存储资源服务:

[root@linuxprobe ~]# systemctl start targetd
[root@linuxprobe ~]# systemctl enable targetd

ln -s '/usr/lib/systemd/system/targetd.service' 
'/etc/systemd/system/multi-user.target.wants/targetd.service'

        第2步:配置iSCSI服务端共享资源。targetcli是用于管理iSCSI服务端存储资源的专用配置命令,它能够提供类似于fdisk命令的交互式配置功能,将iSCSI共享资源的配置内容抽象成“目录”的形式,我们只需将各类配置信息填入到相应的“目录”中即可。这里的难点主要在于认识每个“参数目录”的作用。当把配置参数正确地填写到“目录”中后,iSCSI服务端也可以提供共享资源服务了。

        在执行targetcli命令后就能看到交互式的配置界面了。在该界面中可以使用很多Linux命令,比如利用ls查看目录参数的结构,使用cd切换到不同的目录中。/backstores/block是iSCSI服务端配置共享设备的位置。我们需要把刚刚创建的RAID 5磁盘阵列md0文件加入到配置共享设备的“资源池”中,并将该文件重新命名为disk0,这样用户就不会知道是由服务器中的哪块硬盘来提供共享存储资源,而只会看到一个名为disk0的存储设备。

配置ISCSI服务端

[root@linuxprobe ~]# targetcli
Warning: Could not load preferences file /root/.targetcli/prefs.bin.
targetcli shell version 2.1.fb34
Copyright 2011-2013 by Datera, Inc and others.
For help on commands, type 'help'.

/> ls
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 0]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 0]
  o- loopback ..................................................... [Targets: 0]
/> cd /backstores/block 
/backstores/block> create disk0 /dev/md0 
Created block storage object disk0 using /dev/md0.
/backstores/block> cd /
/> ls
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 1]
  | | o- disk0 ..................... [/dev/md0 (40.0GiB) write-thru deactivated]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 0]
  o- loopback ..................................................... [Targets: 0]

        第3步:创建iSCSI target名称及配置共享资源。iSCSI target名称是由系统自动生成的,这是一串用于描述共享资源的唯一字符串。稍后用户在扫描iSCSI服务端时即可看到这个字符串,因此我们不需要记住它。系统在生成这个target名称后,还会在/iscsi参数目录中创建一个与其字符串同名的新“目录”用来存放共享资源。我们需要把前面加入到iSCSI共享资源池中的硬盘设备添加到这个新目录中,这样用户在登录iSCSI服务端后,即可默认使用这硬盘设备提供的共享存储资源了。

/> cd iscsi
/iscsi> create
Created target iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.f04223f71aa6.
Created TPG 1.
/iscsi> cd iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.f04223f71aa6/
/iscsi/iqn.20....f04223f71aa6> ls
o- iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.f04223f71aa6 ...... [TPGs: 1]
  o- tpg1 ............................................... [no-gen-acls, no-auth]
    o- acls .......................................................... [ACLs: 0]
    o- luns .......................................................... [LUNs: 0]
    o- portals .................................................... [Portals: 0]
/iscsi/iqn.20....f04223f71aa6> cd tpg1/luns 
/iscsi/iqn.20...aa6/tpg1/luns> create /backstores/block/disk0 
Created LUN 0.

        第4步:设置访问控制列表(ACL)。iSCSI协议是通过客户端名称进行验证的,也就是说,用户在访问存储共享资源时不需要输入密码,只要iSCSI客户端的名称与服务端中设置的访问控制列表中某一名称条目一致即可,因此需要在iSCSI服务端的配置文件中写入一串能够验证用户信息的名称。acls参数目录用于存放能够访问iSCSI服务端共享存储资源的客户端名称。刘遄老师推荐在刚刚系统生成的iSCSI target后面追加上类似于:client的参数,这样既能保证客户端的名称具有唯一性,又非常便于管理和阅读:

/iscsi/iqn.20...aa6/tpg1/luns> cd ..
/iscsi/iqn.20...23f71aa6/tpg1> cd acls
/iscsi/iqn.20...aa6/tpg1/acls> create iqn.2003-01.org.linux-iscsi.
linuxprobe.x8664:sn.f04223f71aa6:client
Created Node ACL for iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.
f04223f71aa6:client
Created mapped LUN 0.

        第5步:设置iSCSI服务端的监听IP地址和端口号。位于生产环境中的服务器上可能有多块网卡,那么到底是由哪个网卡或IP地址对外提供共享存储资源呢?这就需要我们在配置文件中手动定义iSCSI服务端的信息,即在portals参数目录中写上服务器的IP地址。接下来将由系统自动开启服务器192.168.126.100的3260端口将向外提供iSCSI共享存储资源服务:

	/iscsi/iqn.20...aa6/tpg1/acls> cd ..
	/iscsi/iqn.20...23f71aa6/tpg1> cd portals
	/iscsi/iqn.20.../tpg1/portals> create 192.168.126.100
	Using default IP port 3260
	Created network portal 192.168.126.100:3260.

        第6步:配置妥当后检查配置信息,重启iSCSI服务端程序并配置防火墙策略。在参数文件配置妥当后,可以浏览刚刚配置的信息,确保与下面的信息基本一致。在确认信息无误后输入exit命令来退出配置。注意,千万不要习惯性地按Ctrl + C组合键结束进程,这样不会保存配置文件,我们的工作也就白费了。最后重启iSCSI服务端程序,再设置firewalld防火墙策略,使其放行3260/tcp端口号的流量。

/iscsi/iqn.20.../tpg1/portals> ls /
o- / ..................................................................... [...]
  o- backstores .......................................................... [...]
  | o- block .............................................. [Storage Objects: 1]
  | | o- disk0 ....................... [/dev/md0 (40.0GiB) write-thru activated]
  | o- fileio ............................................. [Storage Objects: 0]
  | o- pscsi .............................................. [Storage Objects: 0]
  | o- ramdisk ............................................ [Storage Objects: 0]
  o- iscsi ........................................................ [Targets: 1]
  | o- iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.f04223f71aa6 .. [TPGs: 1]
  |   o- tpg1 ........................................... [no-gen-acls, no-auth]
  |     o- acls ...................................................... [ACLs: 1]
  |     | o- iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.f04223f71aa6:client  [Mapped LUNs: 1]
  |     |   o- mapped_lun0 ............................. [lun0 block/disk0 (rw)]
  |     o- luns ...................................................... [LUNs: 1]
  |     | o- lun0 ..................................... [block/disk0 (/dev/md0)]
  |     o- portals ................................................ [Portals: 1]
  |       o- 192.168.126.100:3260 ......................................... [OK]
  o- loopback ..................................................... [Targets: 0]
/iscsi/iqn.20.../tpg1/portals> exit
Global pref auto_save_on_exit=true
Last 10 configs saved in /etc/target/backup.
Configuration saved to /etc/target/saveconfig.json
[root@linuxprobe ~]# systemctl restart targetd
[root@linuxprobe ~]# firewall-cmd --permanent --add-port=3260/tcp
success
[root@linuxprobe ~]# firewall-cmd --reload
success

配置Linux客户端

iSCSI服务端和客户端的操作系统以及IP地址:

主机名称 操作系统 IP地址
ISCSI服务端 RHEL7 192.168.126.100
ISCSI客户端 RHEL7 192.168.126.200

        我们在前面的章节中已经配置了很多Linux服务,基本上可以说,无论是什么服务,客户端的配置步骤都要比服务端的配置步骤简单一些。在RHEL 7系统中,已经默认安装了iSCSI客户端服务程序initiator。如果您的系统没有安装的话,可以使用Yum软件仓库手动安装。

[root@linuxprobe ~]# yum install iscsi-initiator-utils 
Loaded plugins: langpacks, product-id, subscription-manager 
Package iscsi-initiator-utils-6.2.0.873-21.el7.x86_64 already installed 
and latest version 
Nothing to do

        前面讲到,iSCSI协议是通过客户端的名称来进行验证,而该名称也是iSCSI客户端的唯一标识,而且必须与服务端配置文件中访问控制列表中的信息一致,否则客户端在尝试访问存储共享设备时,系统会弹出验证失败的保存信息。

        下面我们编辑iSCSI客户端中的initiator名称文件,把服务端的访问控制列表名称填写进来,然后重启客户端iscsid服务程序并将其加入到开机启动项中:

[root@linuxprobe ~]# vim /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80:client
[root@linuxprobe ~]# systemctl restart iscsid
[root@linuxprobe ~]# systemctl enable iscsid
 ln -s '/usr/lib/systemd/system/iscsid.service' '/etc/systemd/system/
 multi-user.target.wants/iscsid.service'

        iSCSI客户端访问并使用共享存储资源的步骤很简单,只需要记住刘遄老师的一个小口诀“先发现,再登录,最后挂载并使用”。iscsiadm是用于管理、查询、插入、更新或删除iSCSI数据库配置文件的命令行工具,用户需要先使用这个工具扫描发现远程iSCSI服务端,然后查看找到的服务端上有哪些可用的共享存储资源。其中,-m discovery参数的目的是扫描并发现可用的存储资源,-t st参数为执行扫描操作的类型,-p 192.168.126.100参数为iSCSI服务端的IP地址:

[root@linuxprobe ~]# iscsiadm -m discovery -t st -p 192.168.126.100
192.168.126.100:3260,1 iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80

        在使用iscsiadm命令发现了远程服务器上可用的存储资源后,接下来准备登录iSCSI服务端。其中,-m node参数为将客户端所在主机作为一台节点服务器,-T iqn.2003-01. org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80参数为要使用的存储资源(大家可以直接复制前面命令中扫描发现的结果,以免录入错误),-p 192.168.126.100参数依然为对方iSCSI服务端的IP地址。最后使用–login或-l参数进行登录验证。

[root@linuxprobe ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80 -p 192.168.126.100 --login
Logging in to [iface: default, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80, portal: 192.168.126.100,3260] (multiple)
Login to [iface: default, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80, portal: 192.168.126.100,3260] successful.

        在iSCSI客户端成功登录之后,会在客户端主机上多出一块名为/dev/sdb的设备文件。

[root@linuxprobe ~]# file /dev/sdb 
/dev/sdb: block special

        下面进入标准的磁盘操作流程。外加这个设备文件本身只有40GB的容量,因此我们不再进行分区,而是直接格式化并挂载使用。

[root@linuxprobe ~]# mkfs.xfs /dev/sdb
log stripe unit (524288 bytes) is too large (maximum is 256KiB)
log stripe unit adjusted to 32KiB
meta-data=/dev/sdb               isize=256    agcount=16, agsize=654720 blks
         =                       sectsz=512   attr=2, projid32bit=1
         =                       crc=0
data     =                       bsize=4096   blocks=10475520, imaxpct=25
         =                       sunit=128    swidth=256 blks
naming   =version 2              bsize=4096   ascii-ci=0 ftype=0
log      =internal log           bsize=4096   blocks=5120, version=2
         =                       sectsz=512   sunit=8 blks, lazy-count=1
realtime =none                   extsz=4096   blocks=0, rtextents=0
[root@linuxprobe ~]# mkdir /iscsi
[root@linuxprobe ~]# mount /dev/sdb /iscsi
[root@linuxprobe ~]# df -h
Filesystem             Size  Used Avail Use% Mounted on
/dev/mapper/rhel-root   18G  3.4G   15G  20% /
devtmpfs               734M     0  734M   0% /dev
tmpfs                  742M  176K  742M   1% /dev/shm
tmpfs                  742M  8.8M  734M   2% /run
tmpfs                  742M     0  742M   0% /sys/fs/cgroup
/dev/sr0               3.5G  3.5G     0 100% /media/cdrom
/dev/sda1              497M  119M  379M  24% /boot
/dev/sdb                40G   33M   40G   1% /iscsi

        从此以后,这个设备文件就如同是客户端本机主机上的硬盘那样工作。需要提醒大家的是,由于udev服务是按照系统识别硬盘设备的顺序来命名硬盘设备的,当客户端主机同时使用多个远程存储资源时,如果下一次识别远程设备的顺序发生了变化,则客户端挂载目录中的文件也将随之混乱。为了防止发生这样的问题,我们应该在/etc/fstab配置文件中使用设备的UUID唯一标识符进行挂载,这样,不论远程设备资源的识别顺序再怎么变化,系统也能正确找到设备所对应的目录。

        blkid命令用于查看设备的名称、文件系统及UUID。可以使用管道符进行过滤,只显示与/dev/sdb设备相关的信息:

[root@linuxprobe ~]# blkid | grep /dev/sdb
/dev/sdb: UUID="eb9cbf2f-fce8-413a-b770-8b0f243e8ad6" TYPE="xfs" 

        由于/dev/sdb是一块网络存储设备,而iSCSI协议是基于TCP/IP网络传输数据的,因此必须在/etc/fstab配置文件中添加上_netdev参数,表示当系统联网后再进行挂载操作,以免系统开机时间过长或开机失败:

[root@linuxprobe ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Wed May 4 19:26:23 2017
#
# Accessible filesystems, by reference, are maintained under '/dev/disk'
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
/dev/mapper/rhel-root / xfs defaults 1 1
UUID=812b1f7c-8b5b-43da-8c06-b9999e0fe48b /boot xfs defaults 1 2
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
UUID=eb9cbf2f-fce8-413a-b770-8b0f243e8ad6 /iscsi xfs defaults,_netdev 0 0

        如果我们不再需要使用iSCSI共享设备资源了,可以用iscsiadm命令的-u参数将其设备卸载:

[root@linuxprobe ~]# iscsiadm -m node -T iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80 -u

Logging out of session [sid: 7, target : iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80, portal: 192.168.10.10,3260]

Logout of [sid: 7, target: iqn.2003-01.org.linux-iscsi.linuxprobe.x8664:sn.d497c356ad80,portal:192.168.10.10,3260]
 successful.

配置Windows客户端

        使用Windows系统的客户端也可以正常访问iSCSI服务器上的共享存储资源,而且操作原理及步骤与Linux系统的客户端基本相同。在进行下面的实验之前,请先关闭Linux系统客户端,以免这两台客户端主机同时使用iSCSI共享存储资源而产生潜在问题。

iSCSI服务器和客户端的操作系统以及IP地址:

主机名称 操作系统 IP地址
ISCSI服务端 RHEL7 192.168.126.100
Windows系统客户端 Windows 10 192.168.126.150

        第1步:运行iSCSI发起程序。在Windows 7操作系统中已经默认安装了iSCSI客户端程序,我们只需在控制面板中找到“系统和安全”标签,然后单击“管理工具”,进入到“管理工具”页面后即可看到“iSCSI发起程序”图标。双击该图标。在第一次运行iSCSI发起程序时,系统会提示“Microsoft iSCSI服务端未运行”,单击“是”按钮即可自动启动并运行iSCSI发起程序。在这里插入图片描述
输入IP地址点击后面的快速链接
在这里插入图片描述
点击设置按钮:
在这里插入图片描述

选择设置,,更改ISCSI发起程序的名称
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

创建磁盘

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

        本实验是仿照刘遄老师的Linux就该这么学,自己做过实验过后而做的实验。目的就是为了以后自己复习方便。

猜你喜欢

转载自blog.csdn.net/xujingran/article/details/83931737
今日推荐