<?xml version="1.0" encoding="utf-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><title>doorxp</title><link>http://139.162.107.204/</link><description>Blog</description><item><title>5 针 188 LED显示屏 带风扇和雪花</title><link>http://139.162.107.204/?id=152</link><description>&lt;p&gt;原理&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2025/05/202505161747381826390608.png&quot; title=&quot;截屏2025-05-16 15.49.06.png&quot; alt=&quot;截屏2025-05-16 15.49.06.png&quot; width=&quot;1&quot; height=&quot;1&quot; style=&quot;width: 1px; height: 1px;&quot;/&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2025/05/202505161747381993867068.png&quot; title=&quot;截屏2025-05-16 15.49.06.png&quot; alt=&quot;截屏2025-05-16 15.49.06.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;CH32V203 驱动代码&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-c&quot;&gt;#include&amp;nbsp;&amp;quot;LED188Display.h&amp;quot;
#include&amp;nbsp;&amp;quot;SysTick.h&amp;quot;
#include&amp;nbsp;&amp;quot;Utils.h&amp;quot;
#include&amp;nbsp;&amp;lt;strings.h&amp;gt;
#include&amp;nbsp;&amp;lt;assert.h&amp;gt;

const&amp;nbsp;GPIOSpeed_TypeDef&amp;nbsp;GPIO_Speed&amp;nbsp;=&amp;nbsp;GPIO_Speed_2MHz;

typedef&amp;nbsp;struct&amp;nbsp;_SEGPOINT{
GPIO_TypeDef*&amp;nbsp;PORT;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;uint16_t&amp;nbsp;PIN;
}&amp;nbsp;SEGPOINT;

#define&amp;nbsp;DPA&amp;nbsp;{GPIOB,GPIO_Pin_3}
#define&amp;nbsp;DPB&amp;nbsp;{GPIOB,GPIO_Pin_4}
#define&amp;nbsp;DPC&amp;nbsp;{GPIOB,GPIO_Pin_5}
#define&amp;nbsp;DPD&amp;nbsp;{GPIOB,GPIO_Pin_6}
#define&amp;nbsp;DPE&amp;nbsp;{GPIOB,GPIO_Pin_7}

//显示五个针脚
const&amp;nbsp;SEGPOINT&amp;nbsp;POINTS[]&amp;nbsp;=&amp;nbsp;{DPA,&amp;nbsp;DPB,&amp;nbsp;DPC,&amp;nbsp;DPD,&amp;nbsp;DPE};

//定义显示表,5针,可以显示&amp;nbsp;5*4=20&amp;nbsp;种状态&amp;nbsp;i=j&amp;nbsp;不能用
u8&amp;nbsp;showTable[5][5]&amp;nbsp;=&amp;nbsp;{0};



const&amp;nbsp;u16&amp;nbsp;LEDPins&amp;nbsp;=&amp;nbsp;POINTS[0].PIN&amp;nbsp;|&amp;nbsp;POINTS[1].PIN&amp;nbsp;|&amp;nbsp;POINTS[2].PIN&amp;nbsp;|&amp;nbsp;POINTS[3].PIN&amp;nbsp;|&amp;nbsp;POINTS[4].PIN;



volatile&amp;nbsp;static&amp;nbsp;uint8_t&amp;nbsp;value&amp;nbsp;=&amp;nbsp;0;
volatile&amp;nbsp;static&amp;nbsp;uint8_t&amp;nbsp;k1&amp;nbsp;=&amp;nbsp;0;
volatile&amp;nbsp;static&amp;nbsp;uint8_t&amp;nbsp;k2&amp;nbsp;=&amp;nbsp;0;
volatile&amp;nbsp;static&amp;nbsp;u8&amp;nbsp;needUpdate&amp;nbsp;=&amp;nbsp;0;
volatile&amp;nbsp;static&amp;nbsp;uint8_t&amp;nbsp;blink&amp;nbsp;=&amp;nbsp;0;

static&amp;nbsp;uint32_t&amp;nbsp;_counter&amp;nbsp;=&amp;nbsp;0;
void&amp;nbsp;updateTable(uint8_t&amp;nbsp;num,&amp;nbsp;uint8_t&amp;nbsp;fan,&amp;nbsp;uint8_t&amp;nbsp;zhilen);

void&amp;nbsp;display(void){
//&amp;nbsp;uint8_t&amp;nbsp;num&amp;nbsp;=&amp;nbsp;value;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(blink){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_counter++;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(_counter&amp;nbsp;&amp;gt;&amp;nbsp;55){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_counter&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;else{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;_counter&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(needUpdate){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;needUpdate&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;updateTable(value,&amp;nbsp;k1,&amp;nbsp;k2);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(u8&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;5;&amp;nbsp;i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//个位闪烁时熄灭状态
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(_counter&amp;nbsp;&amp;gt;=&amp;nbsp;30&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;i&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//判断第i个PIN&amp;nbsp;为低电平时,有需要显示me&amp;nbsp;v为0&amp;nbsp;不需要显示,&amp;nbsp;其他需要显示&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;v&amp;nbsp;=&amp;nbsp;showTable[i][1]&amp;nbsp;|&amp;nbsp;showTable[i][2]&amp;nbsp;|&amp;nbsp;showTable[i][3]&amp;nbsp;|&amp;nbsp;showTable[i][4];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(_counter&amp;nbsp;&amp;lt;&amp;nbsp;30){&amp;nbsp;v&amp;nbsp;|=&amp;nbsp;showTable[i][0];&amp;nbsp;}&amp;nbsp;//第&amp;nbsp;0&amp;nbsp;位闪烁时,&amp;nbsp;不亮&amp;nbsp;LED&amp;nbsp;不需要参加判断
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(v){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//第&amp;nbsp;i个引脚为低电平时,&amp;nbsp;其他4&amp;nbsp;个引脚&amp;nbsp;有至少一个&amp;nbsp;段要亮,&amp;nbsp;所以需要设置第&amp;nbsp;i&amp;nbsp;个引脚为低电平
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_ResetBits(POINTS[i].PORT,&amp;nbsp;POINTS[i].PIN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;highPins&amp;nbsp;=&amp;nbsp;0;//记录需要高电平的引脚
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//判断其他&amp;nbsp;4&amp;nbsp;个引脚&amp;nbsp;是否有需要显示的段,需要就要设置为高电平
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(u8&amp;nbsp;j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;5;&amp;nbsp;j++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(j&amp;nbsp;==&amp;nbsp;i&amp;nbsp;||&amp;nbsp;showTable[i][j]&amp;nbsp;==&amp;nbsp;0)continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((j&amp;nbsp;==&amp;nbsp;0&amp;nbsp;||&amp;nbsp;i&amp;nbsp;==&amp;nbsp;0)&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;_counter&amp;nbsp;&amp;gt;=&amp;nbsp;30)&amp;nbsp;continue;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//如果&amp;nbsp;i&amp;nbsp;和&amp;nbsp;j&amp;nbsp;都不是&amp;nbsp;0，或者&amp;nbsp;_counter&amp;nbsp;&amp;lt;&amp;nbsp;30，才设置&amp;nbsp;highPins
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if((i&amp;nbsp;!=&amp;nbsp;0&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;j&amp;nbsp;!=&amp;nbsp;0)&amp;nbsp;||&amp;nbsp;_counter&amp;nbsp;&amp;lt;&amp;nbsp;30){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;highPins&amp;nbsp;|=&amp;nbsp;POINTS[j].PIN;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//设置highPins为高电平
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_CONFIG(POINTS[i].PORT,&amp;nbsp;highPins,&amp;nbsp;GPIO_Mode_Out_PP,&amp;nbsp;GPIO_Speed);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_SetBits(POINTS[i].PORT,&amp;nbsp;highPins);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//延时
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Delay_US(50);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//设置highPins为高阻状态,&amp;nbsp;这些&amp;nbsp;PIN&amp;nbsp;已经是高电平了.一行代码搞定&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_CONFIG(GPIOB,&amp;nbsp;highPins,&amp;nbsp;GPIO_Mode_Out_OD,&amp;nbsp;GPIO_Speed);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//恢复低电平PIN为高阻状态
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GPIO_SetBits(POINTS[i].PORT,&amp;nbsp;POINTS[i].PIN);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

}

//根据段码表得到,不能修改
#define&amp;nbsp;FAN_SEG_CODE&amp;nbsp;0x02
#define&amp;nbsp;COOL_SEG_CODE&amp;nbsp;0x04

/*&amp;nbsp;0-9&amp;nbsp;的段码,&amp;nbsp;0x01&amp;nbsp;代表&amp;nbsp;风扇,&amp;nbsp;0x02&amp;nbsp;代表制冷&amp;nbsp;*/
u8&amp;nbsp;segmentCodes[]&amp;nbsp;=&amp;nbsp;{0x7E,&amp;nbsp;0x30,&amp;nbsp;0x6D,&amp;nbsp;0x79,&amp;nbsp;0x33,&amp;nbsp;0x5B,&amp;nbsp;0x5F,&amp;nbsp;0x70,&amp;nbsp;0x7F,&amp;nbsp;0x7B,&amp;nbsp;FAN_SEG_CODE,&amp;nbsp;COOL_SEG_CODE};


typedef&amp;nbsp;struct{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;pH;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;pL;
}AK;

#define&amp;nbsp;_NCAK&amp;nbsp;{0,0}&amp;nbsp;//没有用的&amp;nbsp;AK
const&amp;nbsp;AK&amp;nbsp;AKTable[3][7]&amp;nbsp;=&amp;nbsp;{
{{4,&amp;nbsp;0},&amp;nbsp;{3,&amp;nbsp;0},&amp;nbsp;{0,&amp;nbsp;3},&amp;nbsp;{2,&amp;nbsp;0},&amp;nbsp;{0,&amp;nbsp;2},&amp;nbsp;{1,&amp;nbsp;0},&amp;nbsp;{0,&amp;nbsp;1}},//个位
{{4,&amp;nbsp;3},&amp;nbsp;{4,&amp;nbsp;2},&amp;nbsp;{4,&amp;nbsp;1},&amp;nbsp;{3,&amp;nbsp;1},&amp;nbsp;{3,&amp;nbsp;2},&amp;nbsp;{2,&amp;nbsp;1},&amp;nbsp;{1,&amp;nbsp;2}},//十位
{_NCAK,&amp;nbsp;{2,&amp;nbsp;4},&amp;nbsp;{1,&amp;nbsp;4},&amp;nbsp;_NCAK,&amp;nbsp;{1,&amp;nbsp;3},&amp;nbsp;{2,&amp;nbsp;3},&amp;nbsp;_NCAK},//百位和风扇图标,制冷图标
};

void&amp;nbsp;getTableIndex(u8&amp;nbsp;wei,&amp;nbsp;u8&amp;nbsp;mask,&amp;nbsp;u8*&amp;nbsp;pH,&amp;nbsp;u8*&amp;nbsp;pL)&amp;nbsp;{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;bit&amp;nbsp;=&amp;nbsp;__builtin_ctz(mask);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;u8&amp;nbsp;bit;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;__asm__(&amp;quot;ctz&amp;nbsp;%0,&amp;nbsp;%1&amp;quot;&amp;nbsp;:&amp;nbsp;&amp;quot;=r&amp;quot;(bit)&amp;nbsp;:&amp;nbsp;&amp;quot;r&amp;quot;(mask));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;AK&amp;nbsp;ak&amp;nbsp;=&amp;nbsp;AKTable[wei][bit];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*pH&amp;nbsp;=&amp;nbsp;ak.pH;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;*pL&amp;nbsp;=&amp;nbsp;ak.pL;
}


void&amp;nbsp;updateTable(uint8_t&amp;nbsp;num,&amp;nbsp;uint8_t&amp;nbsp;fan,&amp;nbsp;uint8_t&amp;nbsp;zhilen){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;bzero(showTable,&amp;nbsp;sizeof(showTable));
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;pH&amp;nbsp;=&amp;nbsp;0;//高位PIN在POINTS中的索引
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;pL&amp;nbsp;=&amp;nbsp;0;//低位PIN在POINTS中的索引
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;code&amp;nbsp;=&amp;nbsp;0;//当前位段码
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;value&amp;nbsp;=&amp;nbsp;num;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//个,十,百位,&amp;nbsp;风扇,&amp;nbsp;制冷图标编码在百位F2,E2中
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(u8&amp;nbsp;j&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;j&amp;nbsp;&amp;lt;&amp;nbsp;3;&amp;nbsp;j++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;code&amp;nbsp;=&amp;nbsp;segmentCodes[value&amp;nbsp;%&amp;nbsp;10];
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;mask&amp;nbsp;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;for(u8&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;7;&amp;nbsp;i++){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;u8&amp;nbsp;v&amp;nbsp;=&amp;nbsp;code&amp;nbsp;&amp;amp;&amp;nbsp;mask;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(v){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getTableIndex(j,&amp;nbsp;mask,&amp;nbsp;&amp;amp;pH,&amp;nbsp;&amp;amp;pL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showTable[pL][pH]&amp;nbsp;=&amp;nbsp;mask;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;mask&amp;nbsp;&amp;lt;&amp;lt;=&amp;nbsp;1;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;/=&amp;nbsp;10;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(value&amp;nbsp;&amp;lt;=&amp;nbsp;0)&amp;nbsp;break;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}

&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(fan){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getTableIndex(2,&amp;nbsp;FAN_SEG_CODE,&amp;nbsp;&amp;amp;pH,&amp;nbsp;&amp;amp;pL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showTable[pL][pH]&amp;nbsp;=&amp;nbsp;FAN_SEG_CODE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(zhilen){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;getTableIndex(2,&amp;nbsp;COOL_SEG_CODE,&amp;nbsp;&amp;amp;pH,&amp;nbsp;&amp;amp;pL);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;showTable[pL][pH]&amp;nbsp;=&amp;nbsp;COOL_SEG_CODE;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}
}

void&amp;nbsp;LED188_Display(uint8_t&amp;nbsp;num,&amp;nbsp;uint8_t&amp;nbsp;fan,&amp;nbsp;uint8_t&amp;nbsp;zhilen,&amp;nbsp;uint8_t&amp;nbsp;b){
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(num&amp;nbsp;&amp;gt;&amp;nbsp;199){&amp;nbsp;num&amp;nbsp;=&amp;nbsp;199;&amp;nbsp;}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;if(value&amp;nbsp;==&amp;nbsp;num&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;fan&amp;nbsp;==&amp;nbsp;k1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;zhilen&amp;nbsp;==&amp;nbsp;k2&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;blink&amp;nbsp;==&amp;nbsp;b)return;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;value&amp;nbsp;=&amp;nbsp;num;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k1&amp;nbsp;=&amp;nbsp;fan;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;k2&amp;nbsp;=&amp;nbsp;zhilen;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;blink&amp;nbsp;=&amp;nbsp;b;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;needUpdate&amp;nbsp;=&amp;nbsp;1;
}&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Fri, 16 May 2025 15:48:05 +0800</pubDate></item><item><title>aliyun DDNS sh</title><link>http://139.162.107.204/?id=151</link><description>&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#!/bin/bash

SERVER_URL=&amp;quot;https://alidns.aliyuncs.com&amp;quot;

#&amp;nbsp;阿里云&amp;nbsp;API&amp;nbsp;设置
ACCESS_KEY_ID=$1
ACCESS_KEY_SECRET=$2
DOMAIN_NAME=$1
IP=$3

domain_parts=(${DOMAIN_NAME//./&amp;nbsp;})
length=${#domain_parts[@]}

if&amp;nbsp;[&amp;nbsp;$length&amp;nbsp;-lt&amp;nbsp;3&amp;nbsp;];&amp;nbsp;then
echo&amp;nbsp;&amp;quot;错误：无效的域名格式&amp;quot;
return&amp;nbsp;1
else
DOMAIN=&amp;quot;${domain_parts[$((length-2))]}.${domain_parts[$((length-1))]}&amp;quot;
SUB_DOMAIN=(${DOMAIN_NAME//.$DOMAIN/&amp;nbsp;})
fi




#&amp;nbsp;API&amp;nbsp;版本
VERSION=&amp;quot;2015-01-09&amp;quot;

#&amp;nbsp;生成时间戳和随机字符串
TIMESTAMP=$(date&amp;nbsp;-u&amp;nbsp;&amp;quot;+%Y-%m-%dT%H:%M:%SZ&amp;quot;)
NONCE=$(cat&amp;nbsp;/dev/urandom&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-n&amp;nbsp;10&amp;nbsp;|&amp;nbsp;md5sum&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-c&amp;nbsp;8)

#&amp;nbsp;URL&amp;nbsp;编码函数
urlencode()&amp;nbsp;{
local&amp;nbsp;length=&amp;quot;${#1}&amp;quot;
for&amp;nbsp;((&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;length;&amp;nbsp;i++&amp;nbsp;));&amp;nbsp;do
local&amp;nbsp;c=&amp;quot;${1:i:1}&amp;quot;
case&amp;nbsp;$c&amp;nbsp;in
[a-zA-Z0-9.~_-])&amp;nbsp;printf&amp;nbsp;&amp;quot;$c&amp;quot;&amp;nbsp;;;
*)&amp;nbsp;printf&amp;nbsp;&amp;#39;%%%02X&amp;#39;&amp;nbsp;&amp;quot;&amp;#39;$c&amp;quot;&amp;nbsp;;;
esac
done
}

#&amp;nbsp;生成时间戳和随机字符串
TIMESTAMP=$(date&amp;nbsp;-u&amp;nbsp;&amp;quot;+%Y-%m-%dT%H:%M:%SZ&amp;quot;)
NONCE=$(cat&amp;nbsp;/dev/urandom&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-n&amp;nbsp;10&amp;nbsp;|&amp;nbsp;md5sum&amp;nbsp;|&amp;nbsp;head&amp;nbsp;-c&amp;nbsp;8)

#&amp;nbsp;URL&amp;nbsp;编码函数
urlencode()&amp;nbsp;{
local&amp;nbsp;length=&amp;quot;${#1}&amp;quot;
for&amp;nbsp;((&amp;nbsp;i&amp;nbsp;=&amp;nbsp;0;&amp;nbsp;i&amp;nbsp;&amp;lt;&amp;nbsp;length;&amp;nbsp;i++&amp;nbsp;));&amp;nbsp;do
local&amp;nbsp;c=&amp;quot;${1:i:1}&amp;quot;
case&amp;nbsp;$c&amp;nbsp;in
[a-zA-Z0-9.~_-])&amp;nbsp;printf&amp;nbsp;&amp;quot;$c&amp;quot;&amp;nbsp;;;
*)&amp;nbsp;printf&amp;nbsp;&amp;#39;%%%02X&amp;#39;&amp;nbsp;&amp;quot;&amp;#39;$c&amp;quot;&amp;nbsp;;;
esac
done
}


#&amp;nbsp;函数：发送&amp;nbsp;API&amp;nbsp;请求
send_request()&amp;nbsp;{
local&amp;nbsp;query=&amp;quot;$1&amp;quot;
local&amp;nbsp;string_to_sign=&amp;quot;GET&amp;amp;%2F&amp;amp;$(urlencode&amp;nbsp;&amp;quot;$query&amp;quot;)&amp;quot;
local&amp;nbsp;signature=$(echo&amp;nbsp;-n&amp;nbsp;&amp;quot;$string_to_sign&amp;quot;&amp;nbsp;|&amp;nbsp;openssl&amp;nbsp;dgst&amp;nbsp;-sha1&amp;nbsp;-hmac&amp;nbsp;&amp;quot;${ACCESS_KEY_SECRET}&amp;amp;&amp;quot;&amp;nbsp;-binary&amp;nbsp;|&amp;nbsp;base64)
local&amp;nbsp;url=&amp;quot;${SERVER_URL}/?${query}&amp;amp;Signature=$(urlencode&amp;nbsp;&amp;quot;$signature&amp;quot;)&amp;quot;
curl&amp;nbsp;-s&amp;nbsp;&amp;quot;$url&amp;quot;
}

#&amp;nbsp;获取&amp;nbsp;RecordId
get_record_id()&amp;nbsp;{
local&amp;nbsp;query=&amp;quot;AccessKeyId=$ACCESS_KEY_ID&amp;amp;Action=DescribeDomainRecords&amp;amp;DomainName=$DOMAIN&amp;amp;Format=JSON&amp;amp;RRKeyWord=$SUB_DOMAIN&amp;amp;SignatureMethod=HMAC-SHA1&amp;amp;SignatureNonce=$NONCE&amp;amp;SignatureVersion=1.0&amp;amp;Timestamp=$(urlencode&amp;nbsp;$TIMESTAMP)&amp;amp;Type=A&amp;amp;Version=$VERSION&amp;quot;
local&amp;nbsp;sorted_query=$(echo&amp;nbsp;$query&amp;nbsp;|&amp;nbsp;tr&amp;nbsp;&amp;#39;&amp;amp;&amp;#39;&amp;nbsp;&amp;#39;\n&amp;#39;&amp;nbsp;|&amp;nbsp;sort&amp;nbsp;|&amp;nbsp;tr&amp;nbsp;&amp;#39;\n&amp;#39;&amp;nbsp;&amp;#39;&amp;amp;&amp;#39;&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;&amp;#39;s/&amp;amp;$//&amp;#39;)
local&amp;nbsp;result=$(send_request&amp;nbsp;&amp;quot;$sorted_query&amp;quot;)
echo&amp;nbsp;&amp;quot;$result&amp;quot;&amp;nbsp;|&amp;nbsp;grep&amp;nbsp;-o&amp;nbsp;&amp;#39;&amp;quot;RecordId&amp;quot;:&amp;quot;[^&amp;quot;]*&amp;#39;&amp;nbsp;|&amp;nbsp;cut&amp;nbsp;-d&amp;#39;&amp;quot;&amp;#39;&amp;nbsp;-f4
}

#&amp;nbsp;获取&amp;nbsp;RecordId
RECORD_ID=$(get_record_id)

if&amp;nbsp;[&amp;nbsp;-z&amp;nbsp;&amp;quot;$RECORD_ID&amp;quot;&amp;nbsp;];&amp;nbsp;then
echo&amp;nbsp;&amp;quot;nohost&amp;quot;
exit&amp;nbsp;1
fi

#&amp;nbsp;构建参数字符串
QUERY_PARAMS=&amp;quot;AccessKeyId=$ACCESS_KEY_ID&amp;amp;Action=UpdateDomainRecord&amp;amp;DomainName=$DOMAIN&amp;amp;Format=JSON&amp;amp;RecordId=$RECORD_ID&amp;amp;RR=$SUB_DOMAIN&amp;amp;SignatureMethod=HMAC-SHA1&amp;amp;SignatureNonce=$NONCE&amp;amp;SignatureVersion=1.0&amp;amp;Timestamp=$(urlencode&amp;nbsp;$TIMESTAMP)&amp;amp;Type=A&amp;amp;Value=$IP&amp;amp;Version=$VERSION&amp;quot;

#&amp;nbsp;对参数进行排序
SORTED_QUERY_PARAMS=$(echo&amp;nbsp;$QUERY_PARAMS&amp;nbsp;|&amp;nbsp;tr&amp;nbsp;&amp;#39;&amp;amp;&amp;#39;&amp;nbsp;&amp;#39;\n&amp;#39;&amp;nbsp;|&amp;nbsp;sort&amp;nbsp;|&amp;nbsp;tr&amp;nbsp;&amp;#39;\n&amp;#39;&amp;nbsp;&amp;#39;&amp;amp;&amp;#39;&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;&amp;#39;s/&amp;amp;$//&amp;#39;)

#&amp;nbsp;构建待签名字符串
STRING_TO_SIGN=&amp;quot;GET&amp;amp;%2F&amp;amp;$(urlencode&amp;nbsp;$SORTED_QUERY_PARAMS)&amp;quot;

#&amp;nbsp;生成签名
SIGNATURE=$(echo&amp;nbsp;-n&amp;nbsp;&amp;quot;$STRING_TO_SIGN&amp;quot;&amp;nbsp;|&amp;nbsp;openssl&amp;nbsp;dgst&amp;nbsp;-sha1&amp;nbsp;-hmac&amp;nbsp;&amp;quot;${ACCESS_KEY_SECRET}&amp;amp;&amp;quot;&amp;nbsp;-binary&amp;nbsp;|&amp;nbsp;base64)

#&amp;nbsp;发送请求
URL=&amp;quot;${SERVER_URL}/?${SORTED_QUERY_PARAMS}&amp;amp;Signature=$(urlencode&amp;nbsp;$SIGNATURE)&amp;quot;
RESULT=$(curl&amp;nbsp;-s&amp;nbsp;&amp;quot;$URL&amp;quot;)

#&amp;nbsp;检查结果
if&amp;nbsp;[[&amp;nbsp;$RESULT&amp;nbsp;==&amp;nbsp;*&amp;quot;RecordId&amp;quot;*&amp;nbsp;]];&amp;nbsp;then
echo&amp;nbsp;&amp;quot;good&amp;quot;
exit&amp;nbsp;0
elif&amp;nbsp;[[&amp;nbsp;$RESULT&amp;nbsp;==&amp;nbsp;*&amp;quot;DomainRecordDuplicate&amp;quot;*&amp;nbsp;]];&amp;nbsp;then
echo&amp;nbsp;&amp;quot;nochg&amp;quot;
exit&amp;nbsp;0
else
echo&amp;nbsp;&amp;quot;abuse&amp;quot;
exit&amp;nbsp;1
fi&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Wed, 20 Nov 2024 16:44:29 +0800</pubDate></item><item><title>Android 网易MuMu模拟器 mac intel 版本 最高支持 Sonoma 14.5 </title><link>http://139.162.107.204/?id=150</link><description>&lt;p&gt;Android 网易MuMu模拟器 mac intel 版本 最高支持 Sonoma 14.5&amp;nbsp;&lt;/p&gt;&lt;p&gt;官网不维护了,居然没有广告了&lt;/p&gt;&lt;p&gt;链接: &lt;a href=&quot;https://pan.baidu.com/s/1JQbEsOXgx7J5nU7lVR8a-w?pwd=wd3p&quot; target=&quot;_self&quot;&gt;https://pan.baidu.com/s/1JQbEsOXgx7J5nU7lVR8a-w?pwd=wd3p&lt;/a&gt; 提取码: wd3p 复制这段内容后打开百度网盘手机App，操作更方便哦&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;先完全卸载以前前安装的&lt;/p&gt;&lt;p&gt;再安装&lt;/p&gt;&lt;p&gt;再重启电脑&lt;/p&gt;</description><pubDate>Mon, 03 Jun 2024 10:34:51 +0800</pubDate></item><item><title>you-get kugou.py 修改</title><link>http://139.162.107.204/?id=149</link><description>&lt;p&gt;修改文件路径 /usr/local/Cellar/you-get/0.4.1650/libexec/lib/python3.11/site-packages/you_get/extractors/kugou.py&lt;/p&gt;&lt;p&gt;内容如下:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;div style=&quot;color: rgb(218, 218, 218); background-color: rgb(30, 30, 30); font-family: Menlo, Monaco, &amp;quot;Courier New&amp;quot;, monospace; font-size: 17.901px; line-height: 26px; white-space-collapse: preserve;&quot;&gt;&lt;p&gt;&lt;span style=&quot;color: #57A64A; font-size: 17.901px;&quot;&gt;#!/usr/bin/env python&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;__all__&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;kugou_download&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #d8a0df;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;..&lt;/span&gt;&lt;span style=&quot;color: #c8c8c8;&quot;&gt;common&lt;/span&gt; &lt;span style=&quot;color: #d8a0df;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;*&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d8a0df;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #c8c8c8;&quot;&gt;json&lt;/span&gt; &lt;span style=&quot;color: #d8a0df;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;loads&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d8a0df;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #c8c8c8;&quot;&gt;base64&lt;/span&gt; &lt;span style=&quot;color: #d8a0df;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;b64decode&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d8a0df;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #c8c8c8;&quot;&gt;re&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #d8a0df;&quot;&gt;from&lt;/span&gt; selenium &lt;span style=&quot;color: #d8a0df;&quot;&gt;import&lt;/span&gt; webdriver&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;def&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;kugou_download&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9a9a9a;&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9a9a9a;&quot;&gt;output_dir&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9a9a9a;&quot;&gt;merge&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;True&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9a9a9a;&quot;&gt;info_only&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;False&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;**&lt;/span&gt;&lt;span style=&quot;color: #9a9a9a;&quot;&gt;kwargs&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;):&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;options&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; webdriver&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;ChromeOptions&lt;span style=&quot;color: #b4b4b4;&quot;&gt;()&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;add_argument&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;headless&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt;webdriver&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;Chrome&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9a9a9a;&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;options&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;get&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9a9a9a;&quot;&gt;url&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;hash&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;execute_script&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;return window.hash;&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;album_id&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;execute_script&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;return window.album_id;&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;album_audio_id&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;execute_script&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;return window.album_audio_id;&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;encode_album_audio_id&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;execute_script&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;return window.encode_album_audio_id;&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;bInfo&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;execute_async_script&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;const callback = arguments[arguments.length - 1];window.getBaseInfo(1014, function(bInfo) {callback(bInfo);});&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;info&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;browser&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;execute_async_script&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;const callback = arguments[arguments.length - 1];&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;window.infSign({from:112,appid:&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;,dfid:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;,encode_album_audio_id:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;,mid:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;,platid:&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%d&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;,token:&amp;quot;&amp;quot;,userid:&amp;quot;0&amp;quot;,uuid:&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #569cd6;&quot;&gt;%s&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;&amp;quot;}, null, {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;useH5: true,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;postType: &amp;#39;json&amp;#39;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;callback: function (spa){$.ajax({&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;type: &amp;quot;GET&amp;quot;,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;url: &amp;quot;https://wwwapi.kugou.com/play/songinfo&amp;quot;,timeout: 5000,data: spa,&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;quot;success&amp;quot;: function (res, status, xhr) {&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;callback(res);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;);&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;}&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt; &amp;nbsp; &amp;nbsp;});&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;%(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;bInfo&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;appid&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;bInfo&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;dfid&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;],&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;encode_album_audio_id&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;bInfo&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;mid&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;],&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;bInfo&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;plat&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;],&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;bInfo&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;uuid&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;]))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #c8c8c8;&quot;&gt;logging&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;.&lt;/span&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;debug&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;play_url&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;play_url&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;title&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;info&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;[&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;data&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;][&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;song_name&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# ext = &amp;quot;mp3&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# size = info[&amp;quot;data&amp;quot;][&amp;quot;filesize&amp;quot;];&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;songtype&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;size&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;url_info&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;play_url&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;print_info&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;(&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;site_info&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;songtype&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #dcdcaa;&quot;&gt;download_urls&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;([&lt;/span&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;play_url&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;],&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;title&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;ext&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9cdcfe;&quot;&gt;size&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9a9a9a;&quot;&gt;output_dir&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #9a9a9a;&quot;&gt;merge&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt;&lt;span style=&quot;color: #9a9a9a;&quot;&gt;merge&lt;/span&gt;&lt;span style=&quot;color: #b4b4b4;&quot;&gt;)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;#html = get_html(url,faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# var hash = &amp;quot;33209AA0259DEF69D0B61333CBE4701A&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# var album_id = &amp;quot;67025894&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# var album_audio_id = &amp;quot;482684975&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# var encode_album_audio_id = &amp;quot;7zdm3zb8&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# hashre = re.compile(r&amp;#39;var hash = &amp;quot;(.*?)&amp;quot;&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# hash = hashre.search(html).group(1).lower()&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# album_idre = re.compile(r&amp;#39;var album_id = &amp;quot;(.*?)&amp;quot;&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# album_id = album_idre.search(html).group(1)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# album_audio_idre = re.compile(r&amp;#39;var album_audio_id = &amp;quot;(.*?)&amp;quot;&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# album_audio_id = album_audio_idre.search(html).group(1)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# encode_album_audio_idre = re.compile(r&amp;#39;var encode_album_audio_id = &amp;quot;(.*?)&amp;quot;&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# encode_album_audio_id = encode_album_audio_idre.search(html).group(1)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# if url.lower().find(&amp;quot;5sing&amp;quot;) != -1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # for 5sing.kugou.com&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; html = get_html(url, faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; ticket = r1(r&amp;#39;&amp;quot;ticket&amp;quot;:\s*&amp;quot;(.*)&amp;quot;&amp;#39;, html)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; j = loads(str(b64decode(ticket), encoding=&amp;quot;utf-8&amp;quot;))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; url = j[&amp;#39;file&amp;#39;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; title = j[&amp;#39;songName&amp;#39;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; songtype, ext, size = url_info(url)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; print_info(site_info, title, songtype, size)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; if not info_only:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; download_urls([url], title, ext, size, output_dir, merge=merge)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# elif url.lower().find(&amp;quot;-&amp;quot;) == -1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; return kugou_download_by_hash(url, output_dir, merge, info_only)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# else:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # for the www.kugou.com/&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; return kugou_download_playlist(url, output_dir=output_dir, merge=merge, info_only=info_only)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # raise NotImplementedError(url) &amp;nbsp; &amp;nbsp; &amp;nbsp; &lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# def kugou_download_by_hash(url, output_dir=&amp;#39;.&amp;#39;, merge=True, info_only=False):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # sample&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # url_sample:http://www.kugou.com/song/#hash=93F7D2FC6E95424739448218B591AEAF&amp;amp;album_id=9019462&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; hash_val = match1(url, &amp;#39;hash=(\w+)&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; album_id = match1(url, &amp;#39;album_id=(\d+)&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; if not album_id:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; album_id = 123&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; html = get_html(&amp;quot;http://www.kugou.com/yy/index.php?r=play/getdata&amp;amp;hash={}&amp;amp;album_id={}&amp;amp;mid=123&amp;quot;.format(hash_val, album_id), faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; j = loads(html)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; url = j[&amp;#39;data&amp;#39;][&amp;#39;play_url&amp;#39;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; title = j[&amp;#39;data&amp;#39;][&amp;#39;audio_name&amp;#39;]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # some songs cann&amp;#39;t play because of copyright protection&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; if (url == &amp;#39;&amp;#39;):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; return&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; songtype, ext, size = url_info(url)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; print_info(site_info, title, songtype, size)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; if not info_only:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; download_urls([url], title, ext, size, output_dir, merge=merge)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# def kugou_download_playlist(url, output_dir=&amp;#39;.&amp;#39;, merge=True, info_only=False, **kwargs):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; urls = []&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # download music leaderboard&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # sample: http://www.kugou.com/yy/html/rank.html&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; if url.lower().find(&amp;#39;rank&amp;#39;) != -1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; html = get_html(url,faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pattern = re.compile(&amp;#39;&amp;lt;a href=&amp;quot;(http://.*?)&amp;quot; data-active=&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = pattern.findall(html)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for song in res:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = get_html(song, faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pattern_url = re.compile(&amp;#39;&amp;quot;hash&amp;quot;:&amp;quot;(\w+)&amp;quot;.*&amp;quot;album_id&amp;quot;:(\d)+&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; hash_val, album_id = res = pattern_url.findall(res)[0]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if not album_id:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; album_id = 123&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; urls.append(&amp;#39;http://www.kugou.com/song/#hash=%s&amp;amp;album_id=%s&amp;#39; % (hash_val, album_id))&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # download album&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # album sample: &amp;nbsp; http://www.kugou.com/yy/album/single/1645030.html&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; elif url.lower().find(&amp;#39;album&amp;#39;) != -1:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; html = get_html(url, faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pattern = re.compile(&amp;#39;var data=(\[.*?\]);&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; res = pattern.findall(html)[0]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for v in json.loads(res):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; urls.append(&amp;#39;http://www.kugou.com/song/#hash=%s&amp;amp;album_id=%s&amp;#39; % (v[&amp;#39;hash&amp;#39;], v[&amp;#39;album_id&amp;#39;]))&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # download the playlist &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # playlist sample:http://www.kugou.com/yy/special/single/487279.html&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; else:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; html = get_html(url, faker=True)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; pattern = re.compile(&amp;#39;data=&amp;quot;(\w+)\|(\d+)&amp;quot;&amp;#39;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; for v in pattern.findall(html):&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; urls.append(&amp;#39;http://www.kugou.com/song/#hash=%s&amp;amp;album_id=%s&amp;#39; % (v[0], v[1]))&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; print(&amp;#39;http://www.kugou.com/song/#hash=%s&amp;amp;album_id=%s&amp;#39; % (v[0], v[1]))&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; logging.debug(urls)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; # download the list by hash&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; for url in urls:&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; kugou_download_by_hash(url, output_dir, merge, info_only)&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;br/&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;site_info&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #ce9178;&quot;&gt;kugou.com&lt;/span&gt;&lt;span style=&quot;color: #e8c9bb;&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #9cdcfe;&quot;&gt;download&lt;/span&gt; &lt;span style=&quot;color: #b4b4b4;&quot;&gt;=&lt;/span&gt; &lt;span style=&quot;color: #dcdcaa;&quot;&gt;kugou_download&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;# download_playlist = playlist_not_supported(&amp;quot;kugou&amp;quot;)&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span style=&quot;color: #57a64a;&quot;&gt;#download_playlist = kugou_download_playlist&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 30 Jan 2024 16:36:18 +0800</pubDate></item><item><title>OpenWrt系统扩容</title><link>http://139.162.107.204/?id=148</link><description>&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;预备知识&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;OpenWrt系统固件分类&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;EXT4固件&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;固件包名称中包含有ext4关键字，可以参考固件分类关键字示意图图片。该种类型的固件硬盘空间划分如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693280805409459.png&quot; style=&quot;&quot; title=&quot;4aec0d3710fa9b84155306213ca0b43f.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;SQUASHFS固件&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;固件包名称中包含有squashfs关键字，同样参考固件分类关键字示意图图片。该种类型的固件硬盘空间划分如下：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693280805645990.png&quot; title=&quot;058fce4243152ff44152092e5278ba78.png&quot; style=&quot;text-wrap: wrap;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;固件分类关键字示意图：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693280843500252.png&quot; title=&quot;46a6b9e28ea423195907805903d3c3a1.png&quot; alt=&quot;46a6b9e28ea423195907805903d3c3a1.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;EXT4固件扩容方式&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;新建分区扩容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;新建分区，将根目录挂载到新分区；（推荐)&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;在未格式化区域创建新分区，然后将原来系统文件分区的所有内容拷贝到新分区，最后将系统根目录默认挂载点变成新分区即可。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693280987278273.png&quot; title=&quot;8e1187adf31e4a5e5b2f2e3099921d56.png&quot; alt=&quot;8e1187adf31e4a5e5b2f2e3099921d56.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;操作步骤&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;查看当前磁盘信息&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;fdisk&amp;nbsp;-l&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281028101489.png&quot; title=&quot;6315f0e031b62b600942477785411547.png&quot; alt=&quot;6315f0e031b62b600942477785411547.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;创建新分区&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;注意fdisk后参数是磁盘名称，是要根据实际情况填写
fdisk&amp;nbsp;/dev/mmcblk0
#&amp;nbsp;输入p查看分区情况
p
#&amp;nbsp;输入n创建新分区
n
#&amp;nbsp;选择p，primary分区类型
p
#&amp;nbsp;选择分区序号，根据实际情况填写了，一般默认即可
#&amp;nbsp;输入分区起始位置，需要大于红色下划线数字
#&amp;nbsp;输入要创建的分区大小，例如要创建3GB，可以输入+3G即可
#&amp;nbsp;最后输入w写入磁盘&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281214903840.png&quot; title=&quot;381ecdf1fd7d1311aee00b041c459bd6.png&quot; style=&quot;text-wrap: wrap;&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281214394436.png&quot; title=&quot;d0a233cc1800c69f5eb1cf10afac73fa.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;查看分区效果&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;fdisk&amp;nbsp;-l&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281267741190.png&quot; title=&quot;cc898f65fa806988c39d64e6b6d7967b.png&quot; alt=&quot;cc898f65fa806988c39d64e6b6d7967b.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;格式化分区&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;mkfs.ext4后参数为新分区名称
mkfs.ext4&amp;nbsp;/dev/mmcblk0p3&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;网页登录openwrt，选择系统挂载点，选择添加&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281292169867.png&quot; title=&quot;495e90558c9bfe34d9625e5cc3d2b57a.png&quot; alt=&quot;495e90558c9bfe34d9625e5cc3d2b57a.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;选择新创建的分区，并挂载至根目录，保存后应用&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281349467147.png&quot; title=&quot;b6cab723548cf8cca1b72652d60ecef6.png&quot; alt=&quot;b6cab723548cf8cca1b72652d60ecef6.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;复制根目录准备区域的命令如下&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;mkdir&amp;nbsp;-p&amp;nbsp;/tmp/introot
mkdir&amp;nbsp;-p&amp;nbsp;/tmp/extroot
mount&amp;nbsp;--bind&amp;nbsp;/&amp;nbsp;/tmp/introot
#&amp;nbsp;mount命令后参数为新分区，该博客中的例子为/dev/mmcblk0p3
mount&amp;nbsp;/dev/sda1&amp;nbsp;/tmp/extroot
tar&amp;nbsp;-C&amp;nbsp;/tmp/introot&amp;nbsp;-cvf&amp;nbsp;-&amp;nbsp;.&amp;nbsp;|&amp;nbsp;tar&amp;nbsp;-C&amp;nbsp;/tmp/extroot&amp;nbsp;-xf&amp;nbsp;-
umount&amp;nbsp;/tmp/introot
umount&amp;nbsp;/tmp/extroot&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;将上述命令在命令行中粘贴执行&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;若固件带有efi 关键字，需要参考EFI引导固件的额外操作章节执行额外步骤（可选：仅固件中包含efi关键字需要执行）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;重启软路由&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;reboot&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;直接扩容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;直接将原有根分区扩容，如下图：&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281384284671.png&quot; title=&quot;75ca605e0e08630d9476861ebb088284.png&quot; alt=&quot;75ca605e0e08630d9476861ebb088284.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;操作步骤&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;删除旧分区（需要记住旧分区的磁盘起始位置，如图下划线位置），并创建新分区&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;注意fdisk后参数是磁盘名称，是要根据实际情况填写
fdisk&amp;nbsp;/dev/mmcblk0
#&amp;nbsp;删除第2个分区，输入d
d
#&amp;nbsp;选择第2个分区，根据实际情况填写
2
#&amp;nbsp;输入n创建新分区
n
#&amp;nbsp;选择primary分区类型
p
#&amp;nbsp;分区编号选择2，一般默认即可
2
#&amp;nbsp;输入分区起始位置，该位置要与删除分区的起始位置相同
#&amp;nbsp;输入创建分区大小，例如+3G
#&amp;nbsp;不要删除标识！不要删除标识！不要删除标识！选择n！
n
#&amp;nbsp;输入w写入磁盘&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281445304911.png&quot; style=&quot;&quot; title=&quot;238cb20e95b97e150468bbcce7d7055e.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281445687551.png&quot; style=&quot;&quot; title=&quot;a349026c8c815bce1778ba9eca3dfebf.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;查看分区效果&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;fdisk&amp;nbsp;-l&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281469516282.png&quot; title=&quot;e216dcd498cd0b07300626a2b21d05bc.png&quot; alt=&quot;e216dcd498cd0b07300626a2b21d05bc.png&quot;/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;设置循环设备&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;losetup&amp;nbsp;/dev/loop0&amp;nbsp;/dev/mmcblk0p2&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;扩展磁盘空间&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;resize2fs&amp;nbsp;-f&amp;nbsp;/dev/loop0&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;若固件带有efi 关键字，需要参考EFI引导固件的额外操作章节执行额外步骤（可选：仅固件中包含efi关键字需要执行）&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;重启软路由&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;reboot&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;SQUASHFS固件扩容方式&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;新建分区扩容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;由于SQUASHFS固件安装后，会自动创建rom空间，所以可以直接扩容即可。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;直接扩容&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;直接扩容方式与ext4固件扩容方式相同，可以参考上述步骤。同样的，需要区分x86设备efi固件。特殊操作上文中也有提及，可以参考。&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;EFI引导固件的额外操作&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;查看分区ID&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;blkid&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;修改系统引导&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;编辑grub.cf文件
vi&amp;nbsp;/boot/grub/grub.cfg
#&amp;nbsp;将下划线的两个分区ID修改成新分区的UUID即可&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;http://139.162.107.204/zb_users/upload/2023/08/202308291693281640326989.png&quot; title=&quot;1219844fdeab097e02bf0a44ff6c031a.png&quot; alt=&quot;1219844fdeab097e02bf0a44ff6c031a.png&quot;/&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;保存文件&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;br/&gt;&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;#&amp;nbsp;输入:wq即可，或者Shift&amp;nbsp;+&amp;nbsp;ZZ快捷键保存均可&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;text-wrap: nowrap;&quot;&gt;&lt;/span&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 29 Aug 2023 11:41:16 +0800</pubDate></item><item><title>使用 Mac + Acs122u复制小区门禁卡</title><link>http://139.162.107.204/?id=147</link><description>&lt;p style=&quot;box-sizing: border-box; font-feature-settings: &amp;quot;liga&amp;quot;, &amp;quot;onum&amp;quot;, &amp;quot;kern&amp;quot;; margin-top: 0px; margin-bottom: 10px; text-rendering: geometricprecision; line-height: 1.75em; color: rgb(44, 63, 81); font-family: &amp;quot;Microsoft Yahei&amp;quot;, Monaco, Helvetica, Arial, sans-serif, serif; font-size: 16px; letter-spacing: 0.1px; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;最近入手小米手环4NFC版，发现有个模拟门禁卡的功能，满心欢喜去按app中的向导操作，结果均显示不支持，无奈去网上搜索了一下，发现可以用pn532, ACR122U等NFC读写器来操作，就跑到闲鱼上花了70元买了一个ACR122U-A9，开始破解，因为手头只有mac，准备用windows的虚拟机，找了相关软件，竟然下载到了恶意软件。无视，结果虚拟机重启N次，果然恶意十足。换linux虚拟机，无奈识别仍有问题。只好继续搜mac相关的软件，终于功夫不负有心人，人品爆发模拟成功。&lt;/p&gt;&lt;ol style=&quot;box-sizing: border-box; font-feature-settings: &amp;quot;liga&amp;quot;, &amp;quot;onum&amp;quot;, &amp;quot;kern&amp;quot;; margin-bottom: 10px; text-rendering: geometricprecision; line-height: 1.75em; padding-left: 3rem; color: rgb(44, 63, 81); font-family: &amp;quot;Microsoft Yahei&amp;quot;, Monaco, Helvetica, Arial, sans-serif, serif; font-size: 16px; letter-spacing: 0.1px; white-space: normal; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;安装官方驱动&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;brew install mfcuk mfoc ， 后来发现人品爆发，mfuck竟然没用上&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;连上nfc，放上门卡，运行nfc-list，报错了&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre style=&quot;box-sizing: border-box; font-size: 13px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; background-color: rgb(245, 245, 245); padding: 9.5px; line-height: 1.42857; border: 1px solid rgb(204, 204, 204); position: relative; margin-top: 0px; margin-bottom: 10px; border-radius: 4px; overflow: auto; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; letter-spacing: 0.1px;&quot;&gt;nfc-list&amp;nbsp;uses&amp;nbsp;libnfc&amp;nbsp;1.7.1&amp;nbsp;&amp;nbsp;error&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;libnfc.driver.acr122_usb&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;claim&amp;nbsp;USB&amp;nbsp;interface&amp;nbsp;(Permission&amp;nbsp;denied)&amp;nbsp;&amp;nbsp;
nfc-list:&amp;nbsp;ERROR:&amp;nbsp;Unable&amp;nbsp;to&amp;nbsp;open&amp;nbsp;NFC&amp;nbsp;device:&amp;nbsp;acr122_usb:020:002&amp;nbsp;&amp;nbsp;123&lt;/pre&gt;&lt;ol style=&quot;box-sizing: border-box; font-feature-settings: &amp;quot;liga&amp;quot;, &amp;quot;onum&amp;quot;, &amp;quot;kern&amp;quot;; margin-bottom: 10px; text-rendering: geometricprecision; line-height: 1.75em; padding-left: 3rem; color: rgb(44, 63, 81); font-family: &amp;quot;Microsoft Yahei&amp;quot;, Monaco, Helvetica, Arial, sans-serif, serif; font-size: 16px; letter-spacing: 0.1px; white-space: normal; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;折腾了一番，发现连上ACR122U后需要执行一下下面两个命令（每次连接都要）&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;pre style=&quot;box-sizing: border-box; font-size: 13px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; background-color: rgb(245, 245, 245); padding: 9.5px; line-height: 1.42857; border: 1px solid rgb(204, 204, 204); position: relative; margin-top: 0px; margin-bottom: 10px; border-radius: 4px; overflow: auto; color: rgb(51, 51, 51); word-break: break-all; overflow-wrap: break-word; letter-spacing: 0.1px;&quot;&gt;sudo&amp;nbsp;launchctl&amp;nbsp;stop&amp;nbsp;com.apple.ifdreader&amp;nbsp;&amp;nbsp;sudo&amp;nbsp;launchctl&amp;nbsp;remove&amp;nbsp;com.apple.ifdreader&amp;nbsp;&amp;nbsp;12&lt;/pre&gt;&lt;ol style=&quot;box-sizing: border-box; font-feature-settings: &amp;quot;liga&amp;quot;, &amp;quot;onum&amp;quot;, &amp;quot;kern&amp;quot;; margin-bottom: 10px; text-rendering: geometricprecision; line-height: 1.75em; padding-left: 3rem; color: rgb(44, 63, 81); font-family: &amp;quot;Microsoft Yahei&amp;quot;, Monaco, Helvetica, Arial, sans-serif, serif; font-size: 16px; letter-spacing: 0.1px; white-space: normal; background-color: rgb(255, 255, 255);&quot; class=&quot; list-paddingleft-2&quot;&gt;&lt;li&gt;&lt;p&gt;然后再运行，ok了&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;接着上mfoc碰运气&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-size: 14.4px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; padding: 2px 4px; white-space: pre-wrap; background: rgb(249, 242, 244); border-radius: 4px; color: rgb(199, 37, 78);&quot;&gt;mfoc -O card.dump&lt;/code&gt;&amp;nbsp;，人品爆发很快就执行完了，生成card.dump&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;运行&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-size: 14.4px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; padding: 2px 4px; white-space: pre-wrap; background: rgb(249, 242, 244); border-radius: 4px; color: rgb(199, 37, 78);&quot;&gt;xxd card.dump | head -1&lt;/code&gt;&amp;nbsp;或者从第3步输出信息里面找到uid(前8个字节）&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;找到一张UID或者CUID卡，放在读写器上，写入uid，&lt;code style=&quot;box-sizing: border-box; font-size: 14.4px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; padding: 2px 4px; white-space: pre-wrap; background: rgb(249, 242, 244); border-radius: 4px; color: rgb(199, 37, 78);&quot;&gt;nfc-mfsetuid xxxxxxxx&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;那这张卡扔给小米手环去模拟，成功&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;最好把小米手环放在读写器上，写入原卡信息，&lt;code style=&quot;box-sizing: border-box; font-size: 14.4px; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; padding: 2px 4px; white-space: pre-wrap; background: rgb(249, 242, 244); border-radius: 4px; color: rgb(199, 37, 78);&quot;&gt;nfc-mfclassic w a card.dump&lt;/code&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 21 Feb 2023 16:36:29 +0800</pubDate></item><item><title>openwrt/lede WARNING: Not overriding core package 'abc' ; use -f to force</title><link>http://139.162.107.204/?id=146</link><description>&lt;p&gt;openwrt/lede WARNING: Not overriding core package &amp;#39;abc&amp;#39; ; use -f to force&lt;/p&gt;&lt;p&gt;多个源包含了 abc 这个 软件&lt;/p&gt;&lt;p&gt;解决方案:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;1. 删除一个源中的 abc 包&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;2. rm&amp;nbsp;tmp/info/.packageinfo*abc*&lt;/p&gt;&lt;p&gt;再次&amp;nbsp;./scripts/feeds install -a 就不会出现了&lt;/p&gt;</description><pubDate>Wed, 11 Jan 2023 16:05:19 +0800</pubDate></item><item><title>Openwrt opkg install 空间不够， 扩空间</title><link>http://139.162.107.204/?id=144</link><description>&lt;p&gt;注意固件，不同的略有不同&lt;br/&gt;&lt;/p&gt;&lt;p&gt;https://downloads.openwrt.org/releases/21.02.1/targets/x86/64/openwrt-21.02.1-x86-64-generic-ext4-combined-efi.img.gz&lt;/p&gt;&lt;p&gt;generic-ext4-combined-efi.img.gz&lt;/p&gt;&lt;p&gt;Resizing Ext4 rootfs&lt;/p&gt;&lt;p&gt;Resize Ext4 rootfs for ext4-combined.img.gz:&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;1.工具准备&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;opkg&amp;nbsp;update
opkg&amp;nbsp;install&amp;nbsp;fdisk&amp;nbsp;losetup&amp;nbsp;resize2fs&amp;nbsp;f2fs-tools&amp;nbsp;lsblk&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;lsblk 查看分区信息， 不必须安装&lt;/p&gt;&lt;p&gt;resize2fs 改变分区表后，文件系统还看不到，用于调整文件系统&lt;/p&gt;&lt;p&gt;losetup&amp;nbsp; 用resize2fs之前要挂着分区到/dev/loop0&lt;/p&gt;&lt;p&gt;fdisk 调整分区信息&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;2.使用fdisk调整分区&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;root@OpenWrt:~#&amp;nbsp;fdisk&amp;nbsp;-l
GPT&amp;nbsp;PMBR&amp;nbsp;size&amp;nbsp;mismatch&amp;nbsp;(246846&amp;nbsp;!=&amp;nbsp;250069679)&amp;nbsp;will&amp;nbsp;be&amp;nbsp;corrected&amp;nbsp;by&amp;nbsp;write.
The&amp;nbsp;backup&amp;nbsp;GPT&amp;nbsp;table&amp;nbsp;is&amp;nbsp;not&amp;nbsp;on&amp;nbsp;the&amp;nbsp;end&amp;nbsp;of&amp;nbsp;the&amp;nbsp;device.
Disk&amp;nbsp;/dev/sda:&amp;nbsp;119.24&amp;nbsp;GiB,&amp;nbsp;128035676160&amp;nbsp;bytes,&amp;nbsp;250069680&amp;nbsp;sectors
Disk&amp;nbsp;model:&amp;nbsp;XINRICH&amp;nbsp;SSD&amp;nbsp;128G
Units:&amp;nbsp;sectors&amp;nbsp;of&amp;nbsp;1&amp;nbsp;*&amp;nbsp;512&amp;nbsp;=&amp;nbsp;512&amp;nbsp;bytes
Sector&amp;nbsp;size&amp;nbsp;(logical/physical):&amp;nbsp;512&amp;nbsp;bytes&amp;nbsp;/&amp;nbsp;512&amp;nbsp;bytes
I/O&amp;nbsp;size&amp;nbsp;(minimum/optimal):&amp;nbsp;512&amp;nbsp;bytes&amp;nbsp;/&amp;nbsp;512&amp;nbsp;bytes
Disklabel&amp;nbsp;type:&amp;nbsp;gpt
Disk&amp;nbsp;identifier:&amp;nbsp;C58D873D-8AB8-7349-EA70-2AB0E496B700
Device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sectors&amp;nbsp;&amp;nbsp;Size&amp;nbsp;Type
/dev/sda1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;512&amp;nbsp;&amp;nbsp;33279&amp;nbsp;&amp;nbsp;&amp;nbsp;32768&amp;nbsp;&amp;nbsp;&amp;nbsp;16M&amp;nbsp;EFI&amp;nbsp;System
/dev/sda2&amp;nbsp;&amp;nbsp;&amp;nbsp;33792&amp;nbsp;246783&amp;nbsp;&amp;nbsp;212992&amp;nbsp;&amp;nbsp;104M&amp;nbsp;Microsoft&amp;nbsp;basic&amp;nbsp;data
/dev/sda128&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;511&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;478&amp;nbsp;&amp;nbsp;239K&amp;nbsp;BIOS&amp;nbsp;boot
Partition&amp;nbsp;table&amp;nbsp;entries&amp;nbsp;are&amp;nbsp;not&amp;nbsp;in&amp;nbsp;disk&amp;nbsp;order.&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;看回显，/dev/sda: 119.24 GiB, 而/dev/sda2只有104M， 接下来修改分区信息&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;root@OpenWrt:~#&amp;nbsp;fdisk&amp;nbsp;/dev/sda
Welcome&amp;nbsp;to&amp;nbsp;fdisk&amp;nbsp;(util-linux&amp;nbsp;2.36.1).
Changes&amp;nbsp;will&amp;nbsp;remain&amp;nbsp;in&amp;nbsp;memory&amp;nbsp;only,&amp;nbsp;until&amp;nbsp;you&amp;nbsp;decide&amp;nbsp;to&amp;nbsp;write&amp;nbsp;them.
Be&amp;nbsp;careful&amp;nbsp;before&amp;nbsp;using&amp;nbsp;the&amp;nbsp;write&amp;nbsp;command.
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;i
Partition&amp;nbsp;number&amp;nbsp;(1,2,128,&amp;nbsp;default&amp;nbsp;128):2
&amp;nbsp;Device:&amp;nbsp;/dev/sda2
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Start:&amp;nbsp;33792
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End:&amp;nbsp;246783
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Sectors:&amp;nbsp;212992
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Size:&amp;nbsp;104M
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type:&amp;nbsp;Microsoft&amp;nbsp;basic&amp;nbsp;data
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Type-UUID:&amp;nbsp;EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;UUID:&amp;nbsp;C58D873D-8AB8-7349-EA70-2AB0E496B702
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;p
Disk&amp;nbsp;/dev/sda:&amp;nbsp;119.24&amp;nbsp;GiB,&amp;nbsp;128035676160&amp;nbsp;bytes,&amp;nbsp;15138816&amp;nbsp;sectors
Units:&amp;nbsp;sectors&amp;nbsp;of&amp;nbsp;1&amp;nbsp;*&amp;nbsp;512&amp;nbsp;=&amp;nbsp;512&amp;nbsp;bytes
Sector&amp;nbsp;size&amp;nbsp;(logical/physical):&amp;nbsp;512&amp;nbsp;bytes&amp;nbsp;/&amp;nbsp;512&amp;nbsp;bytes
I/O&amp;nbsp;size&amp;nbsp;(minimum/optimal):&amp;nbsp;512&amp;nbsp;bytes&amp;nbsp;/&amp;nbsp;512&amp;nbsp;bytes
Disklabel&amp;nbsp;type:&amp;nbsp;gpt
Disk&amp;nbsp;identifier:&amp;nbsp;C58D873D-8AB8-7349-EA70-2AB0E496B700
Device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Boot&amp;nbsp;Start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sectors&amp;nbsp;&amp;nbsp;Size&amp;nbsp;Id&amp;nbsp;Type
/dev/sda1&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;512&amp;nbsp;&amp;nbsp;33279&amp;nbsp;&amp;nbsp;&amp;nbsp;32768&amp;nbsp;&amp;nbsp;&amp;nbsp;16M&amp;nbsp;EFI&amp;nbsp;System
/dev/sda2&amp;nbsp;&amp;nbsp;&amp;nbsp;33792&amp;nbsp;246783&amp;nbsp;&amp;nbsp;212992&amp;nbsp;&amp;nbsp;104M&amp;nbsp;Microsoft&amp;nbsp;basic&amp;nbsp;data
/dev/sda128&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;34&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;511&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;478&amp;nbsp;&amp;nbsp;239K&amp;nbsp;BIOS&amp;nbsp;boot
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;d
Partition&amp;nbsp;number&amp;nbsp;(1,2,&amp;nbsp;default&amp;nbsp;2):&amp;nbsp;
Partition&amp;nbsp;2&amp;nbsp;has&amp;nbsp;been&amp;nbsp;deleted.
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;n
Partition&amp;nbsp;number&amp;nbsp;(2-4,&amp;nbsp;default&amp;nbsp;2):&amp;nbsp;
First&amp;nbsp;sector&amp;nbsp;(33280-250069646,&amp;nbsp;default&amp;nbsp;34816):&amp;nbsp;33792
Last&amp;nbsp;sector,&amp;nbsp;+sectors&amp;nbsp;or&amp;nbsp;+size{K,M,G,T,P}&amp;nbsp;(33792-250069646,&amp;nbsp;default&amp;nbsp;250069646):&amp;nbsp;
Created&amp;nbsp;a&amp;nbsp;new&amp;nbsp;partition&amp;nbsp;2&amp;nbsp;of&amp;nbsp;type&amp;nbsp;&amp;#39;Linux&amp;#39;&amp;nbsp;and&amp;nbsp;of&amp;nbsp;size&amp;nbsp;7.2&amp;nbsp;GiB.
Partition&amp;nbsp;#2&amp;nbsp;contains&amp;nbsp;a&amp;nbsp;ext4&amp;nbsp;signature.
Do&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;remove&amp;nbsp;the&amp;nbsp;signature?&amp;nbsp;[Y]es/[N]o:&amp;nbsp;n
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;w
The&amp;nbsp;partition&amp;nbsp;table&amp;nbsp;has&amp;nbsp;been&amp;nbsp;altered.
Syncing&amp;nbsp;disks.&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#到此分区表已经调整完成，但是文件系统还看不到大小改变，不能用，先不管，我们先修正分区UUID，和分区类型UUID&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;root@OpenWrt:~#&amp;nbsp;fdisk&amp;nbsp;/dev/sda
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):t
Partition&amp;nbsp;number&amp;nbsp;(1,2,128,&amp;nbsp;default&amp;nbsp;128):2
Partition&amp;nbsp;type&amp;nbsp;or&amp;nbsp;alias&amp;nbsp;(type&amp;nbsp;L&amp;nbsp;to&amp;nbsp;list&amp;nbsp;all):EBD0A0A2-B9E5-4433-87C0-68B6B72699C7
#回车提示修改分区类型UUID成功，接下来修正分区UUID
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):x
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):u
Partition&amp;nbsp;number&amp;nbsp;(1,2,128,&amp;nbsp;default&amp;nbsp;128):&amp;nbsp;2
New&amp;nbsp;UUID&amp;nbsp;(in&amp;nbsp;8-4-4-4-12&amp;nbsp;format):C58D873D-8AB8-7349-EA70-2AB0E496B702
Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;w
The&amp;nbsp;partition&amp;nbsp;table&amp;nbsp;has&amp;nbsp;been&amp;nbsp;altered.
Syncing&amp;nbsp;disks.&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;p&gt;#以上操作，让系统启动时，看到的系统配置还是以前的配置&lt;/p&gt;&lt;p&gt;#接下来，调整文件系统，调整好后我们就可以看到和使用&lt;/p&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;&lt;pre class=&quot;prism-highlight prism-language-bash&quot;&gt;losetup&amp;nbsp;/dev/loop0&amp;nbsp;/dev/sda2
fsck.ext4&amp;nbsp;-y&amp;nbsp;/dev/loop0
resize2fs&amp;nbsp;/dev/loop0
reboot&lt;/pre&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Tue, 21 Dec 2021 20:27:13 +0800</pubDate></item><item><title>ffmpeg合并（复用）音频和视频文件，组成mp4。程序如下：</title><link>http://139.162.107.204/?id=143</link><description>&lt;pre class=&quot;prism-highlight prism-language-cpp&quot;&gt;/*
合并音频和视频,形成音视频
*/
extern&amp;nbsp;&amp;quot;C&amp;quot;
{
#include&amp;nbsp;&amp;quot;libavutil/avutil.h&amp;quot;
#include&amp;nbsp;&amp;quot;libavformat/avformat.h&amp;quot;
#include&amp;nbsp;&amp;quot;libavformat/avio.h&amp;quot;
#include&amp;nbsp;&amp;quot;libavcodec/avcodec.h&amp;quot;
}

#pragma&amp;nbsp;warning(disable:4996)

int&amp;nbsp;main()
{
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//
const&amp;nbsp;char&amp;nbsp;*srcMedia1&amp;nbsp;=&amp;nbsp;&amp;quot;out/t2Video.h264&amp;quot;;
const&amp;nbsp;char&amp;nbsp;*srcMedia2&amp;nbsp;=&amp;nbsp;&amp;quot;out/T2audio.aac&amp;quot;;
const&amp;nbsp;char&amp;nbsp;*destMedia&amp;nbsp;=&amp;nbsp;&amp;quot;out/T2.mp4&amp;quot;;
char&amp;nbsp;errors[200]&amp;nbsp;=&amp;nbsp;{0};
AVFormatContext&amp;nbsp;*inFormatContext1&amp;nbsp;=&amp;nbsp;NULL;
AVFormatContext&amp;nbsp;*inFormatContext2&amp;nbsp;=&amp;nbsp;NULL;
AVFormatContext&amp;nbsp;*outFormatContext&amp;nbsp;=&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//输入上下文1-视频
int&amp;nbsp;ret&amp;nbsp;=&amp;nbsp;0;
av_log_set_level(AV_LOG_INFO);
av_register_all();
ret&amp;nbsp;=&amp;nbsp;avformat_open_input(&amp;amp;inFormatContext1,&amp;nbsp;srcMedia1,&amp;nbsp;NULL,&amp;nbsp;NULL);
if&amp;nbsp;(ret&amp;nbsp;!=&amp;nbsp;0)
{
av_strerror(ret,&amp;nbsp;errors,&amp;nbsp;200);
av_log(NULL,&amp;nbsp;AV_LOG_WARNING,&amp;nbsp;&amp;quot;error,&amp;nbsp;ret=%d,&amp;nbsp;msg=%s\n&amp;quot;,&amp;nbsp;ret,&amp;nbsp;errors);
return&amp;nbsp;-1;
}
avformat_find_stream_info(inFormatContext1,&amp;nbsp;NULL);
av_dump_format(inFormatContext1,&amp;nbsp;-1,&amp;nbsp;srcMedia1,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//输入上下文1-音频
ret&amp;nbsp;=&amp;nbsp;avformat_open_input(&amp;amp;inFormatContext2,&amp;nbsp;srcMedia2,&amp;nbsp;NULL,&amp;nbsp;NULL);
avformat_find_stream_info(inFormatContext2,&amp;nbsp;NULL);
av_dump_format(inFormatContext2,&amp;nbsp;-1,&amp;nbsp;srcMedia2,&amp;nbsp;0);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//输出上下文
avformat_alloc_output_context2(&amp;amp;outFormatContext,&amp;nbsp;NULL,&amp;nbsp;NULL,&amp;nbsp;destMedia);
AVOutputFormat&amp;nbsp;*outFormat&amp;nbsp;=&amp;nbsp;outFormatContext-&amp;gt;oformat;
int&amp;nbsp;stream1&amp;nbsp;=&amp;nbsp;0;
AVStream&amp;nbsp;*inStream1&amp;nbsp;=&amp;nbsp;NULL;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//复制流信息
if&amp;nbsp;(inFormatContext1-&amp;gt;nb_streams&amp;nbsp;&amp;gt;&amp;nbsp;0)
{
stream1&amp;nbsp;=&amp;nbsp;1;
inStream1&amp;nbsp;=&amp;nbsp;inFormatContext1-&amp;gt;streams[0];
AVStream&amp;nbsp;*outStream&amp;nbsp;=&amp;nbsp;avformat_new_stream(outFormatContext,&amp;nbsp;NULL);
avcodec_parameters_copy(outStream-&amp;gt;codecpar,&amp;nbsp;inStream1-&amp;gt;codecpar);
outStream-&amp;gt;codecpar-&amp;gt;codec_tag&amp;nbsp;=&amp;nbsp;0;
}
int&amp;nbsp;stream2&amp;nbsp;=&amp;nbsp;0;
AVStream&amp;nbsp;*inStream2&amp;nbsp;=&amp;nbsp;NULL;
if&amp;nbsp;(inFormatContext2-&amp;gt;nb_streams&amp;nbsp;&amp;gt;&amp;nbsp;0)
{
stream2&amp;nbsp;=&amp;nbsp;1;
inStream2&amp;nbsp;=&amp;nbsp;inFormatContext2-&amp;gt;streams[0];
AVStream&amp;nbsp;*outStream&amp;nbsp;=&amp;nbsp;avformat_new_stream(outFormatContext,&amp;nbsp;NULL);
avcodec_parameters_copy(outStream-&amp;gt;codecpar,&amp;nbsp;inStream2-&amp;gt;codecpar);
outStream-&amp;gt;codecpar-&amp;gt;codec_tag&amp;nbsp;=&amp;nbsp;0;
}
av_dump_format(outFormatContext,&amp;nbsp;-1,&amp;nbsp;destMedia,&amp;nbsp;1);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//打开文件
avio_open(&amp;amp;outFormatContext-&amp;gt;pb,&amp;nbsp;destMedia,&amp;nbsp;AVIO_FLAG_WRITE);
avformat_write_header(outFormatContext,&amp;nbsp;NULL);
int64_t&amp;nbsp;curPts1&amp;nbsp;=&amp;nbsp;0;
int64_t&amp;nbsp;curPts2&amp;nbsp;=&amp;nbsp;0;
AVPacket&amp;nbsp;avPacket;
av_init_packet(&amp;amp;avPacket);
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//输入流时间基
AVRational&amp;nbsp;inStream1time&amp;nbsp;=&amp;nbsp;inStream1-&amp;gt;time_base;
AVRational&amp;nbsp;inStream2time&amp;nbsp;=&amp;nbsp;inStream2-&amp;gt;time_base;
int&amp;nbsp;frameIndex&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//交替写入音频和视频数据
while&amp;nbsp;(stream1&amp;nbsp;||&amp;nbsp;stream2)
{
if&amp;nbsp;(stream1&amp;nbsp;&amp;amp;&amp;amp;&amp;nbsp;(!stream2&amp;nbsp;||&amp;nbsp;av_compare_ts(curPts1,&amp;nbsp;inStream1time,&amp;nbsp;curPts2,&amp;nbsp;inStream2time)&amp;nbsp;&amp;amp;lt;&amp;nbsp;=&amp;nbsp;0))
{
ret&amp;nbsp;=&amp;nbsp;av_read_frame(inFormatContext1,&amp;nbsp;&amp;amp;avPacket);
if&amp;nbsp;(ret&amp;nbsp;&amp;amp;&amp;nbsp;lt;&amp;nbsp;0)
{
stream1&amp;nbsp;=&amp;nbsp;0;
continue;
}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;raw&amp;nbsp;h264无pts,手动添加
if&amp;nbsp;(avPacket.pts&amp;nbsp;==&amp;nbsp;AV_NOPTS_VALUE)
{
AVRational&amp;nbsp;timeBase&amp;nbsp;=&amp;nbsp;inStream1time;
int64_t&amp;nbsp;calcDuration&amp;nbsp;=&amp;nbsp;AV_TIME_BASE&amp;nbsp;/&amp;nbsp;av_q2d(inStream1-&amp;gt;r_frame_rate);
avPacket.pts&amp;nbsp;=&amp;nbsp;(double)(frameIndex&amp;nbsp;*&amp;nbsp;calcDuration)&amp;nbsp;/&amp;nbsp;(av_q2d(timeBase)&amp;nbsp;*&amp;nbsp;AV_TIME_BASE);
avPacket.dts&amp;nbsp;=&amp;nbsp;avPacket.pts;
avPacket.duration&amp;nbsp;=&amp;nbsp;(double)calcDuration&amp;nbsp;/&amp;nbsp;(av_q2d(timeBase)&amp;nbsp;*&amp;nbsp;AV_TIME_BASE);
frameIndex++;
}
curPts1&amp;nbsp;=&amp;nbsp;avPacket.pts;
AVStream&amp;nbsp;*outStream&amp;nbsp;=&amp;nbsp;outFormatContext-&amp;gt;streams[0];
avPacket.pts&amp;nbsp;=&amp;nbsp;av_rescale_q_rnd(avPacket.pts,&amp;nbsp;inStream1time,&amp;nbsp;outStream-&amp;gt;time_base,&amp;nbsp;AVRounding(AV_ROUND_NEAR_INF&amp;nbsp;|&amp;nbsp;AV_ROUND_PASS_MINMAX));
avPacket.dts&amp;nbsp;=&amp;nbsp;avPacket.pts;
avPacket.duration&amp;nbsp;=&amp;nbsp;av_rescale_q(avPacket.duration,&amp;nbsp;inStream1time,&amp;nbsp;outStream-&amp;gt;time_base);
avPacket.pos&amp;nbsp;=&amp;nbsp;-1;
avPacket.stream_index&amp;nbsp;=&amp;nbsp;0;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;av_log(NULL,&amp;nbsp;AV_LOG_INFO,&amp;nbsp;&amp;quot;xxxxxxxxx%d,&amp;nbsp;dts=%lld,&amp;nbsp;pts=%lld,&amp;nbsp;duration=%lld\n&amp;quot;,&amp;nbsp;frameIndex,&amp;nbsp;avPacket.dts,&amp;nbsp;avPacket.pts,&amp;nbsp;avPacket.duration);
stream1&amp;nbsp;=&amp;nbsp;!av_interleaved_write_frame(outFormatContext,&amp;nbsp;&amp;amp;avPacket);
}
else&amp;nbsp;if&amp;nbsp;(stream2)
{
ret&amp;nbsp;=&amp;nbsp;av_read_frame(inFormatContext2,&amp;nbsp;&amp;amp;avPacket);
if&amp;nbsp;(ret&amp;nbsp;&amp;amp;&amp;nbsp;lt;&amp;nbsp;0)
{
stream2&amp;nbsp;=&amp;nbsp;0;
continue;
}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//&amp;nbsp;raw&amp;nbsp;aac无pts,手动添加
if&amp;nbsp;(avPacket.pts&amp;nbsp;==&amp;nbsp;AV_NOPTS_VALUE)
{
AVRational&amp;nbsp;timeBase&amp;nbsp;=&amp;nbsp;inStream2time;
int64_t&amp;nbsp;calcDuration&amp;nbsp;=&amp;nbsp;AV_TIME_BASE&amp;nbsp;/&amp;nbsp;av_q2d(inStream2-&amp;gt;r_frame_rate);
avPacket.pts&amp;nbsp;=&amp;nbsp;(double)(frameIndex&amp;nbsp;*&amp;nbsp;calcDuration)&amp;nbsp;/&amp;nbsp;(av_q2d(timeBase)&amp;nbsp;*&amp;nbsp;AV_TIME_BASE);
avPacket.dts&amp;nbsp;=&amp;nbsp;avPacket.pts;
avPacket.duration&amp;nbsp;=&amp;nbsp;(double)calcDuration&amp;nbsp;/&amp;nbsp;(av_q2d(timeBase)&amp;nbsp;*&amp;nbsp;AV_TIME_BASE);
frameIndex++;
}
curPts2&amp;nbsp;=&amp;nbsp;avPacket.pts;
AVStream&amp;nbsp;*outStream&amp;nbsp;=&amp;nbsp;outFormatContext-&amp;gt;streams[1];
avPacket.pts&amp;nbsp;=&amp;nbsp;av_rescale_q_rnd(avPacket.pts,&amp;nbsp;inStream2time,&amp;nbsp;outStream-&amp;gt;time_base,&amp;nbsp;AVRounding(AV_ROUND_NEAR_INF&amp;nbsp;|&amp;nbsp;AV_ROUND_PASS_MINMAX));
avPacket.dts&amp;nbsp;=&amp;nbsp;avPacket.pts;
avPacket.duration&amp;nbsp;=&amp;nbsp;av_rescale_q(avPacket.duration,&amp;nbsp;inStream2time,&amp;nbsp;outStream-&amp;gt;time_base);
avPacket.pos&amp;nbsp;=&amp;nbsp;-1;
avPacket.stream_index&amp;nbsp;=&amp;nbsp;1;
av_log(NULL,&amp;nbsp;AV_LOG_INFO,&amp;nbsp;&amp;quot;xxxxxxxxx%d,&amp;nbsp;size:%5d,&amp;nbsp;dts=%lld,&amp;nbsp;pts=%lld,&amp;nbsp;duration=%lld\n&amp;quot;,&amp;nbsp;frameIndex,&amp;nbsp;avPacket.size,&amp;nbsp;avPacket.dts,&amp;nbsp;avPacket.pts,&amp;nbsp;avPacket.duration);
stream2&amp;nbsp;=&amp;nbsp;!av_interleaved_write_frame(outFormatContext,&amp;nbsp;&amp;amp;avPacket);
}
av_packet_unref(&amp;amp;avPacket);
}
ret&amp;nbsp;=&amp;nbsp;av_write_trailer(outFormatContext);
if&amp;nbsp;(ret&amp;nbsp;!=&amp;nbsp;0)
{
av_strerror(ret,&amp;nbsp;errors,&amp;nbsp;200);
av_log(NULL,&amp;nbsp;AV_LOG_WARNING,&amp;nbsp;&amp;quot;av_write_trailer&amp;nbsp;error:&amp;nbsp;ret=%d,&amp;nbsp;msg=%s\n&amp;quot;,&amp;nbsp;ret,&amp;nbsp;errors);
}
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;//释放资源
avformat_close_input(&amp;amp;inFormatContext1);
avformat_close_input(&amp;amp;inFormatContext2);
avio_close(outFormatContext-&amp;gt;pb);
return&amp;nbsp;0;
}&lt;/pre&gt;</description><pubDate>Tue, 21 Dec 2021 16:22:20 +0800</pubDate></item><item><title>Openwrt Resizing partitions</title><link>http://139.162.107.204/?id=142</link><description>&lt;h2 class=&quot;sectionedit11 page-header pb-3 mb-4 mt-5&quot; id=&quot;resizing_partitions&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 30px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Resizing partitions&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#resizing_partitions&quot; aria-label=&quot;Anchor link for: resizing_partitions&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&quot;level2&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;&lt;img src=&quot;https://openwrt.org/lib/images/smileys/icon_exclaim.gif&quot; class=&quot;icon&quot; alt=&quot;:!:&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle;&quot;/&gt;&amp;nbsp;Be sure to&amp;nbsp;&lt;a href=&quot;https://openwrt.org/docs/guide-user/virtualization/qemu#preparation&quot; class=&quot;wikilink1&quot; title=&quot;docs:guide-user:virtualization:qemu&quot; data-wiki-id=&quot;docs:guide-user:virtualization:qemu&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none;&quot;&gt;resize the image&lt;/a&gt;&amp;nbsp;before resizing partitions when installing in a VM.&lt;/p&gt;&lt;ol class=&quot;fix-media-list-overlap list-paddingleft-2&quot; style=&quot;box-sizing: border-box; margin-bottom: 10px; list-style-position: outside; list-style-image: initial; overflow: hidden;&quot;&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Install&amp;nbsp;&lt;a href=&quot;https://openwrt.org/packages/pkgdata/fdisk&quot; class=&quot;wikilink1&quot; title=&quot;packages:pkgdata:fdisk&quot; data-wiki-id=&quot;packages:pkgdata:fdisk&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none;&quot;&gt;fdisk&lt;/a&gt;.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Use fdisk to show the partitions.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Write down the starting sector address of /dev/sda2 (which is the root partition).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Use fdisk to delete the partition 2 (which is sda2), don&amp;#39;t write the changes to disk yet.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Use fdisk to create a new partition 2, choose/type the starting sector address you wrote down earlier (as by default it will try to place it somewhere else), and leave the default end sector address (this will mean the partition will now use all available space).&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Write the partition table changes to disk. It may complain about partition signatures already present, write&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;n&lt;/span&gt;&amp;nbsp;to NOT remove the partition signature to proceed.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;An example fdisk operation on a 8GB flash drive:&lt;/p&gt;&lt;pre class=&quot;code&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; white-space: pre-wrap;&quot;&gt;Welcome&amp;nbsp;to&amp;nbsp;fdisk&amp;nbsp;(util-linux&amp;nbsp;2.32).
Changes&amp;nbsp;will&amp;nbsp;remain&amp;nbsp;in&amp;nbsp;memory&amp;nbsp;only,&amp;nbsp;until&amp;nbsp;you&amp;nbsp;decide&amp;nbsp;to&amp;nbsp;write&amp;nbsp;them.
Be&amp;nbsp;careful&amp;nbsp;before&amp;nbsp;using&amp;nbsp;the&amp;nbsp;write&amp;nbsp;command.

Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;p
Disk&amp;nbsp;/dev/sda:&amp;nbsp;7.2&amp;nbsp;GiB,&amp;nbsp;7751073792&amp;nbsp;bytes,&amp;nbsp;15138816&amp;nbsp;sectors
Units:&amp;nbsp;sectors&amp;nbsp;of&amp;nbsp;1&amp;nbsp;*&amp;nbsp;512&amp;nbsp;=&amp;nbsp;512&amp;nbsp;bytes
Sector&amp;nbsp;size&amp;nbsp;(logical/physical):&amp;nbsp;512&amp;nbsp;bytes&amp;nbsp;/&amp;nbsp;512&amp;nbsp;bytes
I/O&amp;nbsp;size&amp;nbsp;(minimum/optimal):&amp;nbsp;512&amp;nbsp;bytes&amp;nbsp;/&amp;nbsp;512&amp;nbsp;bytes
Disklabel&amp;nbsp;type:&amp;nbsp;dos
Disk&amp;nbsp;identifier:&amp;nbsp;0xcbad8a62

Device&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Boot&amp;nbsp;Start&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;End&amp;nbsp;Sectors&amp;nbsp;&amp;nbsp;Size&amp;nbsp;Id&amp;nbsp;Type
/dev/sda1&amp;nbsp;&amp;nbsp;*&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;512&amp;nbsp;&amp;nbsp;33279&amp;nbsp;&amp;nbsp;&amp;nbsp;32768&amp;nbsp;&amp;nbsp;&amp;nbsp;16M&amp;nbsp;83&amp;nbsp;Linux
/dev/sda2&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;33792&amp;nbsp;558079&amp;nbsp;&amp;nbsp;524288&amp;nbsp;&amp;nbsp;256M&amp;nbsp;83&amp;nbsp;Linux

Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;d
Partition&amp;nbsp;number&amp;nbsp;(1,2,&amp;nbsp;default&amp;nbsp;2):&amp;nbsp;

Partition&amp;nbsp;2&amp;nbsp;has&amp;nbsp;been&amp;nbsp;deleted.

Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;n
Partition&amp;nbsp;type
&amp;nbsp;&amp;nbsp;&amp;nbsp;p&amp;nbsp;&amp;nbsp;&amp;nbsp;primary&amp;nbsp;(1&amp;nbsp;primary,&amp;nbsp;0&amp;nbsp;extended,&amp;nbsp;3&amp;nbsp;free)
&amp;nbsp;&amp;nbsp;&amp;nbsp;e&amp;nbsp;&amp;nbsp;&amp;nbsp;extended&amp;nbsp;(container&amp;nbsp;for&amp;nbsp;logical&amp;nbsp;partitions)
Select&amp;nbsp;(default&amp;nbsp;p):&amp;nbsp;
Partition&amp;nbsp;number&amp;nbsp;(2-4,&amp;nbsp;default&amp;nbsp;2):&amp;nbsp;
First&amp;nbsp;sector&amp;nbsp;(33280-15138815,&amp;nbsp;default&amp;nbsp;34816):&amp;nbsp;33792
Last&amp;nbsp;sector,&amp;nbsp;+sectors&amp;nbsp;or&amp;nbsp;+size{K,M,G,T,P}&amp;nbsp;(33792-15138815,&amp;nbsp;default&amp;nbsp;15138815):&amp;nbsp;

Created&amp;nbsp;a&amp;nbsp;new&amp;nbsp;partition&amp;nbsp;2&amp;nbsp;of&amp;nbsp;type&amp;nbsp;&amp;#39;Linux&amp;#39;&amp;nbsp;and&amp;nbsp;of&amp;nbsp;size&amp;nbsp;7.2&amp;nbsp;GiB.
Partition&amp;nbsp;#2&amp;nbsp;contains&amp;nbsp;a&amp;nbsp;ext4&amp;nbsp;signature.

Do&amp;nbsp;you&amp;nbsp;want&amp;nbsp;to&amp;nbsp;remove&amp;nbsp;the&amp;nbsp;signature?&amp;nbsp;[Y]es/[N]o:&amp;nbsp;n

Command&amp;nbsp;(m&amp;nbsp;for&amp;nbsp;help):&amp;nbsp;w

The&amp;nbsp;partition&amp;nbsp;table&amp;nbsp;has&amp;nbsp;been&amp;nbsp;altered.
Syncing&amp;nbsp;disks.&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Automated method:&lt;/p&gt;&lt;pre class=&quot;code bash&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; white-space: pre-wrap;&quot;&gt;opkg&amp;nbsp;update
opkg&amp;nbsp;install&amp;nbsp;fdisk
BOOT=&amp;quot;$(sed&amp;nbsp;-n&amp;nbsp;-e&amp;nbsp;&amp;quot;/\s\/boot\s.*$/{s///p;q}&amp;quot;&amp;nbsp;/etc/mtab)&amp;quot;
DISK=&amp;quot;${BOOT%%[0-9]*}&amp;quot;
PART=&amp;quot;$((${BOOT##*[^0-9]}+1))&amp;quot;ROOT=&amp;quot;${DISK}${PART}&amp;quot;
OFFS=&amp;quot;$(fdisk&amp;nbsp;${DISK}&amp;nbsp;-l&amp;nbsp;-o&amp;nbsp;device,start&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;-n&amp;nbsp;-e&amp;nbsp;&amp;quot;\|^${ROOT}\s*|s///p&amp;quot;)&amp;quot;
echo&amp;nbsp;-e&amp;nbsp;&amp;quot;p\nd\n${PART}\nn\np\n${PART}\n${OFFS}\n\nn\np\nw&amp;quot;&amp;nbsp;|&amp;nbsp;fdisk&amp;nbsp;${DISK}&lt;/pre&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Be sure to update the GPT partition UUID in the GRUB configuration when using&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;efi.img.gz&lt;/span&gt;:&lt;/p&gt;&lt;pre class=&quot;code bash&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; white-space: pre-wrap;&quot;&gt;opkg&amp;nbsp;update
opkg&amp;nbsp;install&amp;nbsp;lsblk
BOOT=&amp;quot;$(sed&amp;nbsp;-n&amp;nbsp;-e&amp;nbsp;&amp;quot;/\s\/boot\s.*$/{s///p;q}&amp;quot;&amp;nbsp;/etc/mtab)&amp;quot;
DISK=&amp;quot;${BOOT%%[0-9]*}&amp;quot;
PART=&amp;quot;$((${BOOT##*[^0-9]}+1))&amp;quot;
ROOT=&amp;quot;${DISK}${PART}&amp;quot;
UUID=&amp;quot;$(lsblk&amp;nbsp;-n&amp;nbsp;-o&amp;nbsp;PARTUUID&amp;nbsp;${ROOT})&amp;quot;
sed&amp;nbsp;-i&amp;nbsp;-r&amp;nbsp;-e&amp;nbsp;&amp;quot;s|(PARTUUID=)\S+|\1${UUID}|g&amp;quot;&amp;nbsp;/boot/grub/grub.cfg&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&quot;sectionedit12 page-header pb-3 mb-4 mt-5&quot; id=&quot;resizing_filesystem&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 30px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Resizing filesystem&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#resizing_filesystem&quot; aria-label=&quot;Anchor link for: resizing_filesystem&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&quot;level2&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;&lt;img src=&quot;https://openwrt.org/lib/images/smileys/icon_exclaim.gif&quot; class=&quot;icon&quot; alt=&quot;:!:&quot; style=&quot;box-sizing: border-box; border: 0px; vertical-align: middle;&quot;/&gt;&amp;nbsp;Be sure to&amp;nbsp;&lt;span class=&quot;curid&quot; style=&quot;box-sizing: border-box; font-weight: bold;&quot;&gt;&lt;a href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#resizing_partitions&quot; class=&quot;wikilink1&quot; title=&quot;docs:guide-user:installation:openwrt_x86&quot; data-wiki-id=&quot;docs:guide-user:installation:openwrt_x86&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none;&quot;&gt;resize partitions&lt;/a&gt;&lt;/span&gt;&amp;nbsp;before resizing filesystem. Note that online resizing should work for both F2FS and Ext4 on OpenWrt 19.07, although F2FS requires rebooting to apply changes.&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&quot;sectionedit13 page-header pb-3 mb-4 mt-5&quot; id=&quot;resizing_f2fs_overlay&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 24px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Resizing F2FS overlay&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#resizing_f2fs_overlay&quot; aria-label=&quot;Anchor link for: resizing_f2fs_overlay&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class=&quot;level3&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Resize F2FS overlay for&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;squashfs-combined.img.gz&lt;/span&gt;:&lt;/p&gt;&lt;pre class=&quot;code bash&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; white-space: pre-wrap;&quot;&gt;opkg&amp;nbsp;update
opkg&amp;nbsp;install&amp;nbsp;losetup&amp;nbsp;f2fs-tools
LOOP=&amp;quot;$(losetup&amp;nbsp;-n&amp;nbsp;-O&amp;nbsp;NAME&amp;nbsp;|&amp;nbsp;sort&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;-n&amp;nbsp;-e&amp;nbsp;&amp;quot;1p&amp;quot;)&amp;quot;
ROOT=&amp;quot;$(losetup&amp;nbsp;-n&amp;nbsp;-O&amp;nbsp;BACK-FILE&amp;nbsp;${LOOP}&amp;nbsp;|&amp;nbsp;sed&amp;nbsp;-e&amp;nbsp;&amp;quot;s|^|/dev|&amp;quot;)&amp;quot;
OFFS=&amp;quot;$(losetup&amp;nbsp;-n&amp;nbsp;-O&amp;nbsp;OFFSET&amp;nbsp;${LOOP})&amp;quot;
LOOP=&amp;quot;$(losetup&amp;nbsp;-f)&amp;quot;
losetup&amp;nbsp;-o&amp;nbsp;${OFFS}&amp;nbsp;${LOOP}&amp;nbsp;${ROOT}
fsck.f2fs&amp;nbsp;-f&amp;nbsp;${LOOP}
mount&amp;nbsp;${LOOP}&amp;nbsp;/mntumount&amp;nbsp;${LOOP}
resize.f2fs&amp;nbsp;${LOOP}reboot&lt;/pre&gt;&lt;/div&gt;&lt;h3 class=&quot;sectionedit14 page-header pb-3 mb-4 mt-5&quot; id=&quot;resizing_ext4_rootfs&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 24px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Resizing Ext4 rootfs&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#resizing_ext4_rootfs&quot; aria-label=&quot;Anchor link for: resizing_ext4_rootfs&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class=&quot;level3&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Resize Ext4 rootfs for&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-combined.img.gz&lt;/span&gt;:&lt;/p&gt;&lt;pre class=&quot;code bash&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; white-space: pre-wrap;&quot;&gt;opkg&amp;nbsp;update
opkg&amp;nbsp;install&amp;nbsp;losetup&amp;nbsp;resize2fs
BOOT=&amp;quot;$(sed&amp;nbsp;-n&amp;nbsp;-e&amp;nbsp;&amp;quot;/\s\/boot\s.*$/{s///p;q}&amp;quot;&amp;nbsp;/etc/mtab)&amp;quot;
DISK=&amp;quot;${BOOT%%[0-9]*}&amp;quot;
PART=&amp;quot;$((${BOOT##*[^0-9]}+1))&amp;quot;
ROOT=&amp;quot;${DISK}${PART}&amp;quot;
LOOP=&amp;quot;$(losetup&amp;nbsp;-f)&amp;quot;
losetup&amp;nbsp;${LOOP}&amp;nbsp;${ROOT}
fsck.ext4&amp;nbsp;-y&amp;nbsp;${LOOP}
resize2fs&amp;nbsp;${LOOP}
reboot&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&quot;sectionedit15 page-header pb-3 mb-4 mt-5&quot; id=&quot;adding_extra_partitions&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 30px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Adding extra partitions&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#adding_extra_partitions&quot; aria-label=&quot;Anchor link for: adding_extra_partitions&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&quot;level2&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;When OpenWrt is installed on a x86 machine using&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;generic-ext4-combined.img.gz&lt;/span&gt;, the drive&amp;#39;s partition table is overwritten, which means that any existing partition is deleted. Any remaining space will be unallocated and the drive will have a normal MBR partition table.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Any partition management tool that supports MBR and ext4 can be used to create extra partitions on the drive, in example fdisk, GParted.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;But attention must be taken for future upgrades. If extra partitions are added, you cannot use&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;-combined.img.gz&lt;/span&gt;&amp;nbsp;images anymore, because writing this type of image will override the drive&amp;#39;s partition table and delete any existing extra partition, and also revert boot and rootfs partitions back to default size.&lt;/p&gt;&lt;/div&gt;&lt;h2 class=&quot;sectionedit16 page-header pb-3 mb-4 mt-5&quot; id=&quot;upgrading&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 30px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Upgrading&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#upgrading&quot; aria-label=&quot;Anchor link for: upgrading&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&quot;level2&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;On most embedded devices, upgrading OpenWrt is much simpler than the first installation and consists of simply executing&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;sysupgrade&lt;/span&gt;. On x86 machines, on the other hand, upgrading is more complex than the first installation.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;One of the advantages of x86 is the easiness to backup and restore drives, using any normal backup tool that supports MBR and ext4. Always make a proper backup of the whole drive and test its restore before any upgrade procedure. It&amp;#39;s also recommended to restore the backup on a virtual machine and execute the upgrade on it prior to upgrading the real router, to learn and experiment the procedures without risking the real thing.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;On all procedures on this section, we must either connect the drive on a secondary PC running Linux, or boot the router with a Linux Live CD/USB.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;If you had used a&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-combined.img.gz&lt;/span&gt;&amp;nbsp;type of image to install, there are 4 options for upgrading:&lt;/p&gt;&lt;ol class=&quot;fix-media-list-overlap list-paddingleft-2&quot; style=&quot;box-sizing: border-box; margin-bottom: 10px; list-style-position: outside; list-style-image: initial; overflow: hidden;&quot;&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Write a new&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-combined.img.gz&lt;/span&gt;&amp;nbsp;image: this is the simplest option and is identical to first installation: all data, configs, packages and extra partitions will be wiped and you&amp;#39;ll have a brand new OpenWrt system with default packages and configs. Then you can reinstall all packages and copy config files back and create extra partitions.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Use&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;sysupgrade&lt;/span&gt;: this is default upgrading procedure, but the least recommended option for x86 machines. Proceed to&amp;nbsp;&lt;a href=&quot;https://openwrt.org/docs/guide-user/installation/installation_methods/sysupgrade&quot; class=&quot;wikilink1&quot; title=&quot;docs:guide-user:installation:installation_methods:sysupgrade&quot; data-wiki-id=&quot;docs:guide-user:installation:installation_methods:sysupgrade&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none;&quot;&gt;Sysupgrade&lt;/a&gt;&amp;nbsp;for details.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Extracting boot partition image from&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-combined.img.gz&lt;/span&gt;&amp;nbsp;and writing it and&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-rootfs.img.gz&lt;/span&gt;, leaving MBR partition table intact.&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Extracting boot partition image from&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-combined.img.gz&lt;/span&gt;&amp;nbsp;and writing it, then uncompressing&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;rootfs.tar.gz&lt;/span&gt;&amp;nbsp;to existing rootfs partition.&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;The 2 last options require more steps to execute, but have the advantage of leaving MBR partition intact, therefore keeping boot and rootfs partitions sizes (in case of having resized them) and any extra partitions. At this time they are the most recommended methods of upgrading. The only exception is when new OpenWrt image brings a newer version of GRUB2. Part of GRUB2 is stored close to MBR and outside of partitions area, so we need to write a full ext4-combined.img.gz to update it.&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&quot;sectionedit17 page-header pb-3 mb-4 mt-5&quot; id=&quot;extracting_boot_partition_image&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 24px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Extracting boot partition image&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#extracting_boot_partition_image&quot; aria-label=&quot;Anchor link for: extracting_boot_partition_image&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class=&quot;level3&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;The boot partition contains part of GRUB2 software, Linux kernel and&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;grub.cfg&lt;/code&gt;&amp;nbsp;with boot options. rootfs partition contains OpenWrt files, packages and configs.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;At the moment, it&amp;#39;s not built a separated image file with boot partition, as it&amp;#39;s available for rootfs. To be able to upgrade boot partition without overriding the whole drive, we must extract it from&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-combined.img.gz&lt;/span&gt;, this requires a spare empty drive or a virtual machine.&lt;/p&gt;&lt;ol class=&quot;fix-media-list-overlap list-paddingleft-2&quot; style=&quot;box-sizing: border-box; margin-bottom: 10px; list-style-position: outside; list-style-image: initial; overflow: hidden;&quot;&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Uncompress combined partitions image:&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;gzip -d openwrt-19.07.8-x86-64-generic-ext4-combined.img.gz&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Write the image to the&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;empty&lt;/span&gt;&amp;nbsp;drive:&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;dd if=openwrt-19.07.8-x86-64-generic-ext4-combined.img of=/dev/sdd&lt;/code&gt;&amp;nbsp;(drive may be on sda, sdb, nvme0n1, etc)&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Extract boot partition image:&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;dd if=/dev/sdd1 of=openwrt-19.07.8-x86-64-generic-ext4-boot.img&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;We will end up with the partition image&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;openwrt-19.07.8-x86-64-generic-ext4-boot.img&lt;/span&gt;. Back to OpenWRT machine/drive, if the drive is on sdd and GRUB2 boot partition is on sdd1, we can write the updated image with&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;dd if=openwrt-19.07.8-x86-64-generic-ext4-boot.img of=/dev/sdd1&lt;/code&gt;. Note we&amp;#39;re here writing on the partition sdd1, not on the drive sdd.&lt;/p&gt;&lt;/div&gt;&lt;h3 class=&quot;sectionedit18 page-header pb-3 mb-4 mt-5&quot; id=&quot;upgrading_rootfs_partition&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 24px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Upgrading rootfs partition&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#upgrading_rootfs_partition&quot; aria-label=&quot;Anchor link for: upgrading_rootfs_partition&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div class=&quot;level3&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;As said above, there are 2 options for upgrading rootfs partition, when we are using the ext4 file system and not squashfs: writing&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-rootfs.img.gz&lt;/span&gt;&amp;nbsp;image or uncompressing&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;rootfs.tar.gz&lt;/span&gt;&amp;nbsp;into existing partition.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Writing&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;ext4-rootfs.img.gz&lt;/span&gt;&amp;nbsp;will delete any file on the partition. When using&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;dd&lt;/code&gt;, it will preserve partition&amp;#39;s actual size, it won&amp;#39;t revert its size to image&amp;#39;s.&lt;/p&gt;&lt;ol class=&quot;fix-media-list-overlap list-paddingleft-2&quot; style=&quot;box-sizing: border-box; margin-bottom: 10px; list-style-position: outside; list-style-image: initial; overflow: hidden;&quot;&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Uncompress rootfs image:&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;gzip -d openwrt-19.07.8-x86-64-generic-ext4-rootfs.img.gz&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;&lt;li&gt;&lt;div class=&quot;li&quot; style=&quot;box-sizing: border-box;&quot;&gt;Write the image to the partition:&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;dd if=openwrt-19.07.8-x86-64-generic-ext4-rootfs.img of=/dev/sdd2&lt;/code&gt;&lt;/div&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;For uncompressing&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;rootfs.tar.gz&lt;/span&gt;, we must mount rootfs partition, delete all files from it, then uncompress updated files.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;It may be tempting to not delete config files, but the risk isn&amp;#39;t worth it, because some file may conflict and not be properly upgraded. It&amp;#39;s safer to backup config files (as we should also backup whole drive before upgrading) and copy them back after upgrading. I suggest going further and having a Subversion repository on another computer where all config files are saved and their changes are tracked, and use&amp;nbsp;&lt;span style=&quot;box-sizing: border-box; font-weight: 700;&quot;&gt;rsync&lt;/span&gt;&amp;nbsp;to sync between the repository working copy and production files on the router.&lt;/p&gt;&lt;pre class=&quot;code bash&quot; style=&quot;box-sizing: border-box; overflow: auto; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 13px; padding: 9.5px; margin-top: 0px; margin-bottom: 10px; line-height: 1.42857; word-break: break-all; overflow-wrap: break-word; background-color: rgb(245, 245, 245); border: 1px solid rgb(204, 204, 204); border-radius: 4px; white-space: pre-wrap;&quot;&gt;#&amp;nbsp;mount&amp;nbsp;rootfs&amp;nbsp;partition,&amp;nbsp;in&amp;nbsp;this&amp;nbsp;example&amp;nbsp;it&amp;#39;s&amp;nbsp;on&amp;nbsp;sdd2mkdir&amp;nbsp;/mnt/rootfsmount&amp;nbsp;-v&amp;nbsp;/dev/sdd2&amp;nbsp;/mnt/rootfscd&amp;nbsp;/mnt/rootfs
&amp;nbsp;#&amp;nbsp;delete&amp;nbsp;all&amp;nbsp;files&amp;nbsp;on&amp;nbsp;the&amp;nbsp;partitionrm&amp;nbsp;-Rf&amp;nbsp;*&amp;nbsp;#&amp;nbsp;copy&amp;nbsp;rootfs.tar.gz&amp;nbsp;here&amp;nbsp;then&amp;nbsp;uncompress&amp;nbsp;ittar&amp;nbsp;-xvzf&amp;nbsp;openwrt-19.07.8-x86-64-generic-rootfs.tar.gz
&amp;nbsp;#&amp;nbsp;wait&amp;nbsp;for&amp;nbsp;uncompress&amp;nbsp;then&amp;nbsp;delete&amp;nbsp;the&amp;nbsp;filerm&amp;nbsp;openwrt-19.07.8-x86-64-generic-rootfs.tar.gz&lt;/pre&gt;&lt;/div&gt;&lt;h2 class=&quot;sectionedit19 page-header pb-3 mb-4 mt-5&quot; id=&quot;building_your_own_image_with_larger_partition_size&quot; style=&quot;box-sizing: border-box; font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; font-weight: 500; line-height: 1.1; color: rgb(51, 51, 51); font-size: 30px; margin-right: 0px; margin-left: 0px; border-bottom: 1px solid rgb(238, 238, 238); white-space: normal; background-color: rgb(255, 255, 255); margin-top: 3rem !important; margin-bottom: 1.5rem !important; padding-bottom: 1rem !important;&quot;&gt;Building your own image with larger partition size&lt;a class=&quot;anchorjs-link &quot; href=&quot;https://openwrt.org/docs/guide-user/installation/openwrt_x86#building_your_own_image_with_larger_partition_size&quot; aria-label=&quot;Anchor link for: building_your_own_image_with_larger_partition_size&quot; data-anchorjs-icon=&quot;&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none; opacity: 0; -webkit-font-smoothing: antialiased; font-family: anchorjs-icons; font-variant-numeric: normal; font-variant-east-asian: normal; line-height: 1; padding-left: 0.375em;&quot;&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div class=&quot;level2&quot; style=&quot;box-sizing: border-box; color: rgb(51, 51, 51); font-family: &amp;quot;Helvetica Neue&amp;quot;, Helvetica, Arial, sans-serif; white-space: normal; background-color: rgb(255, 255, 255);&quot;&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Anyone can compile OpenWrt from source, but it&amp;#39;s a complex procedure with many options which require some experience, specially for using it on a production router.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Different from compiling, we can build our own custom image using the&amp;nbsp;&lt;a href=&quot;https://openwrt.org/docs/guide-user/additional-software/imagebuilder&quot; class=&quot;wikilink1&quot; title=&quot;docs:guide-user:additional-software:imagebuilder&quot; data-wiki-id=&quot;docs:guide-user:additional-software:imagebuilder&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none;&quot;&gt;Image Builder&lt;/a&gt;. This doesn&amp;#39;t compile the whole software, instead it downloads required packages from the same repository used by OpenWrt to install them. Image Builder builds the same image files used for installing and upgrading OpenWrt.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Due to that it&amp;#39;s much simpler than compiling and offers great advantages, like adding directly to the image all packages we need, removing those we don&amp;#39;t need, and also adding to it our config files. Having packages on the image, we don&amp;#39;t need to reinstall all of them after an upgrade. And having our config files directly on the image, we don&amp;#39;t need to reconfigure everything or copy all files from backup, which is specially difficult when default network configs don&amp;#39;t work with our router&amp;#39;s interfaces or it doesn&amp;#39;t start with correct&amp;nbsp;&lt;abbr title=&quot;&quot; data-original-title=&quot;Internet Protocol&quot; style=&quot;box-sizing: border-box; border-bottom: none; cursor: help;&quot;&gt;IP&lt;/abbr&gt;&amp;nbsp;address. In many cases, OpenWrt will be back fully working on first boot after upgrading.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Another advantage for building a custom image is when the default rootfs partition size is too small to store all packages and we need to resize it. Note that, when following above procedures of installing then resizing partition and upgrading by writing partition image or extracting rootfs.tar.gz, we don&amp;#39;t need to build the image with the final size of the partition. Doing so would result in the too large image file and would require enough RAM to store the whole file during building. It&amp;#39;s recommended to use on the image just enough size to store all packages plus a small amount of free space.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Follow the&amp;nbsp;&lt;a href=&quot;https://openwrt.org/docs/guide-user/additional-software/imagebuilder&quot; class=&quot;wikilink1&quot; title=&quot;docs:guide-user:additional-software:imagebuilder&quot; data-wiki-id=&quot;docs:guide-user:additional-software:imagebuilder&quot; style=&quot;box-sizing: border-box; background-color: transparent; color: rgb(51, 122, 183); text-decoration-line: none;&quot;&gt;Image Builder&lt;/a&gt;&amp;nbsp;tutorial to setup the building environment using the x86/64 target. Once the building environment is setup, we use the&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;make image&lt;/code&gt;&amp;nbsp;command to build an image, which results on a set of files with the types of images described on this page. They are saved on&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;bin/targets/x86/64&lt;/code&gt;&amp;nbsp;inside the building folder.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;Because x86 hardware doesn&amp;#39;t have profiles, we don&amp;#39;t need to use the&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;PROFILE&lt;/code&gt;&amp;nbsp;parameter. With&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;PACKAGES&lt;/code&gt;&amp;nbsp;parameter we set all packages we want to add to or remove from default list. The command&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;make info&lt;/code&gt;&amp;nbsp;lists default packages list.&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;FILES&lt;/code&gt;&amp;nbsp;parameter is used to add custom config and script files to be added to the image, it points to a folder which represents root folder when OpenWrt is running.&lt;/p&gt;&lt;p style=&quot;box-sizing: border-box; margin-top: 0px; margin-bottom: 10px;&quot;&gt;For changing default partition sizes use parameters&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;CONFIG_TARGET_KERNEL_PARTSIZE&lt;/code&gt;&amp;nbsp;and&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;CONFIG_TARGET_ROOTFS_PARTSIZE&lt;/code&gt;. We can either edit&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;.config&lt;/code&gt;&amp;nbsp;file on building folder or pass them directly to&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;make image&lt;/code&gt;. Example&amp;nbsp;&lt;code style=&quot;box-sizing: border-box; font-family: Menlo, Monaco, Consolas, &amp;quot;Courier New&amp;quot;, monospace; font-size: 12.6px; padding: 2px 4px; color: rgb(85, 85, 85); background-color: rgb(238, 238, 238); border-radius: 4px;&quot;&gt;CONFIG_TARGET_KERNEL_PARTSIZE=128 CONFIG_TARGET_ROOTFS_PARTSIZE=512&lt;/code&gt;.&lt;/p&gt;&lt;/div&gt;&lt;p&gt;&lt;br/&gt;&lt;/p&gt;</description><pubDate>Mon, 20 Dec 2021 14:01:58 +0800</pubDate></item></channel></rss><!--5.95 ms , 5 query , -890kb memory , 0 error-->