1、创建一个10G分区,并格式为ext4文件系统;
(1) 要求其block大小为2048, 预留空间百分比为2, 卷标为MYDATA, 默认挂载属性包含acl;
#]tune2fs -m 2 /dev/sda3 [root@localhost ~]# mke2fs -t ext4 -b 2048 -L MYDATA -m 2 /dev/sda3 mke2fs 1.42.9 (28-Dec-2013) 文件系统标签=MYDATA OS type: Linux 块大小=2048 (log=1) 分块大小=2048 (log=1) Stride=0 blocks, Stripe width=0 blocks 655360 inodes, 5242880 blocks 104857 blocks (2.00%) reserved for the super user 第一个数据块=0 Maximum filesystem blocks=273678336 320 block groups 16384 blocks per group, 16384 fragments per group 2048 inodes per group Superblock backups stored on blocks: 16384, 49152, 81920, 114688, 147456, 409600, 442368, 802816, 1327104, 2048000, 3981312 Allocating group tables: 完成 正在写入inode表: 完成 Creating journal (32768 blocks): 完成 Writing superblocks and filesystem accounting information: 完成
(2) 挂载至/data/mydata目录,要求挂载时禁止程序自动运行,且不更新文件的访问时间戳;
[root@localhost ~]# mkdir -pv /data/mydata mkdir: 已创建目录 "/data" mkdir: 已创建目录 "/data/mydata" [root@localhost ~]# mount /dev/sda3 /data/mydata/
2、创建一个大小为1G的swap分区,并创建好文件系统,并启用之;
[root@localhost ~]#mkswap /dev/sda4 [root@localhost ~]#swapon /dev/sda4
3、写一个脚本
(1)、获取并列出当前系统上的所有磁盘设备;
(2)、显示每个磁盘设备上每个分区相关的空间使用信息;
#!/bin/bash # echo "当前系统磁盘设备有:" fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | cut -d' ' -f2 # 显示每个磁盘的分区信息 for i in $(fdisk -l | grep -o "^Disk /dev/[sh]d[a-z]" | cut -d' ' -f2);do echo "============$i 磁盘分区信息===========" fdisk -l $i echo done
脚本测试
[root@localhost script]# bash getdisk.sh 当前系统磁盘设备有: /dev/sda /dev/sdb ============/dev/sda 磁盘分区信息=========== Disk /dev/sda: 85.9 GB, 85899345920 bytes 255 heads, 63 sectors/track, 10443 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x0004d0da Device Boot Start End Blocks Id System /dev/sda1 * 1 64 512000 83 Linux Partition 1 does not end on cylinder boundary. /dev/sda2 64 10444 83373056 8e Linux LVM ============/dev/sdb 磁盘分区信息=========== Disk /dev/sdb: 107.4 GB, 107374182400 bytes 255 heads, 63 sectors/track, 13054 cylinders Units = cylinders of 16065 * 512 = 8225280 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x266ebb54 Device Boot Start End Blocks Id System /dev/sdb1 1 1306 10490413+ 83 Linux /dev/sdb2 1307 1332 208845 82 Linux swap / Solaris
4、总结RAID的各个级别及其组合方式和性能的不同;
RAID 全称 Redundant Arrays f Independent Disks,目前常用RAID级别有5种:RAID0、1、4、5、6、10。
RAID0:提供了IO性能扩展能力,读写性能得到提升。
缺点:无容错能力,一块磁盘损坏,其他磁盘将受影响。
组合方式:通过2块及以上磁盘组成可用空间为N*min(S1,S2,...)磁盘。
RAID1:读性能提升,写性能略有下降,有冗余能力
组合方式:2块及以上磁盘组成可用空间为min(S1,S2,...)
RAID4:读写性能得到提升,同时拥有冗余能力
组合方式:两块磁盘存储数据,第三存储前两块磁盘按位异或的结果。
如:DISK1存储:1101;DISK2存储:0110;DISK3存储:1101异或0110=>1011
RAID5:读写性能提升,有1块磁盘容错能力。与RAID4不同的是,在每块磁盘上都有chuk。
组合方式:最少3块磁盘数,组成可用空间:(N-1)*min(S1,S2,...)磁盘
RAID6:读写性能提升,有2块磁盘容错能力。比RAID5多一块校验盘
组合方式:最少4块磁盘数,组成可用空间:(N-2)*min(S1,S2,...)磁盘
RAID10:读写性能提升,存储数据先分割,后存储到两块磁盘组成的RAID1的镜像中
有容错能力,每组RAID1组成的镜像自多只能坏一块磁盘
组合方式:最少4块磁盘数,组成可用空间:N*min(S1,S2,...)/2磁盘
5、创建一个大小为10G的RAID1,要求有一个空闲盘,而且CHUNK大小为128k;
1、创建3块10G空闲盘,并调整格式为fd
[root@localhost ~]# fdisk /dev/sdb Command (m for help): n Partition number (1-4): 1 First cylinder (1-13054, default 1): Last cylinder, +cylinders or +size{K,M,G} (1-13054, default 13054): +10G Command (m for help): t Partition number (1-4): Value out of range. Partition number (1-4): 1 Hex code (type L to list codes): fd Changed system type of partition 1 to fd (Linux raid autodetect)
2、用mdadm工具创建RAID1
-C:指明创建的磁盘 md0
-n 2: 使用两块设备来创建
-l 1: 指明创建RAID级别为RAID1
-c 128: 指明CHUNK大小为128
-x 1: 指明空闲盘数为1
[root@localhost ~]# mdadm -C md0 -n 2 -l 1 -c 128 -x 1 /dev/sdb{1,2,3} mdadm: /dev/sdb1 appears to contain an ext2fs file system size=10490412K mtime=Mon Feb 27 13:44:42 2017 mdadm: Note: this array has metadata at the start and may not be suitable as a boot device. If you plan to store '/boot' on this device please ensure that your boot-loader understands md/v1.x metadata, or use --metadata=0.90 Continue creating array? Continue creating array? (y/n) y mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md/md0 started.
3、mdadm -D 参数显示创建RAID的详细信息
[root@localhost ~]# mdadm -D /dev/md/md0 /dev/md/md0: Version : 1.2 Creation Time : Sun Mar 5 15:45:56 2017 Raid Level : raid1 Array Size : 10482176 (10.00 GiB 10.73 GB) Used Dev Size : 10482176 (10.00 GiB 10.73 GB) Raid Devices : 2 Total Devices : 3 Persistence : Superblock is persistent Update Time : Sun Mar 5 15:46:29 2017 State : clean, resyncing Active Devices : 2 Working Devices : 3 Failed Devices : 0 Spare Devices : 1 Resync Status : 11% complete Name : localhost.localdomain:md0 (local to host localhost.localdomain) UUID : 50c34387:f13ce1b2:1087d348:1fe1ebef Events : 1 Number Major Minor RaidDevice State 0 8 17 0 active sync /dev/sdb1 1 8 18 1 active sync /dev/sdb2 2 8 19 - spare /dev/sdb3
6、创建一个大小为4G的RAID5设备,chunk大小为256k,格式化ext4文件系统,要求可开机自动挂载至/backup目录,而且不更新访问时间戳,且支持acl功能;
1、创建3块空间为2G的分区,并调整类型为fd,创建过程同上。
2、创建RAID5
[root@localhost ~]# mdadm -C /dev/md1 -l 5 -n 3 -c 256 -a yes /dev/sdb{5,6,7} mdadm: Defaulting to version 1.2 metadata mdadm: array /dev/md1 started. [root@localhost ~]# mdadm -D /dev/md1 /dev/md1: Version : 1.2 Creation Time : Sun Mar 5 16:05:48 2017 Raid Level : raid5 Array Size : 4204544 (4.01 GiB 4.31 GB) Used Dev Size : 2102272 (2.00 GiB 2.15 GB) Raid Devices : 3 Total Devices : 3 Persistence : Superblock is persistent Update Time : Sun Mar 5 16:07:35 2017 State : clean Active Devices : 3 Working Devices : 3 Failed Devices : 0 Spare Devices : 0 Layout : left-symmetric Chunk Size : 256K Name : localhost.localdomain:1 (local to host localhost.localdomain) UUID : ea6f54f2:c745274e:f56132bc:a84d4cad Events : 18 Number Major Minor RaidDevice State 0 8 21 0 active sync /dev/sdb5 1 8 22 1 active sync /dev/sdb6 3 8 23 2 active sync /dev/sdb7
#] mkfs.ext4 /dev/md1 #格式化为ext4文件系统; #创建目录 /backup ]# mkdir /backup #修改配置文件,设置开机自动挂载至/backup; ]# echo "/dev/md1 /backup ext4 defaults,noatime,acl 0 0" >>/etc/fstab
7、写一个脚本
(1) 传递两个以上字符串当作用户名;
(2) 创建这些用户;且密码同用户名;
(3) 总结说明共创建了几个用户;
#!/bin/bash # addu.sh # 创建多个用户,并设置用户名与密码相同 # 脚本接受至少2个参数作为用户名 # declare -i count=0 # 重定向输出文件描述符 exec 3>$1 exec 3>&2 exec 1>/dev/null exec 2>/dev/null # # 检查脚本参数个数 if [ $# -ge 2 ];then for user in $@;do # 判断用户是否存在,如不存在,则添加用户,并设置密码与用户名相同 if ! id $user;then useradd $user && echo $user | passwd --stdin $user && (( count++ )) fi done echo "成功添加用户$count个。" >&3 else echo "至少需传递两个参数作为用户名" >&3 fi # 恢复重定向文件描述符 exec 1>&3 exec 2>&3 # 关闭创建的文件描述符 exec 3>&- ~
测试脚本: [root@localhost script]# bash addu.sh user1 至少需传递两个参数作为用户名 [root@localhost script]# bash addu.sh user1 user2 成功添加用户2个。 [root@localhost script]# bash addu.sh user1 user2 user3 成功添加用户1个。 [root@localhost script]# bash addu.sh user1 user2 user3 成功添加用户0个。 [root@localhost script]#
8、写一脚本,分别统计/etc/rc.d/rc.sysinit、/etc/rc.d/init.d/functions和/etc/fstab文件中以#号开头的行数之和,以及总的空白行数;
[root@localhost script]# vim cnt.sh #!/bin/bash # cnt.sh # 统计/etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/fstab # 以#开头行数之和,以及总空白行 declare -i count1=0 declare -i count2=0 file="/etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/fstab" for f in $file;do if [ -f $f ];then count1=$(grep '^#' $f | wc -l) count2=$(grep '^$' $f | wc -l) echo "$f 文件以#开头有:$count1 行;空白行为:$count2" fi done
测试脚本:
[root@localhost script]# bash cnt.sh /etc/rc.d/rc.sysinit 文件以#开头有:44 行;空白行为:99 /etc/rc.d/init.d/functions 文件以#开头有:42 行;空白行为:76 /etc/fstab 文件以#开头有:7 行;空白行为:1
9、写一个脚本,显示当前系统上所有,拥有附加组的用户的用户名;并说明共有多少个此类用户;
#!/bin/bash # # hasmultgrp.sh # declare -i count=0 declare -i cnt=0 user=$(awk -F: '{print $1}' /etc/passwd| sed 's/[[:space:]]*//') echo -n "以下用户拥有附加组:" for i in $user;do count=$(id -G $i | awk -F' ' '{print NF}') if [ $count -ge 2 ];then echo -n "$i " (( cnt++ )) fi done echo echo "拥有附加组的用户共有$cnt个"
测试脚本:
[root@localhost script]# bash hasmulgrp.sh 以下用户拥有附加组:bin daemon adm postfix user1 user3 user4 拥有附加组的用户共有7个
10、创建一个由至少两个物理卷组成的大小为20G的卷组;要求,PE大小为8M;而在卷组中创建一个大小为5G的逻辑卷mylv1,格式化为ext4文件系统,开机自动挂载至/users目录,支持acl;
1、本次实验通过两块硬盘的3个分区来创建20G卷组,sdb8:8G,sdc1:6G,sdc2:6G,并调整分区类型为8e。创建分区过程在此略过。
[root@localhost ~]# fdisk -l /dev/sd{b,c} | grep '8e' /dev/sdb8 4705 5749 8393931 8e Linux LVM /dev/sdc1 1 784 6297448+ 8e Linux LVM /dev/sdc2 785 1568 6297480 8e Linux LVM
2、用3个分区创建3个物理卷,通过pvcreate命令来创建,pvdisplay来显示物理卷
[root@localhost ~]# pvcreate /dev/sdb8 Physical volume "/dev/sdb8" successfully created [root@localhost ~]# pvcreate /dev/sdc1 Physical volume "/dev/sdc1" successfully created [root@localhost ~]# pvcreate /dev/sdc2 Physical volume "/dev/sdc2" successfully created [root@localhost ~]# pvdisplay -C PV VG Fmt Attr PSize PFree /dev/sda2 VolGroup lvm2 a-- 79.51g 0 /dev/sdb8 lvm2 --- 8.01g 8.01g /dev/sdc1 lvm2 --- 6.01g 6.01g /dev/sdc2 lvm2 --- 6.01g 6.01g
3、创建卷组MyVG,使用vgcreate -s 8创建pe=8M的卷组,vgs显示卷组简要信息
[root@localhost ~]# vgcreate -s 8 MyVG /dev/sdb8 /dev/sdc{1,2} Volume group "MyVG" successfully created [root@localhost ~]# vgs VG #PV #LV #SN Attr VSize VFree MyVG 3 0 0 wz--n- 20.00g 20.00g
4、创建5G大小逻辑卷mylv1,使用命令lvcreate
[root@localhost ~]# lvcreate -L 5G -n mylv1 MyVG Logical volume "mylv1" created. [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv1 MyVG -wi-a----- 5.00g
5、格式化为ext4文件系统,并挂载至/user目录下,支持acl,开机自动挂载
[root@localhost ~]# mkfs.ext4 /dev/MyVG/mylv1 ..... Writing inode tables: done Creating journal (32768 blocks): done Writing superblocks and filesystem accounting information: done ..... [root@localhost ~]# mkdir /user [root@localhost ~]# mount /dev/MyVG/mylv1 /user/ [root@localhost ~]# echo -e "/dev/mapper/MyVG-mylv1\t/user\text4\tdefault,acl\t0 0">>/etc/fstab
11、扩展mylv1至9G,确保扩展完成后原有数据完全可用;
1、在/user目录下创建目录mydata,复制部分数据至改目录
2、扩展逻辑卷通过命令lvextend, -L指定扩展大小,使用resize2fs来修复逻辑卷大小上的改变
[root@localhost script]# lvextend -L 9G /dev/MyVG/mylv1 Size of logical volume MyVG/mylv1 changed from 5.00 GiB (640 extents) to 9.00 GiB (1152 extents). Logical volume mylv1 successfully resized [root@localhost script]# resize2fs /dev/MyVG/mylv1 resize2fs 1.41.12 (17-May-2010) Filesystem at /dev/MyVG/mylv1 is mounted on /user; on-line resizing required old desc_blocks = 1, new_desc_blocks = 1 Performing an on-line resize of /dev/MyVG/mylv1 to 2359296 (4k) blocks. The filesystem on /dev/MyVG/mylv1 is now 2359296 blocks long.
[root@localhost script]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv1 MyVG -wi-ao---- 9.00g
3、确认数据可以性
[root@localhost script]# pwd /user/mydata/script [root@localhost script]# ls addu.sh cnt.sh getdisk.sh hasmulgrp.sh ks.sh nine.sh ping2.sh ping.sh user1 [root@localhost script]# less cnt.sh #!/bin/bash # cnt.sh declare -i count1=0 declare -i count2=0 file="/etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/fstab"
12、缩减mylv1至7G,确保缩减完成后原有数据完全可用;
1、缩减逻辑卷前需要先卸载,检查文件系统
[root@localhost ~]# umount /user/ [root@localhost ~]# e2fsck -f /dev/MyVG/mylv1 e2fsck 1.41.12 (17-May-2010) Pass 1: Checking inodes, blocks, and sizes Pass 2: Checking directory structure Pass 3: Checking directory connectivity Pass 4: Checking reference counts Pass 5: Checking group summary information /dev/MyVG/mylv1: 24/589824 files (0.0% non-contiguous), 72726/2359296 blocks
2、改变逻辑卷大小为7G
[root@localhost ~]# resize2fs /dev/MyVG/mylv1 7G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/MyVG/mylv1 to 1835008 (4k) blocks. The filesystem on /dev/MyVG/mylv1 is now 1835008 blocks long. [root@localhost ~]# resize2fs /dev/MyVG/mylv1 7G resize2fs 1.41.12 (17-May-2010) Resizing the filesystem on /dev/MyVG/mylv1 to 1835008 (4k) blocks. The filesystem on /dev/MyVG/mylv1 is now 1835008 blocks long.
3、lvreduce缩减逻辑卷大小7G
[root@localhost ~]# lvreduce -L 7G /dev/MyVG/mylv1 WARNING: Reducing active logical volume to 7.00 GiB THIS MAY DESTROY YOUR DATA (filesystem etc.) Do you really want to reduce mylv1? [y/n]: y Size of logical volume MyVG/mylv1 changed from 9.00 GiB (1152 extents) to 7.00 GiB (896 extents). Logical volume mylv1 successfully resized [root@localhost ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv1 MyVG -wi-a----- 7.00g
4、重新挂载逻辑卷,并检查数据可用性
[root@localhost ~]# mount /dev/MyVG/mylv1 /user/ [root@localhost script]# pwd /user/mydata/script [root@localhost script]# less cnt.sh #!/bin/bash # cnt.sh declare -i count1=0 declare -i count2=0 file="/etc/rc.d/rc.sysinit /etc/rc.d/init.d/functions /etc/fstab"
13、对mylv1创建快照,并通过备份数据;要求保留原有的属主属组等信息;
1、创建名为snap_mylv1的快照,lvcreate命令:-s指定创建快照
[root@localhost ~]# lvcreate -L 7G -p r -s -n snap_mylv1 /dev/MyVG/mylv1 Logical volume "snap_mylv1" created. [root@localhost mydata]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert mylv1 MyVG owi-aos--- 7.00g snap_mylv1 MyVG sri-a-s--- 7.00g mylv1 0.00
2、查看快照
[root@localhost mydata]# ll /dev/MyVG/ total 0 lrwxrwxrwx. 1 root root 7 Mar 5 18:24 mylv1 -> ../dm-3 lrwxrwxrwx. 1 root root 7 Mar 5 18:24 snap_mylv1 -> ../dm-6
3、挂载快照至/snap
[root@localhost mydata]# mkdir /snap [root@localhost mydata]# mount /dev/MyVG/snap_mylv1 /snap/ mount: block device /dev/mapper/MyVG-snap_mylv1 is write-protected, mounting read-only [root@localhost mydata]# df -hP Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 4.3G 43G 10% / tmpfs 940M 76K 939M 1% /dev/shm /dev/sda1 477M 42M 410M 10% /boot /dev/mapper/VolGroup-lv_home 26G 46M 24G 1% /home /dev/mapper/MyVG-mylv1 6.8G 12M 6.5G 1% /user /dev/mapper/MyVG-snap_mylv1 6.8G 12M 6.5G 1% /snap
4、创建一个100M大小的文件,比对快照与原始逻辑卷的空间
[root@localhost user]# dd if=/dev/zero of=test bs=2048k count=50 50+0 records in 50+0 records out 104857600 bytes (105 MB) copied, 0.408157 s, 257 MB/s [root@localhost user]# df -hP Filesystem Size Used Avail Use% Mounted on /dev/mapper/VolGroup-lv_root 50G 4.3G 43G 10% / tmpfs 940M 76K 939M 1% /dev/shm /dev/sda1 477M 42M 410M 10% /boot /dev/mapper/VolGroup-lv_home 26G 46M 24G 1% /home /dev/mapper/MyVG-mylv1 6.8G 112M 6.4G 2% /user /dev/mapper/MyVG-snap_mylv1 6.8G 12M 6.5G 1% /snap
14、如何将Linux主机接入到TCP/IP网络,请描述详细的步骤。(手动指定的方式)
1、将linux主机添加至TCP/IP网络。在CENTOS6系列,编辑/etc/sysconfig/network-scripts/ifcfg-eth0文件,设定IPADDR,NETMASK,GATEWAY,DNS1,BOOTPROTO等信息
[root@localhost ~]# vi /etc/sysconfig/network-scripts/ifcfg-eth0 [root@localhost network-scripts]# less ifcfg-eth0 DEVICE=eth0 HWADDR=00:0c:29:97:c0:34 TYPE=Ethernet #指明接口类型 UUID=140eddab-b7cc-4ec7-afd0-df43c15b5402 ONBOOT=yes #在系统的引导过程中,是否激活此接口 NM_CONTROLLED=yes BOOTPROTO=static IPADDR=172.16.100.10 NETMASK=255.255.255.0 GATEWAY=172.16.100.1 DNS1=114.114.114.114 IPV6INIT=no USERCTL=no
2、重启网络服务生效
[root@localhost ~]# service network restart
15、为Linux主机配置网络信息的方式有哪些,请描述各个过程。
1)使用命令ifconfig eth0 172.16.100.10 临时立即生效,重启系统后失效
2)使用命令ip addr add 172.16.100.10/24 dev eth0 临时立即生效,重启系统后失效
3)修改网卡配置 vim /etc/sysconfig/network-scripts/ifcfg-eth0 需要重启服务后生效
4)使用图形界面 setup--网络配置 修改后重启服务
16、写一个脚本,使用ping命令探测172.16.250.1-172.16.250.254之间的所有主机的在线状态;
在线的主机使用绿色显示;
不在线的主使用红色显示;
#!/bin/bash # # ping.sh # ping命令探测主机状态,在线显示绿色,不在线显示红色 net="172.16.250." for h in $(seq 1 20);do ping -c 1 -w 1 $net$h &>/dev/null && echo -e "\033[32m $net$h \033[0m" || echo -e "\033[31m $net$h \033[m" done
17、常用的网络管理类工具有哪些,并用示例形式描述他们的使用方法。
18、写一个脚本,完成以下功能
(1) 假设某目录(/etc/rc.d/rc3.d/)下分别有K开头的文件和S开头的文件若干;
(2) 显示所有以K开头的文件的文件名,并且给其附加一个stop字符串;
(3) 显示所有以S开头的文件的文件名,并且给其附加一个start字符串;
(4) 分别统计S开头和K开头的文件各有多少;
#!/bin/bash # # 统计/etc/rc.d/rc3.d目录下S开头和K开头文件个数 # 并将这些文件显示出来 dir="/etc/rc.d/rc3.d" if [ -d $dir ];then kfile=$(ls $dir | grep '^K') sfile=$(ls $dir | grep '^S') kcnt=$(echo $kfile | wc -w) scnt=$(echo $sfile | wc -w) for f in $kfile;do echo "$f stop" done for f in $sfile;do echo "$f start" done echo "S开头文件有$scnt个,K开头文件有$kcnt个"
19、写一脚本,用ping命令测试172.16.250.20-172.16.250.100以内有哪些主机在线,将在线的显示出来;
#!/bin/bash # # net="172.16.250." echo "172.16.250.20-100在线主机为:" for i in $(seq 20 100);do ping -c 1 -w 1 $net$i &>/dev/null && echo "$net$i" done ~
20、打印九九乘法表;
[root@localhost script]# vim nine.sh #!/bin/bash # # # 打印九九乘法表 for i in $(seq 1 9);do for j in $(seq 1 $i);do echo -e -n "${i}x${j}=$[$i*$j]\t" done echo done
脚本测试:
[root@localhost script]# bash nine.sh 1x1=1 2x1=2 2x2=4 3x1=3 3x2=6 3x3=9 4x1=4 4x2=8 4x3=12 4x4=16 5x1=5 5x2=10 5x3=15 5x4=20 5x5=25 6x1=6 6x2=12 6x3=18 6x4=24 6x5=30 6x6=36 7x1=7 7x2=14 7x3=21 7x4=28 7x5=35 7x6=42 7x7=49 8x1=8 8x2=16 8x3=24 8x4=32 8x5=40 8x6=48 8x7=56 8x8=64 9x1=9 9x2=18 9x3=27 9x4=36 9x5=45 9x6=54 9x7=63 9x8=72 9x9=81