VPN ස්ථාපකය 32-bit කියයි: ඒ වෙනුවට ELF හෙඩරය පරීක්ෂා කරන්න
වචන ප්රමාණය උපදෙස් කට්ටලය හඳුනා නොගනී. පන්තිය, යන්ත්රය සහ අන්තර්ප්රිටර් කියවා පසුව සත්කාරකයට ගැළපෙන build ඉල්ලීමේ ක්රියාපටිපාටිය.
බාගැනීම් පිටුවක් 32-bit කියයි, ගොනුව Raspberry Pi වෙත පැමිණෙන අතර, ගැටලුවේ කිසිදු ප්රයෝජනවත් කොටසක් නොකියන පණිවිඩයකින් ස්ථාපකය අසාර්ථක වේ. සම්පූර්ණයෙන්ම වෙනස් ක්රියාත්මක කළ හැකි ගොනු දෙකක්ම ELF අර්ථයෙන් 32-bit ලෙස ගණන් ගැනේ, ඒවායින් එකකට පමණක් එම පුවරුවේ ක්රියා කළ හැකිය. පන්ති ක්ෂේත්රය එක් කරුණකි, යන්ත්ර ක්ෂේත්රය තවත් එකකි, ගොනු නාමය ඔබට දෙකම විශ්වාසයෙන් නොකියයි. පුස්තකාලයක් වෙනස් කිරීමට හෝ තවත් කැඩපතක් උත්සාහ කිරීමට පෙර හෙඩරය කියවන්න.
පන්තිය වචන ප්රමාණය කියයි, යන්ත්රය උපදෙස් කට්ටලය කියයි
Linux ELF යොමුව ගොනු හෙඩරයේ පන්ති ක්ෂේත්රයක් සහ යන්ත්ර ක්ෂේත්රයක් නිර්වචනය කරයි, දෙකම වෙනස් ප්රශ්නවලට පිළිතුරු දෙයි. පන්තිය කියන්නේ ගොනුව 32-bit හෝ 64-bit ආකාරය භාවිතා කරනවාද කියාය; යන්ත්රය කියන්නේ එය කුමන උපදෙස් කට්ටලය සඳහා ගොඩනඟන ලද්දක්ද කියාය. 32-bit x86 build සහ 32-bit ARM build පළමු කරුණට එකඟ වී දෙවැන්නේ වෙනස් වේ. එලෙස නිවැරදි වචන ප්රමාණය පොරොන්දු වන ලේබලයක් වුවද ප්රොසෙසරයට විකේතනය කළ නොහැකි කේතයක් ලබා දෙයි. කියවීමට වටිනා තෙවැනි අගය වන්නේ ඉල්ලා සිටින අන්තර්ප්රිටර් ය, බයිනරිය එකක් ප්රකාශ කරන විට වැඩසටහන් හෙඩර එය නම් කරයි.
readelf -h -- ./vendor-vpn
readelf -l -- ./vendor-vpn
readelf -d -- ./vendor-vpn | grep NEEDED
පළමු විධානය හෙඩරය මුද්රණය කරයි, දෙවැන්න ගොනුවේ ඇත්නම් වැඩසටහන් හෙඩර මුද්රණය කරයි, තෙවැන්න පූරකයට අවශ්ය වන හවුල් වස්තු ලැයිස්තුගත කරයි. පන්තිය, යන්ත්රය සහ අන්තර්ප්රිටර් එකට සටහන් කරන්න, මන්ද මෙම අගයන් තුන මෙම ස්තරයේ සම්පූර්ණ ගැළපුම් ප්රශ්නයයි. තුනෙන් කිසිවක් බාගැනීම් බොත්තමේ නොපෙනේ, එබැවින් ගොනුව විස්තර කිරීම නොව පරීක්ෂා කළ යුතුය.
එය කර්නලයෙන් කුමන අන්තර්ප්රිටර් ඉල්ලයිද
අන්තර්ප්රිටර් ප්රකාශ කරන ක්රියාත්මක කළ හැකි ගොනුවක් කර්නලයෙන් එක් නිශ්චිත පූරක මාර්ගයක් ඉල්ලයි. එම පූරකය නොමැති විට, ඔබ නම් කළ ගොනුව හරියටම එහි තිබුණද ආරම්භය අසාර්ථක වේ. මෙයයි මිනිසුන් බාගැනීම දෝෂ සහිත යැයි තීරණය කරන ස්ථානය, සැබෑ පිළිතුර බෙදාහැරීම සපයන්නේ නැති පූරකයක් වන විට.
පූරකය ඔබ සැබවින්ම ධාවනය කරන පද්ධතියට ගළපන්න: OS නිකුතුව, පරිශීලක අවකාශයේ නිර්මාණය සහ පූරකය සපයන පැකේජය. 64-bit කර්නලයකට 32-bit පරිශීලක අවකාශය ධාවනය කළ හැක්කේ එම අවකාශය සහ එහි පූරකය ස්ථාපිත විට පමණි, එබැවින් ප්රොසෙසරයේ හැකියාවන් තීරණාත්මක සාධකය නොවේ. එක් කෙටි පරීක්ෂාවක් අන්තර්ප්රිටර් එක් පේළියක නම් කරයි, එය ආධාරක ටිකට්පතකට වඩා අඩු කාලයක් ගනී. Shell ස්ක්රිප්ටය නැවත වෙනස් ආකාරයකින් අසාර්ථක වේ, මන්ද එහි අන්තර්ප්රිටර් ELF හෙඩරයේ නොව පළමු පේළියේ නම් කර ඇති අතර, එම පේළිය කියවීමට කිසිවක් වැය නොවේ.
file --brief ./vendor-vpn
බාගැනීම පැකේජ නිර්මාණයට ගළපන්න
බෙදාහැරීම්වල පැකේජ නිර්මාණ එම වෙනසම තමන්ගේම වචන මාලාවෙන් සංකේතනය කරයි, විකුණුම්කරුවෙකුගේ ආධාරක ප්රකාශය යොමු වන්නේ එම වචන මාලාවටය. ඔබේ පැකේජ කළමනාකරු වාර්තා කරන අගය විකුණුම්කරු ලේඛනගත කරන අගය සමඟ සසඳන්න, අලෙවිකරණ ලේබලයක් ගොනු නාමයක් සමඟ සසඳනවා වෙනුවට. ගැටලු ඇති කරන යුගල වන්නේ amd64 එදිරිව arm64, සහ armhf එදිරිව armel, මන්ද සෑම යුගලයක්ම බාගැනීම් ලැයිස්තුවක හුවමාරු කළ හැකි ලෙස පෙනේ. x64 හෝ ia32 වලින් අවසන් වන ගොනු නාමයක් build ඉලක්කයක් විස්තර කරයි, එය රඳවා ගන්නා යන්ත්රය නොවේ.
| Label on the download | ELF class | e_machine | Interpreter the kernel wants | How it fails on the wrong host |
|---|---|---|---|---|
| amd64 | ELF64 | x86-64 | /lib64/ld-linux-x86-64.so.2 | Immediate exec failure on an ARM board |
| armhf | ELF32 | ARM | /lib/ld-linux-armhf.so.3 | Loads on a soft-float system, then fails on a float ABI call |
| i386 | ELF32 | Intel 80386 | /lib/ld-linux.so.2 | Exec format error where no 32-bit loader package exists |
සෑම පේළියක්ම වචන ප්රමාණය නිවැරදි ලෙස පෙනෙන නමුත් කේතය තවමත් වැරදි ලෙස හැසිරෙන අවස්ථාවකි, නැතහොත් එය ආරම්භ වී පසුව එක් ස්තරයක් පහළින් අසාර්ථක වන අවස්ථාවකි. අන්තර්ප්රිටර් තීරුව ඉඟියක් නොව දැඩි අවශ්යතාවක් ලෙස කියවන්න, මන්ද කර්නලය ඔබේ කේතයේ කිසිදු කොටසක් ධාවනයට පෙර එම මාර්ගය විසඳයි. අනුකරණය තමන්ගේම කාර්ය සාධන හා ආධාරක ප්රතිවිපාක සහිත යෙදවුම් තීරණයක් වන අතර, පුළුල් වචන ප්රමාණයක් ප්රචාරණය කරන ප්රොසෙසරයක් එය කිසි විටෙක ඇඟවීම නොකරයි.
dpkg --print-architecture
ENOEXEC සහ ENOENT වෙනස් අසාර්ථකතා වේ
දියත් කිරීමේ අදියර දෝෂ දෙකෙන් එකක් වාර්තා කරයි, ඒවා වෙනස් ගැටලු වෙත යොමු කරයි. දෝෂ අගය කියවීම වෙනත් ඕනෑම දෙයක් ධාවනයට පෙර අසාර්ථකත්වය වර්ගීකරණය කරයි.
ENOEXEC යනු ආකෘතිය හඳුනා නොගත් බවයි: වැරදි නිර්මාණය, වැරදි පන්තිය හෝ කිසිසේත් ක්රියාත්මක කළ හැකි ගොනුවක් නොවන දෙයක්. ELF ගොනුවක ENOENT සාමාන්යයෙන් අර්ථ දෙන්නේ අන්තර්ප්රිටර් නොමැති බවයි, ඔබ ඉල්ලූ ගොනුව තිබුණත්. එම ENOENT මගින් ස්ක්රිප්ටයක අන්තර්ප්රිටර් ද නොමැති බව අර්ථ දැක්විය හැක, එබැවින් ස්ක්රිප්ටයක පළමු පේළිය වැදගත් වේ. කෙසේ වුවද පණිවිඩය ස්තරය නම් කරයි, සෑම “හමු නොවීය” එකක්ම නොමැති වින්යාසයක් ලෙස සැලකීම විමර්ශනය වැරදි දිශාවට යවයි. ටිකට්පතේ දෝෂ අගය උපුටා දක්වන්න, මන්ද එය වටා ඇති වාක්යයට වඩා නැවත කීමේදී හොඳින් ඔරොත්තු දෙයි.
බයිනරිය ආරම්භ නොවන විට නොකළ යුතු දේ
පැහැදිලි නොකළ බයිනරියක් shell ආවරණයක් හරහා බලහත්කාරයෙන් යැවීම එය ධාවනය කරන්නේ නැත. ඔබ විශ්වාස නොකරන ගොනුවක යැපුම් පරීක්ෂකයක් නොසැලකිලිමත් ලෙස නොකරන්න, මන්ද එය ධාවනය කිරීම සමහර අවස්ථාවලදී බයිනරියෙන් කේත ක්රියාත්මක කළ හැකිය. පූරක සංකේතාත්මක සබැඳි එකතු නොකරන්න, සත්කාරක පුස්තකාල මාරු නොකරන්න, පණිවිඩය මඟහරවා ගැනීමට තෙවන පාර්ශ්ව කැඩපතකින් පැරණි ලේඛනාගාරයක් නොගන්න. ඒවායින් සෑම එකක්ම හෙඩරය දැනටමත් නම් කළ නොගැළපීම ස්පර්ශ නොකර වෙනස්කම් පෘෂ්ඨය පුළුල් කරයි.
විකුණුම්කරු සම්බන්ධ කර ගැනීමේදී කතාවක් නොව අගයන් යවන්න: OS නිකුතුව, පැකේජ නිර්මාණය, පන්ති සහ යන්ත්ර තන්තු, ඉල්ලූ අන්තර්ප්රිටර් සහ පළමු දෝෂ පේළිය. එම කට්ටලය ආධාරක ප්රශ්න අසාර්ථක ස්ථාපකයක තිර රුවකට වඩා ඉක්මනින් විසඳයි. පැරණි නිර්මාණ සහ මතක තබාගත් සංසද ප්රතිදාන වර්තමාන ආධාරක න්යාසය නොවේ, දේශීය බයිනරියක් පූරණය වූ පසු පැතිකඩ, සත්යාපනය සහ මාර්ගකරණය වෙනම කටයුතු ලෙස පවතී.