IcingTomato's Archive Enjoy it while it lasts, because it never does.

【新品开箱】Make Windows Great Again

补记 电源计划 卓越性能,启动! powercfg -duplicatescheme e9a42b02-d5df-448d-aa00-03f14749eb61 显示成功。但在电源计划里依然没有显示卓越性能。 此时需要修改注册表的CSEnabled值,但CSEnabled不见了(之前有的),所以应该在管理员模式下的 cmdlet 敲 reg add HKLM\System\CurrentControlSet\Control\Power /v PlatformAoAcOverride /t REG_DWORD /d 0 问了一下 Premier 事业部的同事,他们说目前据了解20H2取消了csenable更改来设置高性能,需要指令调用。 ==================================== 如何优雅地使用 Windows 作为开发环境。 如何使用 WSL 在 Windows 上优雅地安装 Linux 检视你电脑的版本 必须是运行 Windows 10 版本 2004 及更高版本(内部版本 19041 及更高版本)或 Windows 11 的电脑才能优雅。其他的版本可以参阅手动安装页,但是不优雅。 安装 WSL 优雅的命令 现在,可以使用单个命令安装运行 WSL 所需的一切内容。 在管理员模式下打开 PowerShell 或 Windows 命令提示符,方法是右键单击并选择“以管理员身份运行”,输入 wsl --install 命令,然后重启计算机。 wsl --install 此命令将启用运行 WSL 并安装 Linux 的 Ubuntu 发行版所需的功能。 (可以更改此默认发行版)。 如果你运行的是旧版,或只是不想使用 install 命令并希望获得分步指引,请参阅旧版 WSL 手动安装步骤。 首次启动新安装的 Linux 发行版时,将打开一个控制台窗口,要求你等待将文件解压缩并存储到计算机上。 未来的所有启动时间应不到一秒。 上述命令仅在完全未安装 WSL 时才有效,如果运行 wsl –install 并查看 WSL 帮助文本,请尝试运行 wsl –list –online 以查看可用发行版列表并运行 wsl –install -d 以安装发行版。 若要卸载 WSL,请参阅卸载旧版 WSL 或注销或卸载 Linux 发行版。 更改默认安装的 Linux 发行版 默认情况下,安装的 Linux 分发版为 Ubuntu。 可以使用 -d 标志进行更改。 若要更改安装的发行版,请输入:wsl --install -d <Distribution Name>。 将 <Distribution Name> 替换为要安装的发行版的名称。 若要查看可通过在线商店下载的可用 Linux 发行版列表,请输入:wsl --list --online 或 wsl -l -o。 若要在初始安装后安装其他 Linux 发行版,还可使用命令:wsl --install -d <Distribution Name>。 如果要通过 Linux/Bash 命令行(而不是通过 PowerShell 或命令提示符)安装其他发行版,必须在命令中使用 .exe:wsl.exe --install -d <Distribution Name> 或若要列出可用发行版,则使用:wsl.exe -l -o。 Ubuntu 不够你用是吧? 将版本从 WSL 1 升级到 WSL 2 使用 wsl --install 命令安装的新 Linux 安装将默认设置为 WSL 2。 wsl --set-version 命令可用于从 WSL 2 降级到 WSL 1,或将以前安装的 Linux 发行版从 WSL 1 更新到 WSL 2。 要查看 Linux 发行版是设置为 WSL 1 还是 WSL 2,请使用命令 wsl -l -v。 要更改版本,请使用 wsl --set-version <distro name> 2 命令将 <distro name> 替换为要更新的 Linux 发行版的名称。 例如,wsl --set-version Ubuntu-20.04 2 会将 Ubuntu 20.04 发行版设置为使用 WSL 2。 如果在 wsl --install 命令可用之前手动安装了 WSL,则可能还需要启用 WSL 2 所使用的虚拟机可选组件并安装内核包(如果尚未这样做)。 WSL 子系统访问宿主机的 Proxy 在 WSL 里面新建一个 setProxy.sh , 然后把这个复制进去: #!/bin/bash hostip=$(cat /etc/resolv.conf | grep nameserver | awk '{ print $2 }') wslip=$(hostname -I | awk '{print $1}') port=7890 PROXY_HTTP="http://${hostip}:${port}" set_proxy(){ export http_proxy="${PROXY_HTTP}" export HTTP_PROXY="${PROXY_HTTP}" export https_proxy="${PROXY_HTTP}" export HTTPS_PROXY="${PROXY_HTTP}" git config --global http.proxy "${PROXY_HTTP}" git config --global https.proxy "${PROXY_HTTP}" # 设置APT代理 echo "Acquire::http::Proxy \"${PROXY_HTTP}\";" | sudo tee /etc/apt/apt.conf.d/95proxies > /dev/null echo "Acquire::https::Proxy \"${PROXY_HTTP}\";" | sudo tee -a /etc/apt/apt.conf.d/95proxies > /dev/null } unset_proxy(){ unset http_proxy unset HTTP_PROXY unset https_proxy unset HTTPS_PROXY git config --global --unset http.proxy git config --global --unset https.proxy # 移除APT代理设置 sudo rm /etc/apt/apt.conf.d/95proxies } test_setting(){ echo "Host ip:" ${hostip} echo "WSL ip:" ${wslip} echo "Current proxy:" $https_proxy } if [ "$1" = "set" ] then set_proxy elif [ "$1" = "unset" ] then unset_proxy elif [ "$1" = "test" ] then test_setting else echo "Unsupported arguments." fi 理论上是所有系统都可以这样做 然后 chmod +x setProxy.sh , 最后要设置的时候就 source ./setProxy.sh set 就行了。 PowerShell 美化 Scoop包管理器: Scoop 是 Windows 的命令行安装程序。使用 Scoop,可以为终端安装程序和插件。 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex scoop search - 搜索软件 scoop install - 安装软件 scoop info - 查看软件详细信息 scoop list - 查看已安装软件 scoop uninstall - 卸载软件,-p删除配置文件。 scoop update - 更新 scoop 本体和软件列表 scoop update - 更新指定软件 scoop update * - 更新所有已安装的软件 scoop checkup - 检查 scoop 的问题并给出解决问题的建议 scoop help - 查看命令列表 scoop help - 查看命令帮助说明* gsudo(提权) gsudo 是 sudo 在 Windows 的等价物,具有与原始 Unix/Linux sudo 相似的用户体验。允许在当前控制台窗口或新控制台窗口中以提升的权限运行命令,或提升当前 shell。 只需 gsudo 将(或sudo别名)添加到您的命令中,它就会以提升的方式运行。 ###GSUDO #安装: scoop install gsudo #导入配置文件内$PROFILE: # 添加以下这行 Import-Module (Get-Command 'gsudoModule.psd1').Source # 或者运行这行命令: Get-Command gsudoModule.psd1 | % { Write-Output "`nImport-Module `"$($_.Source)`"" | Add-Content $PROFILE } #在PowerShell中执行notepad $PROFILE,打开文件。 #在其中添加: Set-alias 'su' 'gsudo' Set-alias 'sudo' 'gsudo' .$PROFILE使配置生效 # gsudo如果用户选择启用缓存,则可以提升多次,仅显示一个 UAC 弹出窗口。 # 凭据缓存 使用 手动启动/停止缓存会话gsudo cache {on | off}。 使用 停止所有缓存会话gsudo -k。 可用的缓存模式: Disabled:每次提权都会显示一个 UAC 弹出窗口。 Explicit:(默认)每次提权都会显示一个 UAC 弹出窗口,除非缓存会话以gsudo cache on Auto:类似于 unix-sudo。第一个提权显示 UAC 弹出窗口并自动启动缓存会话。 使用更改缓存模式gsudo config CacheMode Disabled|Explicit|Auto Git 和 posh-git ###SCOOP安装GIT scoop bucket add main scoop install git #验证GIT安装: git --version #模块安装posh-git Install-Module posh-git -Scope AllUser -Force #notepad $PROFILE打开配置档案,添加以下: Import-Module posh-git #配置完成后,运行.$PROFILE,使得修改生效 # 克隆任何 GitHub 存储库,以测试在输入常用 git 命令时 posh-git的反映: git clone https://github.com/dahlbyk/posh-git cd posh-git PSReadline 语法定制 PSReadLine 是微软创建的一个模块,用于自定义 PowerShell 中的命令行编辑环境。它提供了大量的定制,可以改变命令行编辑器以多种方式呈现数据的方式。 # 安装 Install-Module PSReadLine # 配置文件: Import-Module PSReadLine fzf fzf 是一个用于命令行的模糊文件查找器。 这将为当前文件夹层次结构中的文件启用搜索机制,或者能够查看您之前使用的先前命令。 要使用 PSFzf,您必须先安装 fzf。 # 首先,需要通过SCOOP安装 scoop install fzf # 第二步,安装模块: Install-Module PSFzf # 配置文件: Import-Module PSFzf Set-PsFzfOption -PSReadLineChordProvider ‘Ctrl+f’ -PSReadLineChordReverseHistory ‘Ctrl+r’ ### #Ctrl+f您可以在当前文件夹和子文件夹中搜索文件。 #您可以通过Ctrl+r列表查看使用过的命令的历史记录。 z z 可让您根据cd命令历史记录在 PowerShell 中快速浏览文件系统。 z 也是经常使用的模块之一,它有助于快速导航到常用目录, Install-Module -Name z Neovim scoop install neovim Powershell 升级 iex "& { $(irm https://aka.ms/install-powershell.ps1) } -UseMSI" Git 一键推送 新建一个 git_push.ps1: # PowerShell Script to Perform Git Operations with User-Inputted Path # Prompt for the path to the Git repository $repoPath = Read-Host -Prompt "Enter the path to your git repository" # Change to the specified directory cd $repoPath # Update git git pull # Add all changes to staging git add --all # Prompt for a commit message $commitMessage = Read-Host -Prompt "Enter your commit message" # Commit the changes git commit -m "$commitMessage" # Push the changes to the remote repository git push # Back to the origin folder cd .. 倒叙之前因后果 11月月初俺爹斥巨资给我换了个笔记本电脑 可能有人要“素质三连”了 Surface Pro 9 不是有酷睿版吗?SQ3 版不是很垃圾吗?有这个钱为什么不买苹果? 首先就是全功能 Type-C 接口,两个接口可以提供视频,音频,数据传输,更重要的是可以充电。这不比原装的那个方便?带个小米67W就可以搞定手机和电脑的充电了。酷睿版就八行,只能拿那个笨笨的充电器充电。 5G 网络说实在真的很香,之前在学校办的移动的号,大流量卡,装这个上面,基本上是全天在线,很舒服。 之前去上海面试的时候,在高铁上就可以用电脑来办公,还能追追剧。 随身WiFi稍微麻烦了点,比如我现在也在用华为的。 再来就是这个屏幕了,这个屏幕香不香我不知道,主要是能触屏,MacBook那么多年也不能触屏。(估计有人就要骂我,说苹果触控板好用,我只能说,我不喜欢,我喜欢触屏) 说它是个大号平板也不为过,我现在就是拿着它在写这篇文章,很舒服。安卓平板根本打不过,如果说我要用安卓应用,Windows还有安卓子系统。 8cx Gen 3 跑分啥的对我来说确实不重要,抛开实际体验的跑分都是耍流氓。 实际体验下来没啥用不了的应用,转译慢就慢我还能摸摸鱼。Python脚本可以跑,我用的是 Anaconda 的环境,没啥问题。IDE用的 VSCode,有原生 ARM64 版本,也没啥问题。VS也能用,还能编译x64/x86的程序,也没啥问题。

【阅板无数】LinkIt Smart 7688/Duo 考古

【阅板无数】LinkIt™ Smart 7688/Duo 使用手册 MT7688 是一个由联发科技(MediaTek)开发的高性能无线SoC(System on Chip)。它主要用于驱动智能家居和物联网(IoT)设备。MT7688 芯片支持 802.11n Wi-Fi 标准,能够提供高速的无线连接。此外,它通常包括多种接口和功能,比如 USB、GPIO、以太网接口,以及内存和存储接口,这使得它能够灵活地应用于各种设备和应用场景中。 参考网站 (MIPS 24KEc) MT7688 (LinkIt Smart 7688) Build OpenWRT - 司徒的教學網站 LinkIt Smart 7688/Duo - Mediatek LinkIt Smart 7688/Duo - SeeedStudio Wiki 讲真,Seeed 做的东西都是好东西,但是就是不好好维护 编译 OpenWRT 截至博客发布日期,我按照网上的教程编译来编译去都用不了,服了 最后通过 Internet Archive 找到了原始镜像和硬件电路图 IcingTomato/embedded_linux_dev - GitHub # MD5 Check 51107d057bda7ac71baeac3277e6e3d1 Hardware_Schematics.zip 4e40f19c968e45aaa2cc9d36c3095f03 LinkIt_Smart_7688_Firmware_upgrade.zip 2438f95e0466a454d491c8029e509d6e Manual.zip 1fb86b892294d3082d8a05d450108c76 MediaTek_LinkIt_Smart_7688_bootloader_v0.8.2.zip 40717f554a8f455df62b238274db1fe4 MediaTek_LinkIt_Smart_7688_firmware_v0.9.2.zip 9e8a7237d8f0c55add7e685a12cf7d12 swapsd.sh 其中 swapsd.sh 用于将系统从内置闪存切换到外置 SD 卡,并添加 swap 分区

【嵌入式实践】Amazon Alexa on M5Core2

如何用 ESP32 制作一个语音助手 Amazon Alexa for M5Stack M5Core2(ESP32) 0. Briefing of Alexa Amazon Alexa, also known simply as Alexa, is a virtual assistant technology largely based on a Polish speech synthesiser named Ivona, bought by Amazon in 2013. It was first used in the Amazon Echo smart speaker and the Echo Dot, Echo Studio and Amazon Tap speakers developed by Amazon Lab126. It is capable of voice interaction, music playback, making to-do lists, setting alarms, streaming podcasts, playing audiobooks, and providing weather, traffic, sports, and other real-time information, such as news. Alexa can also control several smart devices using itself as a home automation system. Users are able to extend the Alexa capabilities by installing “skills” (additional functionality developed by third-party vendors, in other settings more commonly called apps) such as weather programs and audio features. It uses automatic speech recognition, natural language processing, and other forms of weak AI to perform these tasks. Most devices with Alexa allow users to activate the device using a wake-word (such as Alexa or Amazon); other devices (such as the Amazon mobile app on iOS or Android and Amazon Dash Wand) require the user to click a button to activate Alexa’s listening mode, although, some phones also allow a user to say a command, such as “Alexa” or “Alexa wake”. 1. Introduction Source Code is here Amazon Alexa on M5Core2 and M5Core2 for AWS You can use M5Core2Alexa like using a real Amazon Echo (sometimes, not always). You can ask M5Alexa questions like “Alexa, what time is sunrise?” or ask her into Japanese 「アレクサ、今何時ですか?」, or maybe you can control your lights and fans (I don’t have any Alexa-supported IoT devices). 2. Development Setup This sections talks about setting up your development host, fetching the git repositories, and instructions for build and flash. 2.1 Host Setup You should install drivers and support packages for your development host. Windows, Linux and Mac OS-X, are supported development hosts. Please see Get Started for the host setup instructions. 2.2 Getting the Repositories git clone --recursive https://github.com/espressif/esp-idf.git cd esp-idf; git checkout release/v4.2; git submodule init; git submodule update --init --recursive; ./install.sh cd .. git clone https://github.com/IcingTomato/AlexaM5Core2.git 2.3 Building the Firmware cd AlexaM5Core2/examples/amazon_alexa/ export ESPPORT=/dev/ttyUSB0 (or /dev/ttycu.SLAB_USBtoUART macOS or COMxx on MinGW) export IDF_PATH=/path/to/esp-idf . $IDF_PATH/export.sh Set audio_board path for M5Core2 and AWS_EDUKIT_PATH: export AUDIO_BOARD_PATH=/path/to/AlexaM5Core2/components/audio_hal/audio_board/audio_board_m5_core2_aws export AWS_EDUKIT_PATH=/path/to/AlexaM5Core2/components/core2forAWS Menuconfig is avaliable, also you can change some components: idf.py menuconfig 3. Configuration Steps Here are the steps to configure the M5Core2: On first boot-up, the M5Core2 is in configuration mode. This is indicated by Orange LED pattern. Please ensure that the LED pattern is seen as described above, before you proceed. Launch the phone app. Select the option Add New Device. A list of devices that are in configuration mode is displayed. Note that the devices are discoverable over BLE (Bluetooth Low Energy). Please ensure that the phone app has the appropriate permissions to access Bluetooth (on Android the Location permission is also required for enabling Bluetooth). Now you can sign-in to your Amazon Alexa account. If you have Amazon Shopping app installed on the same phone, app will automatically sign-in with the account the shopping app is signed in to. Otherwise it will open a login page on the phone’s default browser. (It is recommended to install the Amazon Shopping app on your phone to avoid any other browser related errors.) You can now select the Wi-Fi network that the M5Core2 should connect with, and enter the credentials for this Wi-Fi network. On successful Wi-Fi connection, you will see a list of few of the voice queries that you can try with the M5Core2. You are now fully setup. You can now say “Alexa” followed by the query you wish to ask. 4. Troubleshooting 4.1 Music and radio playback (Audible or Podcast) are not supported on this device. According to Espressif Official, music and radio playback (Audible or Podcast) services are not supported on Non-Amazon-Official products. Unfortunately, Amazon music functionality needs whitelisted product. Only the commercial products are whitelisted by Amazon. Let us know if you are going to commercialise it. 4.2 Alarm Dismiss doesn’t take effect. When the alarm on, you cannot say “Alexa, stop alarm” to dismiss the alarm. I dno’t know why… So, if you want to stop the alarm, you can touch the middle “button” on M5Core2. The middle “button” can also wake up Alexa.

【运维实践】什么是LVM?

深入浅出讲述 Linux 上的 LVM (Logical Volume Manager 逻辑卷管理) 想象一个情况,我在网上买了个新电脑,自带 Windows 10 操作系统。512GiB 的硬盘我不想分区直接用,过了三个月: 它快满了,我就添置一块硬盘当仓库盘。但是有些文件太大我还要花时间移动到新的仓库盘上…… 虽然现在传输速度很快,但是还要花时间查找能移动和不能移动的文件确实麻烦。所以现在隆重介绍 LVM 逻辑卷管理。 逻辑卷管理的重点在于 可以弹性调整 FlieSystem 的容量 而不是 注重文件传输效率和数据安全 上面。追求读写效率或者数据保护的可以使用 RAID 。 LVM 可以整合成多个物理硬盘在一起,让这些分区看起来像在一块大硬盘上。而且在将来还可以新增或者移除物理硬盘到 LVM 中。 什么是 LVM : PV, PE, VG, LV 的含义 LVM 全名 Logical Volume Manager ,大陆中文译作 逻辑卷管理。台湾中文翻译成 邏輯捲軸管理員。在这里我觉得用『捲軸』来解释更方便,引用一下鸟哥的解释: 之所以稱為『捲軸』可能是因為可以將 filesystem 像捲軸一樣伸長或縮短之故吧! LVM 的做法是将几个实体的 Partitions分区 (或者 Disks硬盘) 通过软件转换成 LVM 最底层的 “块” (PV) ,然后将这些 “块” 组合成一块庞大的 “硬盘” (VG),接着将这块巨大的 “硬盘” 分割成一个个可以格式化的 “小硬盘” (LV),最终就能挂载使用了。但是为什么这样可以对 FileSystem 进行扩容和缩小呢?其实和一个叫 PE 的东西有关。 Physical Volume, PV, 物理卷 物理卷的理解其实很简单,可以近似看作是我们买来的实体的硬盘。但实际上物理卷(PV) 需要调整 硬盘(Disks)/分区(Partitions) 的 系统识别码(systemID) 为 8e( LVM 的识别码),然后再经过 pvcreate 的指令将它转换成 LVM 最底层的 物理卷(PV) ,之后才能将这些 PV 加以使用。调整 systemID 的方法有三种:gdisk, fdisk 和 parted。 注:gdisk是仅为GPT分区使用,fdisk是仅为MBR分区使用,如果用错的的话主引导记录会被清空,切记切记 Volume Group, VG, 卷组 顾名思义 卷组 就是很多个物理卷的凑成的一个组。就好比小学的时候会分小组,小组里面的每个同学就是物理卷,几个同学组成的一个组就是卷组。同理 VG 就是 LVM 将许多个 PV 整合成的东西。那么 VG 最大可以达到多少呢?这个和 PE物理块 和 LVM 的版本有关。在以前,32位的 Linux 操作系统上的 LVM(lvm1) 一个 LV 最大只能支持65534个 PE,假设使用 Linux 的默认设置(一个 PE 大小为4MiB),那么一个 LV 的最大容量也就只有 4M*65534/(1024M/G)=256GiB。不过在64位的操作系统上 LV 几乎不存在大小限制。(主要还是和寻址有关系) Physical Extent, PE, 物理块 LVM 预设的 PE 大小是 4MiB。它是整个 LVM 的最小存储区块,换句话说就是我们写入的每个文件都是往 PE 里面填充的。简单来说 PE 很像在机械硬盘上划分的磁道。所以调整 PE 大小会影响到 LVM 的最大容量的。但是在 CentOS/Red Hat 6 之后的操作系统普遍采用 lvm2 技术,以及64位 CPU 的出现,因此这个限制不复存在。 Logical Volume, LV, 逻辑卷 最终 一大块 VG 会像切蛋糕一样分成一个个 LV ,这些被切出来的 LV 就是能吃的格式化使用的东西了。 那么问题来了:LV 可以随意划分大小吗?答案是不可以。因为 PE 是 LVM 中最小的存储单位,所以 LV 的大小和 PV 的块数相关。在 Linux 系统中,为了方便我们使用 LVM 管理磁盘,LV 通常被命名为 /dev/vg_name/lv_name 的样子。 此外,前文中提及到 LVM 可以弹性变更 FileSystem 的容量,实际上是通过 “交换PE” 来进行扩容和缩小的操作,将原本逻辑卷LV中的物理块PE移出以缩小容量,将空闲的物理块PE移入现有逻辑卷LV以扩容。如下图: VG 内的 PE 会分给虚线部分的 LV ,如果未来这个 VG 要扩充的话,加上其他的 PV 即可。最重要的是如果 LV 要扩充的话,也可以通过加入 VG 内没有使用到的 PE 来扩充的。 Logical Extent, LE, 逻辑块 逻辑卷LV中可以分配的最小存储单元,在同一卷组VG中LE的大小和PE是相同的,并且一一相对。 LVM 工具 fdisk, gdisk 和 parted fdisk [student@node2 ~]## fdisk /dev/sda 欢迎使用 fdisk (util-linux 2.23.2)。 更改将停留在内存中,直到您决定将更改写入磁盘。 使用写入命令前请三思。 命令(输入 m 获取帮助): <==这里可以输入指令,可以按 m 来查看所有指令 命令(输入 m 获取帮助):m 命令操作 a toggle a bootable flag b edit bsd disklabel c toggle the dos compatibility flag d delete a partition #删除一个分区 g create a new empty GPT partition table G create an IRIX (SGI) partition table l list known partition types m print this menu n add a new partition #增加一个新分区 o create a new empty DOS partition table p print the partition table #打印分区表 q quit without saving changes #不储存直接离开 s create a new empty Sun disklabel t change a partition's system id u change display/entry units v verify the partition table w write table to disk and exit #写入分区表并离开 x extra functionality (experts only) 命令(输入 m 获取帮助): gdisk [student@node2 ~]# gdisk /dev/vda <==仔細看,不要加上數字喔! GPT fdisk (gdisk) version 0.8.6 Partition table scan: MBR: protective BSD: not present APM: not present GPT: present Found valid GPT with protective MBR; using GPT. <==找到了 GPT 的分割表! Command (? for help): <==这里可以输入指令,可以按 ? 来查看所有指令 Command (? for help): ? b back up GPT data to a file c change a partition's name d delete a partition #删除一个分区 i show detailed information on a partition l list known partition types n add a new partition #增加一个新分区 o create a new empty GUID partition table (GPT) p print the partition table #打印分区表 q quit without saving changes #不储存直接离开 r recovery and transformation options (experts only) s sort partitions t change a partition's type code v verify disk w write table to disk and exit #写入分区表并离开 x extra functionality (experts only) ? print this menu Command (? for help): parted [student@node2 ~]# parted /dev/sda GNU Parted 3.1 使用 /dev/sda Welcome to GNU Parted! Type 'help' to view a list of commands. (parted) help align-check TYPE N check partition N for TYPE(min|opt) alignment help [COMMAND] print general help, or help on COMMAND mklabel,mktable LABEL-TYPE create a new disklabel (partition table) mkpart PART-TYPE [FS-TYPE] START END make a partition name NUMBER NAME name partition NUMBER as NAME print [devices|free|list,all|NUMBER] display the partition table, available devices, free space, all found partitions, or a particular partition quit exit program rescue START END rescue a lost partition near START and END resizepart NUMBER END resize partition NUMBER rm NUMBER delete partition NUMBER select DEVICE choose the device to edit disk_set FLAG STATE change the FLAG on selected device disk_toggle [FLAG] toggle the state of FLAG on selected device set NUMBER FLAG STATE change the FLAG on partition NUMBER toggle [NUMBER [FLAG]] toggle the state of FLAG on partition NUMBER unit UNIT set the default unit to UNIT version display the version number and copyright information of GNU Parted (parted) PV 阶段 pvcreate :将实体partition 建立成为 PV ; pvscan :搜寻目前系统里面任何具有 PV 的磁盘; pvdisplay :显示出目前系统上面的 PV 状态; pvremove :将 PV 属性移除,让该partition 不具有PV 属性。 VG 阶段 vgcreate :就是主要建立 VG 的指令; vgscan :搜寻系统上面是否有 VG 存在; vgdisplay :显示目前系统上面的 VG 状态; vgextend :在 VG 内增加额外的 PV ; vgreduce :在 VG 内移除 PV ; vgchange :设定 VG 是否启动(active); vgremove :删除一个 VG 。 LV 阶段 lvcreate :建立 LV ; lvscan :查询系统上面的 LV ; lvdisplay :显示系统上面的 LV 状态; lvextend :在 LV 里面增加容量; lvreduce :在 LV 里面减少容量; lvremove :删除一个 LV ; lvresize :对 LV 进行容量大小的调整。 LVM 实操流程 在这里我们就用 RHel 8 RH134 的题目来演练一下如何调整逻辑卷大小以及创建逻辑卷。 十六、调整逻辑卷大小 1)预先创建 2GiB 的分区/dev/vdb1,并用于创建卷组 testvg 2)创建大小为 200MiB 的逻辑卷/dev/testvg/vo,格式化为 xfs 文件系统,并挂载在/mnt/vo 上 3)将逻辑卷/dev/testvg/vo 及其文件系统大小调整到 300MiB,确保文件系统内容保持不变。 [student@node2 ~]# fdisk /dev/vdb Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Device does not contain a recognized partition table. Created a new DOS disklabel with disk identifier 0xae75bf0a. Command (m for help): n Partition type p primary (0 primary, 0 extended, 4 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (1-4, default 1): First sector (2048-10485759, default 2048): Last sector, +sectors or +size{K,M,G,T,P} (2048-10485759,default 10485759): +2G Created a new partition 1 of type 'Linux' and of size 2 GiB. Command (m for help): w The partition table has been altered. Calling ioctl() to re-read partition table. Syncing disks. [student@node2 ~]# pvcreate /dev/vdb1 [student@node2 ~]# vgcreate testvg /dev/vdb1 [student@node2 ~]# lvcreate -L 200M -n vo testvg [student@node2 ~]# mkfs.xfs /dev/testvg/vo [student@node2 ~]# mkdir /mnt/vo [student@node2 ~]# vim /etc/fstab /dev/testvg/vo /mnt/vo xfs defaults 0 0 [student@node2 ~]# mount -a [student@node2 ~]# df -hT /dev/testvg/vo # 查看文件系统的类型 和大小 Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/testvg-vo xfs 195M 12M 183M 6% /mnt/vo [student@node2 ~]# lvextend -L 300M /dev/testvg/vo [student@node2 ~]# lvs LV VG Attr LSize Pool Origin Data% Meta% Move Log Cpy%Sync Convert vo testvg -wi-ao---- 300.00m # 扩展文件系统,ext 类型的文件系统用 resize2fs /dev/testvg/vo,后面接的是逻辑卷的路径。 [student@node2 ~]# xfs_growfs /mnt/vo # 后面接的是挂载点的路径 [student@node2 ~]# df -hT /dev/testvg/vo Filesystem Type Size Used Avail Use% Mounted on /dev/mapper/testvg-vo xfs 295M 13M 283M 5% /mnt/vo 十八、创建逻辑卷 根据以下要求,创建新的逻辑卷: 1)逻辑卷的名字为 mylv,属于 myvg 卷组,大小为 50 个 pe 2)卷组 myvg 中的逻辑卷的 pe 大小应当为 16MiB 3)使用 vfat 文件系统将逻辑卷 mylv 格式化 4)此逻辑卷应当在系统启动时自动挂载到/mnt/mydata 目录下 [student@node2 ~]# fdisk /dev/vdb Welcome to fdisk (util-linux 2.32.1). Changes will remain in memory only, until you decide to write them. Be careful before using the write command. Command (m for help): n Partition type p primary (2 primary, 0 extended, 2 free) e extended (container for logical partitions) Select (default p): Using default response p. Partition number (3,4, default 3): First sector (5244928-10485759, default 5244928): Last sector, +sectors or +size{K,M,G,T,P} (5244928-10485759,default 10485759): +1G Created a new partition 3 of type 'Linux' and of size 1 GiB. Command (m for help): w The partition table has been altered. Syncing disks. [student@node2 ~]# pvcreate /dev/vdb3 [student@node2 ~]# vgcreate -s 16M myvg /dev/vdb3 [student@node2 ~]# lvcreate -l 50 -n mylv myvg [student@node2 ~]# mkfs.vfat /dev/myvg/mylv [student@node2 ~]# mkdir /mnt/mydata [student@node2 ~]# vim /etc/fstab /dev/myvg/mylv /mnt/mydata vfat defaults 0 0 [student@node2 ~]# mount -a [student@node2 ~]# df -h /mnt/mydata/ Filesystem Size Used Avail Use% Mounted on /dev/myvg/mylv 799M 4.0K 799M 1% /mnt/mydata

【运维实践】HTTP状态码

当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求。当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应浏览器的请求。 HTTP状态码的英文为HTTP Status Code。 下面是常见的HTTP状态码: 200 - 请求成功 301 - 资源(网页等)被永久转移到其它URL 404 - 请求的资源(网页等)不存在 500 - 内部服务器错误 HTTP状态码分类 HTTP状态码由三个十进制数字组成,第一个十进制数字定义了状态码的类型,后两个数字没有分类的作用。HTTP状态码共分为5种类型: HTTP状态码分类 分类 分类描述 1** 信息,服务器收到请求,需要请求者继续执行操作 2** 成功,操作被成功接收并处理 3** 重定向,需要进一步的操作以完成请求 4** 客户端错误,请求包含语法错误或无法完成请求 5** 服务器错误,服务器在处理请求的过程中发生了错误 HTTP状态码列表: HTTP状态码列表 状态码 状态码英文名称 中文描述 100 Continue 继续。客户端应继续其请求 101 Switching Protocols 切换协议。服务器根据客户端的请求切换协议。只能切换到更高级的协议,例如,切换到HTTP的新版本协议 200 OK 请求成功。一般用于GET与POST请求 201 Created 已创建。成功请求并创建了新的资源 202 Accepted 已接受。已经接受请求,但未处理完成 203 Non-Authoritative Information 非授权信息。请求成功。但返回的meta信息不在原始的服务器,而是一个副本 204 No Content 无内容。服务器成功处理,但未返回内容。在未更新网页的情况下,可确保浏览器继续显示当前文档 205 Reset Content 重置内容。服务器处理成功,用户终端(例如:浏览器)应重置文档视图。可通过此返回码清除浏览器的表单域 206 Partial Content 部分内容。服务器成功处理了部分GET请求 300 Multiple Choices 多种选择。请求的资源可包括多个位置,相应可返回一个资源特征与地址的列表用于用户终端(例如:浏览器)选择 301 Moved Permanently 永久移动。请求的资源已被永久的移动到新URI,返回信息会包括新的URI,浏览器会自动定向到新URI。今后任何新的请求都应使用新的URI代替 302 Found 临时移动。与301类似。但资源只是临时被移动。客户端应继续使用原有URI 303 See Other 查看其它地址。与301类似。使用GET和POST请求查看 304 Not Modified 未修改。所请求的资源未修改,服务器返回此状态码时,不会返回任何资源。客户端通常会缓存访问过的资源,通过提供一个头信息指出客户端希望只返回在指定日期之后修改的资源 305 Use Proxy 使用代理。所请求的资源必须通过代理访问 306 Unused 已经被废弃的HTTP状态码 307 Temporary Redirect 临时重定向。与302类似。使用GET请求重定向 400 Bad Request 客户端请求的语法错误,服务器无法理解 401 Unauthorized 请求要求用户的身份认证 402 Payment Required 保留,将来使用 403 Forbidden 服务器理解请求客户端的请求,但是拒绝执行此请求 404 Not Found 服务器无法根据客户端的请求找到资源(网页)。通过此代码,网站设计人员可设置"您所请求的资源无法找到"的个性页面 405 Method Not Allowed 客户端请求中的方法被禁止 406 Not Acceptable 服务器无法根据客户端请求的内容特性完成请求 407 Proxy Authentication Required 请求要求代理的身份认证,与401类似,但请求者应当使用代理进行授权 408 Request Time-out 服务器等待客户端发送的请求时间过长,超时 409 Conflict 服务器完成客户端的 PUT 请求时可能返回此代码,服务器处理请求时发生了冲突 410 Gone 客户端请求的资源已经不存在。410不同于404,如果资源以前有现在被永久删除了可使用410代码,网站设计人员可通过301代码指定资源的新位置 411 Length Required 服务器无法处理客户端发送的不带Content-Length的请求信息 412 Precondition Failed 客户端请求信息的先决条件错误 413 Request Entity Too Large 由于请求的实体过大,服务器无法处理,因此拒绝请求。为防止客户端的连续请求,服务器可能会关闭连接。如果只是服务器暂时无法处理,则会包含一个Retry-After的响应信息 414 Request-URI Too Large 请求的URI过长(URI通常为网址),服务器无法处理 415 Unsupported Media Type 服务器无法处理请求附带的媒体格式 416 Requested range not satisfiable 客户端请求的范围无效 417 Expectation Failed 服务器无法满足Expect的请求头信息 500 Internal Server Error 服务器内部错误,无法完成请求 501 Not Implemented 服务器不支持请求的功能,无法完成请求 502 Bad Gateway 作为网关或者代理工作的服务器尝试执行请求时,从远程服务器接收到了一个无效的响应 503 Service Unavailable 由于超载或系统维护,服务器暂时的无法处理客户端的请求。延时的长度可包含在服务器的Retry-After头信息中 504 Gateway Time-out 充当网关或代理的服务器,未及时从远端服务器获取请求 505 HTTP Version not supported 服务器不支持请求的HTTP协议的版本,无法完成处理

Plan of Jekyll Blog - Episode 2: Ruby-3, Jekyll-4, Git, Ubuntu and Nginx

This tutorial you will learn how to configure Jekyll-4 on Ubuntu 16.04/18.04. Catalogue Jekyll-4 Installation Ubuntu 16.04 Nginx Setup GitHub Local Repository Setup Git roll back to some commit Jekyll Maintaining Tutorial Jekyll Code Block for Liquid-Like Finally… My Second Jekyll Blog Git Dual Repository Setup Here is the blog repository: blog.old/blog.old3 Jekyll-4 Installation Ubuntu 16.04 First, we should install Ruby3.0.0 for Ubuntu 16.04/18.04: sudo apt-get install ruby-full build-essential zlib1g-dev nginx sudo apt-get install gcc g++ make curl -sL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update && sudo apt-get install yarn sudo apt install curl curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash - curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list sudo apt-get update sudo apt-get install git-core zlib1g-dev build-essential libssl-dev libreadline-dev libyaml-dev libsqlite3-dev sqlite3 libxml2-dev libxslt1-dev libcurl4-openssl-dev software-properties-common libffi-dev nodejs yarn Then, we can use one of these methods to install Ruby-3: Install rbenv cd ~ git clone https://github.com/rbenv/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bashrc echo 'eval "$(rbenv init -)"' >> ~/.bashrc exec $SHELL git clone https://github.com/rbenv/ruby-build.git ~/.rbenv/plugins/ruby-build echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc exec $SHELL rbenv install 3.0.0 rbenv global 3.0.0 ruby -v Install RVM sudo apt-get install libgdbm-dev libncurses5-dev automake libtool bison libffi-dev gpg --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 7D2BAF1CF37B13E2069D6956105BD0E739499BDB curl -sSL https://get.rvm.io | bash -s stable source ~/.rvm/scripts/rvm rvm install 3.0.0 rvm use 3.0.0 --default ruby -v Ruby Source Codes Installation cd wget http://ftp.ruby-lang.org/pub/ruby/3.0/ruby-3.0.0.tar.gz tar -xzvf ruby-3.0.0.tar.gz cd ruby-3.0.0/ ./configure make sudo make install ruby -v Caution: In some area, it’s difficult to visit RubyGems, so you might be change a Ruby Source. gem source -r https://rubygems.org/ gem source --add https://gems.ruby-china.com/ gem source -u Finally, install Bundler gem install bundler jekyll github-pages jekyll-paginate webrick After installation, you can clone your repository from GitHub or GitLab. git clone https://github.com/IcingTomato/blog.old.git Nginx Setup Well, you can also use Apache which use sudo apt-get install apache2 on Debian/Ubuntu or sudo yum install httpd on CentOS/RHEL/Fedora. First, install Nginx: sudo apt-get isntall nginx Then, configure nginx profile: root@blog:~# sudo nano /etc/nginx/sites-enabled/default server { listen 80 default_server; listen [::]:80 default_server; # SSL configuration # listen 443 ssl default_server; listen [::]:443 ssl default_server; # Disable SSL, because when it enabled, it blocked 80. #ssl on; ssl_certificate path/to/your_key.pem; ssl_certificate_key path/to/your_key.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; root /var/www/html; # Add index.php to the list if you are using PHP index index.html; server_name your.domain; location / { # First attempt to serve request as file, then # as directory, then fall back to displaying a 404. try_files $uri $uri/ =404; } # Rewrited the 404 page to 200 error_page 404 =200 /404.html; location /404.html { root /var/www/html/; internal; } # Rewrited the 403 page to 200 error_page 403 =200 /403.html; location /403.html { root /var/www/html/; internal; } } Ctrl+O and Ctrl+X to save and exit. Finally, restart nginx.service sudo systemctl restart nginx # On AWS, you must use systemctl to start, stop, enable, disable, restart a service. GitHub Local Repository Setup git init git add README.md git commit -m "first commit" git branch -M master git remote add origin repo_address git push -u origin master Git roll back to some commit git reset --hard 某个commit id git push -f -u origin master Jekyll Maintaining Tutorial You can make a quick start for surfing the Jekyll blog: git clone -b blank https://github.com/IcingTomato/blog.old.git cd blog.old jekyll serve # jekyll s # => Now browse to http://localhost:4000 Setup _config.yml # Site settings title: Your Blog # Your blog title SEOTitle: Jekyll | Ruby # SEO title description: "Hello from Seattle" # Your blog description # SNS settings github_username: John Doe # GitHub account RSS: true # RSS On weibo_username: # Weibo zhihu_username: # Zhihu facebook_username: # Facebook bilibili_username: # Bilibili twitter_username: # Twitter # Build settings paginate: 100 # Contents in a page You can visit Jekyll-Docs/Jekyll中文网-文档 for more support. Sidebar On PCs, tablet devices or ultra-wide scale screen there is a sidebar to display your personal profile. # Sidebar settings sidebar: true # Add Sidebar sidebar-about-description: "describe yourself" # Description sidebar-avatar: /img/avatar.jpg # Your Avatar Sidebar is a Responsive Layout*, when the display size is below 992px, the sidebar will move to the page bottom. You can visit Bootstrap3 for global CSS settings/Bootstrap 设置全局 CSS 样式 Mini About Me This module is under your avatar. It will display all your social media account. It is also a Responsive Layout. When the screen size become small, it will move to the bottom of the page. But there is a litte change when it move to the bottom. Featured Tags # Featured Tags featured-tags: true featured-condition-size: 15 # A tag will be featured if the size of it is more than this condition value featured-condition-size means if the tags’ count over 15(or the number you set), it will display on home page. Friends # Friends friends: [ { title: "John Doe", href: "http://john.doe/" },{ title: "村財 師内", href: "https://sonzai.shinai/" },{ title: "鵜祖田 陽", href: "https://usoda.you/" } ] Comment This Jekyll Blog supports both Disqus and Gitalk, it also supports Markdown Grammar. Disqus # Disqus(https://disqus.com/) disqus_username: Gitalk First, we should create a new repository for saving our comments: And then open Issues option: Besides, register a new OAuth application: Google Analytics # Google Analytics ga_track_id: 'UA-' ga_domain: # Default as 'auto', you can use your domain Write your first blog We must put the article, which named as YYYY-MM-DD-your_first_article.markdown, in _post folder. And you can change parameter in the front of the article: --- layout: post title: Your First Blog subtitle: Jekyll is Хорошо date: 1900-01-01 author: John Doe header-img: img/title.jpg catalog: true tags: - Jekyll --- Jekyll Code Block for Liquid-Like In Jekyll, some Ruby code block can’t generate perfectly. So, we can use raw tag to avoid execute liquid or liquid-like code block: {% raw %} You can use {% highlight ruby %}{% endhighlight %} for code highlight. Finally… cd your.folder git clone repo.address git pull origin master jekyll build -d /var/www/html/ My Second Jekyll Blog Here is the blog repository: blog.old2 You can use these command line for configuring the blog: cd <the folder> git clone https://github.com/IcingTomato/blog.old2.git bundle add webrick rake bundle install --path vendor/cache git pull origin master bundle exec jekyll build -d /var/www/html/ First, you need to install some Dependence like webrick rake jekyll. And then, in my case, I had a PATH problem. Bundler::GemNotFound: Could not find rake-10.3.2 in any of the sources ~/.rvm/gems/ruby-2.0.0-p451/gems/bundler-1.6.2/lib/bundler/spec_set.rb:92:in `block in materialize' ~/.rvm/gems/ruby-2.0.0-p451/gems/bundler-1.6.2/lib/bundler/spec_set.rb:85:in `map!' ~/.rvm/gems/ruby-2.0.0-p451/gems/bundler-1.6.2/lib/bundler/spec_set.rb:85:in `materialize' ~/.rvm/gems/ruby-2.0.0-p451/gems/bundler-1.6.2/lib/bundler/definition.rb:133:in `specs' ~/.rvm/gems/ruby-2.0.0-p451/gems/bundler-1.6.2/lib/bundler/definition.rb:178:in `specs_for' Show 28 more lines I used gem install rake but it was no use fixing the matter. SO, bundle install --path vendor/cache can help you fix the problem. This command line generally fixes it as that is the more common problem. Basically, my bundler path configuration is messed up. See their documentation (first paragraph) for where to find those configurations and change them manually if needed. Git Dual Repository Setup Everytime I finish my blog, I have to push to two different platform: GitHub and Gitee. Gitee is a collaboration platform for software development & code hosting in China Mainland. Because I use Ali ECS Area Hangzhou, it’s hard to visit GitHub, so I have to use Gitee. So cd 'your-repository-path' git remote add gitee 'your-gitee-repository-address' git push gitee master # Push to 'gitee' git push origin master # Push to 'github' You can also change your-repository/.git/config [core] repositoryformatversion = 0 filemode = true bare = false logallrefupdates = true [remote "origin"] url = 'your-github-repository-address' fetch = +refs/heads/*:refs/remotes/origin/* [branch "master"] remote = origin merge = refs/heads/master [remote "gitee"] url = 'your-gitee-repository-address' fetch = +refs/heads/*:refs/remotes/gitee/*

【运维实践】网络基础知识

The foundations of networking: switches, routers, and wireless access points. Switches, routers, and wireless access points are the essential networking basics. Through them, devices connected to your network can communicate with one another and with other networks, like the Internet. 传输介质简介 可以让设备通过网卡连接互联网的介质,如同轴电缆、双绞线和光纤等。不同的传输介质具有不同的特性,这些特性直接影响到通信的诸多方面,如线路编码方式、传输速度和传输距离等。 常见的网络传输介质 同轴电缆(Coaxial Cable) 同轴电缆是一种早期使用的传输介质,同轴电缆的标准分为两种,10BASE2和10BASE5。这两种标准都支持10Mbps的传输速率,最长传输距离分别为185米和500米。一般情况下,10Base2同轴电缆使用BNC接头,10Base5同轴电缆使用N型接头。 10BASE5和10BASE2是早期的两种以太网标准,它们均采用同轴电缆作为传输介质。10BASE5和10BASE2所使用的同轴电缆的直径分别为9.5mm和5mm,所以前者又称为粗缆,后者又称为细缆。 现在,10Mbps的传输速率早已不能满足目前企业网络需求,因此同轴电缆在目前企业网络中很少应用。 双绞线(Twisted Pair) 与同轴电缆相比双绞线(Twisted Pair)具有更低的制造和部署成本,因此在企业网络中被广泛应用。双绞线可分为屏蔽双绞线(Shielded Twisted Pair,STP)和非屏蔽双绞线(Unshielded Twisted Pair,UTP)。屏蔽双绞线在双绞线与外层绝缘封套之间有一个金属屏蔽层,可以屏蔽电磁干扰。双绞线有很多种类型,不同类型的双绞线所支持的传输速率一般也不相同。例如,3类双绞线支持10Mbps传输速率;5类双绞线支持100Mbps传输速率;超5类双绞线及更高级别的双绞线支持千兆以太网传输。双绞线使用RJ-45接头连接网络设备。为保证终端能够正确收发数据,RJ-45接头中的针脚必须按照一定的线序排列 光纤(Optical Fiber) 双绞线和同轴电缆传输数据时使用的是电信号,而光纤传输数据时使用的是光信号。光纤支持的传输速率包括10Mbps,100Mbps,1Gbps,10Gbps,甚至更高。根据光纤传输光信号模式的不同,光纤又可分为单模光纤和多模光纤。单模光纤只能传输一种模式的光,不存在模间色散,因此适用于长距离高速传输。多模光纤允许不同模式的光在一根光纤上传输,由于模间色散较大而导致信号脉冲展宽严重,因此多模光纤主要用于局域网中的短距离传输。光纤连接器种类很多,常用的连接器包括ST,FC,SC,LC连接器。 串口电缆(Serial Port Cable) 网络通信中常常会用到各种各样的串口电缆。常用的串口电缆标准为RS-232,同时也是推荐的标准。但是RS-232的传输速率有限,传输距离仅为6米。其他的串口电缆标准可以支持更长的传输距离,例如RS-422和RS-485的传输距离可达1200米。RS-422和RS-485串口电缆通常使用V.35接头,这种接头在上世纪80年代已经淘汰,但是现在仍在帧中继、ATM等传统网络上使用。V.24是RS-232标准的欧洲版。RS-232本身没有定义接头标准,常用的接头类型为DB-9和DB-25。现在,RS-232已逐渐被FireWire、USB等新标准取代,新产品和新设备已普遍使用USB标准。 什么是「网络」 网络是由若干节点和连接这些节点的链路构成,表示诸多对象及其相互联系。网络是信息传输、接收、共享的虚拟平台,通过它把各个点、面、体的信息联系到一起,从而实现这些资源的共享。网络是人类发展史来最重要的发明,提高了科技和人类社会的发展。 网络设备有什么 电脑、手机、iPad、凡是能联网的设备、提供服务的设备、路由器、交换机、防火墙、无线设备…… 网卡是上网必备的工具 简单网络 两个终端,用一条能承载数据传输的物理介质(也称为传输介质)连接起来,就组成了一个最简单的网络。 网络划分为 有线网络 无线网络 双绞线的线序 T-568A 白绿 绿 白橙 蓝 白蓝 橙 白棕 棕 T-568B 白橙 橙 白绿 蓝 白蓝 绿 白棕 棕 根据网线两端的线序可分为 直通线:两端线序是一样的 交叉线:两端线序是相反的 冲突域(Collision Domain) 共享式网络中可能会出现信号冲突现象。 如图是一个10BASE5以太网,每个主机都是用同一根同轴电缆来与其它主机进行通信,因此,这里的同轴电缆又被称为共享介质,相应的网络被称为共享介质网络,或简称为共享式网络。共享式网络中,不同的主机同时发送数据时,就会产生信号冲突的问题,解决这一问题的方法一般是采用载波侦听多路访问/冲突检测技术(Carrier Sense Multiple Access/Collision Detection)。 CSMA/CD的基本工作过程如下: 终端设备不停地检测共享线路的状态。如果线路空闲,则可以发送数据;如果线路不空闲,则等待一段时间后继续检测(延时时间由退避算法决定)。 如果有另外一个设备同时发送数据,两个设备发送的数据会产生冲突。 终端设备检测到冲突之后,会马上停止发送自己的数据,并发送特殊阻塞信息,以强化冲突信号,使线路上其他站点能够尽早检测到冲突。 终端设备检测到冲突后,等待一段时间之后再进行数据发送(延时时间由退避算法决定)。 CSMA/CD的工作原理可简单总结为:先听后发,边发边听,冲突停发,随机延迟后重发。 双工模式(Duplex) 两种双工模式都支持双向数据传输。 半双工:在半双工模式(half-duplex mode)下,通信双方都能发送和接收数据,但不能同时进行。当一台设备发送时,另一台只能接收,反之亦然。对讲机是半双工的典型例子。 全双工:在全双工模式(full-duplex mode)下,通信双方都能同时接收和发送数据。电话网络是典型的全双工例子。 以太网上的通信模式包括半双工和全双工两种: 半双工模式下,共享物理介质的通信双方必须采用CSMA/CD机制来避免冲突。例如,10BASE5以太网的通信模式就必须是半双工模式。 全双工模式下,通信双方可以同时实现双向通信,这种模式不会产生冲突,因此不需要使用CSMA/CD机制。例如,10BASE-T以太网的通信模式就可以是全双工模式。 同一物理链路上相连的两台设备的双工模式必须保持一致。 以太网帧结构 网络中传输数据时需要定义并遵循一些标准,以太网是根据IEEE 802.3标准来管理和控制数据帧的。 网络通信协议 不同的协议栈用于定义和管理不同网络的数据转发规则。 20世纪60年代以来,计算机网络得到了飞速发展。各大厂商和标准组织为了在数据通信网络领域占据主导地位,纷纷推出了各自的网络架构体系和标准,如IBM公司的SNA协议,Novell公司的IPX/SPX协议,以及广泛流行的OSI参考模型和TCP/IP协议。同时,各大厂商根据这些协议生产出了不同的硬件和软件。标准组织和厂商的共同努力促进了网络技术的快速发展和网络设备种类的迅速增长。 网络通信中,“协议”和“标准”这两个词汇常常可以混用。同时,协议或标准本身又常常具有层次的特点。一般地,关注于逻辑数据关系的协议通常被称为上层协议,而关注于物理数据流的协议通常被称为底层协议。IEEE 802就是一套用来管理物理数据流在局域网中传输的标准,包括在局域网中传输物理数据的802.3以太网标准。除以太外,还有一些用来管理物理数据流在广域网中传输的标准,如PPP(Point-to-Point Protocol),高级数据链路控制HDLC(High-Level Data Link Control)。 分层模型-OSI 国际标准化组织ISO于1984年提出了OSI RM(Open System Interconnection Reference Model,开放系统互连参考模型)。OSI参考模型很快成为了计算机网络通信的基础模型。 OSI参考模型具有以下优点:简化了相关的网络操作;提供了不同厂商之间的兼容性;促进了标准化工作;结构上进行了分层;易于学习和操作。 OSI参考模型各个层次的基本功能如下: 物理层:在设备之间传输比特流,规定了电平、速度和电缆针脚。 数据链路层:将比特组合成字节,再将字节组合成帧,使用链路层地址(以太网使用MAC地址)来访问介质,并进行差错检测。 网络层:提供逻辑地址,供路由器确定路径。 传输层:提供面向连接或非面向连接的数据传递以及进行重传前的差错检测。 会话层:负责建立、管理和终止表示层实体之间的通信会话。该层的通信由不同设备中的应用程序之间的服务请求和响应组成。 表示层:提供各种用于应用层数据的编码和转换功能,确保一个系统的应用层发送的数据能被另一个系统的应用层识别。 应用层:OSI参考模型中最靠近用户的一层,为应用程序提供网络服务。 分层模型-TCP/IP TCP/IP模型同样采用了分层结构,层与层相对独立但是相互之间也具备非常密切的协作关系。 TCP/IP模型将网络分为四层。TCP/IP模型不关注底层物理介质,主要关注终端之间的逻辑数据流转发。TCP/IP模型的核心是网络层和传输层,网络层解决网络之间的逻辑转发问题,传输层保证源端到目的端之间的可靠传输。最上层的应用层通过各种协议向终端用户提供业务应用。 数据封装 应用数据需要经过TCP/IP每一层处理之后才能通过网络传输到目的端,每一层上都使用该层的协议数据单元PDU(Protocol Data Unit)彼此交换信息。不同层的PDU中包含有不同的信息,因此PDU在不同层被赋予了不同的名称。如上层数据在传输层添加TCP报头后得到的PDU被称为Segment(数据段);数据段被传递给网络层,网络层添加IP报头得到的PDU被称为Packet(数据包);数据包被传递到数据链路层,封装数据链路层报头得到的PDU被称为Frame(数据帧);最后,帧被转换为比特,通过网络介质传输。这种协议栈逐层向下传递数据,并添加报头和报尾的过程称为封装。 终端之间的通信 数据链路层控制数据帧在物理链路上传输。 数据包在以太网物理介质上传播之前必须封装头部和尾部信息,封装后的数据包称为数据帧,数据帧中封装的信息决定了数据如何传输。以太网上传输的数据帧有两种格式,选择哪种格式由TCP/IP协议簇中的网络层决定。 帧格式 以太网上使用两种标准帧格式。第一种是上世纪80年代初提出的DIX v2格式,即Ethernet II帧格式。Ethernet II后来被IEEE 802标准接纳,并写进了IEEE 802.3x-1997的3.2.6节。第二种是1983年提出的IEEE 802.3格式。这两种格式的主要区别在于Ethernet II格式中包含一个Type字段,标识以太帧处理完成之后将被发送到哪个上层协议进行处理,IEEE 802.3格式中,同样的位置是长度字段。 不同的Type字段值可以用来区别这两种帧的类型,当Type字段值小于等于1500(或者十六进制的0x05DC)时,帧使用的是IEEE 802.3格式。当Type字段值大于等于1536 (或者十六进制的0x0600)时,帧使用的是Ethernet II格式。以太网中大多数的数据帧使用的是Ethernet II格式。 以太帧中还包括源和目的MAC地址,分别代表发送者的MAC和接收者的MAC,此外还有帧校验序列字段,用于检验传输过程中帧的完整性。 Ethernet_II帧格式 Ethernet_II 帧类型值大于等于1536 (0x0600),以太网数据帧的长度在64-1518字节之间。 Ethernet_II的帧中各字段说明如下: DMAC(Destination MAC)是目的MAC地址。DMAC字段长度为6个字节,标识帧的接收者。 SMAC(Source MAC)是源MAC地址。SMAC字段长度为6个字节,标识帧的发送者。 类型字段(Type)用于标识数据字段中包含的高层协议,该字段长度为2个字节。类型字段取值为0x0800的帧代表IP协议帧;类型字段取值为0x0806的帧代表ARP协议帧。 数据字段(Data)是网络层数据,最小长度必须为46字节以保证帧长至少为64字节,数据字段的最大长度为1500字节 。 循环冗余校验字段(FCS)提供了一种错误检测机制。该字段长度为4个字节。 IEEE802.3帧格式 IEEE802.3帧长度字段值小于等于1500 (0x05DC)。 IEEE802.3帧格式类似于Ethernet_II帧,只是Ethernet_II帧的Type域被802.3帧的Length域取代,并且占用了Data字段的8个字节作为LLC和SNAP字段。 Length字段定义了Data字段包含的字节数。 逻辑链路控制LLC(Logical Link Control)由目的服务访问点DSAP(Destination Service Access Point)、源服务访问点SSAP(Source Service Access Point)和Control字段组成。 SNAP(Sub-network Access Protocol)由机构代码(Org Code)和类型(Type)字段组成。Org Code三个字节都为0。Type字段的含义与Ethernet_II帧中的Type字段相同。IEEE802.3帧根据DSAP和SSAP字段的取值又可分为以下几类: 1)当DSAP和SSAP都取特定值0xff时,802.3帧就变成了Netware-ETHERNET帧,用来承载NetWare类型的数据。 2)当DSAP和SSAP都取特定值0xaa时,802.3帧就变成了ETHERNET_SNAP帧。ETHERNET_SNAP帧可以用于传输多种协议。 3)DSAP和SSAP其他的取值均为纯IEEE802.3帧。 数据帧传输 数据链路层基于MAC地址进行帧的传输。 以太网在二层链路上通过MAC地址来唯一标识网络设备,并且实现局域网上网络设备之间的通信。MAC地址也叫物理地址,大多数网卡厂商把MAC地址烧入了网卡的ROM中。发送端使用接收端的MAC地址作为目的地址。以太帧封装完成后会通过物理层转换成比特流在物理介质上传输。 以太网的MAC地址 MAC地址由两部分组成,分别是供应商代码和序列号。其中前24位代表该供应商代码,由IEEE管理和分配。剩下的24位序列号由厂商自己分配。 如同每一个人都有一个名字一样,每一台网络设备都用物理地址来标识自己,这个地址就是MAC地址。网络设备的MAC地址是全球唯一的。MAC地址长度为48比特,通常用十六进制表示。MAC地址包含两部分:前24比特是组织唯一标识符(OUI,Organizationally Unique Identifier),由IEEE统一分配给设备制造商。例如,华为的网络产品的MAC地址前24比特是0x00e0fc。后24位序列号是厂商分配给每个产品的唯一数值,由各个厂商自行分配(这里所说的产品可以是网卡或者其他需要MAC地址的设备)。 单播(Unicast) 局域网上的帧可以通过三种方式发送。第一种是单播,指从单一的源端发送到单一的目的端。每个主机接口由一个MAC地址唯一标识,MAC地址的OUI中,第一字节第8个比特表示地址类型。对于主机MAC地址,这个比特固定为0,表示目的MAC地址为此MAC地址的帧都是发送到某个唯一的目的端。在冲突域中,所有主机都能收到源主机发送的单播帧,但是其他主机发现目的地址与本地MAC地址不一致后会丢弃收到的帧,只有真正的目的主机才会接收并处理收到的帧。 广播(Broadcast) 第二种发送方式是广播,表示帧从单一的源发送到共享以太网上的所有主机。广播帧的目的MAC地址为十六进制的FF:FF:FF:FF:FF:FF,所有收到该广播帧的主机都要接收并处理这个帧。 广播方式会产生大量流量,导致带宽利用率降低,进而影响整个网络的性能。 当需要网络中的所有主机都能接收到相同的信息并进行处理的情况下,通常会使用广播方式。 组播(Multicast) 第三种发送方式为组播,组播比广播更加高效。组播转发可以理解为选择性的广播,主机侦听特定组播地址,接收并处理目的MAC地址为该组播MAC地址的帧。 组播MAC地址和单播MAC地址是通过第一字节中的第8个比特区分的。组播MAC地址的第8个比特为1,而单播MAC地址的第8个比特为0。 当需要网络上的一组主机(而不是全部主机)接收相同信息,并且其他主机不受影响的情况下通常会使用组播方式。 数据帧的发送和接收 当主机接收到的数据帧所包含的目的MAC地址是自己时,会把以太网封装剥掉后送往上层协议。 帧从主机的物理接口发送出来后,通过传输介质传输到目的端。共享网络中,这个帧可能到达多个主机。主机检查帧头中的目的MAC地址,如果目的MAC地址不是本机MAC地址,也不是本机侦听的组播或广播MAC地址,则主机会丢弃收到的帧。 如果目的MAC地址是本机MAC地址,则接收该帧,检查帧校验序列(FCS)字段,并与本机计算的值对比来确定帧在传输过程中是否保持了完整性。如果帧的FCS值与本机计算的值不同,主机会认为帧已被破坏,并会丢弃该帧。如果该帧通过了FCS校验,则主机会根据帧头部中的Type字段来确定将帧发送给上层哪个协议处理。本例中,Type字段的值为0x0800,表明该帧需要发送到IP协议上处理。在发送给IP协议之前,帧的头部和尾部会被剥掉。 IP编址 上层协议地址 以太网帧中的Type字段值为0x0800,表示该帧的网络层协议为IP协议。 在剥掉帧的头部和尾部之前,网络设备需要根据帧头中Type字段确定下一步将帧发送到哪个上层协议进行处理。本例中的帧头部Type字段表示该帧需要上送到IP协议进行处理。以下将介绍帧的头部和尾部被剥掉后,IP协议将如何处理帧中的数据。 IP报文头部 IP报文头部信息用于指导网络设备对报文进行路由和分片。同一个网段内的数据转发通过链路层即可实现,而跨网段的数据转发需要使用网络设备的路由功能。分片是指数据包超过一定长度时,需要被划分成不同的片段使其能够在网络中传输。 IP报文头部长度为20到60字节,报文头中的信息可以用来指导网络设备如何将报文从源设备发送到目的设备。其中,版本字段表示当前支持的IP协议版本,当前的版本号为4。DS字段早期用来表示业务类型,现在用于支持QoS中的差分服务模型,实现网络流量优化。 源和目的IP地址是分配给主机的逻辑地址,用于在网络层标识报文的发送方和接收方。根据源和目的IP地址可以判断目的端是否与发送端位于同一网段,如果二者不在同一网段,则需要采用路由机制进行跨网段转发。 IP编址 IP地址分为网络部分和主机部分。 IP地址由32个二进制位组成,通常用点分十进制形式表示。 IPv4地址为32比特的二进制数,通常用点分十进制表示。IP地址用来标识网络中的设备,具有IP地址的设备可以在同一网段内或跨网段通信。IP地址包括两部分,第一部分是网络号,表示IP地址所属的网段,第二部分是主机号,用来唯一标识本网段上的某台网络设备。 每个网段上都有两个特殊地址不能分配给主机或网络设备。第一个是该网段的网络地址,该IP地址的主机位为全0,表示一个网段。第二个地址是该网段中的广播地址,目的地址为广播地址的报文会被该网段中的所有网络设备接收。广播地址的主机位为全1。除网络地址和广播地址以外的其他IP地址都可以作为网络设备的IP地址。 二进制、十进制和十六进制 在IP网络中,二进制和十六进制是常用的编码方式。 网络中的数据可以采用二进制、十进制或十六进制来表示,了解这些进制对理解IP网络基础知识很有必要。每种进制使用不同的基值表示每一位的数值。二进制每一位只有0和1两个值,基值为2,二进制数的每一位都可以用2的x次幂来表示,x表示二进制数的位数。十六进制的每一位可以有16个数值,范围为0-F(即0-9和A-F),A对应十进制的10,F对应十进制的15(二进制的1111)。 IP地址以字节为单位分为四段,每字节包含8个比特,可以表示0到255,共256个数值。从二进制到十进制转换表中可以看到每一位二进制数所代表的十进制数。上面的表格举例说明了8位二进制数转换为十进制数和十六进制数的情况。从表格中也可以看到全0和全1所对应的十进制数和十六进制数。 二进制和十进制转换 32位的IP地址分为4个字节,每个字节有256个取值。因此,理论上IPv4可以有4,294,967,296个IP地址,但实际上只有其中一部分地址可以分配给网络设备使用。本例中,IP地址的前三个字节表示网络号,最后一个字节表示该网络上网络设备可用的地址范围。将二进制格式的IP地址转换为十进制格式时,需要把二进制中每一位1所代表的值加在一起,得出IP地址的十进制值。 IP地址分类 IPv4地址被划分为A、B、C、D、E五类,每类地址的网络号包含不同的字节数。A类,B类和C类地址为可分配IP地址,每类地址支持的网络数和主机数不同。比如,A类地址可支持126个网络,每个网络支持224 (16,777,216 )个主机地址,另外每个网段中的网络地址和广播地址不能分配给主机。C类地址支持200多万个网络,每个网络支持256个主机地址,其中254个地址可以分配给主机使用。 D类地址为组播地址。主机收到以D类地址为目的地址的报文后,且该主机是该组播组成员,就会接收并处理该报文。各类IP地址可以通过第一个字节中的比特位进行区分。如A类地址第一字节的最高位固定为0,B类地址第一字节的高两位固定为10,C类地址第一字节的高三位固定为110,D类地址第一字节的高四位固定为1110,E类地址第一字节的高四位固定为1111。 IP地址类型 私有地址范围 10.0.0.0~10.255.255.255 172.16.0.0~172.31.255.255 192.168.0.0~192.168.255.255 特殊地址 127.0.0.0~127.255.255.255 0.0.0.0 255.255.255.255 IPv4中的部分IP地址被保留用作特殊用途。为节省IPv4地址,A、B、C类地址段中都预留了特定范围的地址作为私网地址。现在,世界上所有终端系统和网络设备需要的IP地址总数已经超过了32位IPv4地址所能支持的最大地址数4,294,967,296。为主机分配私网地址节省了公网地址,可以用来缓解IP地址短缺的问题。企业网络中普遍使用私网地址,不同企业网络中的私网地址可以重叠。默认情况下,网络中的主机无法使用私网地址与公网通信;当需要与公网通信时,私网地址必须转换成公网地址。还有其他一些特殊IP地址,如127.0.0.0网段中的地址为环回地址,用于诊断网络是否正常。IPv4中的第一个地址0.0.0.0表示任何网络,这个地址的作用将在路由原理中详细介绍。IPv4中的最后一个地址255.255.255.255是0.0.0.0网络中的广播地址。 网络通信 源主机必须要知道目的主机的IP地址后才能将数据发送到目的地。源主机向其他目的主机发送报文之前,需要检查目的IP地址和源IP地址是否属于同一个网段。如果是,则报文将被下发到底层协议进行以太网封装处理。如果目的地址和源地址属于不同网段,则主机需要获取下一跳路由器的IP地址,然后将报文下发到底层协议处理。 子网掩码(Mask) 子网掩码用于区分网络部分和主机部分。子网掩码与IP地址的表示方法相同。每个IP地址和子网掩码一起可以用来唯一的标识一个网段中的某台网络设备。子网掩码中的1表示网络位,0表示主机位。 默认子网掩码 每类IP地址有一个缺省子网掩码。A类地址的缺省子网掩码为8位,即第一个字节表示网络位,其他三个字节表示主机位。B类地址的缺省子网掩码为16位,因此B类地址支持更多的网络,但是主机数也相应减少。C类地址的缺省子网掩码为24位,支持的网络最多,同时也限制了单个网络中主机的数量。 地址规划 通过子网掩码可以判断主机所属的网段、网段上的广播地址以及网段上支持的主机数。图中这个例子,主机地址为192.168.1.7,子网掩码为24位(C类IP地址的缺省掩码),从中我们可以判断该主机位于192.168.1.0/24网段。将IP地址中的主机位全部置为1,并转换为十进制数,即可得到该网段的广播地址192.168.1.255。网段中支持的主机数为2n,n为主机位的个数。本例中n=8,28=256,减去本网段的网络地址和广播地址,可知该网段支持254个有效主机地址。 有类IP编址的缺陷 在设计网络时使用有类IP地址会造成地址的浪费。 如果企业网络中希望通过规划多个网段来隔离物理网络上的主机,使用缺省子网掩码就会存在一定的局限性。网络中划分多个网段后,每个网段中的实际主机数量可能很有限,导致很多地址未被使用。如图所示的场景下,如果使用缺省子网掩码的编址方案,则地址使用率很低。 变长子网掩码 采用可变长子网掩码可解决上述问题。缺省子网掩码可以进一步划分,成为变长子网掩码(VLSM)。通过改变子网掩码,可以将网络划分为多个子网。本例中的地址为C类地址,缺省子网掩码为24位。现借用一个主机位作为网络位,借用的主机位变成子网位。一个子网位有两个取值0和1,因此可划分两个子网。该比特位设置为0,则子网号为0,该比特位设置为1,则子网号为128。将剩余的主机位都设置为0,即可得到划分后的子网地址;将剩余的主机位都设置为1,即可得到子网的广播地址。每个子网中支持的主机数为27-2(减去子网地址和广播地址),即126个主机地址。 网关(Gateway) 网关用来转发来自不同网段之间的数据包。 报文转发过程中,首先需要确定转发路径以及通往目的网段的接口,然后将报文封装在以太帧中通过指定的物理接口转发出去。如果目的主机与源主机不在同一网段,报文需要先转发到网关,然后通过网关将报文转发到目的网段。 网关是指接收并处理本地网段主机发送的报文并转发到目的网段的设备。为实现此功能,网关必须知道目的网段的IP地址。网关设备上连接本地网段的接口地址即为该网段的网关地址。 IP包分片 网络中转发的IP报文的长度可以不同,但如果报文长度超过了数据链路所支持的最大长度,则报文就需要分割成若干个较小的片段才能够在链路上传输。将报文分割成多个片段的过程叫做分片。 接收端根据分片报文中的标识符(Identification),标志(Flags),及片偏移(Fragment Offset)字段对分片报文进行重组。标识符用于识别属于同一个数据包的分片,以区别于同一主机或其他主机发送的其它数据包分片,保证分片被正确的重新组合。标志字段用于判断是否已经收到最后一个分片。最后一个分片的标志字段设置为0,其他分片的标志字段设置为1,目的端在收到标志字段为0的分片后,开始重组报文。片偏移字段表示每个分片在原始报文中的位置。第一个分片的片偏移为0,第二个分片的片偏移表示紧跟第一个分片后的第一个比特的位置。比如,如果首片报文包含1259比特,那么第二分片报文的片偏移字段值就应该为1260。 生存时间 报文在网段间转发时,如果网络设备上的路由规划不合理,就可能会出现环路,导致报文在网络中无限循环,无法到达目的端。环路发生后,所有发往这个目的地的报文都会被循环转发,随着这种报文逐渐增多,网络将会发生拥塞。 为避免环路导致的网络拥塞,IP报文头中包含一个生存时间TTL(Time To Live)字段。报文每经过一台三层设备,TTL值减1。初始TTL值由源端设备设置。当报文中的TTL降为0时,报文会被丢弃。同时,丢弃报文的设备会根据报文头中的源IP地址向源端发送ICMP错误消息。 协议号 目的端的网络层在接收并处理报文以后,需要决定下一步对报文该做如何处理。IP报文头中的协议字段标识了将会继续处理报文的协议。与以太帧头中的Type字段类似,协议字段也是一个十六进制数。该字段可以标识网络层协议,如ICMP(Internet Control Message Protocol,因特网控制报文协议),也可以标识上层协议,如TCP(Transmission Control Protocol,传输控制协议,对应值0x06)、UDP(User Datagram Protocol,用户数据包协议,对应值0x11)。 常用端口列举 端口:0 服务:Reserved 说明:通常用于分析操作系统。这一方法能够工作是因为在一些系统中“0”是无效端 口,当你试图使用通常的闭合端口连接它时将产生不同的结果。一种典型的扫描,使用 IP地址为0.0.0.0,设置ACK位并在以太网层广播。 端口:1 服务:tcpmux 说明:这显示有人在寻找SGI Irix机器。Irix是实现tcpmux的主要提供者,默认情况下 tcpmux在这种系统中被打开。Irix机器在发布是含有几个默认的无密码的帐户,如: IP、GUEST UUCP、NUUCP、DEMOS 、TUTOR、DIAG、OUTOFBOX等。许多管理员在安装后忘 记删除这些帐户。因此HACKER在INTERNET上搜索tcpmux并利用这些帐户。 端口:7 服务:Echo 说明:能看到许多人搜索Fraggle放大器时,发送到X.X.X.0和X.X.X.255的信息。 端口:19 服务:Character Generator 说明:这是一种仅仅发送字符的服务。UDP版本将会在收到UDP包后回应含有垃圾字符的 包。TCP连接时会发送含有垃圾字符的数据流直到连接关闭。HACKER利用IP欺骗可以发 动DoS攻击。伪造两个chargen服务器之间的UDP包。同样Fraggle DoS攻击向目标地址的 这个端口广播一个带有伪造受害者IP的数据包,受害者为了回应这些数据而过载。 端口:20、21 服务:FTP 说明:FTP服务器所开放的端口,20用于数据传输,21用于控制。最常见的攻击者用于寻找打开 anonymous的FTP服务器的方法。这些服务器带有可读写的目录。木马Doly Trojan、 Fore、Invisible FTP、WebEx、WinCrash和Blade Runner所开放的端口。 端口:22 服务:Ssh 说明:PcAnywhere建立的TCP和这一端口的连接可能是为了寻找ssh。这一服务有许多弱 点,如果配置成特定的模式,许多使用RSAREF库的版本就会有不少的漏洞存在。 端口:23 服务:Telnet 说明:远程登录,入侵者在搜索远程登录UNIX的服务。大多数情况下扫描这一端口是为 了找到机器运行的操作系统。还有使用其他技术,入侵者也会找到密码。木马Tiny Telnet Server就开放这个端口。 端口:25 服务:SMTP 说明:SMTP服务器所开放的端口,用于发送邮件。入侵者寻找SMTP服务器是为了传递他 们的SPAM。入侵者的帐户被关闭,他们需要连接到高带宽的E-MAIL服务器上,将简单的 信息传递到不同的地址。木马Antigen、Email Password Sender、Haebu Coceda、 Shtrilitz Stealth、WinPC、WinSpy都开放这个端口。 端口:31 服务:MSG Authentication 说明:木马Master Paradise、Hackers Paradise开放此端口。 端口:42 服务:WINS Replication 说明:WINS复制 端口:53 服务:Domain Name Server(DNS) 说明:DNS服务器所开放的端口,入侵者可能是试图进行区域传递(TCP),欺骗DNS (UDP)或隐藏其他的通信。因此防火墙常常过滤或记录此端口。 端口:67 服务:Bootstrap Protocol Server 说明:通过DSL和Cable modem的防火墙常会看见大量发送到广播地址255.255.255.255 的数据。这些机器在向DHCP服务器请求一个地址。HACKER常进入它们,分配一个地址把 自己作为局部路由器而发起大量中间人(man-in-middle)攻击。客户端向68端口广播 请求配置,服务器向67端口广播回应请求。这种回应使用广播是因为客户端还不知道可 以发送的IP地址。 端口:69 服务:Trival File Transfer 说明:许多服务器与bootp一起提供这项服务,便于从系统下载启动代码。但是它们常常由于错误配置而使入侵者能从系统中窃取任何 文件。它们也可用于系统写入文件。 端口:79 服务:Finger Server 说明:入侵者用于获得用户信息,查询操作系统,探测已知的缓冲区溢出错误,回应从自己机器到其他机器Finger扫描。 端口:80 服务:HTTP 说明:用于网页浏览。木马Executor开放此端口。 端口:99 服务:Metagram Relay 说明:后门程序ncx99开放此端口。 端口:102 服务:Message transfer agent(MTA)-X.400 over TCP/IP 说明:消息传输代理。 端口:109 服务:Post Office Protocol -Version3 说明:POP3服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交 换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。 端口:110 服务:SUN公司的RPC服务所有端口 说明:常见RPC服务有rpc.mountd、NFS、rpc.statd、rpc.csmd、rpc.ttybd、amd等 端口:113 服务:Authentication Service 说明:这是一个许多计算机上运行的协议,用于鉴别TCP连接的用户。使用标准的这种服务可以获得许多计算机的信息。但是它可作为许多服务的记录器,尤其是FTP、POP、IMAP、SMTP和IRC等服务。通常如果有许多客户通过防火墙访问这些服务,将会看到许多这个端口的连接请求。记住,如果阻断这个端口客户端会感觉到在防火墙另一边与E-MAIL服务器的缓慢连接。许多防火墙支持TCP连接的阻断过程中发回RST。这将会停止缓慢的连接。 端口:119 服务:Network News Transfer Protocol 说明:NEWS新闻组传输协议,承载USENET通信。这个端口的连接通常是人们在寻找USENET服务器。多数ISP限制,只有他们的客户才能访问他们的新闻组服务器。打开新闻组服务器将允许发/读任何人的帖子,访问被限制的新闻组服务器,匿名发帖或发送SPAM。 端口:135 服务:Location Service 说明:Microsoft在这个端口运行DCE RPC end-point mapper为它的DCOM服务。这与UNIX 111端口的功能很相似。使用DCOM和RPC的服务利用计算机上的end-point mapper注册它们的位置。远端客户连接到计算机时,它们查找end-point mapper找到服务的位置。HACKER扫描计算机的这个端口是为了找到这个计算机上运行Exchange Server吗? 什么版本?还有 端口:110 服务:pop3 说明:POP3(Post Office Protocol 3)服务器开放此端口,用于接收邮件,客户端访问服务器端的邮件服务。POP3服务有许多公认的弱点。关于用户名和密码交换缓冲区溢出的弱点至少有20个,这意味着入侵者可以在真正登陆前进入系统。成功登陆后还有其他缓冲区溢出错误。 端口:137、138、139 服务:NETBIOS Name Service 说明:其中137、138是UDP端口,当通过网上邻居传输文件时用这个端口。而139端口:通过这个端口进入的连接试图获得NetBIOS/SMB服务。这个协议被用于windows文件和打印机共享和SAMBA。还有WINS Regisrtation也用它。 端口:143 服务:Interim Mail Access Protocol v2 说明:和POP3的安全问题一样,许多IMAP服务器存在有缓冲区溢出漏洞。记住:一种LINUX蠕虫(admv0rm)会通过这个端口繁殖,因此许多这个端口的扫描来自不知情的已经被感染的用户。当REDHAT在他们的LINUX发布版本中默认允许IMAP后,这些漏洞变的很流行。这一端口还被用于IMAP2,但并不流行。 端口:161 服务:SNMP 说明:SNMP允许远程管理设备。所有配置和运行信息的储存在数据库中,通过SNMP可获得这些信息。许多管理员的错误配置将被暴露在Internet。Cackers将试图使用默认的密码public、private访问系统。他们可能会试验所有可能的组合。SNMP包可能会被错误的指向用户的网络。 端口:389 服务:LDAP、ILS 说明:轻型目录访问协议和NetMeeting Internet Locator Server共用这一端口。 端口:443 服务:Https 说明:网页浏览端口,能提供加密和通过安全端口传输的另一种HTTP。 端口:993 服务:IMAP 说明:SSL(Secure Sockets layer) 端口:1080 服务:SOCKS代理协议服务器 说明:SOCKS代理协议服务器 端口:1433 服务:SQL 说明:Microsoft的SQL服务开放的端口。 端口:1503 服务:NetMeeting T.120 说明:NetMeeting T.120 端口:1521 服务:Oracle 数据库 说明:Oracle 数据库 端口:1720 服务:NetMeeting 说明:NetMeeting H.233 call Setup。 端口:1731 服务:NetMeeting Audio Call Control 说明:NetMeeting音频调用控制。 端口:3306 服务:MySQL 数据库 说明:MySQL 数据库 端口:3389 服务:超级终端 说明:WINDOWS 2000终端开放此端口。 端口:4000 服务:QQ客户端 说明:腾讯QQ客户端开放此端口。 端口:5631 服务:pcAnywere 说明:有时会看到很多这个端口的扫描,这依赖于用户所在的位置。当用户打开pcAnywere时,它会自动扫描局域网C类网以寻找可能的代理(这里的代理是指agent而不是proxy)。入侵者也会寻找开放这种服务的计算机。,所以应该查看这种扫描的源地址。一些搜寻pcAnywere的扫描包常含端口22的UDP数据包。 端口:6970 服务:RealAudio 说明:RealAudio客户将从服务器的6970-7170的UDP端口接收音频数据流。这是由TCP-7070端口外向控制连接设置的。 端口:7323 服务: 说明:Sygate服务器端。 端口:8000 服务:OICQ 说明:腾讯QQ服务器端开放此端口。 端口:8010 服务:Wingate 说明:Wingate代理开放此端口。 端口:8080 服务:代理端口 说明:WWW代理开放此端口 传输层协议 传输层定义了主机应用程序之间端到端的连通性。传输层中最为常见的两个协议分别是传输控制协议TCP(Transmission Control Protocol)和用户数据包协议UDP(User Datagram Protocol)。 TCP TCP是一种面向连接的传输层协议,可提供可靠的传输服务。 TCP位于TCP/IP模型的传输层,它是一种面向连接的端到端协议。TCP作为传输控制协议,可以为主机提供可靠的数据传输。在本例中,两台主机在通信之前,需要TCP在它们之间建立可靠的传输通道。 TCP端口号 端口号用来区分不同的网络服务。 TCP允许一个主机同时运行多个应用进程。每台主机可以拥有多个应用端口,每对端口号、源和目标IP地址的组合唯一地标识了一个会话。端口分为知名端口和动态端口。有些网络服务会使用固定的端口,这类端口称为知名端口,端口号范围为0-1023。如FTP、HTTP、Telnet、SNMP服务均使用知名端口。动态端口号范围从1024到65535,这些端口号一般不固定分配给某个服务,也就是说许多服务都可以使用这些端口。只要运行的程序向系统提出访问网络的申请,那么系统就可以从这些端口号中分配一个供该程序使用。 TCP头部 TCP通常使用IP作为网络层协议,这时TCP数据段被封装在IP数据包内。 TCP数据段由TCP Header(头部)和TCP Data(数据)组成。TCP最多可以有60个字节的头部,如果没有Options字段,正常的长度是20字节。 TCP Header是由如上图标识的一些字段组成,这里列出几个常用字段。 16位源端口号:源主机的应用程序使用的端口号。 16位目的端口号:目的主机的应用程序使用的端口号。每个TCP头部都包含源和目的端的端口号,这两个值加上IP头部中的源IP地址和目的IP地址可以唯一确定一个TCP连接。 32位序列号:用于标识从发送端发出的不同的TCP数据段的序号。数据段在网络中传输时,它们的顺序可能会发生变化;接收端依据此序列号,便可按照正确的顺序重组数据。 32位确认序列号:用于标识接收端确认收到的数据段。确认序列号为成功收到的数据序列号加1。 4位头部长度:表示头部占32bit字的数目,它能表达的TCP头部最大长度为60字节。 16位窗口大小:表示接收端期望通过单次确认而收到的数据的大小。由于该字段为16位,所以窗口大小的最大值为65535字节,该机制通常用来进行流量控制。 16位校验和:校验整个TCP报文段,包括TCP头部和TCP数据。该值由发送端计算和记录并由接收端进行验证。 TCP建立连接的过程 TCP通过三次握手建立可靠连接。 TCP是一种可靠的,面向连接的全双工传输层协议。 TCP连接的建立是一个三次握手的过程。如图所示: 主机A(通常也称为客户端)发送一个标识了SYN的数据段,表示期望与服务器A建立连接,此数据段的序列号(seq)为a。 服务器A回复标识了SYN+ACK的数据段,此数据段的序列号(seq)为b,确认序列号为主机A的序列号加1(a+1),以此作为对主机A的SYN报文的确认。 主机A发送一个标识了ACK的数据段,此数据段的序列号(seq)为a+1,确认序列号为服务器A的序列号加1(b+1),以此作为对服务器A的SYN报文的确认。 TCP传输过程 TCP的可靠传输还体现在TCP使用了确认技术来确保目的设备收到了从源设备发来的数据,并且是准确无误的。 确认技术的工作原理如下: 目的设备接收到源设备发送的数据段时,会向源端发送确认报文,源设备收到确认报文后,继续发送数据段,如此重复。 如图所示,主机A向服务器A发送TCP数据段,为描述方便假定每个数据段的长度都是500个字节。当服务器A成功收到序列号是M+1499的字节以及之前的所有字节时,会以序列号M+1499+1=M+1500进行确认。另外,由于数据段N+3传输失败,所以服务器A未能收到序列号为M+1500的字节,因此服务器A还会再次以序列号M+1500进行确认。 TCP流量控制 TCP滑动窗口技术通过动态改变窗口大小来实现对端到端设备之间的数据传输进行流量控制。 如图所示,主机A和服务器A之间通过滑动窗口来实现流量控制。为方便理解,此例中只考虑主机A发送数据给服务器A时,服务器A通过滑动窗口进行流量控制。 主机A向服务器发送4个长度为1024字节的数据段,其中主机的窗口大小为4096个字节。服务器A收到第3个数据段后,缓存区满,第4个数据段被丢弃。服务器以ACK 3073响应,窗口大小调整为3072,表明服务器的缓冲区只能处理3072个字节的数据段。于是主机A改变其发送速率,发送窗口大小为3072的数据段。 TCP关闭连接 主机在关闭连接之前,要确认收到来自对方的ACK。 TCP支持全双工模式传输数据,这意味着同一时刻两个方向都可以进行数据的传输。在传输数据之前,TCP通过三次握手建立的实际上是两个方向的连接,因此在传输完毕后,两个方向的连接必须都关闭。 TCP连接的建立是一个三次握手的过程,而TCP连接的终止则要经过四次握手。 如图所示: 主机A想终止连接,于是发送一个标识了FIN,ACK的数据段,序列号为a,确认序列号为b。 服务器A回应一个标识了ACK的数据段,序列号为b,确认序号为a+1,作为对主机A的FIN报文的确认。 服务器A想终止连接,于是向主机A发送一个标识了FIN,ACK的数据段,序列号为b,确认序列号为a+1。 主机A回应一个标识了ACK的数据段,序列号为a+1,确认序号为b+1,作为对服务器A的FIN报文的确认。 以上四次交互便完成了两个方向连接的关闭。 UDP UDP是一种面向无连接的传输层协议,传输可靠性没有保证。 当应用程序对传输的可靠性要求不高,但是对传输速度和延迟要求较高时,可以用UDP协议来替代TCP协议在传输层控制数据的转发。UDP将数据从源端发送到目的端时,无需事先建立连接。UDP采用了简单、易操作的机制在应用程序间传输数据,没有使用TCP中的确认技术或滑动窗口机制,因此UDP不能保证数据传输的可靠性,也无法避免接收到重复数据的情况。 UDP头部 UDP头部仅占8字节,传输数据时没有确认机制。 UDP报文分为UDP报文头和UDP数据区域两部分。报头由源端口、目的端口、报文长度以及校验和组成。UDP适合于实时数据传输,如语音和视频通信。相比于TCP,UDP的传输效率更高、开销更小,但是无法保障数据传输的可靠性。UDP头部的标识如下: 16位源端口号:源主机的应用程序使用的端口号。 16位目的端口号:目的主机的应用程序使用的端口号。 16位UDP长度:是指UDP头部和UDP数据的字节长度。因为UDP头部长度为8字节,所以该字段的最小值为8。 16位UDP校验和:该字段提供了与TCP校验字段同样的功能;该字段是可选的。 UDP传输过程 使用UDP传输数据时,由应用程序根据需要提供报文到达确认、排序、流量控制等功能。 主机A发送数据包时,这些数据包是以有序的方式发送到网络中的,每个数据包独立地在网络中被发送,所以不同的数据包可能会通过不同的网络路径到达主机B。这样的情况下,先发送的数据包不一定先到达主机B。因为UDP数据包没有序号,主机B将无法通过UDP协议将数据包按照原来的顺序重新组合,所以此时需要应用程序提供报文的到达确认、排序和流量控制等功能。通常情况下,UDP采用实时传输机制和时间戳来传输语音和视频数据。 UDP不提供重传机制,占用资源小,处理效率高。 一些时延敏感的流量,如语音、视频等,通常使用UDP作为传输层协议。 UDP适合传输对时延敏感的流量,如语音和视频。 在使用TCP协议传输数据时,如果一个数据段丢失或者接收端对某个数据段没有确认,发送端会重新发送该数据段。 TCP重新发送数据会带来传输延迟和重复数据,降低了用户的体验。对于时延敏感的应用,少量的数据丢失一般可以被忽略,这时使用UDP传输将能够提升用户的体验。 数据转发过程 TCP/IP协议簇和底层协议配合,保证了数据能够实现端到端的传输。数据传输过程是一个非常复杂的过程,例如数据在转发的过程中会进行一系列的封装和解封装。对于网络工程师来说,只有深入地理解了数据在各种不同设备上的转发过程,才能够对网络进行正确的分析和检测。 数据转发过程概述 数据包在相同网段内或不同网段之间转发所依据的原理基本一致。 数据可以在同一网络内或者不同网络间传输,数据转发过程也分为本地转发和远程转发,但两者的数据转发原理是基本一样的,都是遵循TCP/IP协议簇。 本示例中,主机A需要访问服务器A的Web服务,并且假定两者之间已经建立了TCP连接。接下来会以此示例来讲解数据在不同网络间的传输过程。 TCP封装 当主机建立了到达目的地的TCP连接后,便开始对应用层数据进行封装。 主机A会对待发送的应用数据首先执行加密和压缩等相关操作,之后进行传输层封装。Web应用是基于传输层的TCP协议传输数据的。主机A使用TCP进行报文封装时,必须填充源端口和目的端口字段,初始序列号和确认序列号字段,标识位,窗口字段以及校验和字段。此例中数据段的源端口号为主机A随机选择的1027号端口,目的端口号为服务器A的TCP知名端口80。 IP封装 主机A完成传输层封装后,一般会进行网络层数据封装,在使用IP进行封装时,需要明确IP报文的源和目的地址。如果IP报文的大小大于网络的最大传输单元(MTU),则该报文有可能在传输过程中被分片。 生存时间(TTL)字段用来减少网络环路造成的影响。ARG3系列路由器产生的数据包,默认TTL值为255。路由器转发一个数据包时,该值会被减1,如果路由器发现该值被减为0,就会丢弃该数据包。这样,即使网络中存在环路,数据包也不会在网络上一直被转发。 协议字段标识了传输层所使用的协议。本例中,传输层使用的是TCP协议,所以该字段的填充值为0X06。 查找路由 主机A必须要拥有到达目的地的路由。 每个主机都会独自维护各自的路由表项。主机A在发送数据前需要先检查是否能够到达目的端,这个过程是通过查找路由来完成的。在此示例中,主机A拥有一条到达“任何网络”(在IP编址部分已经简要介绍过)的路由,它发往其他网络的数据都会通过IP地址为10.1.1.1的接口转发到下一跳,即网关10.1.1.254。 ARP 通过ARP缓存表找到下一跳的MAC地址。 如果表项里没有下一跳的MAC地址,主机A会发送ARP请求。 接下来,由于数据包要被封装成数据帧,所以主机A需要获取下一跳的MAC地址,也就是网关的MAC地址。主机首先会查询ARP缓存表。本例中,主机A的ARP缓存表中存在网关MAC地址的表项。 如果没有查找到网关的MAC地址表项,主机A会通过发送ARP请求来获取网关的MAC地址。 以太网封装 主机A在链路层封装数据帧时,会遵循IEEE 802.3或Ethernet_II标准,Ethernet_II帧头中的类型字段填充为0x0800,以表示网络层使用的是IP协议。源MAC地址为主机A的MAC地址,目的MAC地址为网关路由器E0/0接口的MAC地址。 数据帧转发过程 主机工作在半双工状态下,所以会使用CSMA/CD来检测链路是否空闲。 前导码用于使接收者进入同步状态,定界符用于指示帧的开始。 主机A工作在半双工状态下,所以会使用CSMA/CD来检测链路是否空闲。如果链路空闲,主机A会将一个前导码(Preamble)和一个帧首定界符(SFD)附加到帧头然后进行传输。前导码的作用是使接收设备进行同步并做好接收数据帧的准备。前导码是包括了7个字节的二进制“1”、“0”交替的代码,即1010…10共56位。帧首定界符是长度为1个字节的10101011二进制序列,它的作用是使接收端对帧的第一位进行定位。 同一个冲突域里的设备都会接收到主机A发送的数据帧。 只有网关(RTA)会处理该数据帧,并继续转发。 本例中,主机A发送数据帧到共享以太网,此网络中的所有网络设备都会收到该帧。设备收到帧之后,首先会进行FCS校验。如果FCS校验未能通过,则帧被立即丢弃。对于通过了FCS校验的帧,设备会检查帧中的目的MAC地址。如果帧中的目的MAC地址与自己的MAC地址不同,设备将丢弃帧,如果相同,则会继续处理。处理过程中,帧头帧尾会被剥去(也就是解封装),剩下的数据报文会被根据帧头中的类型字段的值来送到网络层中的对应协议模块去处理。 数据包转发过程 网关检查是否具有到达目的网络的路由条目。 如果存在转发路径,则为数据包添加一个新的二层帧头和帧尾,并继续转发。 RTA收到此数据报文后,网络层会对该报文进行处理。RTA首先根据IP头部信息中的校验和字段,检查IP数据报文头部的完整性,然后根据目的IP地址查看路由表,确定是否能够将数据包转发到目的端。RTA还必须对TTL的值进行处理。另外,报文大小不能超过MTU值。如果报文大小超过MTU值,则报文将被分片。 网络层处理完成后,报文将被送到数据链路层重新进行封装,成为一个新的数据帧,该帧的头部会封装新的源MAC地址和目的MAC地址。如果当前网络设备不知道下一跳的MAC地址,将会使用ARP来获得。 数据帧解封装 RTB以服务器A的MAC地址作为目的MAC继续转发。 服务器A接收到该数据帧后,发现目的MAC为自己的MAC,于是会继续处理该数据帧。 该示例中,服务器A处于一个共享以太网中,两台服务器都会收到RTB发送的数据帧。该帧的目的MAC地址与服务器B的接口MAC地址不匹配,所以会被服务器B丢弃。 服务器A成功收到该帧,并通过FCS校验。服务器A将利用帧中的类型字段来识别在网络层处理该数据的协议。该示例中,服务器A会将解封装后的此数据交给网络层的IP协议来进行处理。 数据包解封装 服务器A检查数据包的目的IP地址,发现目的IP与自己的IP地址相同。 服务器A剥掉数据包的IP头部后,会送往上层协议TCP继续进行处理。 服务器A通过IP协议来处理该报文,首先会通过校验和字段来验证报文头的完整性,然后检查IP报文头中的目的IP地址是否与自己当前的IP地址匹配。 如果在源与目的之间的数据传输期间数据发生了报文分片,则报文会被目的端重新组合。标识字段用于标识属于同一数据源的分片报文,偏移量表示该分片在原分组中的相对位置。标志字段目前只有两位有意义,标志字段最低位为1,表示后面还有分片,为0表示这已经是最后一个数据片;中间一位为1表示不能分片,为0表示允许分片。所有的分片报文必须被目的端全部接收到后才会进行重新组合。 协议字段表示此数据包携带的上层数据是哪种协议的数据。需要注意的是,下一个报头并非总是传输层报头。例如,ICMP报文也是使用IP协议封装,协议字段值为0x01。 数据段解封装 服务器A检查TCP头部的目的端口,然后将数据段发送给应用层的HTTP协议进行处理。 当IP报文头被处理完并剥离后,数据段会被发送到传输层进行处理。在此示例中,传输层协议使用的是TCP,且发送端和接收端已经通过三次握手建立了连接。传输层收到该数据段后,TCP协议会查看并处理该数据段头部信息,其中目的端口号为80,用于表示处理该数据的应用层协议为HTTP协议。TCP处理完头部信息后会将此数据段头部进行剥离,然后将剩下的应用数据发送到HTTP协议进行处理。

Plan of Jekyll Blog - Episode 1: Jekyll-3 on Ubuntu and Nginx

This tutorial you will learn how to configure Jekyll-3 on Ubuntu 16.04 and Nginx. Jekyll On Ubuntu The release of the Ubuntu is Ubuntu 16.04 LTS (Xenial Xerus). You can follow this link Jekyll on Ubuntu to configure Jekyll. Before we install Jekyll, we need to install Ruby and other dependencies: sudo apt-get install ruby-full build-essential zlib1g-dev Caution: sudo apt-get install ruby-full command on Ubuntu 16.04 even 18.04 can only install Ruby2.5, it might take some unsuspected problem. Avoid installing RubyGems packages (called gems) as the root user. (Well, AliCloud only provides root account and I am lazy about adding a new user account. So I think it doesn’t matter to use root account.) Instead, set up a gem installation directory for your user account. The following commands will add environment variables to your ~/.bashrc file to configure the gem installation path: echo '# Install Ruby Gems to ~/gems' >> ~/.bashrc echo 'export GEM_HOME="$HOME/gems"' >> ~/.bashrc echo 'export PATH="$HOME/gems/bin:$PATH"' >> ~/.bashrc source ~/.bashrc Finally, install Jekyll and Bundler: gem install jekyll bundler You can make a quick start for surfing the Jekyll blog: jekyll new my-awesome-site cd my-awesome-site bundle exec jekyll serve # => Now browse to http://localhost:4000 Or, clone the repository from GitHub and build Jekyll blog: git clone https://github.com/IcingTomato/blog.old.git cd blog.old jekyll serve # => Now browse to http://localhost:4000 Liquid warning If you follow the step, congratulation, you cannot see any blog in your website. Just like this: Well, because Ruby2.5 made its Bundler incompatible with Jekyll-4.0, so we have to uninstall Jekyll-4.0 and install the previous versions. gem uninstall jekyll gem install jekyll -v 3.1.3 Jekyll Serve jekyll serve will publish your site on localhost:4000. But you can change the port: jekyll serve --port 4001 But you can’t visit it on public network. So you can: jekyll serve -w --host=0.0.0.0 After doing these jobs, we can’t visit our website ethier. Nginx Configuration Because Jekyll uses port 4000, so we will make a Nginx “proxy” from port 4000 to port 80. First, install Nginx: sudo apt-get install nginx Then, use your favourite text editor to edit /etc/nginx/conf.d/jekyll.conf: root@blog:~# sudo nano /etc/nginx/conf.d/jekyll.conf server { listen 80; server_name your.domain; location / { proxy_pass http://localhost:4000; } } Finally, Ctrl+O and Ctrl+X to save and exit, then restart nginx.service: sudo systemctl restart nginx jekyll serve --detach

【安卓搞机记】Google Pixel XL 折腾记

我在18年的时候,攒了好久的一笔钱,买了 Pixel XL,换掉了可怜的 iPhone5s,然后就开始了我的折腾之路。 前言 手机摔个稀碎,没法拍图了 Pixel/Pixel XL V版解锁教程 退出谷歌账号,取消屏幕密码,删除指纹 把设备恢复出厂设置 跳过设置向导所有东西,不要连接wifi 进入开发者选项开启USB调试,并授权电脑访问 电脑使用adb命令 adb shell pm uninstall --user 0 com.android.phone adb reboot 比较关键的一步,国内很多人卡在这里,主要是要让手机可以访问谷歌并且消除wifi上的X号,我的方法是先使用adb命令(或者科学上网法) adb shell settings put global captive_portal_https_url https://www.google.cn/generate_204 然后开关飞行模式,再开启外网,再连接wifi,就可以消除信号x了 设置锁屏密码为图形,再通过桌面的google程序登录谷歌账号 这时候再回去开发者选项就会看到OEM解锁可以开了 打开OEM解锁重启进入BootLoader 电源+音量+ 或 adb reboot bootloader 使用adb命令 fastboot oem unlock 或 fastboot flashing unlock 然后手机会进入一个界面,音量键选择YES(将会清除所有数据) 清除完了之后手机会跳回到BootLoader界面,可以看到底下已经是UNLOCK状态了 然后重启手机,再进入开发者选项,就会看到OEM解锁那里已经是解锁状态了 如何进入Bootloader界面? 方法一:手机关机,等待3秒钟,按住音量下1秒,不要松开,然后按住电源键,等待手机振动,手机进入bootloader界面。 方法二:手机关机,等待3秒钟,按住音量下1秒,链接电源线,等待手机振动,手机进入bootloader界面。 方法三:手机开机状态下,打开usb调试,在cmd窗口中手动输入 adb reboot bootloader 线刷包刷机教程 在谷歌Pixel镜像下载对应的线刷包 然后把所有的文件放到同一个文件夹内 手机进入Bootloader界面,链接电脑 这时候可以确认驱动是不是安装好了,打开设备管理器 双击刚才那个文件夹下的 flash-all.bat,开始刷机(刷机会清除所有数据哦) 刷机过程中手机会重启多次,请静静等待结束 为什么要解锁 Bootloader? 解锁 Bootloader 是打开玩机之门的钥匙。只有在 Bootloader 解锁的前提下,我们接下来的步骤才得以顺利进行:安装 TWRP、获取 Root 权限……最后,通过一些需要 Root 权限的特殊手段,打开位置历史记录功能,获得近乎完整的 Android 体验。 让我们直奔正题吧: (注意:解锁 Bootloader 重置设备数据,请注意备份) 首先,我们需要安装必(ni)备(dong)的工具并成功接入互联网。 前往「设置-关于手机-版本号」,猛击版本号 7 次开启「开发者选项」。 在开发者选项中开启「OEM 解锁」。若该选项显示为灰色,请检查你的网络连接是否正(ke)常(xue)USB 调试。 在 Pixel 设备中,开启 OEM 解锁需要连网 通过数据线将手机连接至电脑,以管理员身份运行命令提示符(CMD),输入 adb shell 并回车。 此时,手机端会弹出 USB 调试申请,点击「允许」。 回到命令提示符窗口,键入 adb reboot bootloader 并回车,手机会立即重启至 Bootloader 模式。 在 Bootloader 解锁界面中,使用音量键 +/- 来控制光标,选择「Yes」并按下电源键来进行 Bootloader 解锁。 稍等片刻之后,你的设备会自动重启,开机时屏幕下方出现一把打开的小锁,那 Bootloader 就解锁成功啦。 刷入第三方 Recovery —— TWRP 如果说 Bootloader 是玩机大门上的那把锁,那么 TWRP 就是你打开玩机之门后的领路人。 所以在解锁 Bootloader 之后,紧接着要做的事情就是刷入第三方 Recovery —— TWRP。由于 Pixel 与 Nexus 的系统分区方式不同,刷入 TWRP 的方式也略为复杂一些: 首先,前往 TWRP 官网下载最新版 TWRP 压缩包(.zip)和临时 TWRP 镜像文件(.img)。 将 .img 文件留在电脑上,同时将 .zip 文件拷贝至内置储存。 重启手机至 Fastboot 模式(参考上面的方法或关机后长按「电源」和「音量 -」),在电脑以管理员身份运行命令提示符。 在命令提示符窗口中输入 cd 你的 .img 文件路径 来进行定向(比如我的 .img 文件放在 E:\Android 下,那就键入 cd E:\Android 并回车),然后输入 fastboot boot xxx.img //xxx 为具体的文件名 此时手机会重启至临时 TWRP。 在临时 TWRP 中,选择「Install」,找到我们事先放在内置储存中的压缩包文件,点击刷入。 至此,我们就已经用第三方 TWRP 替换了系统自带的 Recovery,接下来的 Root 操作也得以进行: 前往 SuperSU 官网下载最新版 SuperSU 压缩包。 将压缩包拷贝至手机内置储存。 重启手机至 TWRP(关机后长按「电源」和「音量+」),找到 SuperSU 压缩包并刷入。 完成后重启手机,首次启动过程会自动中断并再次自动重启,不用担心。开机后,手机便已获得 Root 权限,SuperSU 权限管理应用也已经安装至系统当中。 做好这些工作之后,我们就可以进一步使用 LocationReportEnabler 等需要 Root 权限的应用来开启位置记录报告功能,最终获得完整的 Android 生态体验了。 如何进行系统更新 非 Root 用户很难对系统文件进行修改,但在进行系统更新时则较为轻松,在保证网络条件畅(ke)通(xue)的前提下,只需前往「设置-关于-系统更新」,便可自动检查、下载并升级至最新版本的 Android 操作系统。 但对 Root 用户而言,手动刷入工厂镜像进行系统更新的方法则更为稳妥。 首先,我们需要前往 Google 的 Nexus/Pixel 工厂镜像网站找到并下载最新版本的 Android 系统镜像,然后解压。 完整工厂镜像文件压缩包包含了这些内容 如果你是拿到手机想要优先进行系统升级的用户,将手机重启至 Fastboot 模式并连接电脑后,直接运行 flash-all.bat 即可全自动升级至最新版本;如果你想保留升级前的系统数据,则需要在运行 flash-all.bat 前对其进行一些处理。 使用文本文档、Notepad++ 等工具打开 flash-all.bat,找到 fastboot -w update image-marlin-xxxxxx.zip 字段,将其改为 fastboot update image-marlin-nof27b.zip //即去掉 -w 然后保存,即可利用修改后的 flash-all.bat 文件在保留数据的前提下进行系统更新。 另外,在运行 flash-all.bat 进行更新的过程中,很有可能会出现报错。报错文本类似于 archive does not contain 'boot.sig' archive does not contain 'recovery.sig' archive does not contain 'system.sig' 当出现这样的字段时,千万不要终止操作。耐心等待耐心等待耐心等待!只要最后出现 finished. total time: 128.109s Press any key to exit... 即是升级成功,手机也会自动重启进入新系统。 另外,在这个过程中所出现的错误往往和 platform-tools(包含 ADB、fastboot 等)版本过旧有关。所以遇到其他形式的报错也不用惊慌,前往 Google 官方网站 下载安装最新版本的 platform-tools 后,再次执行以上操作步骤即可。 Google 从年初开始提供独立的 platform-tools 下载 与非 root 系统自动更新相比,手动刷入完整版工厂镜像尽管要麻烦不少,但也更加灵活。 举个例子,我的 Pixel XL 到手时的系统版本是 Android 7.1.1,但安全更新补丁停留在去年 10 月。如果采用非 root 系统自动更新的方法,那我总计需要更新五次才能更新至最新的 3 月安全更新补丁。 手动 Fastboot 刷入工厂镜像则简单许多,只要我们刷入的是完整版工厂镜像,就可以无视版本跨度,一次性升级至最新版本。 原生安卓WiFi信号去叹号去叉教程5.0-Android P Captive Portal是安卓5引入的一种检测网络是否正常连接的机制,制作的非常有创意,通过HTTP返回的状态码是否是204来判断是否成功,如果访问得到了200带网页数据,那你就可能处在一个需要登录验证才能上网的环境里,比如说校园网,再比如说一些酒店提供的客户才能免费使用的WiFi(其实是通过DNS劫持实现的),如果连接超时(根本就连接不上)就在WiFi图标和信号图标上加一个标志,安卓5和6是叹号,安卓7改成一个叉了。只不过默认访问的是谷歌自家的验证服务器,然而由于你懂的原因,就算你连接上了网络也连不上这个服务器… 嗯…那其实还是没有连接上网络嘛… 噫…. 谷歌设计了一个开关来控制是否启用这个特性,同时也提供了一个变量来控制待验证的服务器地址,国内的修改版ROM通常都改成了高通中国的地址,还有一些ROM设计了代码在重启的时候恢复这个设置,不知道是出于什么目的。 没更新7.0的时候,一直用小狐狸的叹号杀手,很不错的应用,可惜当时他已经很久不更新了,当时安卓N不能用,后来自己做了个小工具,想了想就干脆上架酷安吧,也能帮助大家,这样有了CaptiveMgr工具,这分明就是个没有名字的名字嘛…根本就是foo, bar一样…好像也没什么好叫的了?现在代码还比较乱,要是哪天有空把这堆代码整理出来就开源了算了,毕竟纯粹体力活。 具体的原理不在这里写了,这里主要写如何去掉叹号或者叉标志。 如果有root权限直接用我这个工具算了,比较方便,毕竟用命令也就是检测一下系统然后代替执行命令而已嘛。 (PS: 如果使用SS/SSR可以通过NAT模式让系统直接连接,其内部是通过iptables实现的) 如果没有root权限就得按下面操作了,做好配置以后重启WiFi和数据流量(打开再关闭飞行模式即可)就可以看到效果了。 以下需要ADB调试,配置不赘述 5.0 - 6.x教程 5和6还不支持HTTPS,直接修改即可 检测开关相关: 先处理开关状态,这个变量删除就是默认开启的,删除操作随意执行,反正没影响,删除状态下获取这个变量会返回null。 注意:如果关闭,则无法判断当前网络是否需要登录,无法自动弹出登录页面 adb shell settings delete global captive_portal_server //删除 adb shell settings put global captive_portal_server 0 //禁用 adb shell settings get global captive_portal_server //查询状态 服务器地址相关: adb shell settings delete global captive_portal_server //删除地址就可以恢复默认的谷歌服务器 adb shell settings put global captive_portal_server captive.v2ex.co //设置一个可用地址(高通/V2EX都推荐) adb shell settings get global captive_portal_server //查询当前地址 7.0 - 7.1教程 这两个版本相比5和6没有大的更改,只是默认连接服务器的时候使用HTTPS,但是提供了一个开关用以指定是否使用HTTPS 检测开关相关:同5.0 - 6.x HTTPS开关相关: adb shell settings delete global captive_portal_use_https //删除(直接删除则默认使用HTTPS) adb shell settings put global captive_portal_use_https 0 //禁用HTTPS(写1启用 写0禁用) adb shell settings get global captive_portal_use_https //查询HTTPS开关状态 服务器地址相关:(如果启用了HTTPS需要先确定地址是否支持HTTPS)同5.0 - 6.x 7.1.1教程 这个版本把HTTPS和HTTP两个地址分开保存,并通过7.0加入的HTTPS开关来控制使用哪一个地址。 检测开关相关:同5.0 - 6.x HTTPS开关相关:同7.0 - 7.1 服务器地址相关: adb shell settings delete global captive_portal_https_url //删除(删除默认用HTTPS) adb shell settings delete global captive_portal_http_url 分别修改两个地址 adb shell settings put global captive_portal_http_url http://captive.v2ex.co/generate_204 adb shell settings put global captive_portal_https_url https://captive.v2ex.co/generate_204 7.1.2教程 此版本服务器地址判断逻辑相比7.1.1没有更改,但是检测的开关却变了。 检测开关: #删除变量:(删除以后默认启用) adb shell settings delete global captive_portal_mode #关闭检测: adb shell settings put global captive_portal_mode 0 #查看当前状态: adb shell settings get global captive_portal_mode 服务器地址相关(同7.1.1): #删除(删除默认用HTTPS) adb shell settings delete global captive_portal_https_url adb shell settings delete global captive_portal_http_url #分别修改两个地址 adb shell settings put global captive_portal_http_url http://captive.v2ex.co/generate_204 adb shell settings put global captive_portal_https_url https://captive.v2ex.co/generate_204 8.0.0和8.1.0和9.0(Android P)同上7.1.2,未做修改 隐藏导航栏和状态栏 #全屏沉浸: adb shell settings put global policy_control immersive.full=* #沉浸状态栏: adb shell settings put global policy_control immersive.status=* #沉浸导航栏: adb shell settings put global policy_control immersive.navigation=* #单独控制某一个app不沉浸,比如以下代码设定google实时界面不沉浸,其他程序沉浸: adb shell settings put global policy_control immersive.full=apps,-com.google.android.googlequicksearchbox #恢复到正常方式: adb shell settings put global policy_control null adb 查看android手机中应用的包名和安装位置 #查看是否连接手机 adb devices #进入指定的device的shell adb shell #或者 adb -s ********* shell #adb 查看所有安装的包 adb shell pm list packages #根据某个关键字查找包 pm list packages | grep tencent #查看包安装位置 pm list packages -f #同样可以进行筛选 pm list packages -f | grep tencent #将apk拉到pc中 adb pull /data/app/com.tencent.tbs-1/base.apk ~/Downloads 黑阈 adb -d shell sh /data/data/me.piebridge.brevent/brevent.sh Google Pixel 电信破解 仅适用于一代,无需双清,无需QPST,摆脱繁琐的刷机 在Android Pie下测试通过,重启后不丢失 开发者模式中开启 OEM 解锁后,重启手机进入 bootloader 模式,在电脑端运行 fastboot oem unlock 注:此过程会清除手机数据,请及时备份。 下载modem.img 刷入modem.img fastboot flash modem_a modem.img fastboot flash modem_b modem.img 理论上不支持移动和联通,如更换请重刷官方底包 注意(如果有路由器级别kexue可以忽略) 你需要2018年3月或之前的系统。原因是这样的: 有一个叫frp的分区,它的全称是——Factory Reset Protection。 开机设置读取frp,得知是否首次开机。清除frp,伪装成首次开机。 不幸的是,4月的官方镜像里的开机设置没有这种操作。开机设置才不管frp呢,必须联网。 所以在恢复出厂设置前一定要看看你的安全补丁日期是哪个月的!!如果是4月的需要先刷回3月。 2021年2月21日补记 忘记是哪一次刷机的时候Pixel和Pixel XL的包搞混了,在Pixel上刷了XL的包,结果还能用?就是屏幕的最小宽度(可以在设置 -> 系统 -> 开发者选项 -> 绘图 下面更改)变了好像?