오류 의미 이해하기: 유효한 YAML이 항상 유효한 Mihomo 구성은 아니다
yaml: unmarshal errors는 보통 프로그램이 YAML을 내부 구성 구조로 바꾸는 중 하나 이상의 키나 값을 예상 필드에 넣지 못했다는 뜻입니다. 파일이 아예 YAML이 아닌 경우와 관련은 있지만 동일하지 않습니다. 일반 YAML로는 읽혀도 문자열 필드에 목록, 불리언 필드에 매핑, 현재 모델에 없는 키를 주면 변환 단계에서 실패합니다.
두 계층을 분리하십시오. 첫째는 Tab, 들여쓰기, 매핑 콜론 뒤 공백, 닫히지 않은 따옴표 같은 YAML 문법입니다. 둘째는 잘못된 필드명, 잘못된 부모, 지원 버전, 값 유형 같은 Mihomo 스키마입니다. Mihomo YAML 문법 안내는 대소문자, 공백 들여쓰기, 같은 계층 정렬, 콜론 뒤 공백, 배열 하이픈을 설명합니다. 구성 참고 문서에서 실제 필드를 확인합니다.
두 질문을 따로 답하십시오. “합법적인 YAML인가?”와 “사용 중인 Mihomo 버전 구조에 맞는가?”는 다릅니다. 일반 YAML 검사 통과는 첫 질문만 답합니다.
이 메시지만 보고 구독을 삭제하거나 클라이언트를 재설치하지 마십시오. 원본을 복사하고 전체 오류, 클라이언트와 코어 버전, 구성 출처, 가장 최근 변경을 기록합니다. 구독 업데이트 뒤라면 이전 생성 파일을 남기고, 수동 편집 뒤라면 이번 차이부터 봅니다. 작은 비교가 대형 파일 재작성보다 유용합니다.
첫 번째 줄 번호부터 시작하고 부모와 앞 항목도 확인하기
오류는 line 42: cannot unmarshal ...처럼 보이거나 여러 줄을 한 번에 나열할 수 있습니다. 첫 항목을 먼저 고칩니다. 앞쪽 계층 오류가 뒤의 모든 키를 잘못된 부모 아래에 넣어 연쇄 메시지를 만들 수 있기 때문입니다. 보고 줄은 파서가 모순을 확정한 위치일 뿐 오타 위치라고 보장되지 않습니다. 닫히지 않은 따옴표나 잘못 시작한 목록이 몇 줄 위에 있을 수 있습니다.
- 마지막 파일을 읽기 전용으로 복사하고 유일한 사본에서 시험하지 않습니다.
- 줄 번호, 공백 문자, UTF-8을 표시하는 일반 텍스트 편집기로 작업본을 엽니다.
- 첫 오류 줄과 그 부모, 앞의 목록 항목을 함께 확인합니다.
- 해당 작은 블록만 1차 필드 예제와 비교합니다.
- 확인된 한 문제만 수정하고 새 버전으로 다시 검사합니다.
오류 줄에 실제 프록시가 있으면 공개하지 마십시오. 필드명과 데이터 모양은 남기되 서버, UUID, 비밀번호, 구독 매개변수는 자리 표시자로 바꿉니다. 선행 공백과 하이픈은 계층 증거이므로 보존해야 합니다. 왼쪽 여백을 자른 화면은 중요한 정보를 없앱니다.
| 오류 조각 | 우선 분류 | 확인 범위 |
|---|---|---|
| did not find expected key | 키, 따옴표, 앞 문법 중단 | 현재와 앞쪽 줄 |
| cannot unmarshal !!seq into string | 문자열 필드에 목록 | 필드 문서와 하이픈 |
| cannot unmarshal !!map into bool | 불리언 필드에 매핑 | 들여쓰기와 기대 유형 |
| field ... not found | 알 수 없는 키, 철자, 버전 | 현재 코어 문서 |
편집기의 화면 줄바꿈은 실제 줄 번호를 바꾸지 않지만 채팅에 붙이면 Tab이 공백으로 변할 수 있습니다. 원래 일반 텍스트 작업본에서 보이지 않는 문자를 확인하고 최소한의 비식별 블록만 공유합니다.
들여쓰기, Tab, 콜론과 따옴표 문법부터 수정하기
YAML은 들여쓰기로 부모와 자식 관계를 표현합니다. 공식 문법 안내는 Tab이 아닌 공백, 같은 계층의 왼쪽 정렬, 키 콜론 뒤 공백, 배열 항목 하이픈을 요구합니다. 두 칸 또는 네 칸은 파일 스타일에 맞출 수 있지만 같은 논리 계층은 일치해야 합니다.
다음 나쁜 예는 목록 앞에 Tab을 쓰고 type도 name과 맞지 않습니다.
proxies:
- name: Example
type: ss
Tab을 공백으로 바꾸고 같은 프록시 매핑의 키를 정렬합니다.
proxies:
- name: Example
type: ss
mixed-port: 7890의 필드 콜론 뒤에는 공백이 필요합니다. URL, IPv6, #가 든 문자열은 문서 예제나 모호성에 따라 인용합니다. 따옴표는 짝을 이루며 워드프로세서의 굽은 따옴표는 ASCII 따옴표가 아닙니다.
모든 공백을 전체 치환하지 마십시오. 자동 정렬이 여러 줄 문자열, 스크립트, 규칙 내용을 바꿀 수 있습니다. 확인한 구조만 고치고 이전 사본을 남깁니다.
YAML 1.2.2 명세는 일반 문법, Mihomo 문서는 실제 필드를 확인하는 데 씁니다. 합법적 YAML을 만든 뒤 유형을 봅니다.
문법 통과 후 문자열·숫자·불리언·매핑·목록 확인하기
cannot unmarshal가 표시한 원본과 대상 유형을 읽습니다. !!seq는 목록, !!map은 키-값 매핑, !!str은 문자열이며 정수와 불리언도 별도 유형입니다. 모든 하이픈을 지우라는 뜻이 아니라 특정 필드가 코어 정의와 다른 모양을 받았다는 뜻입니다.
다음은 포트를 인용 문자열, 불리언 스위치를 목록으로 표현한 예입니다.
mixed-port: "7890"
allow-lan:
- true
참고 문서로 이 필드를 확인하면 다음 모양입니다.
mixed-port: 7890
allow-lan: true
반대로 proxies, proxy-groups, rules는 일반적으로 목록입니다. 오류에서 !!seq를 없애려고 전부 한 줄 문자열로 바꾸면 안 됩니다. 사용 중인 코어 버전 문서에서 각 필드를 확인합니다. 이름은 대소문자와 하이픈을 구분하며 다른 클라이언트나 구버전 키는 없거나 부모가 다를 수 있습니다.
- unknown field: 철자, 대소문자, 버전, 부모를 확인합니다.
- sequence into scalar: 한 값인지 반복 항목인지 확인합니다.
- map into scalar: 추가 들여쓰기가 뒤 키를 잡아넣었는지 봅니다.
- 중복 키: 덮어쓰기 동작에 기대지 말고 명확히 합칩니다.
- null·빈 값: 문서에 따라 생략, 유효 값, 빈 문자열을 선택합니다.
원격 구독 문제라면 다음 갱신이 덮어쓸 캐시를 영구 수정하지 않습니다. 공급 형식이 Mihomo용인지 확인하고 로컬 변경은 클라이언트가 지원하는 오버라이드에 둡니다.
같은 버전 코어로 최소 수정을 검사한 뒤 전체 사용으로 복귀하기
큰 구성에는 구독 노드, 규칙 공급자, DNS, TUN, 스크립트가 함께 있습니다. 의심 구역을 모두 한 번에 지우지 말고 원본을 보존한 작업본에서 첫 오류에 필요한 최소 변경만 합니다. 위치를 모르면 오프라인 사본에서 비필수 구역을 절반씩 제외할 수 있지만 YAML 계층을 유지하고 각 제거를 기록합니다.
클라이언트와 같은 Mihomo 버전과 플랫폼에서 구성을 시험할 수 있습니다. 일반 명령 형식은 다음과 같으며 경로는 로컬 비식별 작업본으로 바꿉니다.
mihomo -t -f /path/to/config.yaml
검증을 위해 알 수 없는 사이트의 다른 코어를 받지 마십시오. 온라인 YAML 검사기는 전체 구성을 업로드해 자격 증명을 노출할 수 있고 일반 문법만 검사할 수 있습니다. 로컬 검증을 우선하고 도움을 받을 때는 오류를 재현하는 최소 블록만 공유합니다.
- 원본과 최근 정상 파일을 읽기 전용으로 남깁니다.
- 첫 문법 또는 유형 오류만 고치고 같은 버전으로 다시 검사합니다.
- 나머지 메시지를 순서대로 처리하고 전체 파일을 재작성하지 않습니다.
- 통과 후 System Proxy와 TUN을 끈 상태로 사본을 불러옵니다.
- 프로필, 정책 그룹, DNS 로그, 실제 연결을 확인합니다.
- 안정 확인 뒤 실제 구성을 교체하고 롤백 사본을 유지합니다.
완료 기준: 구성 검사에 오류가 없고 코어가 계속 실행되며 예상 그룹이 있고 로그가 의도한 파일을 읽고 실제 요청이 설명 가능한 규칙을 따릅니다. 저장 성공만으로는 부족합니다.
알 수 없는 필드가 남으면 코어 버전, 첫 전체 오류, 민감 정보를 지운 부모 블록, 참고한 공식 문서를 제공합니다. 구독 토큰, 서버 비밀번호, 전체 운영 구성은 첨부하지 않습니다.
공식 자료와 버전 범위
버전 번호, 파일 이름, 화면 문구는 업데이트로 바뀔 수 있습니다. 작업 전에 연결된 공식 문서를 확인하세요.