[{"data":1,"prerenderedAt":7708},["ShallowReactive",2],{"wiki-page-\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0900-qi-ta-cao-zuo":3,"wiki-doc-items-2024-03-30-linux-jiao-cheng":7641,"wiki:author-members":7696},{"id":4,"title":5,"authors":6,"body":8,"chapterDepth":7628,"chapterOrder":7629,"date":7630,"description":37,"docKey":7631,"docRoot":7632,"docTitle":7633,"extension":7634,"isWikiDoc":1584,"isWikiIndex":7635,"meta":7636,"navigation":1584,"path":7637,"seo":7638,"stem":7639,"wikiDepth":44,"__hash__":7640},"wiki\u002Fwiki\u002F2024-03-30-Linux教程\u002F0900-其他操作.md","其他操作",[7],"董佳辉",{"type":9,"value":10,"toc":7614},"minimark",[11,15,19,23,31,319,322,395,398,401,404,423,429,432,449,454,457,483,488,491,515,520,524,527,533,536,539,542,547,550,553,556,561,564,569,572,575,580,583,588,591,594,599,602,607,610,626,629,632,644,647,656,659,662,671,674,683,686,689,698,701,704,720,723,726,735,740,743,746,755,758,767,770,779,782,791,796,799,807,812,815,824,827,835,840,843,852,855,858,862,865,870,873,878,893,898,903,914,919,925,930,945,950,953,958,963,968,976,981,988,993,1004,1009,1012,1015,1019,1022,1025,1034,1044,1051,1084,1087,1100,1105,1108,1111,1123,1126,1129,1132,1137,1140,1159,1164,1167,1176,1181,1184,1208,1211,1242,1245,1250,1253,1268,1273,1292,1295,1298,1303,1315,1320,1325,1328,1333,1336,1351,1354,1359,1364,1367,1370,1383,1394,1397,1414,1417,1433,1436,1448,1452,1456,1459,1484,1491,1497,1500,1541,1544,1547,1554,1613,1616,1624,1627,1630,1632,1636,1639,1642,1667,1670,1676,1679,1692,1694,1700,1705,1708,1717,1719,1728,1731,1739,1742,1751,1757,1760,1776,1779,1800,1802,1807,1812,1815,1824,1827,1840,1842,1848,1851,1857,1860,1863,1869,1876,1879,1884,1886,1890,1896,1899,1908,1910,1916,1918,1924,1927,1933,1936,1944,1947,1953,1962,1965,1979,1981,1984,1987,2006,2009,2025,2028,2062,2065,2071,2074,2155,2157,2161,2164,2202,2204,2236,2239,2255,2262,2286,2289,2291,2295,2298,2301,2303,2309,2311,2319,2322,2330,2333,2339,2341,2347,2349,2353,2356,2365,2368,2383,2386,2407,2409,2441,2443,2449,2451,2454,2457,2484,2487,2494,2521,2523,2526,2549,2551,2574,2577,2583,2585,2588,2591,2596,2599,2604,2607,2609,2618,2621,2624,2640,2642,2646,2649,2651,2657,2660,2679,2682,2688,2691,2694,2700,2703,2705,2708,2730,2732,2738,2744,2746,2750,2753,2756,2759,2773,2776,2778,2784,2787,2799,2801,2806,2809,2815,2818,2824,2827,2829,2836,2839,2859,2862,2884,2887,2893,2896,2910,2913,2932,2935,2957,2960,2983,2985,2988,2991,2996,2999,3004,3007,3010,3016,3019,3025,3027,3034,3043,3045,3067,3069,3075,3078,3087,3090,3099,3105,3107,3110,3113,3115,3141,3143,3152,3155,3161,3164,3166,3169,3172,3178,3181,3187,3189,3216,3219,3253,3256,3258,3269,3272,3278,3281,3389,3392,3401,3404,3407,3412,3415,3424,3427,3436,3439,3441,3445,3448,3454,3461,3464,3470,3473,3475,3478,3481,3504,3506,3512,3515,3521,3524,3530,3532,3535,3538,3554,3557,3570,3572,3578,3581,3599,3601,3604,3607,3613,3616,3641,3643,3657,3660,3666,3668,3672,3675,3681,3684,3706,3709,3712,3727,3730,3732,3735,3738,3752,3755,3768,3770,3775,3778,3784,3787,3792,3795,3797,3801,3804,3806,3809,3825,3828,3830,3833,3847,3849,3863,3866,3872,3874,3877,3879,3897,3899,3902,3904,3907,3921,3923,3929,3932,3941,3944,3946,3949,3952,3958,3961,3968,3970,3973,3977,3980,3989,3992,3997,3999,4003,4006,4012,4015,4017,4021,4024,4030,4033,4035,4039,4041,4046,4048,4054,4057,4059,4063,4066,4069,4075,4078,4080,4083,4086,4092,4095,4101,4104,4109,4112,4117,4120,4124,4139,4143,4146,4149,4152,4155,4163,4166,4179,4182,4197,4200,4219,4268,4271,4291,4294,4308,4314,4317,4326,4342,4354,4394,4399,4427,4432,4437,4467,4471,4475,4478,4482,4487,4499,4511,4514,4519,4534,4541,4575,4580,4597,4600,4604,4607,4611,4614,4618,4621,4625,4634,4640,4645,4657,4662,4667,4672,4699,4702,4707,4718,4723,4729,4734,4737,4742,4951,4955,4960,4965,4969,4974,4986,4994,4997,5002,5006,5011,5016,5021,5027,5032,5037,5042,5045,5048,5054,5059,5064,5067,5074,5080,5085,5090,5093,5097,5100,5103,5106,5109,5112,5118,5123,5126,5133,5140,5142,5145,5148,5178,5181,5185,5191,5196,5202,5207,5224,5256,5272,5275,5278,5284,5295,5300,5311,5321,5337,5342,5347,5350,5353,5356,5385,5388,5391,5440,5445,5448,5453,5456,5459,5464,5467,5472,5475,5478,5481,5484,5487,5492,5495,5498,5503,5508,5513,5517,5521,5524,5527,5538,5541,5544,5548,5551,5637,5640,5652,5658,5661,5665,5672,5678,5681,6087,6090,6093,6100,6103,6116,6119,6122,6128,6131,6143,6150,6153,6166,6173,6176,6179,6185,6188,6201,6208,6211,6225,6232,6235,6249,6252,6259,6262,6276,6281,6288,6291,6293,6322,6325,6341,6344,6347,6365,6368,6374,6376,6404,6407,6410,6415,6421,6424,6427,6444,6447,6453,6456,6462,6465,6468,6471,6474,6508,6511,6517,6526,6530,6534,6537,6540,6544,6548,6552,6555,6560,6572,6625,6630,6633,6638,6642,6645,6661,6668,6673,6680,6685,6689,6692,6706,6711,6715,6718,6724,6727,6734,6741,6849,6852,6857,6862,6865,6868,6895,6898,6903,6908,6911,6916,6922,6927,6930,6937,6942,6957,6962,6987,7007,7010,7015,7018,7101,7104,7110,7113,7117,7120,7312,7315,7321,7324,7329,7332,7335,7340,7446,7449,7454,7458,7462,7468,7474,7479,7482,7485,7490,7495,7498,7503,7508,7513,7517,7523,7528,7531,7545,7549,7554,7557,7571,7575,7580,7584,7589,7594,7597,7602,7605,7610],[12,13,14],"h3",{"id":14},"工控机如何连wifi",[16,17,18],"h4",{"id":18},"现在无法进入ssh",[20,21,22],"p",{},"当我们工控机从一个环境移动到另一个环境，且新的环境的wifi我们没有连接过，我们没有屏幕如何让工控机连上网呢？",[20,24,25,26,30],{},"进入工控机的硬盘目录，进入",[27,28,29],"code",{},"\u002Fetc\u002Fnetplan\u002F","，底下有很多yaml,找到一个最符合下方格式的yaml:",[32,33,38],"pre",{"className":34,"code":35,"language":36,"meta":37,"style":37},"language-YAML shiki shiki-themes github-light github-dark","network: \n  version: 2 \n  wifis: \n    NM-6f414fe0-2658-48ff-89ee-c7981b87bc96: \n      renderer: NetworkManager \n      match: \n        name: \"wlan0\" \n      dhcp4: true \n      dhcp6: true \n      access-points: \n        \"EMIS_Vinci_Robocon_5G\": \n          auth: \n            key-management: \"psk\" \n            password: \"vinci666\" \n          networkmanager: \n            uuid: \"6f414fe0-2658-48ff-89ee-c7981b87bc96\" \n            name: \"EMIS_Vinci_Robocon_5G\" \n            passthrough: \n              wifi-security.auth-alg: \"open\" \n              ipv6.addr-gen-mode: \"default\" \n              ipv6.ip6-privacy: \"-1\" \n              proxy._: \"\" \n      networkmanager: \n        uuid: \"6f414fe0-2658-48ff-89ee-c7981b87bc96\" \n        name: \"EMIS_Vinci_Robocon_5G\"\n\n","YAML","",[27,39,40,53,69,77,85,99,107,120,133,145,153,161,169,182,195,203,216,229,237,250,263,276,289,297,309],{"__ignoreMap":37},[41,42,45,49],"span",{"class":43,"line":44},"line",1,[41,46,48],{"class":47},"s9eBZ","network",[41,50,52],{"class":51},"sVt8B",": \n",[41,54,56,59,62,66],{"class":43,"line":55},2,[41,57,58],{"class":47},"  version",[41,60,61],{"class":51},": ",[41,63,65],{"class":64},"sj4cs","2",[41,67,68],{"class":51}," \n",[41,70,72,75],{"class":43,"line":71},3,[41,73,74],{"class":47},"  wifis",[41,76,52],{"class":51},[41,78,80,83],{"class":43,"line":79},4,[41,81,82],{"class":47},"    NM-6f414fe0-2658-48ff-89ee-c7981b87bc96",[41,84,52],{"class":51},[41,86,88,91,93,97],{"class":43,"line":87},5,[41,89,90],{"class":47},"      renderer",[41,92,61],{"class":51},[41,94,96],{"class":95},"sZZnC","NetworkManager",[41,98,68],{"class":51},[41,100,102,105],{"class":43,"line":101},6,[41,103,104],{"class":47},"      match",[41,106,52],{"class":51},[41,108,110,113,115,118],{"class":43,"line":109},7,[41,111,112],{"class":47},"        name",[41,114,61],{"class":51},[41,116,117],{"class":95},"\"wlan0\"",[41,119,68],{"class":51},[41,121,123,126,128,131],{"class":43,"line":122},8,[41,124,125],{"class":47},"      dhcp4",[41,127,61],{"class":51},[41,129,130],{"class":64},"true",[41,132,68],{"class":51},[41,134,136,139,141,143],{"class":43,"line":135},9,[41,137,138],{"class":47},"      dhcp6",[41,140,61],{"class":51},[41,142,130],{"class":64},[41,144,68],{"class":51},[41,146,148,151],{"class":43,"line":147},10,[41,149,150],{"class":47},"      access-points",[41,152,52],{"class":51},[41,154,156,159],{"class":43,"line":155},11,[41,157,158],{"class":95},"        \"EMIS_Vinci_Robocon_5G\"",[41,160,52],{"class":51},[41,162,164,167],{"class":43,"line":163},12,[41,165,166],{"class":47},"          auth",[41,168,52],{"class":51},[41,170,172,175,177,180],{"class":43,"line":171},13,[41,173,174],{"class":47},"            key-management",[41,176,61],{"class":51},[41,178,179],{"class":95},"\"psk\"",[41,181,68],{"class":51},[41,183,185,188,190,193],{"class":43,"line":184},14,[41,186,187],{"class":47},"            password",[41,189,61],{"class":51},[41,191,192],{"class":95},"\"vinci666\"",[41,194,68],{"class":51},[41,196,198,201],{"class":43,"line":197},15,[41,199,200],{"class":47},"          networkmanager",[41,202,52],{"class":51},[41,204,206,209,211,214],{"class":43,"line":205},16,[41,207,208],{"class":47},"            uuid",[41,210,61],{"class":51},[41,212,213],{"class":95},"\"6f414fe0-2658-48ff-89ee-c7981b87bc96\"",[41,215,68],{"class":51},[41,217,219,222,224,227],{"class":43,"line":218},17,[41,220,221],{"class":47},"            name",[41,223,61],{"class":51},[41,225,226],{"class":95},"\"EMIS_Vinci_Robocon_5G\"",[41,228,68],{"class":51},[41,230,232,235],{"class":43,"line":231},18,[41,233,234],{"class":47},"            passthrough",[41,236,52],{"class":51},[41,238,240,243,245,248],{"class":43,"line":239},19,[41,241,242],{"class":47},"              wifi-security.auth-alg",[41,244,61],{"class":51},[41,246,247],{"class":95},"\"open\"",[41,249,68],{"class":51},[41,251,253,256,258,261],{"class":43,"line":252},20,[41,254,255],{"class":47},"              ipv6.addr-gen-mode",[41,257,61],{"class":51},[41,259,260],{"class":95},"\"default\"",[41,262,68],{"class":51},[41,264,266,269,271,274],{"class":43,"line":265},21,[41,267,268],{"class":47},"              ipv6.ip6-privacy",[41,270,61],{"class":51},[41,272,273],{"class":95},"\"-1\"",[41,275,68],{"class":51},[41,277,279,282,284,287],{"class":43,"line":278},22,[41,280,281],{"class":47},"              proxy._",[41,283,61],{"class":51},[41,285,286],{"class":95},"\"\"",[41,288,68],{"class":51},[41,290,292,295],{"class":43,"line":291},23,[41,293,294],{"class":47},"      networkmanager",[41,296,52],{"class":51},[41,298,300,303,305,307],{"class":43,"line":299},24,[41,301,302],{"class":47},"        uuid",[41,304,61],{"class":51},[41,306,213],{"class":95},[41,308,68],{"class":51},[41,310,312,314,316],{"class":43,"line":311},25,[41,313,112],{"class":47},[41,315,61],{"class":51},[41,317,318],{"class":95},"\"EMIS_Vinci_Robocon_5G\"\n",[20,320,321],{},"将其改为新wifi的名和密码：",[32,323,325],{"className":34,"code":324,"language":36,"meta":37,"style":37},"network:\n  version: 2\n  wifis:\n    wlan0:\n      dhcp4: true\n      dhcp6: true\n      access-points:\n        \"EMIS_Vinci_Robocon_5G\":\n          password: \"vinci666\"\n\n",[27,326,327,334,343,349,356,365,373,379,385],{"__ignoreMap":37},[41,328,329,331],{"class":43,"line":44},[41,330,48],{"class":47},[41,332,333],{"class":51},":\n",[41,335,336,338,340],{"class":43,"line":55},[41,337,58],{"class":47},[41,339,61],{"class":51},[41,341,342],{"class":64},"2\n",[41,344,345,347],{"class":43,"line":71},[41,346,74],{"class":47},[41,348,333],{"class":51},[41,350,351,354],{"class":43,"line":79},[41,352,353],{"class":47},"    wlan0",[41,355,333],{"class":51},[41,357,358,360,362],{"class":43,"line":87},[41,359,125],{"class":47},[41,361,61],{"class":51},[41,363,364],{"class":64},"true\n",[41,366,367,369,371],{"class":43,"line":101},[41,368,138],{"class":47},[41,370,61],{"class":51},[41,372,364],{"class":64},[41,374,375,377],{"class":43,"line":109},[41,376,150],{"class":47},[41,378,333],{"class":51},[41,380,381,383],{"class":43,"line":122},[41,382,158],{"class":95},[41,384,333],{"class":51},[41,386,387,390,392],{"class":43,"line":135},[41,388,389],{"class":47},"          password",[41,391,61],{"class":51},[41,393,394],{"class":95},"\"vinci666\"\n",[20,396,397],{},"工控机开机即可连上网。",[16,399,400],{"id":400},"现在可以ssh",[20,402,403],{},"查网卡：",[32,405,409],{"className":406,"code":407,"language":408,"meta":37,"style":37},"language-bash shiki shiki-themes github-light github-dark","nmcli device status\n","bash",[27,410,411],{"__ignoreMap":37},[41,412,413,417,420],{"class":43,"line":44},[41,414,416],{"class":415},"sScJk","nmcli",[41,418,419],{"class":95}," device",[41,421,422],{"class":95}," status\n",[20,424,425],{},[426,427],"img",{"alt":37,"src":428},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791725251343-4fb980bd.webp",[20,430,431],{},"当前连接的Wifi：",[32,433,435],{"className":406,"code":434,"language":408,"meta":37,"style":37},"nmcli device wifi list\n",[27,436,437],{"__ignoreMap":37},[41,438,439,441,443,446],{"class":43,"line":44},[41,440,416],{"class":415},[41,442,419],{"class":95},[41,444,445],{"class":95}," wifi",[41,447,448],{"class":95}," list\n",[20,450,451],{},[426,452],{"alt":37,"src":453},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791725295034-f1d849ab.webp",[20,455,456],{},"查询当前周围有什么wifi",[32,458,460],{"className":406,"code":459,"language":408,"meta":37,"style":37},"sudo nmcli device wifi list --rescan yes\n",[27,461,462],{"__ignoreMap":37},[41,463,464,467,470,472,474,477,480],{"class":43,"line":44},[41,465,466],{"class":415},"sudo",[41,468,469],{"class":95}," nmcli",[41,471,419],{"class":95},[41,473,445],{"class":95},[41,475,476],{"class":95}," list",[41,478,479],{"class":64}," --rescan",[41,481,482],{"class":95}," yes\n",[20,484,485],{},[426,486],{"alt":37,"src":487},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791725420032-11063ea0.webp",[20,489,490],{},"连接wifi：",[32,492,494],{"className":406,"code":493,"language":408,"meta":37,"style":37},"sudo nmcli --ask device wifi connect \"新的WiFi名称\"\n",[27,495,496],{"__ignoreMap":37},[41,497,498,500,502,505,507,509,512],{"class":43,"line":44},[41,499,466],{"class":415},[41,501,469],{"class":95},[41,503,504],{"class":64}," --ask",[41,506,419],{"class":95},[41,508,445],{"class":95},[41,510,511],{"class":95}," connect",[41,513,514],{"class":95}," \"新的WiFi名称\"\n",[20,516,517],{},[426,518],{"alt":37,"src":519},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791726245258-d62ae325.webp",[12,521,523],{"id":522},"ssh远程开发","SSH远程开发",[16,525,526],{"id":526},"环境准备",[20,528,529],{},[530,531,532],"strong",{},"1.硬件准备",[20,534,535],{},"首先要有一台工控机（X86小型电脑，专业工控机，树莓派等等）。",[20,537,538],{},"控制系统的硬件载体是具有多样性的，常用的多是基于ARM、x86等架构的处理器，比如：PC、工控机、树莓派、NVIDIA Jetson...。不同的处理器都存在一定的优缺点，PC和工控机，处理器性能强大，但是功耗高、体积大、灵活性差，嵌入式系统则反之。对于我们而言，可以根据机器人平台的电气、载重、空间以及用途等诸多要素自主选择合适的控制系统。",[20,540,541],{},"无论选用何种处理器，只要是要进行机器人的开发，安装了ROS或者ROS2，那么对于开发人员而言，在使用上，没有任何本质的区别，或者换言之，作为软件工程师，部分场景下无需关注于硬件的选型。",[20,543,544],{},[530,545,546],{},"2.设置固定IP",[20,548,549],{},"远程连接时，不管使用何种工具，需要根据IP地址定位到被连接的主机，再通过账号和密码登录该主机，因此，我们需要先获取该IP地址。并且每次连接时，都需要使用到IP，为了保证连接的便利性和稳定性，最好将被连接主机的IP地址设置为固定IP，具体操作如下。",[20,551,552],{},"1.进入设置界面",[20,554,555],{},"启动被连接的主机（启动时需要连接显示器或使用HDMI采集卡，并且配置完SSH远程访问之后，可以不再使用显示器或HDMI采集卡），并进入设置界面。",[20,557,558],{},[426,559],{"alt":37,"src":560},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage332.webp",[20,562,563],{},"2.配置所连接的网络",[20,565,566],{},[426,567],{"alt":37,"src":568},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage333.webp",[20,570,571],{},"3.设置固定IP",[20,573,574],{},"查看当前IP地址。",[20,576,577],{},[426,578],{"alt":37,"src":579},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage334.webp",[20,581,582],{},"设置固定IP。",[20,584,585],{},[426,586],{"alt":37,"src":587},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage335.webp",[20,589,590],{},"至此，IP配置完毕。",[16,592,593],{"id":593},"环境搭建",[20,595,596],{},[530,597,598],{},"概念",[20,600,601],{},"SSH（Secure Shell）是一种通用的、功能强大的、基于软件的网络安全解决方案。计算机每次向网络发送数据时，SSH都会自动对其进行加密。数据到达目的地时，SSH自动对加密数据进行解密。整个过程都是透明的，使用OpenSSH工具将会增进你的系统安全性。SSH安装容易、使用简单。",[20,603,604],{},[530,605,606],{},"实现",[20,608,609],{},"SSH实现架构上分为客户端和服务器端两大部分，客户端是数据的发送方，服务端是数据的接收方，当前场景下，我们需要从本地主机发送数据到远程主机，那么本地主机需要安装并启动SSH客户端，而远程主机则需要安装并启动SSH服务端，整个实现具体流程如下：",[611,612,613,617,620,623],"ol",{},[614,615,616],"li",{},"本地主机安装SSH客户端，远程主机安装SSH服务端；",[614,618,619],{},"远程主机启动SSH服务；",[614,621,622],{},"本地主机登陆远程主机；",[614,624,625],{},"实现数据传输。",[20,627,628],{},"1.安装SSH客户端与服务端",[20,630,631],{},"默认情况下，Ubuntu系统已经安装了SSH客户端，因此只需要在远程主机安装SSH服务端即可，安装命令如下：",[32,633,638],{"className":634,"code":635,"language":636,"meta":637,"style":37},"language-Plain shiki shiki-themes github-light github-dark"," sudo apt install openssh-server\n","Plain","Text",[27,639,640],{"__ignoreMap":37},[41,641,642],{"class":43,"line":44},[41,643,635],{},[20,645,646],{},"如果SSH客户端需要自行安装，那么调用如下命令:",[32,648,650],{"className":634,"code":649,"language":636,"meta":637,"style":37},"sudo apt install openssh-client\n",[27,651,652],{"__ignoreMap":37},[41,653,654],{"class":43,"line":44},[41,655,649],{},[20,657,658],{},"2.远程主机启动SSH服务",[20,660,661],{},"远程主机启动 ssh 服务命令如下：",[32,663,665],{"className":634,"code":664,"language":636,"meta":637,"style":37},"sudo \u002Fetc\u002Finit.d\u002Fssh start\n",[27,666,667],{"__ignoreMap":37},[41,668,669],{"class":43,"line":44},[41,670,664],{},[20,672,673],{},"启动后可使用如下命令查看服务是否正常运行：",[32,675,677],{"className":634,"code":676,"language":636,"meta":637,"style":37},"ps -e | grep ssh\n",[27,678,679],{"__ignoreMap":37},[41,680,681],{"class":43,"line":44},[41,682,676],{},[20,684,685],{},"如果启动成功，会包含 sshd 程序。",[20,687,688],{},"以后需要频繁的使用ssh远程登录，为了简化实现，可以将远程主机的ssh服务设置为开机自启动，命令如下：",[32,690,692],{"className":634,"code":691,"language":636,"meta":637,"style":37},"sudo systemctl enable ssh\n",[27,693,694],{"__ignoreMap":37},[41,695,696],{"class":43,"line":44},[41,697,691],{},[20,699,700],{},"3.本地远程登录",[20,702,703],{},"登录远程主机可以调用如下命令:",[32,705,707],{"className":406,"code":706,"language":408,"meta":37,"style":37},"ssh -X 用户名@ip地址\n",[27,708,709],{"__ignoreMap":37},[41,710,711,714,717],{"class":43,"line":44},[41,712,713],{"class":415},"ssh",[41,715,716],{"class":64}," -X",[41,718,719],{"class":95}," 用户名@ip地址\n",[20,721,722],{},"然后根据提示，录入登陆密码，即可成功登录。",[20,724,725],{},"如果退出，可以调用exit命令：",[32,727,729],{"className":634,"code":728,"language":636,"meta":637,"style":37},"exit\n",[27,730,731],{"__ignoreMap":37},[41,732,733],{"class":43,"line":44},[41,734,728],{},[20,736,737],{},[530,738,739],{},"4.实现数据传输",[20,741,742],{},"通过SSH在本地主机只需调用相关指令，便可方便的实现与远程主机的数据上传或下载，指令格式如下所示：",[20,744,745],{},"上传文件指令格式如下：",[32,747,749],{"className":634,"code":748,"language":636,"meta":637,"style":37},"scp 本地文件路径 账号@ip:路径\n",[27,750,751],{"__ignoreMap":37},[41,752,753],{"class":43,"line":44},[41,754,748],{},[20,756,757],{},"上传文件夹指令格式如下：",[32,759,761],{"className":634,"code":760,"language":636,"meta":637,"style":37},"scp -r 本地文件夹路径 账号@ip:路径\n",[27,762,763],{"__ignoreMap":37},[41,764,765],{"class":43,"line":44},[41,766,760],{},[20,768,769],{},"下载文件指令格式如下：",[32,771,773],{"className":634,"code":772,"language":636,"meta":637,"style":37},"scp 账号@ip:路径 本地文件夹路径\n",[27,774,775],{"__ignoreMap":37},[41,776,777],{"class":43,"line":44},[41,778,772],{},[20,780,781],{},"下载文件夹指令格式如下：",[32,783,785],{"className":634,"code":784,"language":636,"meta":637,"style":37},"scp -r 账号@ip:路径 本地文件夹路径\n",[27,786,787],{"__ignoreMap":37},[41,788,789],{"class":43,"line":44},[41,790,784],{},[20,792,793],{},[530,794,795],{},"优化",[20,797,798],{},"每次远程登录时，都需要输入密码，使用不方便，可以借助密钥简化登录过程，实现免密登录，提高操作效率。实现思想是：生成一对公钥私钥，私钥存储在本地，公钥上传至服务器，每次登录时，本地直接上传私钥到服务器，服务器有匹配的公钥就认为是合法用户，直接创建SSH连接即可。具体实现步骤只有两步：",[611,800,801,804],{},[614,802,803],{},"本地生成密钥对；",[614,805,806],{},"将公钥上传至远程主机。",[20,808,809],{},[530,810,811],{},"1.生成密钥对",[20,813,814],{},"本地客户端生成公私钥：（一路回车默认即可）",[32,816,818],{"className":634,"code":817,"language":636,"meta":637,"style":37},"ssh-keygen\n",[27,819,820],{"__ignoreMap":37},[41,821,822],{"class":43,"line":44},[41,823,817],{},[20,825,826],{},"上面这个命令会在用户目录.ssh文件夹下创建公私钥：",[611,828,829,832],{},[614,830,831],{},"id_rsa （私钥）；",[614,833,834],{},"id_rsa.pub (公钥)。",[20,836,837],{},[530,838,839],{},"2.公钥上传",[20,841,842],{},"上传指令如下：",[32,844,846],{"className":634,"code":845,"language":636,"meta":637,"style":37},"ssh-copy-id -i ~\u002F.ssh\u002Fid_rsa.pub 账号@ip\n",[27,847,848],{"__ignoreMap":37},[41,849,850],{"class":43,"line":44},[41,851,845],{},[20,853,854],{},"上面这条指令是将本地公钥上传到远程主机的ssh目录下，该目录下有文件authorized_keys保存了公钥内容。",[20,856,857],{},"以后再远程登录就无需录入密码了。",[16,859,861],{"id":860},"使用vscode优化","使用VScode优化",[20,863,864],{},"上一节，我们介绍了ssh远程连接的使用，但是如果只是纯粹使用ssh也存在一些不足，比如：编辑文件内容时，需要使用vi编辑器，且在一个终端内，无法同时编辑多个文件。本节将介绍一更为实用的功能——VSCode结合插件实现远程开发，这使我们可以以图形化的方式实现远程开发，比ssh的使用更方便快捷，可以大大的提高程序开发效率。",[20,866,867],{},[530,868,869],{},"1.准备工作",[20,871,872],{},"VScode远程开发依赖于ssh，请首先按照上一节内容配置ssh远程连接。",[20,874,875],{},[530,876,877],{},"2.为VScode安装远程开发插件",[20,879,880,881,884,885,888,889,892],{},"启动VScode，首先点击侧边栏的扩展按钮，然后在",[27,882,883],{},"扩展：商店","的搜索栏输入",[27,886,887],{},"Remote Development","并点击同名插件，最后在右侧显示区中点击",[27,890,891],{},"安装","。",[20,894,895],{},[426,896],{"alt":37,"src":897},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage336.webp",[20,899,900],{},[530,901,902],{},"3.配置远程连接",[20,904,905,906,909,910,913],{},"步骤1：使用快捷键",[27,907,908],{},"ctrl + shift + p","打开命令输入窗口，并输入",[27,911,912],{},"Remote-SSH:Connect to Host...","，弹出列表中选择与之同名的选项。",[20,915,916],{},[426,917],{"alt":37,"src":918},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage337.webp",[20,920,921,922,892],{},"步骤2：步骤1完成将弹出一个新的命令窗口如下，选择下拉列表中的 ",[27,923,924],{},"Add New SSH Host",[20,926,927],{},[426,928],{"alt":37,"src":929},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage338.webp",[20,931,932,933,936,937,940,941,944],{},"步骤3：步骤2完成又将弹出一个新的命令窗口，在其中输入：",[27,934,935],{},"ssh -X ubuntu@192.168.43.164","，其中，",[27,938,939],{},"ubuntu","需要替换为你的登录用户名，",[27,942,943],{},"192.18.43.164"," 则替换为被远程连接主机的ip地址。",[20,946,947],{},[426,948],{"alt":37,"src":949},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage339.webp",[20,951,952],{},"步骤4：选择步骤3完成后的弹窗列表中的第一个选项(或直接回车)，即可完成配置，配置成功后会有提示信息。",[20,954,955],{},[426,956],{"alt":37,"src":957},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage340.webp",[20,959,960],{},[426,961],{"alt":37,"src":962},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage341.webp",[20,964,965],{},[530,966,967],{},"4.使用",[20,969,970,971,909,973,975],{},"步骤1：继续使用快捷键",[27,972,908],{},[27,974,912],{},"，此时列表中将显示步骤3中配置的ip地址，直接选择，选择后，VScode将打开一个新的窗口。",[20,977,978],{},[426,979],{"alt":37,"src":980},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage342.webp",[20,982,983,984,987],{},"或者，也可以点击侧边栏的",[27,985,986],{},"远程资源管理器","，在弹出的服务器列表中选择要连接的服务器，并右击，选择在本窗口或新窗口中实现远程连接。",[20,989,990],{},[426,991],{"alt":37,"src":992},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage343.webp",[20,994,995,996,999,1000,1003],{},"步骤2：选择菜单栏的",[27,997,998],{},"文件","下的",[27,1001,1002],{},"打开文件夹","，在弹窗列表中选择需要打开的文件夹并点击确定即可。",[20,1005,1006],{},[426,1007],{"alt":37,"src":1008},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage344.webp",[20,1010,1011],{},"最终，我们就可以像操作本地文件一样实现远程开发了。",[16,1013,1014],{"id":1014},"进阶",[1016,1017,1018],"h5",{"id":1018},"使用hostname进行ssh",[20,1020,1021],{},"当一个设备他的IP一直变化，可以用hostname来进行连接。",[20,1023,1024],{},"可以先看你要远程开发的设备的hostname是什么？",[32,1026,1028],{"className":406,"code":1027,"language":408,"meta":37,"style":37},"hostname\n",[27,1029,1030],{"__ignoreMap":37},[41,1031,1032],{"class":43,"line":44},[41,1033,1027],{"class":415},[20,1035,1036,1037,1040,1041],{},"比如输出的",[27,1038,1039],{},"hostname","是",[27,1042,1043],{},"Dell-G15-5511",[20,1045,1046,1047,1050],{},"那么在这个设备上装上",[27,1048,1049],{},"avahi-daemon",":",[32,1052,1054],{"className":406,"code":1053,"language":408,"meta":37,"style":37},"sudo apt install avahi-daemon\nsudo systemctl enable --now avahi-daemon\n",[27,1055,1056,1069],{"__ignoreMap":37},[41,1057,1058,1060,1063,1066],{"class":43,"line":44},[41,1059,466],{"class":415},[41,1061,1062],{"class":95}," apt",[41,1064,1065],{"class":95}," install",[41,1067,1068],{"class":95}," avahi-daemon\n",[41,1070,1071,1073,1076,1079,1082],{"class":43,"line":55},[41,1072,466],{"class":415},[41,1074,1075],{"class":95}," systemctl",[41,1077,1078],{"class":95}," enable",[41,1080,1081],{"class":64}," --now",[41,1083,1068],{"class":95},[20,1085,1086],{},"然后你就可以在同局域网的电脑上尝试：",[32,1088,1090],{"className":406,"code":1089,"language":408,"meta":37,"style":37},"ping Dell-G15-5511.local\n",[27,1091,1092],{"__ignoreMap":37},[41,1093,1094,1097],{"class":43,"line":44},[41,1095,1096],{"class":415},"ping",[41,1098,1099],{"class":95}," Dell-G15-5511.local\n",[20,1101,1102],{},[426,1103],{"alt":37,"src":1104},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791010688472-34fbeb1a.webp",[20,1106,1107],{},"如果能够ping通就可以了。",[20,1109,1110],{},"那么以后ssh就可以",[32,1112,1114],{"className":406,"code":1113,"language":408,"meta":37,"style":37},"ssh 用户名@Dell-G15-5511.local\n",[27,1115,1116],{"__ignoreMap":37},[41,1117,1118,1120],{"class":43,"line":44},[41,1119,713],{"class":415},[41,1121,1122],{"class":95}," 用户名@Dell-G15-5511.local\n",[12,1124,1125],{"id":1125},"远程桌面",[20,1127,1128],{},"因为用X11转发效率太低太低，所以还是要选用远程访问桌面的形式来看Rviz2和Gazebo等等（如果有需求的话）",[20,1130,1131],{},"我们选择使用VNC来看。",[611,1133,1134],{},[614,1135,1136],{},"安装VNC服务器：",[20,1138,1139],{},"这里以TigerVNC为例进行安装：",[32,1141,1143],{"className":406,"code":1142,"language":408,"meta":37,"style":37},"sudo apt install tigervnc-standalone-server tigervnc-common\n",[27,1144,1145],{"__ignoreMap":37},[41,1146,1147,1149,1151,1153,1156],{"class":43,"line":44},[41,1148,466],{"class":415},[41,1150,1062],{"class":95},[41,1152,1065],{"class":95},[41,1154,1155],{"class":95}," tigervnc-standalone-server",[41,1157,1158],{"class":95}," tigervnc-common\n",[611,1160,1161],{"start":55},[614,1162,1163],{},"设置VNC密码：",[20,1165,1166],{},"为VNC用户设置密码，运行以下命令：",[32,1168,1170],{"className":406,"code":1169,"language":408,"meta":37,"style":37},"vncpasswd\n",[27,1171,1172],{"__ignoreMap":37},[41,1173,1174],{"class":43,"line":44},[41,1175,1169],{"class":415},[611,1177,1178],{"start":71},[614,1179,1180],{},"配置VNC启动脚本:",[20,1182,1183],{},"创建VNC配置文件，在用户家目录内的.vnc文件夹中创建启动文件：",[32,1185,1187],{"className":406,"code":1186,"language":408,"meta":37,"style":37},"mkdir -p ~\u002F.vnc\nnano ~\u002F.vnc\u002Fxstartup\n",[27,1188,1189,1200],{"__ignoreMap":37},[41,1190,1191,1194,1197],{"class":43,"line":44},[41,1192,1193],{"class":415},"mkdir",[41,1195,1196],{"class":64}," -p",[41,1198,1199],{"class":95}," ~\u002F.vnc\n",[41,1201,1202,1205],{"class":43,"line":55},[41,1203,1204],{"class":415},"nano",[41,1206,1207],{"class":95}," ~\u002F.vnc\u002Fxstartup\n",[20,1209,1210],{},"在打开的编辑器里面输入以下内容（以GNOME为例）：",[32,1212,1214],{"className":406,"code":1213,"language":408,"meta":37,"style":37},"#!\u002Fbin\u002Fsh\nunset SESSION_MANAGER\nunset DBUS_SESSION_BUS_ADDRESS\ngnome-session\n",[27,1215,1216,1222,1230,1237],{"__ignoreMap":37},[41,1217,1218],{"class":43,"line":44},[41,1219,1221],{"class":1220},"sJ8bj","#!\u002Fbin\u002Fsh\n",[41,1223,1224,1227],{"class":43,"line":55},[41,1225,1226],{"class":64},"unset",[41,1228,1229],{"class":95}," SESSION_MANAGER\n",[41,1231,1232,1234],{"class":43,"line":71},[41,1233,1226],{"class":64},[41,1235,1236],{"class":95}," DBUS_SESSION_BUS_ADDRESS\n",[41,1238,1239],{"class":43,"line":79},[41,1240,1241],{"class":415},"gnome-session\n",[20,1243,1244],{},"保存并退出（在nano中按Ctrl + O保存，然后按Ctrl + X退出）。",[611,1246,1247],{"start":79},[614,1248,1249],{},"给予执行权限：",[20,1251,1252],{},"为xstartup文件设置执行权限：",[32,1254,1256],{"className":406,"code":1255,"language":408,"meta":37,"style":37},"chmod +x ~\u002F.vnc\u002Fxstartup\n",[27,1257,1258],{"__ignoreMap":37},[41,1259,1260,1263,1266],{"class":43,"line":44},[41,1261,1262],{"class":415},"chmod",[41,1264,1265],{"class":95}," +x",[41,1267,1207],{"class":95},[611,1269,1270],{"start":87},[614,1271,1272],{},"启动VNC服务器：",[32,1274,1276],{"className":406,"code":1275,"language":408,"meta":37,"style":37},"vncserver -geometry 1920x1080 -localhost=0\n",[27,1277,1278],{"__ignoreMap":37},[41,1279,1280,1283,1286,1289],{"class":43,"line":44},[41,1281,1282],{"class":415},"vncserver",[41,1284,1285],{"class":64}," -geometry",[41,1287,1288],{"class":95}," 1920x1080",[41,1290,1291],{"class":64}," -localhost=0\n",[20,1293,1294],{},"geometry 选项指定窗口大小，localhost 选项设为 0 以开放连接。(设为1是只允许本地连接)",[20,1296,1297],{},"你将看到类似于:1的输出，这表示VNC会话的显示编号。例如，如果输出为:1，则VNC监听的端口为5901（5900 + 显示编号）。",[611,1299,1300],{"start":101},[614,1301,1302],{},"查看已开启的VNC服务器：",[32,1304,1306],{"className":406,"code":1305,"language":408,"meta":37,"style":37},"vncserver -list\n",[27,1307,1308],{"__ignoreMap":37},[41,1309,1310,1312],{"class":43,"line":44},[41,1311,1282],{"class":415},[41,1313,1314],{"class":64}," -list\n",[20,1316,1317],{},[426,1318],{"alt":37,"src":1319},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage345.webp",[611,1321,1322],{"start":109},[614,1323,1324],{},"连接到VNC服务器：",[20,1326,1327],{},"使用VNC客户端（如vncviewer）连接到VNC服务器，输入你的服务器IP和端口。例如，如果服务器IP为192.168.31.10，且显示编号为1，你应该连接到192.168.31.10:1，或者直接输入192.168.31.10:5901。",[611,1329,1330],{"start":122},[614,1331,1332],{},"停止VNC服务器：",[20,1334,1335],{},"如果需要停止VNC服务器，可以使用以下命令：",[32,1337,1339],{"className":406,"code":1338,"language":408,"meta":37,"style":37},"vncserver -kill :1\n",[27,1340,1341],{"__ignoreMap":37},[41,1342,1343,1345,1348],{"class":43,"line":44},[41,1344,1282],{"class":415},[41,1346,1347],{"class":64}," -kill",[41,1349,1350],{"class":95}," :1\n",[20,1352,1353],{},"将:1替换为你实际使用的显示编号。",[20,1355,1356],{},[426,1357],{"alt":37,"src":1358},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage346.webp",[20,1360,1361],{},[426,1362],{"alt":37,"src":1363},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002Fimage347.webp",[12,1365,1366],{"id":1366},"开关图形界面",[20,1368,1369],{},"可以先看当前默认模式：",[32,1371,1373],{"className":406,"code":1372,"language":408,"meta":37,"style":37},"systemctl get-default\n",[27,1374,1375],{"__ignoreMap":37},[41,1376,1377,1380],{"class":43,"line":44},[41,1378,1379],{"class":415},"systemctl",[41,1381,1382],{"class":95}," get-default\n",[20,1384,1385,1386,1389,1390,1393],{},"如果是",[27,1387,1388],{},"graphical.target","就是有图形模式，如果是",[27,1391,1392],{},"multi-user.target","就是命令行模式。",[20,1395,1396],{},"关掉图形界面（设置为命令行模式）：",[32,1398,1400],{"className":406,"code":1399,"language":408,"meta":37,"style":37},"sudo systemctl isolate multi-user.target\n",[27,1401,1402],{"__ignoreMap":37},[41,1403,1404,1406,1408,1411],{"class":43,"line":44},[41,1405,466],{"class":415},[41,1407,1075],{"class":95},[41,1409,1410],{"class":95}," isolate",[41,1412,1413],{"class":95}," multi-user.target\n",[20,1415,1416],{},"默认关闭图形界面（默认进入命令行模式）：",[32,1418,1420],{"className":406,"code":1419,"language":408,"meta":37,"style":37},"sudo systemctl set-default multi-user.target\n",[27,1421,1422],{"__ignoreMap":37},[41,1423,1424,1426,1428,1431],{"class":43,"line":44},[41,1425,466],{"class":415},[41,1427,1075],{"class":95},[41,1429,1430],{"class":95}," set-default",[41,1432,1413],{"class":95},[20,1434,1435],{},"重启",[32,1437,1439],{"className":406,"code":1438,"language":408,"meta":37,"style":37},"sudo reboot\n",[27,1440,1441],{"__ignoreMap":37},[41,1442,1443,1445],{"class":43,"line":44},[41,1444,466],{"class":415},[41,1446,1447],{"class":95}," reboot\n",[12,1449,1451],{"id":1450},"usb设备名持久化","USB设备名持久化",[16,1453,1455],{"id":1454},"usb端口设置","USB端口设置",[20,1457,1458],{},"在 Linux 中，USB 串口设备插拔之后，系统分配的设备节点可能会发生变化，例如：",[32,1460,1462],{"className":406,"code":1461,"language":408,"meta":37,"style":37},"\u002Fdev\u002FttyUSB0\n\u002Fdev\u002FttyUSB1\n\u002Fdev\u002FttyACM0\n\u002Fdev\u002FttyACM1\n",[27,1463,1464,1469,1474,1479],{"__ignoreMap":37},[41,1465,1466],{"class":43,"line":44},[41,1467,1468],{"class":415},"\u002Fdev\u002FttyUSB0\n",[41,1470,1471],{"class":43,"line":55},[41,1472,1473],{"class":415},"\u002Fdev\u002FttyUSB1\n",[41,1475,1476],{"class":43,"line":71},[41,1477,1478],{"class":415},"\u002Fdev\u002FttyACM0\n",[41,1480,1481],{"class":43,"line":79},[41,1482,1483],{"class":415},"\u002Fdev\u002FttyACM1\n",[20,1485,1486,1487,1490],{},"如果程序、ROS 节点或者启动脚本直接写死 ",[27,1488,1489],{},"\u002Fdev\u002FttyUSB0","，当设备重新插拔、增加新的 USB 设备或者系统启动顺序发生变化时，就可能出现端口号改变的问题。",[20,1492,1493,1494,892],{},"因此，在机器人、无人车、嵌入式设备等场景中，一般需要给 USB 设备建立一个",[530,1495,1496],{},"稳定的设备路径或固定别名",[20,1498,1499],{},"常见方案主要有：",[611,1501,1502,1509,1514,1528,1531],{},[614,1503,1504,1505,1508],{},"使用 Linux 自动生成的 ",[27,1506,1507],{},"\u002Fdev\u002Fserial\u002Fby-id\u002F","；",[614,1510,1504,1511,1508],{},[27,1512,1513],{},"\u002Fdev\u002Fserial\u002Fby-path\u002F",[614,1515,1516,1517,1520,1521,1520,1524,1527],{},"根据设备的 ",[27,1518,1519],{},"idVendor","、",[27,1522,1523],{},"idProduct",[27,1525,1526],{},"serial"," 等属性编写 udev 规则；",[614,1529,1530],{},"根据主机 USB 物理接口的位置编写 udev 规则；",[614,1532,1533,1534,1537,1538,892],{},"对摄像头等设备使用 ",[27,1535,1536],{},"\u002Fdev\u002Fv4l\u002Fby-id\u002F"," 或 ",[27,1539,1540],{},"\u002Fdev\u002Fv4l\u002Fby-path\u002F",[1542,1543],"hr",{},[1016,1545,1546],{"id":1546},"首先配置串口权限",[20,1548,1549,1550,1553],{},"Linux 下普通用户默认可能没有串口设备的访问权限，因此首先将当前用户加入 ",[27,1551,1552],{},"dialout"," 用户组。",[32,1555,1557],{"className":406,"code":1556,"language":408,"meta":37,"style":37},"#### 将当前用户加入 dialout 用户组\nsudo usermod -aG dialout $USER\n\n#### 临时在当前终端加载新的用户组\nnewgrp dialout\n\n#### 查看当前用户组中是否存在 dialout\ngroups\n",[27,1558,1559,1564,1580,1586,1591,1599,1603,1608],{"__ignoreMap":37},[41,1560,1561],{"class":43,"line":44},[41,1562,1563],{"class":1220},"#### 将当前用户加入 dialout 用户组\n",[41,1565,1566,1568,1571,1574,1577],{"class":43,"line":55},[41,1567,466],{"class":415},[41,1569,1570],{"class":95}," usermod",[41,1572,1573],{"class":64}," -aG",[41,1575,1576],{"class":95}," dialout",[41,1578,1579],{"class":51}," $USER\n",[41,1581,1582],{"class":43,"line":71},[41,1583,1585],{"emptyLinePlaceholder":1584},true,"\n",[41,1587,1588],{"class":43,"line":79},[41,1589,1590],{"class":1220},"#### 临时在当前终端加载新的用户组\n",[41,1592,1593,1596],{"class":43,"line":87},[41,1594,1595],{"class":415},"newgrp",[41,1597,1598],{"class":95}," dialout\n",[41,1600,1601],{"class":43,"line":101},[41,1602,1585],{"emptyLinePlaceholder":1584},[41,1604,1605],{"class":43,"line":109},[41,1606,1607],{"class":1220},"#### 查看当前用户组中是否存在 dialout\n",[41,1609,1610],{"class":43,"line":122},[41,1611,1612],{"class":415},"groups\n",[20,1614,1615],{},"如果输出中包含：",[32,1617,1622],{"className":1618,"code":1620,"language":1621,"meta":37},[1619],"language-text","dialout\n","text",[27,1623,1620],{"__ignoreMap":37},[20,1625,1626],{},"说明当前终端已经具有串口访问权限。",[20,1628,1629],{},"也可以注销当前桌面会话后重新登录，使用户组权限在整个用户会话中生效。",[1542,1631],{},[16,1633,1635],{"id":1634},"优先使用-linux-自带的固定设备路径","优先使用 Linux 自带的固定设备路径",[20,1637,1638],{},"在自己编写 udev 规则之前，建议首先查看系统是否已经为设备生成了稳定的符号链接。",[20,1640,1641],{},"对于 USB 串口设备：",[32,1643,1645],{"className":406,"code":1644,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Fserial\u002Fby-id\u002F\nls -l \u002Fdev\u002Fserial\u002Fby-path\u002F\n",[27,1646,1647,1658],{"__ignoreMap":37},[41,1648,1649,1652,1655],{"class":43,"line":44},[41,1650,1651],{"class":415},"ls",[41,1653,1654],{"class":64}," -l",[41,1656,1657],{"class":95}," \u002Fdev\u002Fserial\u002Fby-id\u002F\n",[41,1659,1660,1662,1664],{"class":43,"line":55},[41,1661,1651],{"class":415},[41,1663,1654],{"class":64},[41,1665,1666],{"class":95}," \u002Fdev\u002Fserial\u002Fby-path\u002F\n",[20,1668,1669],{},"例如：",[32,1671,1674],{"className":1672,"code":1673,"language":1621,"meta":37},[1619],"usb-1a86_USB_Serial-if00-port0 -> ..\u002F..\u002FttyUSB0\nusb-STMicroelectronics_STM32_Virtual_ComPort_123456-if00 -> ..\u002F..\u002FttyACM0\n",[27,1675,1673],{"__ignoreMap":37},[20,1677,1678],{},"其中：",[1680,1681,1682,1687],"ul",{},[614,1683,1684,1686],{},[27,1685,1507],{},"：主要根据设备本身的身份信息生成；",[614,1688,1689,1691],{},[27,1690,1513],{},"：主要根据设备连接到主机的 USB 物理路径生成。",[1542,1693],{},[1016,1695,1697,1698],{"id":1696},"使用-devserialby-id","使用 ",[27,1699,1507],{},[20,1701,1702],{},[426,1703],{"alt":37,"src":1704},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791017283656-95d3e85d.webp",[20,1706,1707],{},"如果设备具有稳定且唯一的序列号，通常优先使用：",[32,1709,1711],{"className":406,"code":1710,"language":408,"meta":37,"style":37},"\u002Fdev\u002Fserial\u002Fby-id\u002Fxxx\n",[27,1712,1713],{"__ignoreMap":37},[41,1714,1715],{"class":43,"line":44},[41,1716,1710],{"class":415},[20,1718,1669],{},[32,1720,1722],{"className":406,"code":1721,"language":408,"meta":37,"style":37},"\u002Fdev\u002Fserial\u002Fby-id\u002Fusb-STMicroelectronics_STM32_Virtual_ComPort_123456-if00\n",[27,1723,1724],{"__ignoreMap":37},[41,1725,1726],{"class":43,"line":44},[41,1727,1721],{"class":415},[20,1729,1730],{},"即使对应的设备节点从：",[32,1732,1733],{"className":406,"code":1478,"language":408,"meta":37,"style":37},[27,1734,1735],{"__ignoreMap":37},[41,1736,1737],{"class":43,"line":44},[41,1738,1478],{"class":415},[20,1740,1741],{},"变成：",[32,1743,1745],{"className":406,"code":1744,"language":408,"meta":37,"style":37},"\u002Fdev\u002FttyACM2\n",[27,1746,1747],{"__ignoreMap":37},[41,1748,1749],{"class":43,"line":44},[41,1750,1744],{"class":415},[20,1752,1753,1756],{},[27,1754,1755],{},"by-id"," 路径通常仍然保持不变。",[20,1758,1759],{},"因此，ROS 2 参数中可以直接写：",[32,1761,1765],{"className":1762,"code":1763,"language":1764,"meta":37,"style":37},"language-yaml shiki shiki-themes github-light github-dark","port: \u002Fdev\u002Fserial\u002Fby-id\u002Fusb-STMicroelectronics_STM32_Virtual_ComPort_123456-if00\n","yaml",[27,1766,1767],{"__ignoreMap":37},[41,1768,1769,1772,1774],{"class":43,"line":44},[41,1770,1771],{"class":47},"port",[41,1773,61],{"class":51},[41,1775,1721],{"class":95},[20,1777,1778],{},"这种方案最大的优点是：",[1680,1780,1781,1791,1794,1797],{},[614,1782,1783,1784,1537,1787,1790],{},"不依赖 ",[27,1785,1786],{},"ttyUSBn",[27,1788,1789],{},"ttyACMn"," 的编号；",[614,1792,1793],{},"USB 设备换到其他接口后，一般仍然能够识别；",[614,1795,1796],{},"对于有唯一序列号的设备非常稳定；",[614,1798,1799],{},"不需要自己编写 udev rules。",[1542,1801],{},[1016,1803,1697,1805],{"id":1804},"使用-devserialby-path",[27,1806,1513],{},[20,1808,1809],{},[426,1810],{"alt":37,"src":1811},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1791017298139-24542e58.webp",[20,1813,1814],{},"如果设备没有唯一序列号，或者系统无法通过设备本身区分多台完全相同的设备，可以使用：",[32,1816,1818],{"className":406,"code":1817,"language":408,"meta":37,"style":37},"\u002Fdev\u002Fserial\u002Fby-path\u002F\n",[27,1819,1820],{"__ignoreMap":37},[41,1821,1822],{"class":43,"line":44},[41,1823,1817],{"class":415},[20,1825,1826],{},"查看：",[32,1828,1830],{"className":406,"code":1829,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Fserial\u002Fby-path\u002F\n",[27,1831,1832],{"__ignoreMap":37},[41,1833,1834,1836,1838],{"class":43,"line":44},[41,1835,1651],{"class":415},[41,1837,1654],{"class":64},[41,1839,1666],{"class":95},[20,1841,1669],{},[32,1843,1846],{"className":1844,"code":1845,"language":1621,"meta":37},[1619],"pci-0000:00:14.0-usb-0:3:1.0-port0 -> ..\u002F..\u002FttyUSB0\npci-0000:00:14.0-usb-0:4:1.0-port0 -> ..\u002F..\u002FttyUSB1\n",[27,1847,1845],{"__ignoreMap":37},[20,1849,1850],{},"这种方式实际上是根据：",[1852,1853,1854],"blockquote",{},[20,1855,1856],{},"设备插在主机的哪个 USB 接口",[20,1858,1859],{},"来区分设备。",[20,1861,1862],{},"例如无人车有两个完全相同的雷达：",[32,1864,1867],{"className":1865,"code":1866,"language":1621,"meta":37},[1619],"前雷达 -> 固定插在 USB 口 A\n后雷达 -> 固定插在 USB 口 B\n",[27,1868,1866],{"__ignoreMap":37},[20,1870,1871,1872,1875],{},"此时可以直接在程序中使用两个不同的 ",[27,1873,1874],{},"by-path"," 路径。",[20,1877,1878],{},"缺点是：",[1852,1880,1881],{},[20,1882,1883],{},"如果交换 USB 接口，设备对应的逻辑身份也会发生变化。",[1542,1885],{},[16,1887,1889],{"id":1888},"查看-usb-设备信息","查看 USB 设备信息",[1016,1891,1697,1893],{"id":1892},"使用-lsusb",[27,1894,1895],{},"lsusb",[20,1897,1898],{},"接入 USB 设备之后，可以首先执行：",[32,1900,1902],{"className":406,"code":1901,"language":408,"meta":37,"style":37},"lsusb\n",[27,1903,1904],{"__ignoreMap":37},[41,1905,1906],{"class":43,"line":44},[41,1907,1901],{"class":415},[20,1909,1669],{},[32,1911,1914],{"className":1912,"code":1913,"language":1621,"meta":37},[1619],"Bus 001 Device 007: ID 1a86:7523 QinHeng Electronics CH340 serial converter\n",[27,1915,1913],{"__ignoreMap":37},[20,1917,1678],{},[32,1919,1922],{"className":1920,"code":1921,"language":1621,"meta":37},[1619],"1a86:7523\n",[27,1923,1921],{"__ignoreMap":37},[20,1925,1926],{},"分别对应：",[32,1928,1931],{"className":1929,"code":1930,"language":1621,"meta":37},[1619],"idVendor  = 1a86\nidProduct = 7523\n",[27,1932,1930],{"__ignoreMap":37},[20,1934,1935],{},"需要注意：",[1852,1937,1938],{},[20,1939,1940,1943],{},[27,1941,1942],{},"idVendor + idProduct"," 只能表示某一类 USB 产品，通常不能唯一表示某一个具体设备。",[20,1945,1946],{},"例如两块完全相同的 CH340：",[32,1948,1951],{"className":1949,"code":1950,"language":1621,"meta":37},[1619],"CH340 A -> 1a86:7523\nCH340 B -> 1a86:7523\n",[27,1952,1950],{"__ignoreMap":37},[20,1954,1955,1956,1958,1959,1961],{},"它们的 ",[27,1957,1519],{}," 和 ",[27,1960,1523],{}," 是完全相同的。",[20,1963,1964],{},"因此：",[1680,1966,1967,1973],{},[614,1968,1969,1970,1972],{},"不同型号设备可以通过 ",[27,1971,1942],{}," 区分；",[614,1974,1975,1976,1978],{},"多个相同型号设备不能只依赖 ",[27,1977,1942],{}," 区分。",[1542,1980],{},[1016,1982,1983],{"id":1983},"查看设备完整属性",[20,1985,1986],{},"对于串口设备，可以使用：",[32,1988,1990],{"className":406,"code":1989,"language":408,"meta":37,"style":37},"udevadm info --query=property --name=\u002Fdev\u002FttyACM0\n",[27,1991,1992],{"__ignoreMap":37},[41,1993,1994,1997,2000,2003],{"class":43,"line":44},[41,1995,1996],{"class":415},"udevadm",[41,1998,1999],{"class":95}," info",[41,2001,2002],{"class":64}," --query=property",[41,2004,2005],{"class":64}," --name=\u002Fdev\u002FttyACM0\n",[20,2007,2008],{},"或者：",[32,2010,2012],{"className":406,"code":2011,"language":408,"meta":37,"style":37},"udevadm info --query=property --name=\u002Fdev\u002FttyUSB0\n",[27,2013,2014],{"__ignoreMap":37},[41,2015,2016,2018,2020,2022],{"class":43,"line":44},[41,2017,1996],{"class":415},[41,2019,1999],{"class":95},[41,2021,2002],{"class":64},[41,2023,2024],{"class":64}," --name=\u002Fdev\u002FttyUSB0\n",[20,2026,2027],{},"只查看常用信息：",[32,2029,2031],{"className":406,"code":2030,"language":408,"meta":37,"style":37},"udevadm info --query=property --name=\u002Fdev\u002FttyACM0 \\\n    | grep -E 'ID_(VENDOR_ID|MODEL_ID|SERIAL|SERIAL_SHORT|PATH|USB_INTERFACE_NUM)'\n",[27,2032,2033,2047],{"__ignoreMap":37},[41,2034,2035,2037,2039,2041,2044],{"class":43,"line":44},[41,2036,1996],{"class":415},[41,2038,1999],{"class":95},[41,2040,2002],{"class":64},[41,2042,2043],{"class":64}," --name=\u002Fdev\u002FttyACM0",[41,2045,2046],{"class":64}," \\\n",[41,2048,2049,2053,2056,2059],{"class":43,"line":55},[41,2050,2052],{"class":2051},"szBVR","    |",[41,2054,2055],{"class":415}," grep",[41,2057,2058],{"class":64}," -E",[41,2060,2061],{"class":95}," 'ID_(VENDOR_ID|MODEL_ID|SERIAL|SERIAL_SHORT|PATH|USB_INTERFACE_NUM)'\n",[20,2063,2064],{},"常见输出：",[32,2066,2069],{"className":2067,"code":2068,"language":1621,"meta":37},[1619],"ID_VENDOR_ID=0483\nID_MODEL_ID=5740\nID_SERIAL=STMicroelectronics_STM32_Virtual_ComPort_123456\nID_SERIAL_SHORT=123456\nID_PATH=pci-0000:00:14.0-usb-0:3:1.0\nID_USB_INTERFACE_NUM=00\n",[27,2070,2068],{"__ignoreMap":37},[20,2072,2073],{},"常用属性说明：",[2075,2076,2077,2091],"table",{},[2078,2079,2080],"thead",{},[2081,2082,2083,2088],"tr",{},[2084,2085,2087],"th",{"align":2086},"left","属性",[2084,2089,2090],{"align":2086},"含义",[2092,2093,2094,2105,2115,2125,2135,2145],"tbody",{},[2081,2095,2096,2102],{},[2097,2098,2099],"td",{"align":2086},[27,2100,2101],{},"ID_VENDOR_ID",[2097,2103,2104],{"align":2086},"USB 厂商 ID",[2081,2106,2107,2112],{},[2097,2108,2109],{"align":2086},[27,2110,2111],{},"ID_MODEL_ID",[2097,2113,2114],{"align":2086},"USB 产品 ID",[2081,2116,2117,2122],{},[2097,2118,2119],{"align":2086},[27,2120,2121],{},"ID_SERIAL",[2097,2123,2124],{"align":2086},"完整设备序列信息",[2081,2126,2127,2132],{},[2097,2128,2129],{"align":2086},[27,2130,2131],{},"ID_SERIAL_SHORT",[2097,2133,2134],{"align":2086},"USB 设备序列号",[2081,2136,2137,2142],{},[2097,2138,2139],{"align":2086},[27,2140,2141],{},"ID_PATH",[2097,2143,2144],{"align":2086},"设备连接到主机的物理路径",[2081,2146,2147,2152],{},[2097,2148,2149],{"align":2086},[27,2150,2151],{},"ID_USB_INTERFACE_NUM",[2097,2153,2154],{"align":2086},"USB Interface 编号",[1542,2156],{},[1016,2158,2160],{"id":2159},"查看-udev-可匹配属性","查看 udev 可匹配属性",[20,2162,2163],{},"如果需要自己编写 udev 规则，可以使用：",[32,2165,2167],{"className":406,"code":2166,"language":408,"meta":37,"style":37},"udevadm info -a -p $(udevadm info -q path -n \u002Fdev\u002FttyACM0)\n",[27,2168,2169],{"__ignoreMap":37},[41,2170,2171,2173,2175,2178,2180,2183,2185,2187,2190,2193,2196,2199],{"class":43,"line":44},[41,2172,1996],{"class":415},[41,2174,1999],{"class":95},[41,2176,2177],{"class":64}," -a",[41,2179,1196],{"class":64},[41,2181,2182],{"class":51}," $(",[41,2184,1996],{"class":415},[41,2186,1999],{"class":95},[41,2188,2189],{"class":64}," -q",[41,2191,2192],{"class":95}," path",[41,2194,2195],{"class":64}," -n",[41,2197,2198],{"class":95}," \u002Fdev\u002FttyACM0",[41,2200,2201],{"class":51},")\n",[20,2203,2008],{},[32,2205,2207],{"className":406,"code":2206,"language":408,"meta":37,"style":37},"udevadm info -a -p $(udevadm info -q path -n \u002Fdev\u002FttyUSB0)\n",[27,2208,2209],{"__ignoreMap":37},[41,2210,2211,2213,2215,2217,2219,2221,2223,2225,2227,2229,2231,2234],{"class":43,"line":44},[41,2212,1996],{"class":415},[41,2214,1999],{"class":95},[41,2216,2177],{"class":64},[41,2218,1196],{"class":64},[41,2220,2182],{"class":51},[41,2222,1996],{"class":415},[41,2224,1999],{"class":95},[41,2226,2189],{"class":64},[41,2228,2192],{"class":95},[41,2230,2195],{"class":64},[41,2232,2233],{"class":95}," \u002Fdev\u002FttyUSB0",[41,2235,2201],{"class":51},[20,2237,2238],{},"也可以使用：",[32,2240,2242],{"className":406,"code":2241,"language":408,"meta":37,"style":37},"udevadm info --attribute-walk --name=\u002Fdev\u002FttyUSB0\n",[27,2243,2244],{"__ignoreMap":37},[41,2245,2246,2248,2250,2253],{"class":43,"line":44},[41,2247,1996],{"class":415},[41,2249,1999],{"class":95},[41,2251,2252],{"class":64}," --attribute-walk",[41,2254,2024],{"class":64},[20,2256,2257,2258,2261],{},"例如只查看 ",[27,2259,2260],{},"KERNELS","：",[32,2263,2265],{"className":406,"code":2264,"language":408,"meta":37,"style":37},"udevadm info --attribute-walk --name=\u002Fdev\u002FttyUSB0 | grep KERNELS\n",[27,2266,2267],{"__ignoreMap":37},[41,2268,2269,2271,2273,2275,2278,2281,2283],{"class":43,"line":44},[41,2270,1996],{"class":415},[41,2272,1999],{"class":95},[41,2274,2252],{"class":64},[41,2276,2277],{"class":64}," --name=\u002Fdev\u002FttyUSB0",[41,2279,2280],{"class":2051}," |",[41,2282,2055],{"class":415},[41,2284,2285],{"class":95}," KERNELS\n",[20,2287,2288],{},"这些信息可以用于编写自定义 udev rules。",[1542,2290],{},[16,2292,2294],{"id":2293},"根据-usb-设备型号绑定端口","根据 USB 设备型号绑定端口",[1016,2296,2297],{"id":2297},"需求",[20,2299,2300],{},"Ubuntu 系统中连接一台雷达和一台智能小车，两台设备型号不同，希望给它们建立固定别名。",[20,2302,1669],{},[32,2304,2307],{"className":2305,"code":2306,"language":1621,"meta":37},[1619],"雷达 -> \u002Fdev\u002Fmylidar\n小车 -> \u002Fdev\u002Fmycar\n",[27,2308,2306],{"__ignoreMap":37},[1542,2310],{},[1016,2312,2314,2315,1958,2317],{"id":2313},"查找-idvendor-和-idproduct","查找 ",[27,2316,1519],{},[27,2318,1523],{},[20,2320,2321],{},"调用：",[32,2323,2324],{"className":406,"code":1901,"language":408,"meta":37,"style":37},[27,2325,2326],{"__ignoreMap":37},[41,2327,2328],{"class":43,"line":44},[41,2329,1901],{"class":415},[20,2331,2332],{},"假设得到：",[32,2334,2337],{"className":2335,"code":2336,"language":1621,"meta":37},[1619],"雷达：10c4:ea60\n小车：1a86:7523\n",[27,2338,2336],{"__ignoreMap":37},[20,2340,1678],{},[32,2342,2345],{"className":2343,"code":2344,"language":1621,"meta":37},[1619],"10c4 -> idVendor\nea60 -> idProduct\n\n1a86 -> idVendor\n7523 -> idProduct\n",[27,2346,2344],{"__ignoreMap":37},[1542,2348],{},[1016,2350,2352],{"id":2351},"编写-udev-规则","编写 udev 规则",[20,2354,2355],{},"在：",[32,2357,2359],{"className":406,"code":2358,"language":408,"meta":37,"style":37},"\u002Fetc\u002Fudev\u002Frules.d\u002F\n",[27,2360,2361],{"__ignoreMap":37},[41,2362,2363],{"class":43,"line":44},[41,2364,2358],{"class":415},[20,2366,2367],{},"目录下创建规则文件，例如：",[32,2369,2371],{"className":406,"code":2370,"language":408,"meta":37,"style":37},"sudo vim \u002Fetc\u002Fudev\u002Frules.d\u002F99-usb-serial.rules\n",[27,2372,2373],{"__ignoreMap":37},[41,2374,2375,2377,2380],{"class":43,"line":44},[41,2376,466],{"class":415},[41,2378,2379],{"class":95}," vim",[41,2381,2382],{"class":95}," \u002Fetc\u002Fudev\u002Frules.d\u002F99-usb-serial.rules\n",[20,2384,2385],{},"输入：",[32,2387,2391],{"className":2388,"code":2389,"language":2390,"meta":37,"style":37},"language-udev shiki shiki-themes github-light github-dark","KERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"10c4\", ATTRS{idProduct}==\"ea60\", MODE:=\"0777\", SYMLINK+=\"mylidar\"\n\nKERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"7523\", MODE:=\"0777\", SYMLINK+=\"mycar\"\n","udev",[27,2392,2393,2398,2402],{"__ignoreMap":37},[41,2394,2395],{"class":43,"line":44},[41,2396,2397],{},"KERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"10c4\", ATTRS{idProduct}==\"ea60\", MODE:=\"0777\", SYMLINK+=\"mylidar\"\n",[41,2399,2400],{"class":43,"line":55},[41,2401,1585],{"emptyLinePlaceholder":1584},[41,2403,2404],{"class":43,"line":71},[41,2405,2406],{},"KERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"7523\", MODE:=\"0777\", SYMLINK+=\"mycar\"\n",[20,2408,1678],{},[1680,2410,2411,2417,2423,2429,2435],{},[614,2412,2413,2416],{},[27,2414,2415],{},"KERNEL","：匹配 Linux 内核分配的设备名称；",[614,2418,2419,2422],{},[27,2420,2421],{},"ATTRS{idVendor}","：USB 厂商 ID；",[614,2424,2425,2428],{},[27,2426,2427],{},"ATTRS{idProduct}","：USB 产品 ID；",[614,2430,2431,2434],{},[27,2432,2433],{},"MODE:=\"0777\"","：设置设备节点权限；",[614,2436,2437,2440],{},[27,2438,2439],{},"SYMLINK+=\"xxx\"","：为设备建立固定符号链接。",[20,2442,1669],{},[32,2444,2447],{"className":2445,"code":2446,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fmylidar -> \u002Fdev\u002FttyUSB0\n\u002Fdev\u002Fmycar   -> \u002Fdev\u002FttyUSB1\n",[27,2448,2446],{"__ignoreMap":37},[1542,2450],{},[1016,2452,2453],{"id":2453},"使规则生效",[20,2455,2456],{},"Ubuntu 和 Fedora 都可以统一使用：",[32,2458,2460],{"className":406,"code":2459,"language":408,"meta":37,"style":37},"sudo udevadm control --reload-rules\nsudo udevadm trigger\n",[27,2461,2462,2475],{"__ignoreMap":37},[41,2463,2464,2466,2469,2472],{"class":43,"line":44},[41,2465,466],{"class":415},[41,2467,2468],{"class":95}," udevadm",[41,2470,2471],{"class":95}," control",[41,2473,2474],{"class":64}," --reload-rules\n",[41,2476,2477,2479,2481],{"class":43,"line":55},[41,2478,466],{"class":415},[41,2480,2468],{"class":95},[41,2482,2483],{"class":95}," trigger\n",[20,2485,2486],{},"然后重新插拔 USB 设备。",[20,2488,2489,2490,2493],{},"也可以只触发 ",[27,2491,2492],{},"tty"," 子系统：",[32,2495,2497],{"className":406,"code":2496,"language":408,"meta":37,"style":37},"sudo udevadm control --reload-rules\nsudo udevadm trigger --subsystem-match=tty\n",[27,2498,2499,2509],{"__ignoreMap":37},[41,2500,2501,2503,2505,2507],{"class":43,"line":44},[41,2502,466],{"class":415},[41,2504,2468],{"class":95},[41,2506,2471],{"class":95},[41,2508,2474],{"class":64},[41,2510,2511,2513,2515,2518],{"class":43,"line":55},[41,2512,466],{"class":415},[41,2514,2468],{"class":95},[41,2516,2517],{"class":95}," trigger",[41,2519,2520],{"class":64}," --subsystem-match=tty\n",[1542,2522],{},[1016,2524,2525],{"id":2525},"测试",[32,2527,2529],{"className":406,"code":2528,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Fmylidar\nls -l \u002Fdev\u002Fmycar\n",[27,2530,2531,2540],{"__ignoreMap":37},[41,2532,2533,2535,2537],{"class":43,"line":44},[41,2534,1651],{"class":415},[41,2536,1654],{"class":64},[41,2538,2539],{"class":95}," \u002Fdev\u002Fmylidar\n",[41,2541,2542,2544,2546],{"class":43,"line":55},[41,2543,1651],{"class":415},[41,2545,1654],{"class":64},[41,2547,2548],{"class":95}," \u002Fdev\u002Fmycar\n",[20,2550,2008],{},[32,2552,2554],{"className":406,"code":2553,"language":408,"meta":37,"style":37},"readlink -f \u002Fdev\u002Fmylidar\nreadlink -f \u002Fdev\u002Fmycar\n",[27,2555,2556,2566],{"__ignoreMap":37},[41,2557,2558,2561,2564],{"class":43,"line":44},[41,2559,2560],{"class":415},"readlink",[41,2562,2563],{"class":64}," -f",[41,2565,2539],{"class":95},[41,2567,2568,2570,2572],{"class":43,"line":55},[41,2569,2560],{"class":415},[41,2571,2563],{"class":64},[41,2573,2548],{"class":95},[20,2575,2576],{},"可能得到：",[32,2578,2581],{"className":2579,"code":2580,"language":1621,"meta":37},[1619],"\u002Fdev\u002FttyUSB0\n\u002Fdev\u002FttyUSB1\n",[27,2582,2580],{"__ignoreMap":37},[1542,2584],{},[1016,2586,2587],{"id":2587},"缺点",[20,2589,2590],{},"这种方式只适合：",[1852,2592,2593],{},[20,2594,2595],{},"不同 USB 型号的设备。",[20,2597,2598],{},"如果接入两台完全相同型号的设备：",[32,2600,2602],{"className":2601,"code":1950,"language":1621,"meta":37},[1619],[27,2603,1950],{"__ignoreMap":37},[20,2605,2606],{},"那么两个设备都会匹配同一条 udev rule。",[20,2608,1964],{},[32,2610,2612],{"className":2388,"code":2611,"language":2390,"meta":37,"style":37},"KERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"7523\", SYMLINK+=\"mycar\"\n",[27,2613,2614],{"__ignoreMap":37},[41,2615,2616],{"class":43,"line":44},[41,2617,2611],{},[20,2619,2620],{},"不能可靠地区分两个完全相同的 USB 设备。",[20,2622,2623],{},"此时需要继续使用：",[1680,2625,2626,2629,2633,2637],{},[614,2627,2628],{},"USB Serial Number；",[614,2630,2631,1508],{},[27,2632,1507],{},[614,2634,2635,1508],{},[27,2636,1513],{},[614,2638,2639],{},"主机 USB 物理接口。",[1542,2641],{},[16,2643,2645],{"id":2644},"根据设备-serial-number-绑定端口","根据设备 Serial Number 绑定端口",[20,2647,2648],{},"如果多台设备型号相同，但是每台设备具有不同的 USB 序列号，那么这是最推荐的自定义 udev 绑定方式。",[20,2650,1669],{},[32,2652,2655],{"className":2653,"code":2654,"language":1621,"meta":37},[1619],"设备 A：\nidVendor  = 1a86\nidProduct = 55d4\nserial    = 0001\n\n设备 B：\nidVendor  = 1a86\nidProduct = 55d4\nserial    = 0002\n",[27,2656,2654],{"__ignoreMap":37},[20,2658,2659],{},"可以编写：",[32,2661,2663],{"className":2388,"code":2662,"language":2390,"meta":37,"style":37},"KERNEL==\"ttyACM*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"55d4\", ATTRS{serial}==\"0001\", MODE:=\"0777\", SYMLINK+=\"ttyACM_Lidar\"\n\nKERNEL==\"ttyACM*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"55d4\", ATTRS{serial}==\"0002\", MODE:=\"0777\", SYMLINK+=\"ttyACM_MCU\"\n",[27,2664,2665,2670,2674],{"__ignoreMap":37},[41,2666,2667],{"class":43,"line":44},[41,2668,2669],{},"KERNEL==\"ttyACM*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"55d4\", ATTRS{serial}==\"0001\", MODE:=\"0777\", SYMLINK+=\"ttyACM_Lidar\"\n",[41,2671,2672],{"class":43,"line":55},[41,2673,1585],{"emptyLinePlaceholder":1584},[41,2675,2676],{"class":43,"line":71},[41,2677,2678],{},"KERNEL==\"ttyACM*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"55d4\", ATTRS{serial}==\"0002\", MODE:=\"0777\", SYMLINK+=\"ttyACM_MCU\"\n",[20,2680,2681],{},"这样：",[32,2683,2686],{"className":2684,"code":2685,"language":1621,"meta":37},[1619],"\u002Fdev\u002FttyACM_Lidar\n\u002Fdev\u002FttyACM_MCU\n",[27,2687,2685],{"__ignoreMap":37},[20,2689,2690],{},"就可以稳定对应两台设备。",[20,2692,2693],{},"即使：",[32,2695,2698],{"className":2696,"code":2697,"language":1621,"meta":37},[1619],"\u002Fdev\u002FttyACM0\n\u002Fdev\u002FttyACM1\n",[27,2699,2697],{"__ignoreMap":37},[20,2701,2702],{},"的编号发生交换，两个固定别名依然可以指向正确设备。",[1542,2704],{},[1016,2706,2707],{"id":2707},"推荐检查方法",[32,2709,2711],{"className":406,"code":2710,"language":408,"meta":37,"style":37},"udevadm info --query=property --name=\u002Fdev\u002FttyACM0 | grep SERIAL\n",[27,2712,2713],{"__ignoreMap":37},[41,2714,2715,2717,2719,2721,2723,2725,2727],{"class":43,"line":44},[41,2716,1996],{"class":415},[41,2718,1999],{"class":95},[41,2720,2002],{"class":64},[41,2722,2043],{"class":64},[41,2724,2280],{"class":2051},[41,2726,2055],{"class":415},[41,2728,2729],{"class":95}," SERIAL\n",[20,2731,1669],{},[32,2733,2736],{"className":2734,"code":2735,"language":1621,"meta":37},[1619],"ID_SERIAL=STMicroelectronics_STM32_Virtual_ComPort_123456\nID_SERIAL_SHORT=123456\n",[27,2737,2735],{"__ignoreMap":37},[20,2739,2740,2741,2743],{},"如果 ",[27,2742,2131],{}," 是唯一的，就非常适合作为设备标识。",[1542,2745],{},[16,2747,2749],{"id":2748},"根据主机-usb-物理接口绑定端口","根据主机 USB 物理接口绑定端口",[1016,2751,2297],{"id":2752},"需求-1",[20,2754,2755],{},"无人车上安装前后两台完全相同型号的雷达。",[20,2757,2758],{},"两台雷达：",[1680,2760,2761,2766,2770],{},[614,2762,2763,2765],{},[27,2764,1519],{}," 相同；",[614,2767,2768,2765],{},[27,2769,1523],{},[614,2771,2772],{},"没有唯一 Serial Number。",[20,2774,2775],{},"此时可以根据主机 USB 接口的位置区分。",[1542,2777],{},[1016,2779,2781,2782],{"id":2780},"方法一直接使用-devserialby-path","方法一：直接使用 ",[27,2783,1513],{},[20,2785,2786],{},"首先执行：",[32,2788,2789],{"className":406,"code":1829,"language":408,"meta":37,"style":37},[27,2790,2791],{"__ignoreMap":37},[41,2792,2793,2795,2797],{"class":43,"line":44},[41,2794,1651],{"class":415},[41,2796,1654],{"class":64},[41,2798,1666],{"class":95},[20,2800,1669],{},[32,2802,2804],{"className":2803,"code":1845,"language":1621,"meta":37},[1619],[27,2805,1845],{"__ignoreMap":37},[20,2807,2808],{},"可以规定：",[32,2810,2813],{"className":2811,"code":2812,"language":1621,"meta":37},[1619],"USB 口 0:3 -> 前雷达\nUSB 口 0:4 -> 后雷达\n",[27,2814,2812],{"__ignoreMap":37},[20,2816,2817],{},"程序直接使用：",[32,2819,2822],{"className":2820,"code":2821,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fserial\u002Fby-path\u002Fpci-0000:00:14.0-usb-0:3:1.0-port0\n\u002Fdev\u002Fserial\u002Fby-path\u002Fpci-0000:00:14.0-usb-0:4:1.0-port0\n",[27,2823,2821],{"__ignoreMap":37},[20,2825,2826],{},"即可。",[1542,2828],{},[1016,2830,2832,2833,2835],{"id":2831},"方法二根据-kernels-创建自定义别名","方法二：根据 ",[27,2834,2260],{}," 创建自定义别名",[20,2837,2838],{},"查看第一台设备：",[32,2840,2841],{"className":406,"code":2264,"language":408,"meta":37,"style":37},[27,2842,2843],{"__ignoreMap":37},[41,2844,2845,2847,2849,2851,2853,2855,2857],{"class":43,"line":44},[41,2846,1996],{"class":415},[41,2848,1999],{"class":95},[41,2850,2252],{"class":64},[41,2852,2277],{"class":64},[41,2854,2280],{"class":2051},[41,2856,2055],{"class":415},[41,2858,2285],{"class":95},[20,2860,2861],{},"查看第二台设备：",[32,2863,2865],{"className":406,"code":2864,"language":408,"meta":37,"style":37},"udevadm info --attribute-walk --name=\u002Fdev\u002FttyUSB1 | grep KERNELS\n",[27,2866,2867],{"__ignoreMap":37},[41,2868,2869,2871,2873,2875,2878,2880,2882],{"class":43,"line":44},[41,2870,1996],{"class":415},[41,2872,1999],{"class":95},[41,2874,2252],{"class":64},[41,2876,2877],{"class":64}," --name=\u002Fdev\u002FttyUSB1",[41,2879,2280],{"class":2051},[41,2881,2055],{"class":415},[41,2883,2285],{"class":95},[20,2885,2886],{},"假设对应：",[32,2888,2891],{"className":2889,"code":2890,"language":1621,"meta":37},[1619],"第一台：\nKERNELS==\"1-1.3:1.0\"\n\n第二台：\nKERNELS==\"1-1.4:1.0\"\n",[27,2892,2890],{"__ignoreMap":37},[20,2894,2895],{},"则可以创建：",[32,2897,2899],{"className":406,"code":2898,"language":408,"meta":37,"style":37},"sudo vim \u002Fetc\u002Fudev\u002Frules.d\u002F99-lidar.rules\n",[27,2900,2901],{"__ignoreMap":37},[41,2902,2903,2905,2907],{"class":43,"line":44},[41,2904,466],{"class":415},[41,2906,2379],{"class":95},[41,2908,2909],{"class":95}," \u002Fetc\u002Fudev\u002Frules.d\u002F99-lidar.rules\n",[20,2911,2912],{},"写入：",[32,2914,2916],{"className":2388,"code":2915,"language":2390,"meta":37,"style":37},"KERNEL==\"ttyUSB*\", KERNELS==\"1-1.3:1.0\", MODE:=\"0777\", SYMLINK+=\"rplidar_front\"\n\nKERNEL==\"ttyUSB*\", KERNELS==\"1-1.4:1.0\", MODE:=\"0777\", SYMLINK+=\"rplidar_back\"\n",[27,2917,2918,2923,2927],{"__ignoreMap":37},[41,2919,2920],{"class":43,"line":44},[41,2921,2922],{},"KERNEL==\"ttyUSB*\", KERNELS==\"1-1.3:1.0\", MODE:=\"0777\", SYMLINK+=\"rplidar_front\"\n",[41,2924,2925],{"class":43,"line":55},[41,2926,1585],{"emptyLinePlaceholder":1584},[41,2928,2929],{"class":43,"line":71},[41,2930,2931],{},"KERNEL==\"ttyUSB*\", KERNELS==\"1-1.4:1.0\", MODE:=\"0777\", SYMLINK+=\"rplidar_back\"\n",[20,2933,2934],{},"重新加载：",[32,2936,2937],{"className":406,"code":2459,"language":408,"meta":37,"style":37},[27,2938,2939,2949],{"__ignoreMap":37},[41,2940,2941,2943,2945,2947],{"class":43,"line":44},[41,2942,466],{"class":415},[41,2944,2468],{"class":95},[41,2946,2471],{"class":95},[41,2948,2474],{"class":64},[41,2950,2951,2953,2955],{"class":43,"line":55},[41,2952,466],{"class":415},[41,2954,2468],{"class":95},[41,2956,2483],{"class":95},[20,2958,2959],{},"重新插拔之后：",[32,2961,2963],{"className":406,"code":2962,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Frplidar_front\nls -l \u002Fdev\u002Frplidar_back\n",[27,2964,2965,2974],{"__ignoreMap":37},[41,2966,2967,2969,2971],{"class":43,"line":44},[41,2968,1651],{"class":415},[41,2970,1654],{"class":64},[41,2972,2973],{"class":95}," \u002Fdev\u002Frplidar_front\n",[41,2975,2976,2978,2980],{"class":43,"line":55},[41,2977,1651],{"class":415},[41,2979,1654],{"class":64},[41,2981,2982],{"class":95}," \u002Fdev\u002Frplidar_back\n",[1542,2984],{},[1016,2986,2587],{"id":2987},"缺点-1",[20,2989,2990],{},"这种方式绑定的是：",[1852,2992,2993],{},[20,2994,2995],{},"主机 USB 接口",[20,2997,2998],{},"而不是：",[1852,3000,3001],{},[20,3002,3003],{},"USB 设备本身",[20,3005,3006],{},"因此设备必须插在固定 USB 接口。",[20,3008,3009],{},"如果前后两台雷达交换接口：",[32,3011,3014],{"className":3012,"code":3013,"language":1621,"meta":37},[1619],"前雷达插到后雷达 USB 口\n",[27,3015,3013],{"__ignoreMap":37},[20,3017,3018],{},"那么系统仍然会将该接口识别为：",[32,3020,3023],{"className":3021,"code":3022,"language":1621,"meta":37},[1619],"\u002Fdev\u002Frplidar_back\n",[27,3024,3022],{"__ignoreMap":37},[1542,3026],{},[16,3028,3030,3031,3033],{"id":3029},"根据-id_path-绑定端口","根据 ",[27,3032,2141],{}," 绑定端口",[20,3035,3036,3037,3039,3040,3042],{},"与使用 ",[27,3038,2260],{}," 类似，也可以根据 ",[27,3041,2141],{}," 建立规则。",[20,3044,1826],{},[32,3046,3048],{"className":406,"code":3047,"language":408,"meta":37,"style":37},"udevadm info --query=property --name=\u002Fdev\u002FttyUSB0 | grep ID_PATH\n",[27,3049,3050],{"__ignoreMap":37},[41,3051,3052,3054,3056,3058,3060,3062,3064],{"class":43,"line":44},[41,3053,1996],{"class":415},[41,3055,1999],{"class":95},[41,3057,2002],{"class":64},[41,3059,2277],{"class":64},[41,3061,2280],{"class":2051},[41,3063,2055],{"class":415},[41,3065,3066],{"class":95}," ID_PATH\n",[20,3068,1669],{},[32,3070,3073],{"className":3071,"code":3072,"language":1621,"meta":37},[1619],"ID_PATH=pci-0000:00:14.0-usb-0:3:1.0\n",[27,3074,3072],{"__ignoreMap":37},[20,3076,3077],{},"可以写：",[32,3079,3081],{"className":2388,"code":3080,"language":2390,"meta":37,"style":37},"SUBSYSTEM==\"tty\", ENV{ID_PATH}==\"pci-0000:00:14.0-usb-0:3:1.0\", MODE:=\"0777\", SYMLINK+=\"rplidar_front\"\n",[27,3082,3083],{"__ignoreMap":37},[41,3084,3085],{"class":43,"line":44},[41,3086,3080],{},[20,3088,3089],{},"另一个接口：",[32,3091,3093],{"className":2388,"code":3092,"language":2390,"meta":37,"style":37},"SUBSYSTEM==\"tty\", ENV{ID_PATH}==\"pci-0000:00:14.0-usb-0:4:1.0\", MODE:=\"0777\", SYMLINK+=\"rplidar_back\"\n",[27,3094,3095],{"__ignoreMap":37},[41,3096,3097],{"class":43,"line":44},[41,3098,3092],{},[20,3100,3101,3102,3104],{},"相比直接写 ",[27,3103,2260],{},"，这种写法通常更加直观。",[1542,3106],{},[16,3108,3109],{"id":3109},"综合多个属性绑定端口",[20,3111,3112],{},"实际工程中，可以同时匹配多个属性。",[20,3114,1669],{},[32,3116,3118],{"className":2388,"code":3117,"language":2390,"meta":37,"style":37},"KERNEL==\"ttyACM*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"55d4\", ATTRS{serial}==\"0001\", MODE:=\"0777\", SYMLINK+=\"ttyACM_Lidar\"\n\nKERNEL==\"ttyACM*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"55d4\", ATTRS{serial}==\"0002\", MODE:=\"0777\", SYMLINK+=\"ttyACM_MCU\"\n\nKERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"7523\", MODE:=\"0777\", SYMLINK+=\"ttyUSB_IMU\"\n",[27,3119,3120,3124,3128,3132,3136],{"__ignoreMap":37},[41,3121,3122],{"class":43,"line":44},[41,3123,2669],{},[41,3125,3126],{"class":43,"line":55},[41,3127,1585],{"emptyLinePlaceholder":1584},[41,3129,3130],{"class":43,"line":71},[41,3131,2678],{},[41,3133,3134],{"class":43,"line":79},[41,3135,1585],{"emptyLinePlaceholder":1584},[41,3137,3138],{"class":43,"line":87},[41,3139,3140],{},"KERNEL==\"ttyUSB*\", ATTRS{idVendor}==\"1a86\", ATTRS{idProduct}==\"7523\", MODE:=\"0777\", SYMLINK+=\"ttyUSB_IMU\"\n",[20,3142,2238],{},[32,3144,3146],{"className":2388,"code":3145,"language":2390,"meta":37,"style":37},"SUBSYSTEM==\"tty\", ENV{ID_VENDOR_ID}==\"0483\", ENV{ID_MODEL_ID}==\"5740\", ENV{ID_SERIAL_SHORT}==\"12345678\", MODE:=\"0777\", SYMLINK+=\"ysu_mcu\"\n",[27,3147,3148],{"__ignoreMap":37},[41,3149,3150],{"class":43,"line":44},[41,3151,3145],{},[20,3153,3154],{},"最终得到：",[32,3156,3159],{"className":3157,"code":3158,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fysu_mcu\n",[27,3160,3158],{"__ignoreMap":37},[20,3162,3163],{},"这种方式非常适合机器人项目。",[1542,3165],{},[16,3167,3168],{"id":3168},"推荐使用统一业务设备名称",[20,3170,3171],{},"对于机器人项目，不建议 ROS 2 节点直接使用：",[32,3173,3176],{"className":3174,"code":3175,"language":1621,"meta":37},[1619],"\u002Fdev\u002FttyUSB0\n\u002Fdev\u002FttyACM0\n",[27,3177,3175],{"__ignoreMap":37},[20,3179,3180],{},"可以统一建立业务名称，例如：",[32,3182,3185],{"className":3183,"code":3184,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fysu_mcu\n\u002Fdev\u002Fysu_gimbal\n\u002Fdev\u002Fysu_imu\n\u002Fdev\u002Fysu_lidar_front\n\u002Fdev\u002Fysu_lidar_back\n",[27,3186,3184],{"__ignoreMap":37},[20,3188,1669],{},[32,3190,3192],{"className":2388,"code":3191,"language":2390,"meta":37,"style":37},"SUBSYSTEM==\"tty\", ENV{ID_VENDOR_ID}==\"0483\", ENV{ID_MODEL_ID}==\"5740\", ENV{ID_SERIAL_SHORT}==\"12345678\", MODE:=\"0777\", SYMLINK+=\"ysu_mcu\"\n\nSUBSYSTEM==\"tty\", ENV{ID_VENDOR_ID}==\"10c4\", ENV{ID_MODEL_ID}==\"ea60\", ENV{ID_SERIAL_SHORT}==\"ABCDEF\", MODE:=\"0777\", SYMLINK+=\"ysu_imu\"\n\nSUBSYSTEM==\"tty\", ENV{ID_PATH}==\"pci-0000:00:14.0-usb-0:3:1.0\", MODE:=\"0777\", SYMLINK+=\"ysu_lidar_front\"\n",[27,3193,3194,3198,3202,3207,3211],{"__ignoreMap":37},[41,3195,3196],{"class":43,"line":44},[41,3197,3145],{},[41,3199,3200],{"class":43,"line":55},[41,3201,1585],{"emptyLinePlaceholder":1584},[41,3203,3204],{"class":43,"line":71},[41,3205,3206],{},"SUBSYSTEM==\"tty\", ENV{ID_VENDOR_ID}==\"10c4\", ENV{ID_MODEL_ID}==\"ea60\", ENV{ID_SERIAL_SHORT}==\"ABCDEF\", MODE:=\"0777\", SYMLINK+=\"ysu_imu\"\n",[41,3208,3209],{"class":43,"line":79},[41,3210,1585],{"emptyLinePlaceholder":1584},[41,3212,3213],{"class":43,"line":87},[41,3214,3215],{},"SUBSYSTEM==\"tty\", ENV{ID_PATH}==\"pci-0000:00:14.0-usb-0:3:1.0\", MODE:=\"0777\", SYMLINK+=\"ysu_lidar_front\"\n",[20,3217,3218],{},"然后 ROS 2 参数写：",[32,3220,3222],{"className":1762,"code":3221,"language":1764,"meta":37,"style":37},"serial_port: \u002Fdev\u002Fysu_mcu\nimu_port: \u002Fdev\u002Fysu_imu\nlidar_port: \u002Fdev\u002Fysu_lidar_front\n",[27,3223,3224,3233,3243],{"__ignoreMap":37},[41,3225,3226,3229,3231],{"class":43,"line":44},[41,3227,3228],{"class":47},"serial_port",[41,3230,61],{"class":51},[41,3232,3158],{"class":95},[41,3234,3235,3238,3240],{"class":43,"line":55},[41,3236,3237],{"class":47},"imu_port",[41,3239,61],{"class":51},[41,3241,3242],{"class":95},"\u002Fdev\u002Fysu_imu\n",[41,3244,3245,3248,3250],{"class":43,"line":71},[41,3246,3247],{"class":47},"lidar_port",[41,3249,61],{"class":51},[41,3251,3252],{"class":95},"\u002Fdev\u002Fysu_lidar_front\n",[20,3254,3255],{},"这样后续更换设备节点编号时，ROS 2 配置文件完全不需要修改。",[1542,3257],{},[16,3259,3261,3264,3265,3268],{"id":3260},"ttyusb-与-ttyacm-的区别",[27,3262,3263],{},"ttyUSB"," 与 ",[27,3266,3267],{},"ttyACM"," 的区别",[20,3270,3271],{},"并非所有 USB 串口设备都使用：",[32,3273,3276],{"className":3274,"code":3275,"language":1621,"meta":37},[1619],"\u002Fdev\u002FttyUSBn\n",[27,3277,3275],{"__ignoreMap":37},[20,3279,3280],{},"常见类型如下：",[2075,3282,3283,3296],{},[2078,3284,3285],{},[2081,3286,3287,3290,3293],{},[2084,3288,3289],{"align":2086},"设备类型",[2084,3291,3292],{"align":2086},"内核名称示例",[2084,3294,3295],{"align":2086},"说明",[2092,3297,3298,3311,3324,3337,3350,3363,3376],{},[2081,3299,3300,3303,3308],{},[2097,3301,3302],{"align":2086},"USB 转串口芯片",[2097,3304,3305],{"align":2086},[27,3306,3307],{},"ttyUSB*",[2097,3309,3310],{"align":2086},"CH340、CP210x、FTDI 等",[2081,3312,3313,3316,3321],{},[2097,3314,3315],{"align":2086},"USB CDC ACM",[2097,3317,3318],{"align":2086},[27,3319,3320],{},"ttyACM*",[2097,3322,3323],{"align":2086},"STM32 CDC、Arduino 等",[2081,3325,3326,3329,3334],{},[2097,3327,3328],{"align":2086},"主机物理串口",[2097,3330,3331],{"align":2086},[27,3332,3333],{},"ttyS*",[2097,3335,3336],{"align":2086},"PC 板载 UART",[2081,3338,3339,3342,3347],{},[2097,3340,3341],{"align":2086},"USB 摄像头",[2097,3343,3344],{"align":2086},[27,3345,3346],{},"video*",[2097,3348,3349],{"align":2086},"V4L2 摄像头",[2081,3351,3352,3355,3360],{},[2097,3353,3354],{"align":2086},"磁盘",[2097,3356,3357],{"align":2086},[27,3358,3359],{},"sd*",[2097,3361,3362],{"align":2086},"USB 硬盘、U 盘",[2081,3364,3365,3368,3373],{},[2097,3366,3367],{"align":2086},"输入设备",[2097,3369,3370],{"align":2086},[27,3371,3372],{},"event*",[2097,3374,3375],{"align":2086},"键盘、鼠标、手柄",[2081,3377,3378,3381,3386],{},[2097,3379,3380],{"align":2086},"蓝牙串口",[2097,3382,3383],{"align":2086},[27,3384,3385],{},"rfcomm*",[2097,3387,3388],{"align":2086},"Bluetooth RFCOMM",[20,3390,3391],{},"所以 udev 规则中的：",[32,3393,3395],{"className":2388,"code":3394,"language":2390,"meta":37,"style":37},"KERNEL==\"ttyUSB*\"\n",[27,3396,3397],{"__ignoreMap":37},[41,3398,3399],{"class":43,"line":44},[41,3400,3394],{},[20,3402,3403],{},"并不是固定写法。",[20,3405,3406],{},"如果 STM32 CDC 对应：",[32,3408,3410],{"className":3409,"code":1478,"language":1621,"meta":37},[1619],[27,3411,1478],{"__ignoreMap":37},[20,3413,3414],{},"则应该匹配：",[32,3416,3418],{"className":2388,"code":3417,"language":2390,"meta":37,"style":37},"KERNEL==\"ttyACM*\"\n",[27,3419,3420],{"__ignoreMap":37},[41,3421,3422],{"class":43,"line":44},[41,3423,3417],{},[20,3425,3426],{},"也可以统一使用：",[32,3428,3430],{"className":2388,"code":3429,"language":2390,"meta":37,"style":37},"SUBSYSTEM==\"tty\"\n",[27,3431,3432],{"__ignoreMap":37},[41,3433,3434],{"class":43,"line":44},[41,3435,3429],{},[20,3437,3438],{},"再配合其他属性进行筛选。",[1542,3440],{},[16,3442,3444],{"id":3443},"usb-摄像头固定设备路径","USB 摄像头固定设备路径",[20,3446,3447],{},"USB 摄像头通常对应：",[32,3449,3452],{"className":3450,"code":3451,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fvideo0\n\u002Fdev\u002Fvideo1\n\u002Fdev\u002Fvideo2\n...\n",[27,3453,3451],{"__ignoreMap":37},[20,3455,3456,3457,3460],{},"而且一台摄像头有时会生成多个 ",[27,3458,3459],{},"\u002Fdev\u002FvideoN"," 节点。",[20,3462,3463],{},"因此不建议简单假设：",[32,3465,3468],{"className":3466,"code":3467,"language":1621,"meta":37},[1619],"video0、video2、video4 一定是摄像头采集节点\n",[27,3469,3467],{"__ignoreMap":37},[20,3471,3472],{},"因为设备节点编号与接口顺序可能发生变化。",[1542,3474],{},[1016,3476,3477],{"id":3477},"查看系统生成的摄像头固定路径",[20,3479,3480],{},"执行：",[32,3482,3484],{"className":406,"code":3483,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Fv4l\u002Fby-id\u002F\nls -l \u002Fdev\u002Fv4l\u002Fby-path\u002F\n",[27,3485,3486,3495],{"__ignoreMap":37},[41,3487,3488,3490,3492],{"class":43,"line":44},[41,3489,1651],{"class":415},[41,3491,1654],{"class":64},[41,3493,3494],{"class":95}," \u002Fdev\u002Fv4l\u002Fby-id\u002F\n",[41,3496,3497,3499,3501],{"class":43,"line":55},[41,3498,1651],{"class":415},[41,3500,1654],{"class":64},[41,3502,3503],{"class":95}," \u002Fdev\u002Fv4l\u002Fby-path\u002F\n",[20,3505,1669],{},[32,3507,3510],{"className":3508,"code":3509,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fv4l\u002Fby-id\u002Fusb-USB_Camera-video-index0\n\u002Fdev\u002Fv4l\u002Fby-id\u002Fusb-USB_Camera-video-index1\n",[27,3511,3509],{"__ignoreMap":37},[20,3513,3514],{},"如果摄像头具有唯一身份信息，推荐使用：",[32,3516,3519],{"className":3517,"code":3518,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fv4l\u002Fby-id\u002F\n",[27,3520,3518],{"__ignoreMap":37},[20,3522,3523],{},"如果需要按照固定 USB 接口区分：",[32,3525,3528],{"className":3526,"code":3527,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fv4l\u002Fby-path\u002F\n",[27,3529,3527],{"__ignoreMap":37},[1542,3531],{},[1016,3533,3534],{"id":3534},"查看摄像头节点",[20,3536,3537],{},"可以安装：",[32,3539,3541],{"className":406,"code":3540,"language":408,"meta":37,"style":37},"sudo apt install v4l-utils\n",[27,3542,3543],{"__ignoreMap":37},[41,3544,3545,3547,3549,3551],{"class":43,"line":44},[41,3546,466],{"class":415},[41,3548,1062],{"class":95},[41,3550,1065],{"class":95},[41,3552,3553],{"class":95}," v4l-utils\n",[20,3555,3556],{},"然后：",[32,3558,3560],{"className":406,"code":3559,"language":408,"meta":37,"style":37},"v4l2-ctl --list-devices\n",[27,3561,3562],{"__ignoreMap":37},[41,3563,3564,3567],{"class":43,"line":44},[41,3565,3566],{"class":415},"v4l2-ctl",[41,3568,3569],{"class":64}," --list-devices\n",[20,3571,1669],{},[32,3573,3576],{"className":3574,"code":3575,"language":1621,"meta":37},[1619],"USB Camera:\n    \u002Fdev\u002Fvideo0\n    \u002Fdev\u002Fvideo1\n",[27,3577,3575],{"__ignoreMap":37},[20,3579,3580],{},"也可以进一步查看某个节点支持的格式：",[32,3582,3584],{"className":406,"code":3583,"language":408,"meta":37,"style":37},"v4l2-ctl -d \u002Fdev\u002Fvideo0 --all\n",[27,3585,3586],{"__ignoreMap":37},[41,3587,3588,3590,3593,3596],{"class":43,"line":44},[41,3589,3566],{"class":415},[41,3591,3592],{"class":64}," -d",[41,3594,3595],{"class":95}," \u002Fdev\u002Fvideo0",[41,3597,3598],{"class":64}," --all\n",[1542,3600],{},[16,3602,3603],{"id":3603},"磁盘设备的固定路径",[20,3605,3606],{},"对于 USB 硬盘、U 盘、SSD 等，不建议直接依赖：",[32,3608,3611],{"className":3609,"code":3610,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fsda\n\u002Fdev\u002Fsdb\n",[27,3612,3610],{"__ignoreMap":37},[20,3614,3615],{},"Linux 同样提供：",[32,3617,3619],{"className":406,"code":3618,"language":408,"meta":37,"style":37},"\u002Fdev\u002Fdisk\u002Fby-id\u002F\n\u002Fdev\u002Fdisk\u002Fby-path\u002F\n\u002Fdev\u002Fdisk\u002Fby-uuid\u002F\n\u002Fdev\u002Fdisk\u002Fby-label\u002F\n",[27,3620,3621,3626,3631,3636],{"__ignoreMap":37},[41,3622,3623],{"class":43,"line":44},[41,3624,3625],{"class":415},"\u002Fdev\u002Fdisk\u002Fby-id\u002F\n",[41,3627,3628],{"class":43,"line":55},[41,3629,3630],{"class":415},"\u002Fdev\u002Fdisk\u002Fby-path\u002F\n",[41,3632,3633],{"class":43,"line":71},[41,3634,3635],{"class":415},"\u002Fdev\u002Fdisk\u002Fby-uuid\u002F\n",[41,3637,3638],{"class":43,"line":79},[41,3639,3640],{"class":415},"\u002Fdev\u002Fdisk\u002Fby-label\u002F\n",[20,3642,1669],{},[32,3644,3646],{"className":406,"code":3645,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Fdisk\u002Fby-id\u002F\n",[27,3647,3648],{"__ignoreMap":37},[41,3649,3650,3652,3654],{"class":43,"line":44},[41,3651,1651],{"class":415},[41,3653,1654],{"class":64},[41,3655,3656],{"class":95}," \u002Fdev\u002Fdisk\u002Fby-id\u002F\n",[20,3658,3659],{},"因此，不同类型设备都遵循类似原则：",[32,3661,3664],{"className":3662,"code":3663,"language":1621,"meta":37},[1619],"动态设备节点\n        ↓\n系统生成固定路径\n        ↓\n必要时自己编写 udev rule\n",[27,3665,3663],{"__ignoreMap":37},[1542,3667],{},[16,3669,3671],{"id":3670},"使-udev-规则生效","使 udev 规则生效",[20,3673,3674],{},"修改：",[32,3676,3679],{"className":3677,"code":3678,"language":1621,"meta":37},[1619],"\u002Fetc\u002Fudev\u002Frules.d\u002F*.rules\n",[27,3680,3678],{"__ignoreMap":37},[20,3682,3683],{},"之后，Ubuntu 和 Fedora 均可以使用：",[32,3685,3686],{"className":406,"code":2459,"language":408,"meta":37,"style":37},[27,3687,3688,3698],{"__ignoreMap":37},[41,3689,3690,3692,3694,3696],{"class":43,"line":44},[41,3691,466],{"class":415},[41,3693,2468],{"class":95},[41,3695,2471],{"class":95},[41,3697,2474],{"class":64},[41,3699,3700,3702,3704],{"class":43,"line":55},[41,3701,466],{"class":415},[41,3703,2468],{"class":95},[41,3705,2483],{"class":95},[20,3707,3708],{},"然后重新插拔设备。",[20,3710,3711],{},"对于串口设备，也可以：",[32,3713,3715],{"className":406,"code":3714,"language":408,"meta":37,"style":37},"sudo udevadm trigger --subsystem-match=tty\n",[27,3716,3717],{"__ignoreMap":37},[41,3718,3719,3721,3723,3725],{"class":43,"line":44},[41,3720,466],{"class":415},[41,3722,2468],{"class":95},[41,3724,2517],{"class":95},[41,3726,2520],{"class":64},[20,3728,3729],{},"如果规则仍然没有生效，可以直接重启系统。",[1542,3731],{},[16,3733,3734],{"id":3734},"测试固定别名",[20,3736,3737],{},"查看符号链接：",[32,3739,3741],{"className":406,"code":3740,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002Fysu_mcu\n",[27,3742,3743],{"__ignoreMap":37},[41,3744,3745,3747,3749],{"class":43,"line":44},[41,3746,1651],{"class":415},[41,3748,1654],{"class":64},[41,3750,3751],{"class":95}," \u002Fdev\u002Fysu_mcu\n",[20,3753,3754],{},"查看最终实际设备：",[32,3756,3758],{"className":406,"code":3757,"language":408,"meta":37,"style":37},"readlink -f \u002Fdev\u002Fysu_mcu\n",[27,3759,3760],{"__ignoreMap":37},[41,3761,3762,3764,3766],{"class":43,"line":44},[41,3763,2560],{"class":415},[41,3765,2563],{"class":64},[41,3767,3751],{"class":95},[20,3769,1669],{},[32,3771,3773],{"className":3772,"code":1483,"language":1621,"meta":37},[1619],[27,3774,1483],{"__ignoreMap":37},[20,3776,3777],{},"即使之后重新插拔设备变成：",[32,3779,3782],{"className":3780,"code":3781,"language":1621,"meta":37},[1619],"\u002Fdev\u002FttyACM3\n",[27,3783,3781],{"__ignoreMap":37},[20,3785,3786],{},"如果 udev 规则匹配正确：",[32,3788,3790],{"className":3789,"code":3158,"language":1621,"meta":37},[1619],[27,3791,3158],{"__ignoreMap":37},[20,3793,3794],{},"仍然会指向正确设备。",[1542,3796],{},[16,3798,3800],{"id":3799},"排查-udev-规则","排查 udev 规则",[20,3802,3803],{},"如果规则没有生效，可以按照下面的方法检查。",[1542,3805],{},[1016,3807,3808],{"id":3808},"检查规则语法",[32,3810,3812],{"className":406,"code":3811,"language":408,"meta":37,"style":37},"sudo udevadm verify \u002Fetc\u002Fudev\u002Frules.d\u002F99-usb-serial.rules\n",[27,3813,3814],{"__ignoreMap":37},[41,3815,3816,3818,3820,3823],{"class":43,"line":44},[41,3817,466],{"class":415},[41,3819,2468],{"class":95},[41,3821,3822],{"class":95}," verify",[41,3824,2382],{"class":95},[20,3826,3827],{},"如果当前系统版本支持该命令，可以直接检查规则文件。",[1542,3829],{},[1016,3831,3832],{"id":3832},"查看设备属性",[32,3834,3835],{"className":406,"code":2011,"language":408,"meta":37,"style":37},[27,3836,3837],{"__ignoreMap":37},[41,3838,3839,3841,3843,3845],{"class":43,"line":44},[41,3840,1996],{"class":415},[41,3842,1999],{"class":95},[41,3844,2002],{"class":64},[41,3846,2024],{"class":64},[20,3848,2008],{},[32,3850,3851],{"className":406,"code":2241,"language":408,"meta":37,"style":37},[27,3852,3853],{"__ignoreMap":37},[41,3854,3855,3857,3859,3861],{"class":43,"line":44},[41,3856,1996],{"class":415},[41,3858,1999],{"class":95},[41,3860,2252],{"class":64},[41,3862,2024],{"class":64},[20,3864,3865],{},"重点检查：",[32,3867,3870],{"className":3868,"code":3869,"language":1621,"meta":37},[1619],"idVendor\nidProduct\nserial\nID_SERIAL\nID_SERIAL_SHORT\nID_PATH\nKERNELS\nSUBSYSTEM\n",[27,3871,3869],{"__ignoreMap":37},[1542,3873],{},[1016,3875,3876],{"id":3876},"监控设备插拔事件",[20,3878,3480],{},[32,3880,3882],{"className":406,"code":3881,"language":408,"meta":37,"style":37},"udevadm monitor --environment --udev\n",[27,3883,3884],{"__ignoreMap":37},[41,3885,3886,3888,3891,3894],{"class":43,"line":44},[41,3887,1996],{"class":415},[41,3889,3890],{"class":95}," monitor",[41,3892,3893],{"class":64}," --environment",[41,3895,3896],{"class":64}," --udev\n",[20,3898,2486],{},[20,3900,3901],{},"可以观察系统识别设备时生成的 udev 属性。",[1542,3903],{},[1016,3905,3906],{"id":3906},"查看设备实际权限",[32,3908,3910],{"className":406,"code":3909,"language":408,"meta":37,"style":37},"ls -l \u002Fdev\u002FttyUSB0\n",[27,3911,3912],{"__ignoreMap":37},[41,3913,3914,3916,3918],{"class":43,"line":44},[41,3915,1651],{"class":415},[41,3917,1654],{"class":64},[41,3919,3920],{"class":95}," \u002Fdev\u002FttyUSB0\n",[20,3922,1669],{},[32,3924,3927],{"className":3925,"code":3926,"language":1621,"meta":37},[1619],"crwxrwxrwx 1 root dialout ...\n",[27,3928,3926],{"__ignoreMap":37},[20,3930,3931],{},"如果规则中使用：",[32,3933,3935],{"className":2388,"code":3934,"language":2390,"meta":37,"style":37},"MODE:=\"0777\"\n",[27,3936,3937],{"__ignoreMap":37},[41,3938,3939],{"class":43,"line":44},[41,3940,3934],{},[20,3942,3943],{},"设备重新生成后会按照规则设置权限。",[1542,3945],{},[16,3947,3948],{"id":3948},"推荐选择顺序",[20,3950,3951],{},"USB 设备固定端口时，推荐按照下面的顺序选择。",[32,3953,3956],{"className":3954,"code":3955,"language":1621,"meta":37},[1619],"                USB设备\n                   │\n                   ▼\n       是否已有系统固定路径？\n         \u002Fdev\u002Fserial\u002Fby-id\n                   │\n             ┌─────┴─────┐\n             │           │\n            有           无\n             │           │\n             ▼           ▼\n          直接使用     是否存在唯一Serial？\n                         │\n                   ┌─────┴─────┐\n                   │           │\n                  有           无\n                   │           │\n                   ▼           ▼\n             按Serial绑定   是否固定USB接口？\n                               │\n                         ┌─────┴─────┐\n                         │           │\n                        是           否\n                         │           │\n                         ▼           ▼\n                    by-path\u002F      尽量从设备固件\n                    ID_PATH       层增加唯一Serial\n",[27,3957,3955],{"__ignoreMap":37},[20,3959,3960],{},"简单来说：",[1852,3962,3963],{},[20,3964,3965],{},[530,3966,3967],{},"能够识别设备本身，就按设备本身绑定；无法识别设备本身，就按设备连接的 USB 接口绑定。",[1542,3969],{},[16,3971,3972],{"id":3972},"最终推荐方案",[1016,3974,3976],{"id":3975},"情况一单个设备具有唯一-serial","情况一：单个设备，具有唯一 Serial",[20,3978,3979],{},"首选：",[32,3981,3983],{"className":406,"code":3982,"language":408,"meta":37,"style":37},"\u002Fdev\u002Fserial\u002Fby-id\u002F\n",[27,3984,3985],{"__ignoreMap":37},[41,3986,3987],{"class":43,"line":44},[41,3988,3982],{"class":415},[20,3990,3991],{},"或者自己建立：",[32,3993,3995],{"className":3994,"code":3158,"language":1621,"meta":37},[1619],[27,3996,3158],{"__ignoreMap":37},[1542,3998],{},[1016,4000,4002],{"id":4001},"情况二多个不同型号设备","情况二：多个不同型号设备",[20,4004,4005],{},"可以使用：",[32,4007,4010],{"className":4008,"code":4009,"language":1621,"meta":37},[1619],"idVendor + idProduct\n",[27,4011,4009],{"__ignoreMap":37},[20,4013,4014],{},"建立自定义 udev rule。",[1542,4016],{},[1016,4018,4020],{"id":4019},"情况三多个相同设备但-serial-不同","情况三：多个相同设备，但 Serial 不同",[20,4022,4023],{},"使用：",[32,4025,4028],{"className":4026,"code":4027,"language":1621,"meta":37},[1619],"idVendor + idProduct + serial\n",[27,4029,4027],{"__ignoreMap":37},[20,4031,4032],{},"这是非常稳定的方案。",[1542,4034],{},[1016,4036,4038],{"id":4037},"情况四多个完全相同设备没有唯一-serial","情况四：多个完全相同设备，没有唯一 Serial",[20,4040,4023],{},[32,4042,4044],{"className":4043,"code":1817,"language":1621,"meta":37},[1619],[27,4045,1817],{"__ignoreMap":37},[20,4047,2008],{},[32,4049,4052],{"className":4050,"code":4051,"language":1621,"meta":37},[1619],"KERNELS\nID_PATH\n",[27,4053,4051],{"__ignoreMap":37},[20,4055,4056],{},"根据主机 USB 物理接口区分。",[1542,4058],{},[1016,4060,4062],{"id":4061},"情况五stm32-自定义-usb-cdc","情况五：STM32 自定义 USB CDC",[20,4064,4065],{},"如果设备固件由自己控制，推荐在 USB Descriptor 中配置唯一 Serial Number。",[20,4067,4068],{},"这样 Linux 可以根据设备自身身份建立稳定路径，例如：",[32,4070,4073],{"className":4071,"code":4072,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fserial\u002Fby-id\u002Fusb-STMicroelectronics_STM32_Virtual_ComPort_xxxxx-if00\n",[27,4074,4072],{"__ignoreMap":37},[20,4076,4077],{},"之后无论插在哪一个 USB 接口，都可以识别同一块控制板。",[1542,4079],{},[16,4081,4082],{"id":4082},"总结",[20,4084,4085],{},"Linux USB 设备的固定命名，本质上可以分为两类：",[32,4087,4090],{"className":4088,"code":4089,"language":1621,"meta":37},[1619],"根据设备是谁\n    ↓\nby-id\nSerial Number\nidVendor + idProduct + serial\n\n\n根据设备插在哪里\n    ↓\nby-path\nID_PATH\nKERNELS\n",[27,4091,4089],{"__ignoreMap":37},[20,4093,4094],{},"工程中建议优先级：",[32,4096,4099],{"className":4097,"code":4098,"language":1621,"meta":37},[1619],"\u002Fdev\u002Fserial\u002Fby-id\u002F\n        ↓\n唯一 Serial Number\n        ↓\n\u002Fdev\u002Fserial\u002Fby-path\u002F\n        ↓\n自定义 udev rules\n",[27,4100,4098],{"__ignoreMap":37},[20,4102,4103],{},"而在机器人项目中，最终可以统一建立：",[32,4105,4107],{"className":4106,"code":3184,"language":1621,"meta":37},[1619],[27,4108,3184],{"__ignoreMap":37},[20,4110,4111],{},"之后 ROS 2、C++ 程序和启动文件全部使用这些固定名称，而不再依赖：",[32,4113,4115],{"className":4114,"code":1461,"language":1621,"meta":37},[1619],[27,4116,1461],{"__ignoreMap":37},[20,4118,4119],{},"这样即使 USB 设备重新插拔、启动顺序发生变化或者系统重新分配端口编号，也不会影响上层程序。",[12,4121,4123],{"id":4122},"linux分区gui工具","Linux分区Gui工具",[32,4125,4127],{"className":634,"code":4126,"language":636,"meta":637,"style":37},"sudo apt install gparted\nsudo dnf install gparted\n",[27,4128,4129,4134],{"__ignoreMap":37},[41,4130,4131],{"class":43,"line":44},[41,4132,4133],{},"sudo apt install gparted\n",[41,4135,4136],{"class":43,"line":55},[41,4137,4138],{},"sudo dnf install gparted\n",[12,4140,4142],{"id":4141},"ddns","DDNS",[12,4144,4145],{"id":4145},"挂载内网网页",[20,4147,4148],{},"可以把本地的网页挂载到路由器端，或者同内网段其他设备上，甚至可以挂载在本地。",[20,4150,4151],{},"下面以安卓设备为例子，由于安卓设备暂时不能直接打开html,所以我们可以把html挂载到本地服务器，再通过浏览器查看。",[20,4153,4154],{},"由于安卓系统基于Linux内核，所以我们可以下载一个叫termux的app来敲一些Linux命令：",[20,4156,4157],{},[4158,4159,4160],"a",{"href":4160,"rel":4161},"https:\u002F\u002Fgithub.com\u002Ftermux\u002Ftermux-app",[4162],"nofollow",[20,4164,4165],{},"首先打开app后，先更新软件缓存：",[32,4167,4169],{"className":406,"code":4168,"language":408,"meta":37,"style":37},"pkg update\n",[27,4170,4171],{"__ignoreMap":37},[41,4172,4173,4176],{"class":43,"line":44},[41,4174,4175],{"class":415},"pkg",[41,4177,4178],{"class":95}," update\n",[20,4180,4181],{},"然后换源",[32,4183,4185],{"className":406,"code":4184,"language":408,"meta":37,"style":37},"nano $PREFIX\u002Fetc\u002Fapt\u002Fsources.list\n",[27,4186,4187],{"__ignoreMap":37},[41,4188,4189,4191,4194],{"class":43,"line":44},[41,4190,1204],{"class":415},[41,4192,4193],{"class":51}," $PREFIX",[41,4195,4196],{"class":95},"\u002Fetc\u002Fapt\u002Fsources.list\n",[20,4198,4199],{},"将该文件内容替换为下面：",[32,4201,4203],{"className":406,"code":4202,"language":408,"meta":37,"style":37},"deb https:\u002F\u002Fmirrors.bfsu.edu.cn\u002Ftermux\u002Ftermux-packages-24 stable main\n",[27,4204,4205],{"__ignoreMap":37},[41,4206,4207,4210,4213,4216],{"class":43,"line":44},[41,4208,4209],{"class":415},"deb",[41,4211,4212],{"class":95}," https:\u002F\u002Fmirrors.bfsu.edu.cn\u002Ftermux\u002Ftermux-packages-24",[41,4214,4215],{"class":95}," stable",[41,4217,4218],{"class":95}," main\n",[1680,4220,4221,4248],{},[614,4222,4223,4224,4226,4227],{},"如果你使用的是",[27,4225,1204],{},"编辑器：",[1680,4228,4229,4236,4242],{},[614,4230,4231,4232,4235],{},"按 ",[27,4233,4234],{},"Ctrl+O"," 保存文件。",[614,4237,4231,4238,4241],{},[27,4239,4240],{},"Enter"," 确认文件名。",[614,4243,4231,4244,4247],{},[27,4245,4246],{},"Ctrl+X"," 退出编辑器。",[614,4249,4223,4250,4226,4253],{},[27,4251,4252],{},"vim",[1680,4254,4255,4261],{},[614,4256,4231,4257,4260],{},[27,4258,4259],{},"Esc"," 退出编辑模式。",[614,4262,4263,4264,4267],{},"输入 ",[27,4265,4266],{},":wq"," 保存并退出。",[20,4269,4270],{},"接下来重新更新软件源：",[32,4272,4274],{"className":406,"code":4273,"language":408,"meta":37,"style":37},"pkg update && pkg upgrade\n",[27,4275,4276],{"__ignoreMap":37},[41,4277,4278,4280,4283,4286,4288],{"class":43,"line":44},[41,4279,4175],{"class":415},[41,4281,4282],{"class":95}," update",[41,4284,4285],{"class":51}," && ",[41,4287,4175],{"class":415},[41,4289,4290],{"class":95}," upgrade\n",[20,4292,4293],{},"安装python：",[32,4295,4297],{"className":406,"code":4296,"language":408,"meta":37,"style":37},"pkg install python3\n",[27,4298,4299],{"__ignoreMap":37},[41,4300,4301,4303,4305],{"class":43,"line":44},[41,4302,4175],{"class":415},[41,4304,1065],{"class":95},[41,4306,4307],{"class":95}," python3\n",[20,4309,4310,4313],{},[530,4311,4312],{},"通过Termux访问设备存储"," ：",[20,4315,4316],{},"如果文件在安卓设备上，可以使用Termux的文件管理器访问设备的存储：",[32,4318,4320],{"className":406,"code":4319,"language":408,"meta":37,"style":37},"termux-setup-storage\n",[27,4321,4322],{"__ignoreMap":37},[41,4323,4324],{"class":43,"line":44},[41,4325,4319],{"class":415},[611,4327,4328],{},[614,4329,4330,4313,4333],{},[530,4331,4332],{},"进入HTML文件所在的目录",[611,4334,4335],{},[614,4336,4337,4338,4341],{},"使用",[27,4339,4340],{},"cd","命令进入HTML文件所在的目录：",[32,4343,4345],{"className":406,"code":4344,"language":408,"meta":37,"style":37},"cd ~\u002Fyour_html_folder\n",[27,4346,4347],{"__ignoreMap":37},[41,4348,4349,4351],{"class":43,"line":44},[41,4350,4340],{"class":64},[41,4352,4353],{"class":95}," ~\u002Fyour_html_folder\n",[611,4355,4356],{"start":55},[614,4357,4358,4313,4361,4366,4385],{},[530,4359,4360],{},"启动Python HTTP服务器",[611,4362,4363],{},[614,4364,4365],{},"运行以下命令启动一个简单的HTTP服务器：",[32,4367,4369],{"className":406,"code":4368,"language":408,"meta":37,"style":37},"python3 -m http.server 8000\n",[27,4370,4371],{"__ignoreMap":37},[41,4372,4373,4376,4379,4382],{"class":43,"line":44},[41,4374,4375],{"class":415},"python3",[41,4377,4378],{"class":64}," -m",[41,4380,4381],{"class":95}," http.server",[41,4383,4384],{"class":64}," 8000\n",[611,4386,4387],{"start":71},[614,4388,4389,4390,4393],{},"这会在端口",[27,4391,4392],{},"8000","上启动一个Web服务器。",[1680,4395,4396],{},[614,4397,4398],{},"启动服务器后，Termux会显示日志信息，例如：",[32,4400,4402],{"className":406,"code":4401,"language":408,"meta":37,"style":37},"Serving HTTP on 0.0.0.0 port 8000 (http:\u002F\u002F0.0.0.0:8000\u002F) ...\n",[27,4403,4404],{"__ignoreMap":37},[41,4405,4406,4409,4412,4415,4418,4421,4424],{"class":43,"line":44},[41,4407,4408],{"class":415},"Serving",[41,4410,4411],{"class":95}," HTTP",[41,4413,4414],{"class":95}," on",[41,4416,4417],{"class":64}," 0.0.0.0",[41,4419,4420],{"class":95}," port",[41,4422,4423],{"class":64}," 8000",[41,4425,4426],{"class":51}," (http:\u002F\u002F0.0.0.0:8000\u002F) ...\n",[1680,4428,4429],{},[614,4430,4431],{},"这表示服务器已成功启动。",[20,4433,4434],{},[530,4435,4436],{},"在浏览器中访问HTML文件",[611,4438,4439],{},[614,4440,4441,4313,4444,4449,4458],{},[530,4442,4443],{},"在同一设备上访问",[611,4445,4446],{},[614,4447,4448],{},"打开安卓设备上的浏览器（如Chrome），输入以下地址：",[32,4450,4452],{"className":406,"code":4451,"language":408,"meta":37,"style":37},"http:\u002F\u002Flocalhost:8000\n",[27,4453,4454],{"__ignoreMap":37},[41,4455,4456],{"class":43,"line":44},[41,4457,4451],{"class":415},[611,4459,4460],{"start":71},[614,4461,4462,4463,4466],{},"如果HTML文件中有",[27,4464,4465],{},"index.html","，它会自动加载；否则，你需要手动点击文件链接。",[12,4468,4470],{"id":4469},"rustdesk","RustDesk",[16,4472,4474],{"id":4473},"rustdesk无人值守远程控制","RustDesk无人值守远程控制",[20,4476,4477],{},"目前rustdesk还没办法进行无人值守在wayland下,所以我们需要把登陆密码,锁屏和休眠待机全部关掉.",[1016,4479,4481],{"id":4480},"设置-kde6-自动登录","设置 KDE6 自动登录",[611,4483,4484],{},[614,4485,4486],{},"可以先查自己的sddm类型",[32,4488,4490],{"className":406,"code":4489,"language":408,"meta":37,"style":37},"ls \u002Fusr\u002Fshare\u002Fxsessions\u002F\n",[27,4491,4492],{"__ignoreMap":37},[41,4493,4494,4496],{"class":43,"line":44},[41,4495,1651],{"class":415},[41,4497,4498],{"class":95}," \u002Fusr\u002Fshare\u002Fxsessions\u002F\n",[32,4500,4502],{"className":406,"code":4501,"language":408,"meta":37,"style":37},"ls \u002Fusr\u002Fshare\u002Fwayland-sessions\u002F\n",[27,4503,4504],{"__ignoreMap":37},[41,4505,4506,4508],{"class":43,"line":44},[41,4507,1651],{"class":415},[41,4509,4510],{"class":95}," \u002Fusr\u002Fshare\u002Fwayland-sessions\u002F\n",[20,4512,4513],{},"看哪个会输出东西,输出东西的文件夹就是你拥有的sddm,比如xsessions输出内容的话,那就是x11的sddm,如果wayland-sessions输出内容的话你就是wayland的sddm.",[611,4515,4516],{"start":55},[614,4517,4518],{},"编辑 SDDM 配置：",[32,4520,4522],{"className":406,"code":4521,"language":408,"meta":37,"style":37},"sudo nano \u002Fetc\u002Fsddm.conf\n",[27,4523,4524],{"__ignoreMap":37},[41,4525,4526,4528,4531],{"class":43,"line":44},[41,4527,466],{"class":415},[41,4529,4530],{"class":95}," nano",[41,4532,4533],{"class":95}," \u002Fetc\u002Fsddm.conf\n",[20,4535,4536,4537,4540],{},"在文件最上面有个",[41,4538,4539],{},"Autologin",",在这个底下加入下面的内容：",[32,4542,4544],{"className":406,"code":4543,"language":408,"meta":37,"style":37},"[Autologin]\nUser=你的用户名\nSession=plasma.desktop   # 或 plasma.desktop（X11），方案一可用 Wayland\n",[27,4545,4546,4551,4562],{"__ignoreMap":37},[41,4547,4548],{"class":43,"line":44},[41,4549,4550],{"class":51},"[Autologin]\n",[41,4552,4553,4556,4559],{"class":43,"line":55},[41,4554,4555],{"class":51},"User",[41,4557,4558],{"class":2051},"=",[41,4560,4561],{"class":95},"你的用户名\n",[41,4563,4564,4567,4569,4572],{"class":43,"line":71},[41,4565,4566],{"class":51},"Session",[41,4568,4558],{"class":2051},[41,4570,4571],{"class":95},"plasma.desktop",[41,4573,4574],{"class":1220},"   # 或 plasma.desktop（X11），方案一可用 Wayland\n",[611,4576,4577],{"start":71},[614,4578,4579],{},"保存退出后重启 SDDM：",[32,4581,4583],{"className":406,"code":4582,"language":408,"meta":37,"style":37},"sudo systemctl restart sddm\n",[27,4584,4585],{"__ignoreMap":37},[41,4586,4587,4589,4591,4594],{"class":43,"line":44},[41,4588,466],{"class":415},[41,4590,1075],{"class":95},[41,4592,4593],{"class":95}," restart",[41,4595,4596],{"class":95}," sddm\n",[20,4598,4599],{},"✅ 开机后自动进入桌面，无需输入密码",[1016,4601,4603],{"id":4602},"关闭锁屏在-kde6-系统设置里","关闭锁屏在 KDE6 系统设置里：",[20,4605,4606],{},"打开 系统设置 → 屏幕锁定(Screen Locking)\n关闭自动锁定\n关闭屏幕关闭 \u002F 屏幕保护锁定\n这样 RustDesk 可以开机后直接控制桌面，不会被锁屏阻挡",[1016,4608,4610],{"id":4609},"关闭休眠系统设置-电源管理power-managerment","关闭休眠系统设置 → 电源管理(Power Managerment)",[20,4612,4613],{},"禁用“休眠”或“自动挂起”\n保证电脑开机一直在线，RustDesk 可随时远控\n如果必须休眠，可在 BIOS 设置里禁用休眠，保证开机即联网",[16,4615,4617],{"id":4616},"rustdesk自建服务器","RustDesk自建服务器",[1016,4619,4620],{"id":4620},"在服务器端安装",[4622,4623,4624],"h6",{"id":4624},"命令行方式",[611,4626,4627],{},[614,4628,4629,4630],{},"打开官网:",[4158,4631,4632],{"href":4632,"rel":4633},"https:\u002F\u002Frustdesk.com\u002Fdocs\u002Fzh-cn\u002Fself-host\u002F",[4162],[20,4635,4636],{},[426,4637],{"alt":4638,"src":4639},"alt text","https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768144998052.webp",[611,4641,4642],{"start":55},[614,4643,4644],{},"用ssh访问你需要安装RustDesk的服务器",[32,4646,4648],{"className":406,"code":4647,"language":408,"meta":37,"style":37},"ssh tungchiahui@10.0.0.4\n",[27,4649,4650],{"__ignoreMap":37},[41,4651,4652,4654],{"class":43,"line":44},[41,4653,713],{"class":415},[41,4655,4656],{"class":95}," tungchiahui@10.0.0.4\n",[20,4658,4659],{},[426,4660],{"alt":4638,"src":4661},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768145500558.webp",[611,4663,4664],{"start":71},[614,4665,4666],{},"使用方法二的命令",[20,4668,4669],{},[426,4670],{"alt":4638,"src":4671},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768145605588.webp",[32,4673,4675],{"className":406,"code":4674,"language":408,"meta":37,"style":37},"wget https:\u002F\u002Fraw.githubusercontent.com\u002Ftechahold\u002Frustdeskinstall\u002Fmaster\u002Finstall.sh\nchmod +x install.sh\n.\u002Finstall.sh\n",[27,4676,4677,4685,4694],{"__ignoreMap":37},[41,4678,4679,4682],{"class":43,"line":44},[41,4680,4681],{"class":415},"wget",[41,4683,4684],{"class":95}," https:\u002F\u002Fraw.githubusercontent.com\u002Ftechahold\u002Frustdeskinstall\u002Fmaster\u002Finstall.sh\n",[41,4686,4687,4689,4691],{"class":43,"line":55},[41,4688,1262],{"class":415},[41,4690,1265],{"class":95},[41,4692,4693],{"class":95}," install.sh\n",[41,4695,4696],{"class":43,"line":71},[41,4697,4698],{"class":415},".\u002Finstall.sh\n",[20,4700,4701],{},".\u002Finstall.sh的设置看下一节",[611,4703,4704],{"start":79},[614,4705,4706],{},"配置与查看KEY",[20,4708,4709,4710,4713,4714,4717],{},"这里如果你是想直接用公网ip则选择",[27,4711,4712],{},"1)IP",",如果你是DDNS等用域名绑定了IP地址,则选择",[27,4715,4716],{},"2)",".",[20,4719,4720],{},[426,4721],{"alt":4638,"src":4722},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768148704646.webp",[20,4724,4725,4726],{},"这个选",[27,4727,4728],{},"2)No",[20,4730,4731],{},[426,4732],{"alt":4638,"src":4733},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768148806049.webp",[20,4735,4736],{},"这个是KEY,要复制下来,等后面软件配置的时候要用.",[20,4738,4739],{},[426,4740],{"alt":4638,"src":4741},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768148866392.webp",[611,4743,4744],{"start":87},[614,4745,4746,4747,4752,4768,4746,4771,4821,4826,4860,4746,4862],{},"配置防火墙",[611,4748,4749],{},[614,4750,4751],{},"如果你是Debian系\n安装防火墙",[32,4753,4755],{"className":406,"code":4754,"language":408,"meta":37,"style":37},"sudo apt install ufw\n",[27,4756,4757],{"__ignoreMap":37},[41,4758,4759,4761,4763,4765],{"class":43,"line":44},[41,4760,466],{"class":415},[41,4762,1062],{"class":95},[41,4764,1065],{"class":95},[41,4766,4767],{"class":95}," ufw\n",[4769,4770],"br",{},[32,4772,4774],{"className":406,"code":4773,"language":408,"meta":37,"style":37},"sudo ufw allow 22\n\nufw allow 21114:21119\u002Ftcp\nufw allow 21116\u002Fudp\nsudo ufw enable\n",[27,4775,4776,4789,4793,4803,4812],{"__ignoreMap":37},[41,4777,4778,4780,4783,4786],{"class":43,"line":44},[41,4779,466],{"class":415},[41,4781,4782],{"class":95}," ufw",[41,4784,4785],{"class":95}," allow",[41,4787,4788],{"class":64}," 22\n",[41,4790,4791],{"class":43,"line":55},[41,4792,1585],{"emptyLinePlaceholder":1584},[41,4794,4795,4798,4800],{"class":43,"line":71},[41,4796,4797],{"class":415},"ufw",[41,4799,4785],{"class":95},[41,4801,4802],{"class":95}," 21114:21119\u002Ftcp\n",[41,4804,4805,4807,4809],{"class":43,"line":79},[41,4806,4797],{"class":415},[41,4808,4785],{"class":95},[41,4810,4811],{"class":95}," 21116\u002Fudp\n",[41,4813,4814,4816,4818],{"class":43,"line":87},[41,4815,466],{"class":415},[41,4817,4782],{"class":95},[41,4819,4820],{"class":95}," enable\n",[611,4822,4823],{"start":55},[614,4824,4825],{},"如果你是RHEL系\n安装防火墙",[32,4827,4829],{"className":406,"code":4828,"language":408,"meta":37,"style":37},"# 如果你是RHEL系\nsudo dnf install firewalld\nsudo systemctl enable --now firewalld\n",[27,4830,4831,4836,4848],{"__ignoreMap":37},[41,4832,4833],{"class":43,"line":44},[41,4834,4835],{"class":1220},"# 如果你是RHEL系\n",[41,4837,4838,4840,4843,4845],{"class":43,"line":55},[41,4839,466],{"class":415},[41,4841,4842],{"class":95}," dnf",[41,4844,1065],{"class":95},[41,4846,4847],{"class":95}," firewalld\n",[41,4849,4850,4852,4854,4856,4858],{"class":43,"line":71},[41,4851,466],{"class":415},[41,4853,1075],{"class":95},[41,4855,1078],{"class":95},[41,4857,1081],{"class":64},[41,4859,4847],{"class":95},[4769,4861],{},[32,4863,4865],{"className":406,"code":4864,"language":408,"meta":37,"style":37},"sudo firewall-cmd --add-port=22\u002Ftcp --permanent\nsudo firewall-cmd --reload\n\nsudo firewall-cmd --add-port=21114-21119\u002Ftcp --permanent\nsudo firewall-cmd --reload\n\nsudo firewall-cmd --add-port=21116\u002Fudp --permanent\nsudo firewall-cmd --reload\n\nsudo systemctl enable --now firewalld\n",[27,4866,4867,4880,4889,4893,4904,4912,4916,4927,4935,4939],{"__ignoreMap":37},[41,4868,4869,4871,4874,4877],{"class":43,"line":44},[41,4870,466],{"class":415},[41,4872,4873],{"class":95}," firewall-cmd",[41,4875,4876],{"class":64}," --add-port=22\u002Ftcp",[41,4878,4879],{"class":64}," --permanent\n",[41,4881,4882,4884,4886],{"class":43,"line":55},[41,4883,466],{"class":415},[41,4885,4873],{"class":95},[41,4887,4888],{"class":64}," --reload\n",[41,4890,4891],{"class":43,"line":71},[41,4892,1585],{"emptyLinePlaceholder":1584},[41,4894,4895,4897,4899,4902],{"class":43,"line":79},[41,4896,466],{"class":415},[41,4898,4873],{"class":95},[41,4900,4901],{"class":64}," --add-port=21114-21119\u002Ftcp",[41,4903,4879],{"class":64},[41,4905,4906,4908,4910],{"class":43,"line":87},[41,4907,466],{"class":415},[41,4909,4873],{"class":95},[41,4911,4888],{"class":64},[41,4913,4914],{"class":43,"line":101},[41,4915,1585],{"emptyLinePlaceholder":1584},[41,4917,4918,4920,4922,4925],{"class":43,"line":109},[41,4919,466],{"class":415},[41,4921,4873],{"class":95},[41,4923,4924],{"class":64}," --add-port=21116\u002Fudp",[41,4926,4879],{"class":64},[41,4928,4929,4931,4933],{"class":43,"line":122},[41,4930,466],{"class":415},[41,4932,4873],{"class":95},[41,4934,4888],{"class":64},[41,4936,4937],{"class":43,"line":135},[41,4938,1585],{"emptyLinePlaceholder":1584},[41,4940,4941,4943,4945,4947,4949],{"class":43,"line":147},[41,4942,466],{"class":415},[41,4944,1075],{"class":95},[41,4946,1078],{"class":95},[41,4948,1081],{"class":64},[41,4950,4847],{"class":95},[4622,4952,4954],{"id":4953},"_1panel方式","1Panel方式",[611,4956,4957],{},[614,4958,4959],{},"在面板里搜RustDesk并安装",[20,4961,4962],{},[426,4963],{"alt":4638,"src":4964},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768146100467.webp",[611,4966,4967],{"start":55},[614,4968,4746],{},[20,4970,4971],{},[426,4972],{"alt":4638,"src":4973},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768146828373.webp",[20,4975,4976,4977,4980,4983],{},"添加几个端口\n",[426,4978],{"alt":4638,"src":4979},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768146848849.webp",[426,4981],{"alt":4638,"src":4982},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768146858053.webp",[426,4984],{"alt":4638,"src":4985},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768146876612.webp",[611,4987,4988],{"start":71},[614,4989,4990,4991],{},"查看KEY\n",[426,4992],{"alt":4638,"src":4993},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768146996637.webp",[20,4995,4996],{},"复制KEY",[20,4998,4999],{},[426,5000],{"alt":4638,"src":5001},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768147034654.webp",[1016,5003,5005],{"id":5004},"自建服务器后配置rustdesk软件","自建服务器后配置RustDesk软件",[611,5007,5008],{},[614,5009,5010],{},"PC端",[20,5012,5013],{},[426,5014],{"alt":4638,"src":5015},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768147115389.webp",[20,5017,5018],{},[426,5019],{"alt":4638,"src":5020},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768147204480.webp",[20,5022,5023,5024],{},"出现就绪就是配置成功了\n",[426,5025],{"alt":4638,"src":5026},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768147547538.webp",[611,5028,5029],{"start":55},[614,5030,5031],{},"移动端",[20,5033,5034],{},[426,5035],{"alt":4638,"src":5036},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768149138253.webp",[20,5038,5039],{},[426,5040],{"alt":4638,"src":5041},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768149199158.webp",[4622,5043,5044],{"id":5044},"注意的问题",[20,5046,5047],{},"如果你是家庭的内网服务器,则需要让路由器也放行对应端口",[20,5049,5050,5051],{},"找到openwrt防火墙设置,点击添加\n",[426,5052],{"alt":4638,"src":5053},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768148357743.webp",[20,5055,5056],{},[426,5057],{"alt":4638,"src":5058},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768148378543.webp",[20,5060,5061],{},[426,5062],{"alt":4638,"src":5063},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1768148398594.webp",[20,5065,5066],{},"然后还有ipv6也要进行放行，那个debian一般默认ipv6不设防，但是会被上游openwrt防住，所以，要在openwrt里开启对应规则。",[20,5068,5069,5070,5073],{},"去",[27,5071,5072],{},"防火墙 - 通信规则","里添加下面俩配置。",[32,5075,5078],{"className":5076,"code":5077,"language":1621,"meta":37},[1619],"Allow-RustDesk-IPv6-TCP\nWAN → LAN\n目标：你服务器的ipv6公网\nTCP 21115-21119\n动作：接受转发\n\nAllow-RustDesk-IPv6-UDP\nWAN → LAN\n目标：你服务器的ipv6公网\nUDP 21116\n动作：接受转发\n",[27,5079,5077],{"__ignoreMap":37},[20,5081,5082],{},[426,5083],{"alt":37,"src":5084},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1788528028821-5f4711e7.webp",[20,5086,5087],{},[426,5088],{"alt":37,"src":5089},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1788528057933-67c6e554.webp",[20,5091,5092],{},"这样才可以让你的服务器端口被真正成功放行.",[12,5094,5096],{"id":5095},"wireguard","WireGuard",[16,5098,5099],{"id":5099},"简介",[20,5101,5102],{},"WireGuard是用于在室外通过VPN来访问内网设备的一种工具.",[20,5104,5105],{},"这里我的教程将会教你如何在室外访问你家里的内网设备.",[16,5107,5108],{"id":5108},"我的环境",[1016,5110,5111],{"id":5111},"内网",[20,5113,5114,5115],{},"家庭内网网段:",[27,5116,5117],{},"10.0.0.0\u002F24",[20,5119,5120],{},[426,5121],{"alt":4638,"src":5122},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783171015365.webp",[1016,5124,5125],{"id":5125},"外部设备",[20,5127,5128,5129,5132],{},"如果你是在办公室等地方链接办公室的wifi,那么你需要知道",[27,5130,5131],{},"室外内网网段",",如果你直接用手机数据流量的话,那么什么都不需要知道.",[20,5134,5135,5136,5139],{},"室外内网网段:",[27,5137,5138],{},"192.168.31.0\u002F24","\n室外数据流量运营商:中国联通",[16,5141,891],{"id":891},[1016,5143,5144],{"id":5144},"服务端-软路由端",[20,5146,5147],{},"SSH登录OpenWrt，或者用LuCI界面：",[32,5149,5151],{"className":406,"code":5150,"language":408,"meta":37,"style":37},"opkg update\nopkg install wireguard-tools luci-proto-wireguard kmod-wireguard qrencode\n",[27,5152,5153,5160],{"__ignoreMap":37},[41,5154,5155,5158],{"class":43,"line":44},[41,5156,5157],{"class":415},"opkg",[41,5159,4178],{"class":95},[41,5161,5162,5164,5166,5169,5172,5175],{"class":43,"line":55},[41,5163,5157],{"class":415},[41,5165,1065],{"class":95},[41,5167,5168],{"class":95}," wireguard-tools",[41,5170,5171],{"class":95}," luci-proto-wireguard",[41,5173,5174],{"class":95}," kmod-wireguard",[41,5176,5177],{"class":95}," qrencode\n",[20,5179,5180],{},"装完刷新一下浏览器LuCI页面.",[1016,5182,5184],{"id":5183},"客户端-手机电脑端","客户端-手机,电脑端",[20,5186,5187],{},[4158,5188,5189],{"href":5189,"rel":5190},"https:\u002F\u002Fwww.wireguard.com\u002Finstall\u002F",[4162],[611,5192,5193],{},[614,5194,5195],{},"Android",[20,5197,5198],{},[4158,5199,5200],{"href":5200,"rel":5201},"https:\u002F\u002Fplay.google.com\u002Fstore\u002Fapps\u002Fdetails?id=com.wireguard.android&hl=zh&pli=1",[4162],[611,5203,5204],{"start":55},[614,5205,5206],{},"iOS",[20,5208,5209,5210,5214,5215,5219,5220],{},"美区:",[4158,5211,5212],{"href":5212,"rel":5213},"https:\u002F\u002Fapps.apple.com\u002Fus\u002Fapp\u002Fwireguard\u002Fid1441195209",[4162],"\n日区:",[4158,5216,5217],{"href":5217,"rel":5218},"https:\u002F\u002Fapps.apple.com\u002Fjp\u002Fapp\u002Fwireguard\u002Fid1441195209",[4162],"\n台区:",[4158,5221,5222],{"href":5222,"rel":5223},"https:\u002F\u002Fapps.apple.com\u002Ftw\u002Fapp\u002Fwireguard\u002Fid1441195209",[4162],[611,5225,5226],{"start":71},[614,5227,5228,5229,5234,5251],{},"Linux",[611,5230,5231],{},[614,5232,5233],{},"Fedora",[32,5235,5237],{"className":406,"code":5236,"language":408,"meta":37,"style":37}," sudo dnf install wireguard-tools\n\n",[27,5238,5239],{"__ignoreMap":37},[41,5240,5241,5244,5246,5248],{"class":43,"line":44},[41,5242,5243],{"class":415}," sudo",[41,5245,4842],{"class":95},[41,5247,1065],{"class":95},[41,5249,5250],{"class":95}," wireguard-tools\n",[611,5252,5253],{"start":55},[614,5254,5255],{},"Ubuntu\u002FDebian",[32,5257,5259],{"className":406,"code":5258,"language":408,"meta":37,"style":37},"sudo apt install wireguard\n",[27,5260,5261],{"__ignoreMap":37},[41,5262,5263,5265,5267,5269],{"class":43,"line":44},[41,5264,466],{"class":415},[41,5266,1062],{"class":95},[41,5268,1065],{"class":95},[41,5270,5271],{"class":95}," wireguard\n",[16,5273,5274],{"id":5274},"配置",[1016,5276,5277],{"id":5277},"服务端-初始化配置",[20,5279,5280,5281],{},"在luci界面中,点击",[27,5282,5283],{},"网络 → 接口 → 添加新接口",[611,5285,5286,5289,5292],{},[614,5287,5288],{},"协议选 WireGuard VPN",[614,5290,5291],{},"名称填 wg0",[614,5293,5294],{},"点下一步，进到详情页",[20,5296,5297],{},[426,5298],{"alt":4638,"src":5299},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783170592021.webp",[20,5301,5302,5303,5306,5307,5310],{},"按照上图的步骤,依次配置.\n这里解释一下.\n监听端口：",[27,5304,5305],{},"51820","（可自定义，使用一个未被占用的端口即可,记住这个端口,不懂的话就照我的设置）\nIP地址：",[27,5308,5309],{},"10.10.10.1\u002F24","（VPN内网网段，跟你软路由的局域网段不能冲突,不懂的话就照我的设置）",[20,5312,5313,5314,5317,5318,5320],{},"你必须确保你的",[27,5315,5316],{},"家庭内网网段","和你的",[27,5319,5131],{},"以及刚才填的那个IP地址不能属于同一网段.",[20,5322,5323,5324,1040,5326,5328,5329,1040,5331,5333,5334,4717],{},"比如我的",[27,5325,5316],{},[27,5327,5117],{},",而",[27,5330,5131],{},[27,5332,5138],{},",VPN的网段",[27,5335,5336],{},"10.10.10.0\u002F24",[20,5338,5339,5340,4717],{},"然后点击防火墙设置,选择",[27,5341,5096],{},[20,5343,5344],{},[426,5345],{"alt":4638,"src":5346},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783171881431.webp",[1016,5348,5349],{"id":5349},"服务端-对端配置",[20,5351,5352],{},"这里配置的就是你的手机\u002F笔记本作为客户端连进来的信息：",[20,5354,5355],{},"这个界面很方便，LuCI可以直接帮你生成客户端的密钥对并直接导出配置文件\u002F二维码，不需要你手动在手机上先生成公钥再倒腾过来，效率高很多。按下面顺序填：",[611,5357,5358,5361,5364,5367,5370,5373,5376,5379,5382],{},[614,5359,5360],{},"描述\nphone\n（或者你自己好记的名字，比如\"iPhone17\"）",[614,5362,5363],{},"公钥 + 私钥 —— 直接点\"生成新的密钥对\"\n点这个按钮，系统会自动帮你同时生成一对新的公钥+私钥，并自动填到\"公钥\"和\"私钥\"两个框里。\n这个做法比你自己在手机App里生成再抄公钥过来省事得多，因为最后可以直接导出完整配置文件甚至二维码给手机扫码导入，私钥也是配置好的，不用手动输入。",[614,5365,5366],{},"预共享密钥(PSK) —— 建议点\"生成预共享密钥\"\n这是可选的额外加密层，加上更安全（抗未来量子计算破解），点一下\"生成预共享密钥\"按钮自动填好即可，不需要手动操作。",[614,5368,5369],{},"允许的IP\n点绿色+号，填：\n10.10.10.2\u002F32\n这是分配给这台手机的隧道内网IP（如果以后要加第二台设备，比如笔记本，就用10.10.10.3\u002F32，以此类推）。",[614,5371,5372],{},"为允许的IP创建路由 —— 勾选\n这个决定了服务端要不要给这个IP自动建路由，勾上，否则服务端不知道怎么把去往10.10.10.2的包转发给这个peer。",[614,5374,5375],{},"对端地址 (Image 2)\n这个字段填的是客户端的地址，但因为你的手机是移动设备、IP会变，服务端这边留空即可，不用填。（这个字段一般是给\"两个固定IP的服务器互联\"场景用的，你这种手机\u002F笔记本客户端场景不需要）",[614,5377,5378],{},"对端端口\n同理，留空或者保持默认51820占位符不用管，服务端这边这个字段对客户端场景没意义，跳过。",[614,5380,5381],{},"持续保持连接(Persistent Keepalive)\n填：\n25\n因为手机大概率处在NAT环境下（无论是WiFi还是4G\u002F5G），这个值能防止连接因为长时间无流量被NAT设备判定断开。",[614,5383,5384],{},"保存后 —— 点\"生成配置...\"\n这一步是重点：全部填完先点右下角\"保存\"，保存完之后再进来点 配置导出 那个\"生成配置...\"按钮，系统会：",[20,5386,5387],{},"自动生成一份完整的客户端配置文件（包含私钥、服务端公钥、Endpoint地址等全部信息）\n通常还会显示一个二维码",[20,5389,5390],{},"手机WireGuard App直接扫这个二维码就能一键导入配置，完全不用你手动输入任何字段，最省事。",[611,5392,5393],{"start":147},[614,5394,5395,5396,5398,5401,5426,5428,5429,5431,5432],{},"填完这些保存之后，点\"生成配置\"",[4769,5397],{},[426,5399],{"alt":4638,"src":5400},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783172425569.webp",[611,5402,5403,5423],{},[614,5404,5405,5406,5410,5411,5414,5415,5418,5419,5422],{},"连接端点 —— 改成DDNS域名\n没有ddns域名的请看",[4158,5407,5409],{"href":5408},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0900-qi-ta-cao-zuo#ddns","ddns教程",".\n现在显示的是 ",[27,5412,5413],{},"112.233.39.5"," 这个具体的公网IPv4，这是系统自动探测到的当前公网IP，但建议改成：",[27,5416,5417],{},"ddns.xxxxxx.cn","\n原因很简单：家庭宽带的公网IP大概率是动态的(如果你是中国移动,你完全不需要担心这件事情,你没有公网ipv4,你只有公网ipv6)，过一阵子运营商重新分配IP后，这个写死的IP就失效了，配置文件也就废了。用DDNS域名的话，只要你路由器上的DDNS客户端正常更新，域名自动跟着IP变化解析，配置文件永久有效，不用来回改。\n直接把这个下拉框里的值改成 ",[27,5420,5421],{},"ddns.tungchiahui.cn"," 即可，如果下拉框里没有这个选项，看能不能手动输入替换。",[614,5424,5425],{},"允许的IP —— 这个要看你的使用需求，建议改\n现在是 0.0.0.0\u002F0 + ::\u002F0，意思是全局代理模式：连上VPN后，手机\u002F电脑的所有上网流量（刷网页、看视频、聊天全部）都会先绕道回你家里，再从家里的网络出去上网。\n这跟最初的需求（\"在外面访问家里NAS\"）不太一致，全局模式的影响：",[4769,5427],{},"✅ 优点：所有流量都通过加密隧道，公共WiFi环境下更安全\n❌ 缺点：手机所有网络流量的速度都取决于你家宽带的上传带宽，如果你家是常见的百兆宽带（上传可能才几十M甚至更低），刷视频、下载会明显变慢；而且家里NAT要承担所有流量的转发压力",[4769,5430],{},"如果你只是想访问家里内网的NAS\u002FPVE\u002FDebian，建议改成分离隧道模式，把这两行改成：\n10.10.10.0\u002F24\n10.0.0.0\u002F24\n删掉 0.0.0.0\u002F0 和 ::\u002F0 这两行（点它们右边的红色×号），只保留上面这两个网段。这样只有\"访问家里内网\"这一类流量才走VPN隧道，其他正常上网流量不受影响，速度不受影响。\n如果你确实希望VPN也当\"全局代理\"用（比如出门用境外的WiFi想用家里的网络环境访问某些内容），那就保留 0.0.0.0\u002F0 不用改。",[611,5433,5434,5437],{"start":71},[614,5435,5436],{},"DNS服务器：10.0.0.1 —— 这是你家庭内网的软路由的LAN地址，连VPN后用它解析域名没问题，能顺带解析你家内网可能配置的一些本地域名",[614,5438,5439],{},"地址：10.10.10.2\u002F32 —— 这个就是你想给你的这个手机分配一个VPN网段",[20,5441,5442],{},[426,5443],{"alt":4638,"src":5444},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783173072915.webp",[20,5446,5447],{},"然后掏出手机的客户端,使用QRcode导入配置即可.",[20,5449,5450],{},[426,5451],{"alt":4638,"src":5452},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783173937724.webp",[1016,5454,5455],{"id":5455},"服务端-防火墙设置",[20,5457,5458],{},"需要加的规则\n去 网络 → 防火墙 → 通信规则(Traffic Rules)，点\"添加\"：",[20,5460,5461],{},[426,5462],{"alt":4638,"src":5463},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783173591260.webp",[20,5465,5466],{},"名称：WireGuard（随便起）\n协议：UDP 或者 TCP\u002FUDP\n源区域：wan\n目标区域：设备(输入) —— 因为WireGuard监听的是软路由本机端口，不是转发给内网其他设备\n目标端口：51820（跟你wg0接口\"监听端口\"那里填的一致）\n操作：接受(Accept)",[20,5468,5469],{},[426,5470],{"alt":4638,"src":5471},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783173651000.webp",[20,5473,5474],{},"保存，应用。",[1016,5476,5477],{"id":5477},"客户端",[20,5479,5480],{},"拿iOS举例子",[20,5482,5483],{},"我这里使用数据流量来测试,使用的是中国联通4G.",[20,5485,5486],{},"像使用普通的VPN一样打开你导入的这个配置即可.",[20,5488,5489],{},[426,5490],{"alt":4638,"src":5491},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783173983036.webp",[16,5493,2525],{"id":5494},"测试-1",[20,5496,5497],{},"然后可以尝试访问你的内网设备,\n比如我的\nopenwrt是10.0.0.1,\npve是10.0.0.2,\nnas是10.0.0.5都可以被正常访问了.",[20,5499,5500],{},[426,5501],{"alt":4638,"src":5502},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783174333555.webp",[20,5504,5505],{},[426,5506],{"alt":4638,"src":5507},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783174341112.webp",[20,5509,5510],{},[426,5511],{"alt":4638,"src":5512},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1783174344742.webp",[16,5514,5516],{"id":5515},"将wireguard交由clash-meta管理可选","将WireGuard交由Clash Meta管理(可选)",[1016,5518,5520],{"id":5519},"将纯wireguard配置放入clash-meta","将纯WireGuard配置放入Clash Meta",[20,5522,5523],{},"如果手机或电脑上已经长期运行支持Mihomo \u002F Clash Meta内核的客户端，再单独启动WireGuard客户端会比较麻烦，而且同一台移动设备通常不能同时启用两个VPN隧道。",[20,5525,5526],{},"因此，可以将WireGuard节点直接写入Clash Meta配置，让Clash Meta统一负责：",[611,5528,5529,5532,5535],{},[614,5530,5531],{},"普通互联网流量直连；",[614,5533,5534],{},"家庭内网流量通过WireGuard访问；",[614,5536,5537],{},"根据规则自动判断流量应该走哪个出口。",[20,5539,5540],{},"本节只介绍不包含机场或其他代理节点的纯WireGuard配置。",[20,5542,5543],{},"配置完成后，不再需要打开独立的WireGuard客户端。使用该配置时，应关闭WireGuard App中的隧道，只打开Clash Meta。",[4622,5545,5547],{"id":5546},"查看wireguard客户端参数","查看WireGuard客户端参数",[20,5549,5550],{},"先打开已经能够正常使用的WireGuard客户端配置，需要记录以下信息：",[2075,5552,5553,5563],{},[2078,5554,5555],{},[2081,5556,5557,5560],{},[2084,5558,5559],{"align":2086},"Clash Meta字段",[2084,5561,5562],{"align":2086},"WireGuard客户端中的对应字段",[2092,5564,5565,5575,5584,5597,5607,5617,5627],{},[2081,5566,5567,5572],{},[2097,5568,5569],{"align":2086},[27,5570,5571],{},"server",[2097,5573,5574],{"align":2086},"Peer中的Endpoint域名或公网IP",[2081,5576,5577,5581],{},[2097,5578,5579],{"align":2086},[27,5580,1771],{},[2097,5582,5583],{"align":2086},"Peer中的Endpoint端口",[2081,5585,5586,5591],{},[2097,5587,5588],{"align":2086},[27,5589,5590],{},"ip",[2097,5592,5593,5594],{"align":2086},"Interface中的Addresses，只填写IPv4地址，不写",[27,5595,5596],{},"\u002F32",[2081,5598,5599,5604],{},[2097,5600,5601],{"align":2086},[27,5602,5603],{},"private-key",[2097,5605,5606],{"align":2086},"Interface中的Private key",[2081,5608,5609,5614],{},[2097,5610,5611],{"align":2086},[27,5612,5613],{},"public-key",[2097,5615,5616],{"align":2086},"Peer中的Public key，也就是WireGuard服务器公钥",[2081,5618,5619,5624],{},[2097,5620,5621],{"align":2086},[27,5622,5623],{},"pre-shared-key",[2097,5625,5626],{"align":2086},"Peer中的Preshared key",[2081,5628,5629,5634],{},[2097,5630,5631],{"align":2086},[27,5632,5633],{},"persistent-keepalive",[2097,5635,5636],{"align":2086},"Peer中的Persistent keepalive",[20,5638,5639],{},"这里最容易弄错的是两个公钥：",[1680,5641,5642,5647],{},[614,5643,5644,5645,1508],{},"Interface中的Public key是当前客户端的公钥，不能填入Clash Meta的",[27,5646,5613],{},[614,5648,5649,5650,892],{},"Peer中的Public key才是WireGuard服务器公钥，需要填入Clash Meta的",[27,5651,5613],{},[20,5653,5654],{},[426,5655],{"alt":5656,"src":5657},"WireGuard客户端参数位置","%E8%AF%B7%E6%9B%BF%E6%8D%A2%E4%B8%BA%E5%9B%BE%E7%89%87%E5%9C%B0%E5%9D%80",[20,5659,5660],{},"这一张图同时包含Interface和Peer两部分，已经足够说明各个字段应该从哪里获取，不需要再增加其他截图。",[4622,5662,5664],{"id":5663},"创建yaml配置","创建YAML配置",[20,5666,5667,5668,5671],{},"新建一个扩展名为",[27,5669,5670],{},".yaml","的文件，例如：",[32,5673,5676],{"className":5674,"code":5675,"language":1621,"meta":37},[1619],"home-wireguard.yaml\n",[27,5677,5675],{"__ignoreMap":37},[20,5679,5680],{},"写入下面的模板：",[32,5682,5684],{"className":1762,"code":5683,"language":1764,"meta":37,"style":37},"# 仅让家庭内网流量通过WireGuard\n# 普通互联网流量保持直连\n# 启用本配置时，不要同时开启独立的WireGuard客户端\n\nmixed-port: 7890\nallow-lan: false\nmode: rule\nlog-level: info\nipv6: true\n\ntun:\n  enable: true\n  stack: mixed\n  auto-route: true\n  auto-detect-interface: true\n\nproxies:\n  - name: 家庭-WG\n    type: wireguard\n\n    # WireGuard客户端Peer中的Endpoint\n    server: ddns.example.com\n    port: 51820\n\n    # WireGuard客户端Interface中的Addresses\n    # 例如原配置为10.10.10.2\u002F32，这里只填写10.10.10.2\n    ip: 10.10.10.2\n\n    # WireGuard客户端Interface中的Private key\n    private-key: \"gBzeTbZH...\"\n\n    # WireGuard客户端Peer中的Public key，即服务器公钥\n    # 不要填写Interface中的客户端公钥\n    public-key: \"UUS0nrKE...\"\n\n    # WireGuard客户端Peer中的Preshared key\n    pre-shared-key: \"NGYvFsCle...\"\n\n    allowed-ips:\n      - 0.0.0.0\u002F0\n\n    udp: true\n    persistent-keepalive: 25\n    mtu: 1380\n\nrules:\n  # 家庭局域网网段\n  - IP-CIDR,10.0.0.0\u002F24,家庭-WG,no-resolve\n\n  # WireGuard隧道网段\n  - IP-CIDR,10.10.10.0\u002F24,家庭-WG,no-resolve\n\n  # 其他网络流量保持直连\n  - MATCH,DIRECT\n",[27,5685,5686,5691,5696,5701,5705,5715,5725,5735,5745,5754,5758,5765,5774,5784,5793,5802,5806,5813,5826,5836,5840,5845,5855,5865,5869,5874,5880,5891,5896,5902,5913,5918,5924,5930,5941,5946,5952,5963,5968,5976,5985,5990,6000,6011,6022,6027,6035,6041,6049,6054,6060,6068,6073,6079],{"__ignoreMap":37},[41,5687,5688],{"class":43,"line":44},[41,5689,5690],{"class":1220},"# 仅让家庭内网流量通过WireGuard\n",[41,5692,5693],{"class":43,"line":55},[41,5694,5695],{"class":1220},"# 普通互联网流量保持直连\n",[41,5697,5698],{"class":43,"line":71},[41,5699,5700],{"class":1220},"# 启用本配置时，不要同时开启独立的WireGuard客户端\n",[41,5702,5703],{"class":43,"line":79},[41,5704,1585],{"emptyLinePlaceholder":1584},[41,5706,5707,5710,5712],{"class":43,"line":87},[41,5708,5709],{"class":47},"mixed-port",[41,5711,61],{"class":51},[41,5713,5714],{"class":64},"7890\n",[41,5716,5717,5720,5722],{"class":43,"line":101},[41,5718,5719],{"class":47},"allow-lan",[41,5721,61],{"class":51},[41,5723,5724],{"class":64},"false\n",[41,5726,5727,5730,5732],{"class":43,"line":109},[41,5728,5729],{"class":47},"mode",[41,5731,61],{"class":51},[41,5733,5734],{"class":95},"rule\n",[41,5736,5737,5740,5742],{"class":43,"line":122},[41,5738,5739],{"class":47},"log-level",[41,5741,61],{"class":51},[41,5743,5744],{"class":95},"info\n",[41,5746,5747,5750,5752],{"class":43,"line":135},[41,5748,5749],{"class":47},"ipv6",[41,5751,61],{"class":51},[41,5753,364],{"class":64},[41,5755,5756],{"class":43,"line":147},[41,5757,1585],{"emptyLinePlaceholder":1584},[41,5759,5760,5763],{"class":43,"line":155},[41,5761,5762],{"class":47},"tun",[41,5764,333],{"class":51},[41,5766,5767,5770,5772],{"class":43,"line":163},[41,5768,5769],{"class":47},"  enable",[41,5771,61],{"class":51},[41,5773,364],{"class":64},[41,5775,5776,5779,5781],{"class":43,"line":171},[41,5777,5778],{"class":47},"  stack",[41,5780,61],{"class":51},[41,5782,5783],{"class":95},"mixed\n",[41,5785,5786,5789,5791],{"class":43,"line":184},[41,5787,5788],{"class":47},"  auto-route",[41,5790,61],{"class":51},[41,5792,364],{"class":64},[41,5794,5795,5798,5800],{"class":43,"line":197},[41,5796,5797],{"class":47},"  auto-detect-interface",[41,5799,61],{"class":51},[41,5801,364],{"class":64},[41,5803,5804],{"class":43,"line":205},[41,5805,1585],{"emptyLinePlaceholder":1584},[41,5807,5808,5811],{"class":43,"line":218},[41,5809,5810],{"class":47},"proxies",[41,5812,333],{"class":51},[41,5814,5815,5818,5821,5823],{"class":43,"line":231},[41,5816,5817],{"class":51},"  - ",[41,5819,5820],{"class":47},"name",[41,5822,61],{"class":51},[41,5824,5825],{"class":95},"家庭-WG\n",[41,5827,5828,5831,5833],{"class":43,"line":239},[41,5829,5830],{"class":47},"    type",[41,5832,61],{"class":51},[41,5834,5835],{"class":95},"wireguard\n",[41,5837,5838],{"class":43,"line":252},[41,5839,1585],{"emptyLinePlaceholder":1584},[41,5841,5842],{"class":43,"line":265},[41,5843,5844],{"class":1220},"    # WireGuard客户端Peer中的Endpoint\n",[41,5846,5847,5850,5852],{"class":43,"line":278},[41,5848,5849],{"class":47},"    server",[41,5851,61],{"class":51},[41,5853,5854],{"class":95},"ddns.example.com\n",[41,5856,5857,5860,5862],{"class":43,"line":291},[41,5858,5859],{"class":47},"    port",[41,5861,61],{"class":51},[41,5863,5864],{"class":64},"51820\n",[41,5866,5867],{"class":43,"line":299},[41,5868,1585],{"emptyLinePlaceholder":1584},[41,5870,5871],{"class":43,"line":311},[41,5872,5873],{"class":1220},"    # WireGuard客户端Interface中的Addresses\n",[41,5875,5877],{"class":43,"line":5876},26,[41,5878,5879],{"class":1220},"    # 例如原配置为10.10.10.2\u002F32，这里只填写10.10.10.2\n",[41,5881,5883,5886,5888],{"class":43,"line":5882},27,[41,5884,5885],{"class":47},"    ip",[41,5887,61],{"class":51},[41,5889,5890],{"class":64},"10.10.10.2\n",[41,5892,5894],{"class":43,"line":5893},28,[41,5895,1585],{"emptyLinePlaceholder":1584},[41,5897,5899],{"class":43,"line":5898},29,[41,5900,5901],{"class":1220},"    # WireGuard客户端Interface中的Private key\n",[41,5903,5905,5908,5910],{"class":43,"line":5904},30,[41,5906,5907],{"class":47},"    private-key",[41,5909,61],{"class":51},[41,5911,5912],{"class":95},"\"gBzeTbZH...\"\n",[41,5914,5916],{"class":43,"line":5915},31,[41,5917,1585],{"emptyLinePlaceholder":1584},[41,5919,5921],{"class":43,"line":5920},32,[41,5922,5923],{"class":1220},"    # WireGuard客户端Peer中的Public key，即服务器公钥\n",[41,5925,5927],{"class":43,"line":5926},33,[41,5928,5929],{"class":1220},"    # 不要填写Interface中的客户端公钥\n",[41,5931,5933,5936,5938],{"class":43,"line":5932},34,[41,5934,5935],{"class":47},"    public-key",[41,5937,61],{"class":51},[41,5939,5940],{"class":95},"\"UUS0nrKE...\"\n",[41,5942,5944],{"class":43,"line":5943},35,[41,5945,1585],{"emptyLinePlaceholder":1584},[41,5947,5949],{"class":43,"line":5948},36,[41,5950,5951],{"class":1220},"    # WireGuard客户端Peer中的Preshared key\n",[41,5953,5955,5958,5960],{"class":43,"line":5954},37,[41,5956,5957],{"class":47},"    pre-shared-key",[41,5959,61],{"class":51},[41,5961,5962],{"class":95},"\"NGYvFsCle...\"\n",[41,5964,5966],{"class":43,"line":5965},38,[41,5967,1585],{"emptyLinePlaceholder":1584},[41,5969,5971,5974],{"class":43,"line":5970},39,[41,5972,5973],{"class":47},"    allowed-ips",[41,5975,333],{"class":51},[41,5977,5979,5982],{"class":43,"line":5978},40,[41,5980,5981],{"class":51},"      - ",[41,5983,5984],{"class":95},"0.0.0.0\u002F0\n",[41,5986,5988],{"class":43,"line":5987},41,[41,5989,1585],{"emptyLinePlaceholder":1584},[41,5991,5993,5996,5998],{"class":43,"line":5992},42,[41,5994,5995],{"class":47},"    udp",[41,5997,61],{"class":51},[41,5999,364],{"class":64},[41,6001,6003,6006,6008],{"class":43,"line":6002},43,[41,6004,6005],{"class":47},"    persistent-keepalive",[41,6007,61],{"class":51},[41,6009,6010],{"class":64},"25\n",[41,6012,6014,6017,6019],{"class":43,"line":6013},44,[41,6015,6016],{"class":47},"    mtu",[41,6018,61],{"class":51},[41,6020,6021],{"class":64},"1380\n",[41,6023,6025],{"class":43,"line":6024},45,[41,6026,1585],{"emptyLinePlaceholder":1584},[41,6028,6030,6033],{"class":43,"line":6029},46,[41,6031,6032],{"class":47},"rules",[41,6034,333],{"class":51},[41,6036,6038],{"class":43,"line":6037},47,[41,6039,6040],{"class":1220},"  # 家庭局域网网段\n",[41,6042,6044,6046],{"class":43,"line":6043},48,[41,6045,5817],{"class":51},[41,6047,6048],{"class":95},"IP-CIDR,10.0.0.0\u002F24,家庭-WG,no-resolve\n",[41,6050,6052],{"class":43,"line":6051},49,[41,6053,1585],{"emptyLinePlaceholder":1584},[41,6055,6057],{"class":43,"line":6056},50,[41,6058,6059],{"class":1220},"  # WireGuard隧道网段\n",[41,6061,6063,6065],{"class":43,"line":6062},51,[41,6064,5817],{"class":51},[41,6066,6067],{"class":95},"IP-CIDR,10.10.10.0\u002F24,家庭-WG,no-resolve\n",[41,6069,6071],{"class":43,"line":6070},52,[41,6072,1585],{"emptyLinePlaceholder":1584},[41,6074,6076],{"class":43,"line":6075},53,[41,6077,6078],{"class":1220},"  # 其他网络流量保持直连\n",[41,6080,6082,6084],{"class":43,"line":6081},54,[41,6083,5817],{"class":51},[41,6085,6086],{"class":95},"MATCH,DIRECT\n",[4622,6088,6089],{"id":6089},"修改模板中的参数",[20,6091,6092],{},"需要按照自己的WireGuard配置修改以下内容。",[20,6094,6095],{},[530,6096,6097,6098],{},"1. ",[27,6099,5571],{},[20,6101,6102],{},"将：",[32,6104,6106],{"className":1762,"code":6105,"language":1764,"meta":37,"style":37},"server: ddns.example.com\n",[27,6107,6108],{"__ignoreMap":37},[41,6109,6110,6112,6114],{"class":43,"line":44},[41,6111,5571],{"class":47},[41,6113,61],{"class":51},[41,6115,5854],{"class":95},[20,6117,6118],{},"改成WireGuard客户端Peer中Endpoint冒号前面的域名或公网IP。",[20,6120,6121],{},"例如Endpoint为：",[32,6123,6126],{"className":6124,"code":6125,"language":1621,"meta":37},[1619],"ddns.example.com:51820\n",[27,6127,6125],{"__ignoreMap":37},[20,6129,6130],{},"那么填写：",[32,6132,6133],{"className":1762,"code":6105,"language":1764,"meta":37,"style":37},[27,6134,6135],{"__ignoreMap":37},[41,6136,6137,6139,6141],{"class":43,"line":44},[41,6138,5571],{"class":47},[41,6140,61],{"class":51},[41,6142,5854],{"class":95},[20,6144,6145],{},[530,6146,6147,6148],{},"2. ",[27,6149,1771],{},[20,6151,6152],{},"填写Endpoint冒号后面的端口，例如：",[32,6154,6156],{"className":1762,"code":6155,"language":1764,"meta":37,"style":37},"port: 51820\n",[27,6157,6158],{"__ignoreMap":37},[41,6159,6160,6162,6164],{"class":43,"line":44},[41,6161,1771],{"class":47},[41,6163,61],{"class":51},[41,6165,5864],{"class":64},[20,6167,6168],{},[530,6169,6170,6171],{},"3. ",[27,6172,5590],{},[20,6174,6175],{},"填写WireGuard客户端Interface中的Addresses，但不要填写CIDR后缀。",[20,6177,6178],{},"例如原配置是：",[32,6180,6183],{"className":6181,"code":6182,"language":1621,"meta":37},[1619],"10.10.10.2\u002F32\n",[27,6184,6182],{"__ignoreMap":37},[20,6186,6187],{},"Clash Meta中填写：",[32,6189,6191],{"className":1762,"code":6190,"language":1764,"meta":37,"style":37},"ip: 10.10.10.2\n",[27,6192,6193],{"__ignoreMap":37},[41,6194,6195,6197,6199],{"class":43,"line":44},[41,6196,5590],{"class":47},[41,6198,61],{"class":51},[41,6200,5890],{"class":64},[20,6202,6203],{},[530,6204,6205,6206],{},"4. ",[27,6207,5603],{},[20,6209,6210],{},"填写WireGuard客户端Interface中的Private key：",[32,6212,6214],{"className":1762,"code":6213,"language":1764,"meta":37,"style":37},"private-key: \"客户端私钥\"\n",[27,6215,6216],{"__ignoreMap":37},[41,6217,6218,6220,6222],{"class":43,"line":44},[41,6219,5603],{"class":47},[41,6221,61],{"class":51},[41,6223,6224],{"class":95},"\"客户端私钥\"\n",[20,6226,6227],{},[530,6228,6229,6230],{},"5. ",[27,6231,5613],{},[20,6233,6234],{},"填写WireGuard客户端Peer中的Public key，也就是服务器公钥：",[32,6236,6238],{"className":1762,"code":6237,"language":1764,"meta":37,"style":37},"public-key: \"服务器公钥\"\n",[27,6239,6240],{"__ignoreMap":37},[41,6241,6242,6244,6246],{"class":43,"line":44},[41,6243,5613],{"class":47},[41,6245,61],{"class":51},[41,6247,6248],{"class":95},"\"服务器公钥\"\n",[20,6250,6251],{},"不要误填Interface中的Public key。Interface中的Public key属于当前客户端，Peer中的Public key才属于服务器。",[20,6253,6254],{},[530,6255,6256,6257],{},"6. ",[27,6258,5623],{},[20,6260,6261],{},"填写WireGuard客户端Peer中的Preshared key：",[32,6263,6265],{"className":1762,"code":6264,"language":1764,"meta":37,"style":37},"pre-shared-key: \"预共享密钥\"\n",[27,6266,6267],{"__ignoreMap":37},[41,6268,6269,6271,6273],{"class":43,"line":44},[41,6270,5623],{"class":47},[41,6272,61],{"class":51},[41,6274,6275],{"class":95},"\"预共享密钥\"\n",[20,6277,6278,6279,892],{},"WireGuard密钥是Base64字符串，复制时不要漏掉末尾可能存在的",[27,6280,4558],{},[20,6282,6283],{},[530,6284,6285,6286],{},"7. ",[27,6287,6032],{},[20,6289,6290],{},"将规则中的家庭局域网网段和WireGuard隧道网段改成自己的实际网段。",[20,6292,1669],{},[32,6294,6296],{"className":1762,"code":6295,"language":1764,"meta":37,"style":37},"rules:\n  - IP-CIDR,10.0.0.0\u002F24,家庭-WG,no-resolve\n  - IP-CIDR,10.10.10.0\u002F24,家庭-WG,no-resolve\n  - MATCH,DIRECT\n",[27,6297,6298,6304,6310,6316],{"__ignoreMap":37},[41,6299,6300,6302],{"class":43,"line":44},[41,6301,6032],{"class":47},[41,6303,333],{"class":51},[41,6305,6306,6308],{"class":43,"line":55},[41,6307,5817],{"class":51},[41,6309,6048],{"class":95},[41,6311,6312,6314],{"class":43,"line":71},[41,6313,5817],{"class":51},[41,6315,6067],{"class":95},[41,6317,6318,6320],{"class":43,"line":79},[41,6319,5817],{"class":51},[41,6321,6086],{"class":95},[20,6323,6324],{},"表示：",[1680,6326,6327,6333,6338],{},[614,6328,6329,6330,6332],{},"访问",[27,6331,5117],{},"家庭局域网时走WireGuard；",[614,6334,6329,6335,6337],{},[27,6336,5336],{},"WireGuard隧道网段时走WireGuard；",[614,6339,6340],{},"其他流量全部直连，不经过家庭宽带。",[4622,6342,6343],{"id":6343},"关于allowed-ips",[20,6345,6346],{},"模板中的：",[32,6348,6350],{"className":1762,"code":6349,"language":1764,"meta":37,"style":37},"allowed-ips:\n  - 0.0.0.0\u002F0\n",[27,6351,6352,6359],{"__ignoreMap":37},[41,6353,6354,6357],{"class":43,"line":44},[41,6355,6356],{"class":47},"allowed-ips",[41,6358,333],{"class":51},[41,6360,6361,6363],{"class":43,"line":55},[41,6362,5817],{"class":51},[41,6364,5984],{"class":95},[20,6366,6367],{},"可以保持不变。",[20,6369,6370,6371,6373],{},"它表示这个WireGuard代理节点能够承载全部IPv4流量，但实际哪些流量交给WireGuard，仍然由最下面的",[27,6372,6032],{},"决定。",[20,6375,1669],{},[32,6377,6378],{"className":1762,"code":6295,"language":1764,"meta":37,"style":37},[27,6379,6380,6386,6392,6398],{"__ignoreMap":37},[41,6381,6382,6384],{"class":43,"line":44},[41,6383,6032],{"class":47},[41,6385,333],{"class":51},[41,6387,6388,6390],{"class":43,"line":55},[41,6389,5817],{"class":51},[41,6391,6048],{"class":95},[41,6393,6394,6396],{"class":43,"line":71},[41,6395,5817],{"class":51},[41,6397,6067],{"class":95},[41,6399,6400,6402],{"class":43,"line":79},[41,6401,5817],{"class":51},[41,6403,6086],{"class":95},[20,6405,6406],{},"在这套规则下，只有家庭内网和WireGuard隧道网段走WireGuard，其他互联网流量继续直连。",[20,6408,6409],{},"需要注意，WireGuard服务端Peer中的Allowed IPs仍然应该是分配给该客户端的地址，例如：",[32,6411,6413],{"className":6412,"code":6182,"language":1621,"meta":37},[1619],[27,6414,6182],{"__ignoreMap":37},[20,6416,6417,6418,892],{},"不要把WireGuard服务端Peer中的Allowed IPs改成",[27,6419,6420],{},"0.0.0.0\u002F0",[4622,6422,6423],{"id":6423},"导入并测试",[20,6425,6426],{},"将YAML文件导入支持Mihomo \u002F Clash Meta内核的客户端，然后：",[611,6428,6429,6432,6435,6438,6441],{},[614,6430,6431],{},"关闭独立的WireGuard客户端隧道；",[614,6433,6434],{},"在Clash Meta中选择刚才导入的配置；",[614,6436,6437],{},"使用“规则”模式；",[614,6439,6440],{},"打开Clash Meta连接开关；",[614,6442,6443],{},"访问家庭内网设备进行测试。",[20,6445,6446],{},"例如访问软路由：",[32,6448,6451],{"className":6449,"code":6450,"language":1621,"meta":37},[1619],"http:\u002F\u002F10.0.0.1\n",[27,6452,6450],{"__ignoreMap":37},[20,6454,6455],{},"或者在iOS文件App中连接NAS：",[32,6457,6460],{"className":6458,"code":6459,"language":1621,"meta":37},[1619],"smb:\u002F\u002F10.0.0.5\n",[27,6461,6459],{"__ignoreMap":37},[20,6463,6464],{},"同时可以进入WireGuard服务端，查看对应Peer的Latest Handshake。",[20,6466,6467],{},"如果开启Clash Meta后握手时间刷新，并且能够访问家庭内网设备，就说明配置成功。",[4622,6469,6470],{"id":6470},"常见问题",[20,6472,6473],{},"如果YAML能够启动，但无法产生WireGuard握手，优先检查：",[611,6475,6476,6481,6486,6494,6499,6502,6505],{},[614,6477,6478,6480],{},[27,6479,5613],{},"是否误填成客户端公钥；",[614,6482,6483,6485],{},[27,6484,5603],{},"是否为当前客户端私钥；",[614,6487,6488,6490,6491,6493],{},[27,6489,5623],{},"是否完整，末尾的",[27,6492,4558],{},"是否遗漏；",[614,6495,6496,6498],{},[27,6497,5590],{},"是否与服务端分配给该Peer的地址一致；",[614,6500,6501],{},"Endpoint域名和端口是否正确；",[614,6503,6504],{},"软路由防火墙是否已经放行WireGuard端口；",[614,6506,6507],{},"独立WireGuard客户端是否仍然处于开启状态。",[20,6509,6510],{},"如果报错类似：",[32,6512,6515],{"className":6513,"code":6514,"language":1621,"meta":37},[1619],"decode pre shared key: illegal base64 data\n",[27,6516,6514],{"__ignoreMap":37},[20,6518,6519,6520,6522,6523,6525],{},"通常说明",[27,6521,5623],{},"复制不完整，常见原因是末尾的",[27,6524,4558],{},"被遗漏。",[1016,6527,6529],{"id":6528},"将wireguard加入包含代理节点的yaml","将WireGuard加入包含代理节点的YAML",[12,6531,6533],{"id":6532},"alist","Alist",[16,6535,5099],{"id":6536},"简介-1",[16,6538,891],{"id":6539},"安装-1",[16,6541,6543],{"id":6542},"webui","WebUI",[16,6545,6547],{"id":6546},"s3协议","S3协议",[1016,6549,6551],{"id":6550},"开启s3","开启S3",[20,6553,6554],{},"先进行使能S3协议。",[20,6556,6557],{},[426,6558],{"alt":37,"src":6559},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787154451682-f5d538c1.webp",[20,6561,5069,6562,6565,6566,6569,6570,892],{},[27,6563,6564],{},"\u002Fopt\u002F1panel\u002Fapps\u002Falist\u002Falist\u002Fdata\u002Fdata","目录修改掉如下图的设置从",[27,6567,6568],{},"false","改成",[27,6571,130],{},[32,6573,6577],{"className":6574,"code":6575,"language":6576,"meta":37,"style":37},"language-json shiki shiki-themes github-light github-dark","\"s3\": {\n  \"enable\": true,\n  \"port\": 5246,\n  \"ssl\": false\n}\n","json",[27,6578,6579,6587,6599,6611,6620],{"__ignoreMap":37},[41,6580,6581,6584],{"class":43,"line":44},[41,6582,6583],{"class":95},"\"s3\"",[41,6585,6586],{"class":51},": {\n",[41,6588,6589,6592,6594,6596],{"class":43,"line":55},[41,6590,6591],{"class":64},"  \"enable\"",[41,6593,61],{"class":51},[41,6595,130],{"class":64},[41,6597,6598],{"class":51},",\n",[41,6600,6601,6604,6606,6609],{"class":43,"line":71},[41,6602,6603],{"class":64},"  \"port\"",[41,6605,61],{"class":51},[41,6607,6608],{"class":64},"5246",[41,6610,6598],{"class":51},[41,6612,6613,6616,6618],{"class":43,"line":79},[41,6614,6615],{"class":64},"  \"ssl\"",[41,6617,61],{"class":51},[41,6619,5724],{"class":64},[41,6621,6622],{"class":43,"line":87},[41,6623,6624],{"class":51},"}\n",[20,6626,6627],{},[426,6628],{"alt":37,"src":6629},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787154352253-3de75e7f.webp",[20,6631,6632],{},"最后点击重启。",[20,6634,6635],{},[426,6636],{"alt":37,"src":6637},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787154532487-c9f49f91.webp",[1016,6639,6641],{"id":6640},"测试s3链接","测试S3链接",[20,6643,6644],{},"在部署AList服务器本身敲",[32,6646,6648],{"className":406,"code":6647,"language":408,"meta":37,"style":37},"curl -i http:\u002F\u002F127.0.0.1:5246\u002F\n",[27,6649,6650],{"__ignoreMap":37},[41,6651,6652,6655,6658],{"class":43,"line":44},[41,6653,6654],{"class":415},"curl",[41,6656,6657],{"class":64}," -i",[41,6659,6660],{"class":95}," http:\u002F\u002F127.0.0.1:5246\u002F\n",[20,6662,6663,6664,6667],{},"如果显示",[27,6665,6666],{},"HTTP\u002F1.1 200 OK","，那证明是OK的。",[20,6669,6670],{},[426,6671],{"alt":37,"src":6672},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787154636455-dff7a529.webp",[20,6674,6675,6676,6679],{},"后续我也把他反向代理成了一个域名",[27,6677,6678],{},"s3.tungchiahui.cn","，经测试，也没毛病：",[20,6681,6682],{},[426,6683],{"alt":37,"src":6684},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787155243623-c19dfc25.webp",[1016,6686,6688],{"id":6687},"配置s3","配置S3",[20,6690,6691],{},"在AList的管理界面找到设置里的S3,然后点底下的Add来添加哪个路径为桶：",[1680,6693,6694,6697,6700,6703],{},[614,6695,6696],{},"Name就是桶的名字",[614,6698,6699],{},"Path是你想让AList的哪个路径作为桶子的根目录",[614,6701,6702],{},"S3 access key id 是S3授权ID",[614,6704,6705],{},"S3 secret access key是S3授权密钥",[20,6707,6708],{},[426,6709],{"alt":37,"src":6710},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787154999413-e747a0fd.webp",[1016,6712,6714],{"id":6713},"测试s3","测试S3",[20,6716,6717],{},"先准备好你的配置",[32,6719,6722],{"className":6720,"code":6721,"language":1621,"meta":37},[1619],"Endpoint:\nhttp:\u002F\u002F127.0.0.1:5246\n或者\nhttps:\u002F\u002Fs3.tungchiahui.cn\n\nBucket:\nObjectStorage\n\nAccess Key:\nAList 后台生成的 S3 Access Key ID\n\nSecret Key:\nAList 后台生成的 S3 Secret Access Key\n\nRegion:\nus-east-1\n",[27,6723,6721],{"__ignoreMap":37},[20,6725,6726],{},"使用一个可以使用S3的软件，比如我使用我做的VScode插件来进行测试。",[20,6728,6729,6730],{},"插件链接如下：\n",[4158,6731,6732],{"href":6732,"rel":6733},"https:\u002F\u002Fmarketplace.visualstudio.com\u002Fitems?itemName=tungchiahui.md-image-uploader",[4162],[20,6735,6736,6737,6740],{},"我把配置填到了VScode中的",[27,6738,6739],{},"settings.json","使用我的插件进行了测试：",[32,6742,6744],{"className":6574,"code":6743,"language":6576,"meta":37,"style":37},"{\n  \"mdImageUploader.s3.accessKeyId\": \"2Vxxxxxxxxxxxxxxxxxxxxxx\",\n  \"mdImageUploader.s3.secretAccessKey\": \"FWx6xxxxxxxxxxxxxxxxxx\",\n  \"mdImageUploader.s3.endpoint\": \"https:\u002F\u002Fs3.tungchiahui.cn\",\n  \"mdImageUploader.s3.region\": \"us-east-1\",\n  \"mdImageUploader.s3.bucket\": \"ObjectStorage\",\n  \"mdImageUploader.cdnUrl\": \"https:\u002F\u002Fcdn.tungchiahui.cn\",\n  \"mdImageUploader.datedUploadPath\": \"\u002Ftungwebsite\u002Fassets\u002Fimages\",\n  \"mdImageUploader.undatedUploadPath\": \"\u002Ftungwebsite\u002Fassets\u002Fimages\u002Fundate\"\n}\n",[27,6745,6746,6751,6763,6775,6787,6799,6811,6823,6835,6845],{"__ignoreMap":37},[41,6747,6748],{"class":43,"line":44},[41,6749,6750],{"class":51},"{\n",[41,6752,6753,6756,6758,6761],{"class":43,"line":55},[41,6754,6755],{"class":64},"  \"mdImageUploader.s3.accessKeyId\"",[41,6757,61],{"class":51},[41,6759,6760],{"class":95},"\"2Vxxxxxxxxxxxxxxxxxxxxxx\"",[41,6762,6598],{"class":51},[41,6764,6765,6768,6770,6773],{"class":43,"line":71},[41,6766,6767],{"class":64},"  \"mdImageUploader.s3.secretAccessKey\"",[41,6769,61],{"class":51},[41,6771,6772],{"class":95},"\"FWx6xxxxxxxxxxxxxxxxxx\"",[41,6774,6598],{"class":51},[41,6776,6777,6780,6782,6785],{"class":43,"line":79},[41,6778,6779],{"class":64},"  \"mdImageUploader.s3.endpoint\"",[41,6781,61],{"class":51},[41,6783,6784],{"class":95},"\"https:\u002F\u002Fs3.tungchiahui.cn\"",[41,6786,6598],{"class":51},[41,6788,6789,6792,6794,6797],{"class":43,"line":87},[41,6790,6791],{"class":64},"  \"mdImageUploader.s3.region\"",[41,6793,61],{"class":51},[41,6795,6796],{"class":95},"\"us-east-1\"",[41,6798,6598],{"class":51},[41,6800,6801,6804,6806,6809],{"class":43,"line":101},[41,6802,6803],{"class":64},"  \"mdImageUploader.s3.bucket\"",[41,6805,61],{"class":51},[41,6807,6808],{"class":95},"\"ObjectStorage\"",[41,6810,6598],{"class":51},[41,6812,6813,6816,6818,6821],{"class":43,"line":109},[41,6814,6815],{"class":64},"  \"mdImageUploader.cdnUrl\"",[41,6817,61],{"class":51},[41,6819,6820],{"class":95},"\"https:\u002F\u002Fcdn.tungchiahui.cn\"",[41,6822,6598],{"class":51},[41,6824,6825,6828,6830,6833],{"class":43,"line":122},[41,6826,6827],{"class":64},"  \"mdImageUploader.datedUploadPath\"",[41,6829,61],{"class":51},[41,6831,6832],{"class":95},"\"\u002Ftungwebsite\u002Fassets\u002Fimages\"",[41,6834,6598],{"class":51},[41,6836,6837,6840,6842],{"class":43,"line":135},[41,6838,6839],{"class":64},"  \"mdImageUploader.undatedUploadPath\"",[41,6841,61],{"class":51},[41,6843,6844],{"class":95},"\"\u002Ftungwebsite\u002Fassets\u002Fimages\u002Fundate\"\n",[41,6846,6847],{"class":43,"line":147},[41,6848,6624],{"class":51},[20,6850,6851],{},"经过测试，文件已经成功被保存到了桶子里。",[20,6853,6854],{},[426,6855],{"alt":37,"src":6856},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787156017266-fa0d943f.webp",[20,6858,6859],{},[426,6860],{"alt":37,"src":6861},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787156156306-94170611.webp",[1016,6863,6864],{"id":6864},"创建文件直链",[20,6866,6867],{},"去AList后台",[32,6869,6873],{"className":6870,"code":6871,"language":6872,"meta":37,"style":37},"language-test shiki shiki-themes github-light github-dark","管理\n→ 设置\n→ 全局\n→ 关闭Sign All\n","test",[27,6874,6875,6880,6885,6890],{"__ignoreMap":37},[41,6876,6877],{"class":43,"line":44},[41,6878,6879],{},"管理\n",[41,6881,6882],{"class":43,"line":55},[41,6883,6884],{},"→ 设置\n",[41,6886,6887],{"class":43,"line":71},[41,6888,6889],{},"→ 全局\n",[41,6891,6892],{"class":43,"line":79},[41,6893,6894],{},"→ 关闭Sign All\n",[20,6896,6897],{},"如果开着 Sign All，关掉。因为只要全局 Sign All 开着，下面单独存储关签名也没用。AList 官方明确说 Sign All 会给所有文件直链添加签名。",[20,6899,6900],{},[426,6901],{"alt":37,"src":6902},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787156596929-05141566.webp",[20,6904,6905],{},[426,6906],{"alt":37,"src":6907},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787156612532-01b09796.webp",[20,6909,6910],{},"然后找到你的存放AList的桶子的存储地点进行编辑。",[20,6912,6913],{},[426,6914],{"alt":37,"src":6915},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787156652655-1141dad8.webp",[20,6917,6918,6919,892],{},"关闭",[27,6920,6921],{},"启用签名 \u002F Enable signing",[20,6923,6924],{},[426,6925],{"alt":37,"src":6926},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787156722613-8c9e13a7.webp",[20,6928,6929],{},"然后保存。",[20,6931,6932,6933,6936],{},"然后你可以通过",[27,6934,6935],{},"![](https:\u002F\u002Falist.tungchiahui.cn\u002Fd\u002FAList文件的路径\u002F文件名.webp)","来访问文件了。",[20,6938,6939,2261],{},[530,6940,6941],{},"高阶操作（可选）",[20,6943,6944,6945,6948,6949,6952,6953,6956],{},"把",[27,6946,6947],{},"cdn.tungchiahui.cn","也和",[27,6950,6951],{},"alist.tungchiahui.cn","同源，然后在腾讯云edgeone里加速，在规则引擎里新加一个",[27,6954,6955],{},"cdn路径前缀增加","的规则。",[20,6958,6959],{},[426,6960],{"alt":37,"src":6961},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787159371048-e2e3749f.webp",[1680,6963,6964,6969,6975,6981],{},[614,6965,6966,6967],{},"HOST选择",[27,6968,6947],{},[614,6970,6971,6972],{},"操作选",[27,6973,6974],{},"回源URL重写",[614,6976,6977,6978],{},"类型选",[27,6979,6980],{},"增加路径前缀",[614,6982,6983,6984],{},"增加路径前缀选",[27,6985,6986],{},"\u002Fd\u002FAList文件的多余路径\u002F",[20,6988,6989,6990,6992,6993,6996,6997,6999,7000,7003,7004,892],{},"比如",[27,6991,6980],{},"我填的",[27,6994,6995],{},"\u002Fd\u002FNAS\u002FObjectStorage","，\n那么我用",[27,6998,6961],{},"\n将会同等于",[27,7001,7002],{},"https:\u002F\u002Falist.tungchiahui.cn\u002Fd\u002FNAS\u002FObjectStorage\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787159371048-e2e3749f.webp",",\n都会回源到我的",[27,7005,7006],{},"https:\u002F\u002F服务器ip地址\u002Fd\u002FNAS\u002FObjectStorage\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787159371048-e2e3749f.webp",[20,7008,7009],{},"再设置一个缓存规则：",[20,7011,7012],{},[426,7013],{"alt":37,"src":7014},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787160214979-6bf621c3.webp",[20,7016,7017],{},"缓存规则可以这样理解：",[1680,7019,7020,7028,7036,7053,7067,7075],{},[614,7021,7022,7025,7027],{},[530,7023,7024],{},"节点缓存 TTL：30 天",[4769,7026],{},"\nEdgeOne 会把图片缓存到边缘节点 30 天。后续访问优先从 CDN 节点返回，可以明显减少 AList、服务器 和 服务器宽带 的压力。",[614,7029,7030,7033,7035],{},[530,7031,7032],{},"强制缓存：关闭",[4769,7034],{},"\n保持关闭更稳妥。如果源站明确要求某些资源不要缓存，EdgeOne 会尊重源站设置，避免把特殊资源错误缓存。",[614,7037,7038,7041,7043,7044,7050,7052],{},[530,7039,7040],{},"Cache Key：查询字符串全部忽略",[4769,7042],{},"\n例如：",[32,7045,7048],{"className":7046,"code":7047,"language":1621,"meta":37},[1619],"xxx.webp\nxxx.webp?a=1\nxxx.webp?a=2\nxxx.webp?a=3\n",[27,7049,7047],{"__ignoreMap":37},[4769,7051],{},"都会被认为是同一个缓存资源。这样可以防止别人不断修改 URL 参数绕过缓存，反复回源打你的 AList 和 服务器，而我这里文件还存储在NAS上，也会进一步防止他反复打我的NAS。",[614,7054,7055,7058,7060,1958,7063,7066],{},[530,7056,7057],{},"忽略大小写：关闭",[4769,7059],{},[27,7061,7062],{},"abc.webp",[27,7064,7065],{},"ABC.webp"," 会被当成两个不同文件，避免不同文件被错误合并到同一个缓存。",[614,7068,7069,7072,7074],{},[530,7070,7071],{},"PHP \u002F JSP \u002F ASP \u002F ASPX：不缓存",[4769,7073],{},"\n这些通常属于动态页面，单独设为不缓存可以防止动态内容被 CDN 长时间缓存。对于纯图片 CDN 来说基本属于防呆设置。",[614,7076,7077,7080,7082,1520,7085,1520,7088,1520,7091,1520,7094,1520,7097,7100],{},[530,7078,7079],{},"图片浏览器缓存 TTL：1 天",[4769,7081],{},[27,7083,7084],{},"jpg",[27,7086,7087],{},"png",[27,7089,7090],{},"gif",[27,7092,7093],{},"bmp",[27,7095,7096],{},"svg",[27,7098,7099],{},"webp"," 等图片会在用户浏览器中缓存 1 天。用户短时间内重复访问时，浏览器可以直接读取本地缓存，连 EdgeOne 都不用重新请求。",[20,7102,7103],{},"最终缓存链路大致如下：",[32,7105,7108],{"className":7106,"code":7107,"language":1621,"meta":37},[1619],"浏览器\n  ↓ 本地缓存 1 天\nEdgeOne\n  ↓ 节点缓存 30 天\nAList\n  ↓\nNAS\n",[27,7109,7107],{"__ignoreMap":37},[20,7111,7112],{},"绝大多数重复访问会停在浏览器或 EdgeOne，不会真正回源到家里的 服务器 和 NAS。",[12,7114,7116],{"id":7115},"minio-自建对象存储","MinIO 自建对象存储",[16,7118,5099],{"id":7119},"简介-2",[2075,7121,7122,7135],{},[2078,7123,7124],{},[2081,7125,7126,7129,7132],{},[2084,7127,7128],{},"项目",[2084,7130,7131],{},"腾讯 COS",[2084,7133,7134],{},"自建 MinIO",[2092,7136,7137,7147,7156,7165,7174,7183,7192,7201,7214,7226,7239,7250,7263,7274,7285,7299],{},[2081,7138,7139,7142,7145],{},[2097,7140,7141],{},"对象存储",[2097,7143,7144],{},"✅",[2097,7146,7144],{},[2081,7148,7149,7152,7154],{},[2097,7150,7151],{},"S3 API",[2097,7153,7144],{},[2097,7155,7144],{},[2081,7157,7158,7161,7163],{},[2097,7159,7160],{},"图片\u002F附件",[2097,7162,7144],{},[2097,7164,7144],{},[2081,7166,7167,7170,7172],{},[2097,7168,7169],{},"Bucket",[2097,7171,7144],{},[2097,7173,7144],{},[2081,7175,7176,7179,7181],{},[2097,7177,7178],{},"SDK 上传",[2097,7180,7144],{},[2097,7182,7144],{},[2081,7184,7185,7188,7190],{},[2097,7186,7187],{},"私有对象\u002F签名 URL",[2097,7189,7144],{},[2097,7191,7144],{},[2081,7193,7194,7197,7199],{},[2097,7195,7196],{},"Versioning",[2097,7198,7144],{},[2097,7200,7144],{},[2081,7202,7203,7206,7209],{},[2097,7204,7205],{},"存储空间",[2097,7207,7208],{},"腾讯提供",[2097,7210,7211],{},[530,7212,7213],{},"吃你服务器硬盘",[2081,7215,7216,7219,7221],{},[2097,7217,7218],{},"带宽",[2097,7220,7208],{},[2097,7222,7223],{},[530,7224,7225],{},"吃学校服务器出口带宽",[2081,7227,7228,7231,7234],{},[2097,7229,7230],{},"高可用",[2097,7232,7233],{},"腾讯负责",[2097,7235,7236],{},[530,7237,7238],{},"你负责",[2081,7240,7241,7244,7246],{},[2097,7242,7243],{},"数据冗余",[2097,7245,7233],{},[2097,7247,7248],{},[530,7249,7238],{},[2081,7251,7252,7255,7258],{},[2097,7253,7254],{},"硬盘损坏",[2097,7256,7257],{},"云厂商处理",[2097,7259,7260],{},[530,7261,7262],{},"可能直接丢数据",[2081,7264,7265,7268,7271],{},[2097,7266,7267],{},"运维",[2097,7269,7270],{},"几乎没有",[2097,7272,7273],{},"Docker、磁盘、备份、升级、安全都自己搞",[2081,7275,7276,7279,7282],{},[2097,7277,7278],{},"费用",[2097,7280,7281],{},"存储+流量",[2097,7283,7284],{},"软件可以自建，但硬盘\u002F服务器\u002F带宽自己承担",[2081,7286,7287,7290,7293],{},[2097,7288,7289],{},"CDN",[2097,7291,7292],{},"很容易接腾讯 CDN\u002FEO",[2097,7294,7295,7296],{},"MinIO 本身",[530,7297,7298],{},"不是 CDN",[2081,7300,7301,7304,7307],{},[2097,7302,7303],{},"可控性",[2097,7305,7306],{},"一般",[2097,7308,7309],{},[530,7310,7311],{},"非常高",[16,7313,891],{"id":7314},"安装-2",[20,7316,7317,7318,4717],{},"首先你需要服务器上安装一个",[27,7319,7320],{},"1panel",[20,7322,7323],{},"进入商店,搜索minio.",[20,7325,7326],{},[426,7327],{"alt":37,"src":7328},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787145834399-2d3916b0.webp",[20,7330,7331],{},"点击安装.",[20,7333,7334],{},"大多数设置都默认即可,但账号密码要自己填写,这个端口外部访问这里,如果你的服务器在内网,可以选择打开,如果你的服务器的IP是一个公网IP,那么不建议你打开.",[20,7336,7337],{},[426,7338],{"alt":37,"src":7339},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787145965960-68b6e978.webp",[2075,7341,7342,7352],{},[2078,7343,7344],{},[2081,7345,7346,7349],{},[2084,7347,7348],{},"配置项",[2084,7350,7351],{},"建议",[2092,7353,7354,7364,7372,7380,7388,7398,7408,7420,7428,7436],{},[2081,7355,7356,7359],{},[2097,7357,7358],{},"名称",[2097,7360,7361],{},[27,7362,7363],{},"minio",[2081,7365,7366,7369],{},[2097,7367,7368],{},"版本",[2097,7370,7371],{},"选 1Panel 当前提供的稳定版本",[2081,7373,7374,7377],{},[2097,7375,7376],{},"用户",[2097,7378,7379],{},"自己设一个，不要用太简单的",[2081,7381,7382,7385],{},[2097,7383,7384],{},"密码",[2097,7386,7387],{},"自己设一个密码复杂点的",[2081,7389,7390,7393],{},[2097,7391,7392],{},"WebUI 端口",[2097,7394,7395],{},[27,7396,7397],{},"9001",[2081,7399,7400,7403],{},[2097,7401,7402],{},"S3 API 端口",[2097,7404,7405],{},[27,7406,7407],{},"9000",[2081,7409,7410,7413],{},[2097,7411,7412],{},"会话持续时间",[2097,7414,7415,7416,7419],{},"默认 ",[27,7417,7418],{},"12h"," 即可",[2081,7421,7422,7425],{},[2097,7423,7424],{},"启用 WebUI",[2097,7426,7427],{},"开",[2081,7429,7430,7433],{},[2097,7431,7432],{},"WebUI 动画",[2097,7434,7435],{},"随意",[2081,7437,7438,7441],{},[2097,7439,7440],{},"端口外部访问",[2097,7442,7443],{},[530,7444,7445],{},"建议不开公网暴露,但如果测试的话,先开公网暴露也可以.",[20,7447,7448],{},"最后点击安装.",[20,7450,7451],{},[426,7452],{"alt":37,"src":7453},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787146064891-460b603b.webp",[16,7455,7457],{"id":7456},"配置minio","配置MinIO",[1016,7459,7461],{"id":7460},"登陆minio","登陆MinIO",[20,7463,7464,7465,1050],{},"在浏览器输入",[27,7466,7467],{},"服务器ip:9001",[20,7469,7470,7471],{},"比如我这个内网",[27,7472,7473],{},"10.0.0.4:9001",[20,7475,7476],{},[426,7477],{"alt":37,"src":7478},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147091527-f99d5032.webp",[20,7480,7481],{},"然后登陆账号密码.",[1016,7483,7484],{"id":7484},"测试桶",[20,7486,7487,7488],{},"创建一个桶,比如我这里叫",[27,7489,6872],{},[20,7491,7492],{},[426,7493],{"alt":37,"src":7494},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147218585-a9d82f0b.webp",[20,7496,7497],{},"再随便上传一张图片试试.",[20,7499,7500],{},[426,7501],{"alt":37,"src":7502},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147308943-431e0c9c.webp",[20,7504,7505],{},[426,7506],{"alt":37,"src":7507},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147318544-4cd5e37f.webp",[20,7509,7510],{},[426,7511],{"alt":37,"src":7512},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147349844-1421edc4.webp",[1016,7514,7516],{"id":7515},"测试s3协议","测试S3协议",[20,7518,7519,7520,1050],{},"S3协议的网址应该是",[27,7521,7522],{},"服务器ip:9000",[20,7524,7470,7525],{},[27,7526,7527],{},"10.0.0.4:9000",[20,7529,7530],{},"在你电脑上测试 S3 API 健康状态：",[32,7532,7534],{"className":406,"code":7533,"language":408,"meta":37,"style":37},"curl -i http:\u002F\u002F10.0.0.4:9000\u002Fminio\u002Fhealth\u002Flive\n",[27,7535,7536],{"__ignoreMap":37},[41,7537,7538,7540,7542],{"class":43,"line":44},[41,7539,6654],{"class":415},[41,7541,6657],{"class":64},[41,7543,7544],{"class":95}," http:\u002F\u002F10.0.0.4:9000\u002Fminio\u002Fhealth\u002Flive\n",[20,7546,6663,7547,6667],{},[27,7548,6666],{},[20,7550,7551],{},[426,7552],{"alt":37,"src":7553},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147506873-538da12a.webp",[20,7555,7556],{},"同样，测试下面这个是否S3就绪：",[32,7558,7560],{"className":406,"code":7559,"language":408,"meta":37,"style":37},"curl -i http:\u002F\u002F10.0.0.4:9000\u002Fminio\u002Fhealth\u002Fready\n",[27,7561,7562],{"__ignoreMap":37},[41,7563,7564,7566,7568],{"class":43,"line":44},[41,7565,6654],{"class":415},[41,7567,6657],{"class":64},[41,7569,7570],{"class":95}," http:\u002F\u002F10.0.0.4:9000\u002Fminio\u002Fhealth\u002Fready\n",[20,7572,6663,7573,6667],{},[27,7574,6666],{},[20,7576,7577],{},[426,7578],{"alt":37,"src":7579},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787147577638-0f060165.webp",[1016,7581,7583],{"id":7582},"接入alist测试","接入AList测试",[20,7585,7586],{},[426,7587],{"alt":37,"src":7588},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787148971335-5ead1508.webp",[20,7590,7591],{},[426,7592],{"alt":37,"src":7593},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787149002738-17bac9d7.webp",[20,7595,7596],{},"这个一定要开着。",[20,7598,7599],{},[426,7600],{"alt":37,"src":7601},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787149013096-2f2eba16.webp",[20,7603,7604],{},"配置完后，可以返回文件列表，发现刚才的文件可以被正常查看了。",[20,7606,7607],{},[426,7608],{"alt":37,"src":7609},"https:\u002F\u002Fcdn.tungchiahui.cn\u002Ftungwebsite\u002Fassets\u002Fimages\u002F2024\u002F03\u002F30\u002F1787149035102-0dba3465.webp",[7611,7612,7613],"style",{},"html pre.shiki code .s9eBZ, html code.shiki .s9eBZ{--shiki-default:#22863A;--shiki-dark:#85E89D}html pre.shiki code .sVt8B, html code.shiki .sVt8B{--shiki-default:#24292E;--shiki-dark:#E1E4E8}html pre.shiki code .sj4cs, html code.shiki .sj4cs{--shiki-default:#005CC5;--shiki-dark:#79B8FF}html pre.shiki code .sZZnC, html code.shiki .sZZnC{--shiki-default:#032F62;--shiki-dark:#9ECBFF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html pre.shiki code .sScJk, html code.shiki .sScJk{--shiki-default:#6F42C1;--shiki-dark:#B392F0}html pre.shiki code .sJ8bj, html code.shiki .sJ8bj{--shiki-default:#6A737D;--shiki-dark:#6A737D}html pre.shiki code .szBVR, html code.shiki .szBVR{--shiki-default:#D73A49;--shiki-dark:#F97583}",{"title":37,"searchDepth":55,"depth":55,"links":7615},[7616,7617,7618,7619,7620,7621,7622,7623,7624,7625,7626,7627],{"id":14,"depth":71,"text":14},{"id":522,"depth":71,"text":523},{"id":1125,"depth":71,"text":1125},{"id":1366,"depth":71,"text":1366},{"id":1450,"depth":71,"text":1451},{"id":4122,"depth":71,"text":4123},{"id":4141,"depth":71,"text":4142},{"id":4145,"depth":71,"text":4145},{"id":4469,"depth":71,"text":4470},{"id":5095,"depth":71,"text":5096},{"id":6532,"depth":71,"text":6533},{"id":7115,"depth":71,"text":7116},0,"0900","2024-03-30","2024-03-30-linux-jiao-cheng","\u002Fwiki\u002F2024-03-30-linux-jiao-cheng","Linux教程","md",false,{},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0900-qi-ta-cao-zuo",{"title":5,"description":37},"wiki\u002F2024-03-30-Linux教程\u002F0900-其他操作","Ohf0e_dNtC5I_aF2DEZNoHkdhDgGNGO47oH0I8JFPMA",[7642,7648,7654,7660,7666,7672,7678,7684,7690,7692],{"path":7643,"stem":7644,"title":7645,"authors":7646,"date":7630,"chapterOrder":7647,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0100-fa-xing-ban-tui-jian","wiki\u002F2024-03-30-Linux教程\u002F0100-发行版推荐","发行版推荐",[7],"0100",{"path":7649,"stem":7650,"title":7651,"authors":7652,"date":7630,"chapterOrder":7653,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0200-linux-zhuang-ji-jiao-cheng","wiki\u002F2024-03-30-Linux教程\u002F0200-Linux装机教程","Linux装机教程",[7],"0200",{"path":7655,"stem":7656,"title":7657,"authors":7658,"date":7630,"chapterOrder":7659,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0300-an-zhuang-bi-bei-pei-zhi","wiki\u002F2024-03-30-Linux教程\u002F0300-安装必备配置","安装必备配置",[7],"0300",{"path":7661,"stem":7662,"title":7663,"authors":7664,"date":7630,"chapterOrder":7665,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0400-ming-ling-jiao-cheng-chang-qi-ji-lei","wiki\u002F2024-03-30-Linux教程\u002F0400-命令教程(长期积累)","命令教程(长期积累)",[7],"0400",{"path":7667,"stem":7668,"title":7669,"authors":7670,"date":7630,"chapterOrder":7671,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0500-ge-zhong-huan-jing-pei-zhi","wiki\u002F2024-03-30-Linux教程\u002F0500-各种环境配置","各种环境配置",[7],"0500",{"path":7673,"stem":7674,"title":7675,"authors":7676,"date":7630,"chapterOrder":7677,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0600-qi-ta-ke-xuan-pei-zhi","wiki\u002F2024-03-30-Linux教程\u002F0600-其他可选配置","其他可选配置",[7],"0600",{"path":7679,"stem":7680,"title":7681,"authors":7682,"date":7630,"chapterOrder":7683,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0700-qemu-kvm-xu-ni-ji","wiki\u002F2024-03-30-Linux教程\u002F0700-QEMU-KVM虚拟机","QEMU-KVM虚拟机",[7],"0700",{"path":7685,"stem":7686,"title":7687,"authors":7688,"date":7630,"chapterOrder":7689,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},"\u002Fwiki\u002F2024-03-30-linux-jiao-cheng\u002F0800-tuo-zhan-gong-neng","wiki\u002F2024-03-30-Linux教程\u002F0800-拓展功能","拓展功能",[7],"0800",{"path":7637,"stem":7639,"title":5,"authors":7691,"date":7630,"chapterOrder":7629,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":7635},[7],{"path":7632,"stem":7693,"title":7633,"authors":7694,"date":7630,"chapterOrder":7695,"chapterDepth":7628,"docKey":7631,"docRoot":7632,"docTitle":7633,"isWikiDoc":1584,"isWikiIndex":1584},"wiki\u002F2024-03-30-Linux教程\u002Findex",[7],null,[7697,7699,7702,7705],{"name":7,"image":7698},"\u002Fimages\u002Fmember_photo\u002F董佳辉.jpg",{"name":7700,"image":7701},"宫金良","\u002Fimages\u002Fmember_photo\u002F宫金良.jpg",{"name":7703,"image":7704},"巩丽","\u002Fimages\u002Fmember_photo\u002F巩丽.png",{"name":7706,"image":7707},"张彦斐","\u002Fimages\u002Fmember_photo\u002F张彦斐.jpg",1792431905051]