thảo luận Cộng đồng OpenWRT Việt Nam - Thắc mắc - Khoe hàng - Đánh giá cho hết vào đây

Thang điểm từ 1 đến 5 bạn thích OpenWRT như thế nào?

  • 1 (Rất không thích)

  • 2 (Không thích)

  • 3 (Cũng được)

  • 4 (Thích)

  • 5 (Siêu thích)


Results are only viewable after voting.
Thím chê đám cỏ dại kia này nọ nhưng thím có thấy đang lãng phí phần cứng không. Trong khi đám kia xài đúng năng lực phần cứng mang lại.
Ko lãng phí nha fen bởi vì fen ko thấy đấy thôi, với lại thực tế chip RAM rẻ bèo:feel_good:
Nếu router ko đủ RAM thì nó sẽ "tự hủy" luôn nhé (đa phần là vậy) nên router bây giờ thường sẽ có RAM rất to (ngoại trừ mấy con như CR880x) để tránh mấy pha như thế:shame:
 
đã làm được :(
giờ mới biết MT7621A là 2 core 4 theard.
1686585206870.png
 
Cài thêm gói nào thế bác?
lằng nhằng vãi bác ạ.

1. vào đường dẫn bên dưới tạo file 29_ports.js rồi copy đoạn code bên dưới:

/www/luci-static/resources/view/status/include
*trong thư mục này chức các thành phần của trang overview, nhân tiện không cần không thích mục nào thì backup ra chổ khác rồi xóa luôn hoặc sửa số thứ tự để di chuyển nó lên/xuống cho trang overview gọn gàng.

'use strict';
'require baseclass';
'require fs';
'require ui';
'require uci';
'require network';
'require firewall';

function isString(v)
{
return typeof(v) === 'string' && v !== '';
}

function resolveVLANChain(ifname, bridges, mapping)
{
while (!mapping[ifname]) {
var m = ifname.match(/^(.+)\.([^.]+)$/);

if (!m)
break;

if (bridges[m[1]]) {
if (bridges[m[1]].vlan_filtering)
mapping[ifname] = bridges[m[1]].vlans[m[2]];
else
mapping[ifname] = bridges[m[1]].ports;
}
else if (/^[0-9]{1,4}$/.test(m[2]) && m[2] <= 4095) {
mapping[ifname] = [ m[1] ];
}
else {
break;
}

ifname = m[1];
}
}

function buildVLANMappings(mapping)
{
var bridge_vlans = uci.sections('network', 'bridge-vlan'),
vlan_devices = uci.sections('network', 'device'),
interfaces = uci.sections('network', 'interface'),
bridges = {};

/* find bridge VLANs */
for (var i = 0, s; (s = bridge_vlans) != null; i++) {
if (!isString(s.device) || !/^[0-9]{1,4}$/.test(s.vlan) || +s.vlan > 4095)
continue;

var aliases = L.toArray(s.alias),
ports = L.toArray(s.ports),
br = bridges[s.device] = (bridges[s.device] || { ports: [], vlans: {}, vlan_filtering: true });

br.vlans[s.vlan] = [];

for (var j = 0; j < ports.length; j++) {
var port = ports[j].replace(/:[ut*]+$/, '');

if (br.ports.indexOf(port) === -1)
br.ports.push(port);

br.vlans[s.vlan].push(port);
}

for (var j = 0; j < aliases.length; j++)
if (aliases[j] != s.vlan)
br.vlans[aliases[j]] = br.vlans[s.vlan];
}

/* find bridges, VLAN devices */
for (var i = 0, s; (s = vlan_devices) != null; i++) {
if (s.type == 'bridge') {
if (!isString(s.name))
continue;

var ports = L.toArray(s.ports),
br = bridges[s.name] || (bridges[s.name] = { ports: [], vlans: {}, vlan_filtering: false });

if (s.vlan_filtering == '0')
br.vlan_filtering = false;
else if (s.vlan_filtering == '1')
br.vlan_filtering = true;

for (var j = 0; j < ports.length; j++)
if (br.ports.indexOf(ports[j]) === -1)
br.ports.push(ports[j]);

mapping[s.name] = br.ports;
}
else if (s.type == '8021q' || s.type == '8021ad') {
if (!isString(s.name) || !isString(s.vid) || !isString(s.ifname))
continue;

/* parent device is a bridge */
if (bridges[s.ifname]) {
/* parent bridge is VLAN enabled, device refers to VLAN ports */
if (bridges[s.ifname].vlan_filtering)
mapping[s.name] = bridges[s.ifname].vlans[s.vid];

/* parent bridge is not VLAN enabled, device refers to all bridge ports */
else
mapping[s.name] = bridges[s.ifname].ports;
}

/* parent is a simple netdev */
else {
mapping[s.name] = [ s.ifname ];
}

resolveVLANChain(s.ifname, bridges, mapping);
}
}

/* resolve VLAN tagged interfaces in bridge ports */
for (var brname in bridges) {
for (var i = 0; i < bridges[brname].ports.length; i++)
resolveVLANChain(bridges[brname].ports, bridges, mapping);

for (var vid in bridges[brname].vlans)
for (var i = 0; i < bridges[brname].vlans[vid].length; i++)
resolveVLANChain(bridges[brname].vlans[vid], bridges, mapping);
}

/* find implicit VLAN devices */
for (var i = 0, s; (s = interfaces) != null; i++) {
if (!isString(s.device))
continue;

resolveVLANChain(s.device, bridges, mapping);
}
}

function resolveVLANPorts(ifname, mapping)
{
var ports = [];

if (mapping[ifname])
for (var i = 0; i < mapping[ifname].length; i++)
ports.push.apply(ports, resolveVLANPorts(mapping[ifname], mapping));
else
ports.push(ifname);

return ports.sort(L.naturalCompare);
}

function buildInterfaceMapping(zones, networks) {
var vlanmap = {},
portmap = {},
netmap = {};

buildVLANMappings(vlanmap);

for (var i = 0; i < networks.length; i++) {
var l3dev = networks.getDevice();

if (!l3dev)
continue;

var ports = resolveVLANPorts(l3dev.getName(), vlanmap);

for (var j = 0; j < ports.length; j++) {
portmap[ports[j]] = portmap[ports[j]] || { networks: [], zones: [] };
portmap[ports[j]].networks.push(networks);
}

netmap[networks.getName()] = networks;
}

for (var i = 0; i < zones.length; i++) {
var networknames = zones.getNetworks();

for (var j = 0; j < networknames.length; j++) {
if (!netmap[networknames[j]])
continue;

var l3dev = netmap[networknames[j]].getDevice();

if (!l3dev)
continue;

var ports = resolveVLANPorts(l3dev.getName(), vlanmap);

for (var k = 0; k < ports.length; k++) {
portmap[ports[k]] = portmap[ports[k]] || { networks: [], zones: [] };

if (portmap[ports[k]].zones.indexOf(zones) === -1)
portmap[ports[k]].zones.push(zones);
}
}
}

return portmap;
}

function formatSpeed(speed, duplex) {
if (speed && duplex) {
var d = (duplex == 'half') ? '\u202f(H)' : '',
e = E('span', { 'title': _('Speed: %d Mibit/s, Duplex: %s').format(speed, duplex) });

switch (speed) {
case 10: e.innerText = '10\u202fM' + d; break;
case 100: e.innerText = '100\u202fM' + d; break;
case 1000: e.innerText = '1\u202fGbE' + d; break;
case 2500: e.innerText = '2.5\u202fGbE'; break;
case 5000: e.innerText = '5\u202fGbE'; break;
case 10000: e.innerText = '10\u202fGbE'; break;
case 25000: e.innerText = '25\u202fGbE'; break;
case 40000: e.innerText = '40\u202fGbE'; break;
default: e.innerText = '%d\u202fMbE%s'.format(speed, d);
}

return e;
}

return _('no link');
}

function formatStats(portdev) {
var stats = portdev._devstate('stats');

return ui.itemlist(E('span'), [
_('Received bytes'), '%1024mB'.format(stats.rx_bytes),
_('Received packets'), '%1000mPkts.'.format(stats.rx_packets),
_('Received multicast'), '%1000mPkts.'.format(stats.multicast),
_('Receive errors'), '%1000mPkts.'.format(stats.rx_errors),
_('Receive dropped'), '%1000mPkts.'.format(stats.rx_dropped),

_('Transmitted bytes'), '%1024mB'.format(stats.tx_bytes),
_('Transmitted packets'), '%1000mPkts.'.format(stats.tx_packets),
_('Transmit errors'), '%1000mPkts.'.format(stats.tx_errors),
_('Transmit dropped'), '%1000mPkts.'.format(stats.tx_dropped),

_('Collisions seen'), stats.collisions
]);
}

function renderNetworkBadge(network, zonename) {
var l3dev = network.getDevice();
var span = E('span', { 'class': 'ifacebadge', 'style': 'margin:.125em 0' }, [
E('span', {
'class': 'zonebadge',
'title': zonename ? _('Part of zone %q').format(zonename) : _('No zone assigned'),
'style': firewall.getZoneColorStyle(zonename)
}, '\u202f'),
'\u202f', network.getName(), ': '
]);

if (l3dev)
span.appendChild(E('img', {
'title': l3dev.getI18n(),
'src': L.resource('icons/%s%s.png'.format(l3dev.getType(), l3dev.isUp() ? '' : '_disabled'))
}));
else
span.appendChild(E('em', _('(no interfaces attached)')));

return span;
}

function renderNetworksTooltip(pmap) {
var res = [ null ],
zmap = {};

for (var i = 0; pmap && i < pmap.zones.length; i++) {
var networknames = pmap.zones.getNetworks();

for (var k = 0; k < networknames.length; k++)
zmap[networknames[k]] = pmap.zones.getName();
}

for (var i = 0; pmap && i < pmap.networks.length; i++)
res.push(E('br'), renderNetworkBadge(pmap.networks, zmap[pmap.networks.getName()]));

if (res.length > 1)
res[0] = N_((res.length - 1) / 2, 'Part of network:', 'Part of networks:');
else
res[0] = _('Port is not part of any network');

return E([], res);
}

return baseclass.extend({
title: _('Port status'),

load: function() {
return Promise.all([
L.resolveDefault(fs.read('/etc/board.json'), '{}'),
firewall.getZones(),
network.getNetworks(),
uci.load('network')
]);
},

render: function(data) {
var board = JSON.parse(data[0]),
known_ports = [],
port_map = buildInterfaceMapping(data[1], data[2]);

if (L.isObject(board) && L.isObject(board.network)) {
for (var k = 'lan'; k != null; k = (k == 'lan') ? 'wan' : null) {
if (!L.isObject(board.network[k]))
continue;

if (Array.isArray(board.network[k].ports))
for (let i = 0; i < board.network[k].ports.length; i++)
known_ports.push({
role: k,
device: board.network[k].ports,
netdev: network.instantiateDevice(board.network[k].ports)
});
else if (typeof(board.network[k].device) == 'string')
known_ports.push({
role: k,
device: board.network[k].device,
netdev: network.instantiateDevice(board.network[k].device)
});
}
}

known_ports.sort(function(a, b) {
return L.naturalCompare(a.device, b.device);
});

return E('div', { 'style': 'display:grid;grid-template-columns:repeat(auto-fit, minmax(70px, 1fr));margin-bottom:1em' }, known_ports.map(function(port) {
var speed = port.netdev.getSpeed(),
duplex = port.netdev.getDuplex(),
pmap = port_map[port.netdev.getName()],
pzones = (pmap && pmap.zones.length) ? pmap.zones.sort(function(a, b) { return L.naturalCompare(a.getName(), b.getName()) }) : [ null ];

return E('div', { 'class': 'ifacebox', 'style': 'margin:.25em;min-width:70px;max-width:100px' }, [
E('div', { 'class': 'ifacebox-head', 'style': 'font-weight:bold' }, [ port.netdev.getName() ]),
E('div', { 'class': 'ifacebox-body' }, [
E('img', { 'src': L.resource('icons/port_%s.png').format((speed && duplex) ? 'up' : 'down') }),
E('br'),
formatSpeed(speed, duplex)
]),
E('div', { 'class': 'ifacebox-head cbi-tooltip-container', 'style': 'display:flex' }, [
E([], pzones.map(function(zone) {
return E('div', {
'class': 'zonebadge',
'style': 'cursor:help;flex:1;height:3px;' + firewall.getZoneColorStyle(zone)
});
})),
E('span', { 'class': 'cbi-tooltip left' }, [ renderNetworksTooltip(pmap) ])
]),
E('div', { 'class': 'ifacebox-body' }, [
E('div', { 'class': 'cbi-tooltip-container', 'style': 'text-align:left;font-size:80%' }, [
'\u25b2\u202f%1024.1mB'.format(port.netdev.getTXBytes()),
E('br'),
'\u25bc\u202f%1024.1mB'.format(port.netdev.getRXBytes()),
E('span', { 'class': 'cbi-tooltip' }, formatStats(port.netdev))
]),
])
]);
}));
}
});


2. vào đường dẫn và file như trong ảnh rồi edit như bên dưới
1686585624705.png


{
"luci-mod-status-index": {
"description": "Grant access to main status display",
"read": {
"file": {
"/etc/board.json": [ "read" ],
"/proc/sys/net/netfilter/nf_conntrack_count": [ "read" ],
"/proc/sys/net/netfilter/nf_conntrack_max": [ "read" ],
"/usr/lib/lua/luci/version.lua": [ "read" ],
"/www/luci-static/resources/view/status/include": [ "list" ]
},
"ubus": {
"file": [ "list", "read" ],
"system": [ "board", "info" ]
}
},
"write": {
"uci": [ "dhcp" ]
}
},

"luci-mod-status-index-dhcp": {
"description": "Grant access to DHCP status display",
"read": {
"ubus": {
"luci-rpc": [ "getDHCPLeases" ]
}
}
},

"luci-mod-status-index-dsl": {
"description": "Grant access to DSL status display",
"read": {
"ubus": {
"dsl": [ "metrics" ]
}
}
},

"luci-mod-status-index-wifi": {
"description": "Grant access to wireless status display",
"read": {
"ubus": {
"iwinfo": [ "assoclist" ]
}
},
"write": {
"ubus": {
"hostapd.*": [ "del_client", "wps_start", "wps_cancel", "wps_status" ]
}
}
}
}

mình làm 2 bước trên mà nó éo chạy, đang chán thì thấy có 1 cái package hiện usage của cpu nên cài vào luôn, cuối cùng cái kia lại chạy theo :ROFLMAO:

wget --no-check-certificate -O /tmp/luci-app-cpu-status-mini_0.1-5_all.ipk https://github.com/gSpotx2f/package...urrent/luci-app-cpu-status-mini_0.1-5_all.ipk
opkg install /tmp/luci-app-cpu-status-mini_0.1-5_all.ipk
rm /tmp/luci-app-cpu-status-mini_0.1-5_all.ipk
/etc/init.d/rpcd reload

Thành quả:
1686586424896.png
 
Last edited:
Mới cài đặt 1 bản trên con Pi 3 B+, cắm thêm 1 cổng mạng qua USB ok, đã cấu hình được 1 đường wan 1 đường LAN, giờ làm gì tiếp các bác nhỉ, có trò gì hay ho không
Pi 3 RAM to cài thêm Adguard Home làm DNS tại nhà luôn chạy cho lẹ :sexy_girl:
Nếu fen thích vọc Docker thì OpenWRT cũng làm được, làm NAS, host server này nọ cân được tất.
 
Đừng mang thói quen nhìn task manager của windows qua linux, linux có quản lý ram kiểu khác, mấy bồ có cài package full chip rom cũng ko bao giờ lo thiếu ram. chỉ trừ mấy app sinh thêm data như adblock, log...này nọ thôi.
 
Đừng mang thói quen nhìn task manager của windows qua linux, linux có quản lý ram kiểu khác, mấy bồ có cài package full chip rom cũng ko bao giờ lo thiếu ram. chỉ trừ mấy app sinh thêm data như adblock, log...này nọ thôi.
Cái này cũng hên xui thôi fen.
Như con CR880x kia chưa nạp OpenWRT xong đã báo hết RAM -> Liệt cả router chứ ở đấy mà quản lý kiểu khác :)
Với lại 1 số con RAM nó có 64MB thôi thì fen cài mỗi Adguard là thấy hết RAM luôn rồi:ah:

Mấy con có chip WiFi kiêm CPU nên lo vụ hết RAM chứ mấy con Ramips thì đa phần xài ít RAM là phải :)
Từ cái thời đồng nát lúc WiFi 5 còn chưa phổ cập ở VN, OpenWRT lúc đấy còn rất mơ hồ ở VN thì Ramips nó đã xuất hiện nhan nhản rồi.
Và đến bây giờ CR660x, Asuck AX53U với đám Mik 750GR vẫn dùng CPU đấy, RAM từ 64 lên 256-512:doubt:
 
Last edited:
Mình có m520 đang sài, thấy nó có cái khi msata để gắn ssd, ae cho mình hỏi: giờ mua ssd gắn vào...rồi mình muốn backup room đang cài trên modem qua SSD đó, để cài rom khác vọc...vọc ko ổn thì restord room từ SSD lại. Có phải là làm dạng: copy hết tất cả mtd của modem qua SSD, rồi sau này copy ngược lại từ SSD qua modem giống ghosh win ko? Ai có link hướng dẫn cho mình xin, thanks :)
 

Attachments

  • IMG_20230607_092209.jpg
    IMG_20230607_092209.jpg
    623.2 KB · Views: 40
Mình có m520 đang sài, thấy nó có cái khi msata để gắn ssd, ae cho mình hỏi: giờ mua ssd gắn vào...rồi mình muốn backup room đang cài trên modem qua SSD đó, để cài rom khác vọc...vọc ko ổn thì restord room từ SSD lại. Có phải là làm dạng: copy hết tất cả mtd của modem qua SSD, rồi sau này copy ngược lại từ SSD qua modem giống ghosh win ko? Ai có link hướng dẫn cho mình xin, thanks :)
Hình như nó là giao tiếp mPCIe á bro, bản của thím 2 sim à.
Bản của tui đây.
M520.jpg
 
Mình có m520 đang sài, thấy nó có cái khi msata để gắn ssd, ae cho mình hỏi: giờ mua ssd gắn vào...rồi mình muốn backup room đang cài trên modem qua SSD đó, để cài rom khác vọc...vọc ko ổn thì restord room từ SSD lại. Có phải là làm dạng: copy hết tất cả mtd của modem qua SSD, rồi sau này copy ngược lại từ SSD qua modem giống ghosh win ko? Ai có link hướng dẫn cho mình xin, thanks :)
Linux thì xài lệnh dd nha. Cắm 1 cái usb dung lượng lớn hơn trên router rồi clone toàn bộ qua.
 
Pi 3 RAM to cài thêm Adguard Home làm DNS tại nhà luôn chạy cho lẹ :sexy_girl:
Nếu fen thích vọc Docker thì OpenWRT cũng làm được, làm NAS, host server này nọ cân được tất.
Cũng vừa mới cài xong Adguard Home, đang test thử xem sao, cần chặn 1 số trang theo lịch, nhưng chưa biết làm
 
Cũng vừa mới cài xong Adguard Home, đang test thử xem sao, cần chặn 1 số trang theo lịch, nhưng chưa biết làm
Fen có con nhỏ tốt nhất nên dùng app Parental Control để chặn nhé, chứ dùng OpenWRT để chặn lại càng nguy hiểm vì chúng nó sẽ học cách bypass cái này đấy:shame:
DNS chỉ dùng để chặn tracker, ads, ko phải để Parental Control đâu.

https://play.google.com/store/apps/details?id=com.google.android.apps.kids.familylink
https://support.apple.com/en-us/HT201304
 
Mong được các bác giúp. E up fw cho con router xong nó brick luôn, hiện tại e cắm uart để vào Uboot tftp firmware qua nhưng e thử nạp vào 1 số phân vùng nó vẫn không chạy. Bác nào rành xem giúp e giờ phải nạp như nào ạ. E có sẵn file sysupgrade.bin, uImage.itb (kernel), roofs.sqsh . E cảm ơn các bácView attachment 1893610View attachment 1893611
Con này là con gì vậy nhỉ?
Fen có nạp về rom gốc NSX đc ko?
 
Con này là con gì vậy nhỉ?
Fen có nạp về rom gốc NSX đc ko?
Con này là Nokia Wi2b bác. Sysupgrade.bin kia là rom á bác. Nhưng e dùng lệnh cp.b hoặc nand write vào địa chỉ 0x0 thì vẫn không chạy. E nghĩ là e nạp sai rồi. Bác nào biết nạp từ địa chỉ nhớ nào bày e với
 
Con này là Nokia Wi2b bác. Sysupgrade.bin kia là rom á bác. Nhưng e dùng lệnh cp.b hoặc nand write vào địa chỉ 0x0 thì vẫn không chạy. E nghĩ là e nạp sai rồi. Bác nào biết nạp từ địa chỉ nhớ nào bày e với
Căng đét rồi, dính phải con chả mấy ai xài chắc thành cục gạch rồi:doubt:
Con này lúc có OpenWRT thì nó tên là gì? Wi2a hay 2b?
Ở trên mạng chỉ có con Wi2a thôi chứ 2b thì thua

Với lại con Wi2a nạp OpenWRT gốc = cổng serial kia https://git.openwrt.org/?p=openwrt/openwrt.git;a=commit;h=2c9aff289e71689c07770efb2ce9e5f1b30960f2
 
Back
Top