Depois de diversas dúvidas na postagem sobre recuperação do OpenWRT, resolvi mostrar os procedimentos em vídeo. Assim ficam menos dúvidas de como apertar o botão, quando, e o que é esperado.
Até a próxima! E feliz 2014!
opkg update
opkg install comgt kmod-usb-serial ...
linuxdesktop:$ lsmod | grep acm
/etc/chatscripts/3g.chat:
OK "ATDT*99#"
# copiando o /etc/passwd do roteador
# para /tmp/passwd.router na máquina localssh root@router cat /etc/passwd | cat > /tmp/passwd.router
# copiando o /etc/resolv.conf do computador
# para /tmp/resolv.conf.exemplo no roteadorcat /etc/resolv.conf | ssh root@router "cat > /tmp/resolv.conf.exemplo"
# copiando o /etc/passwd do roteador
# para /tmp/passwd.router na máquina localscp root@router:/etc/passwd /tmp/passwd.router
# copiando o /etc/resolv.conf do computador
# para /tmp/resolv.conf.exemplo no roteadorscp /etc/resolv.conf root@router:/tmp/resolv.conf.exempl
# copia o conteúdo de /overlay do
# roteador para o diretório atualssh root@router tar -cz /overlay | tar -xzv
opkg install rsync
rsync -av root@router:/overlay /tmp/overlay
opkg install openssh-sftp-server
opkg install luci-app-minidlna
rm /tmp/luci-indexcacheSe optar por gerenciamento somente pelo terminal, instale diretamente o "minidlna". O único arquivo a ser editado é o /etc/config/minidlna.
opkg install minidlnaA principal configuração é o seu diretório de mídia (media_dir). Você pode ter um ou mais diretórios. Se adicionar mais de um, todo o conteúdo destes será apresentado para seu tocador como se estivesse no mesmo diretório. Se quiser, pode também definir o local do banco de dados em uma unidade persistente, como seu HD externo. Se deixar o padrão, ele será recriado toda vez que o roteador reiniciar.
/etc/init.d/minidlna enableUma dica: se estiver baixando torrents direteamente no seu roteador, é bom usar o recurso que separa as pastas de arquivos incompletos dos completos. Assim, você pode configurar o minidlna para somente observar os arquivos na pasta de conteúdo completo. Outra dica: dependendo do tamanho de sua biblioteca, você pode ficar sem memória RAM. Para resolver, use memória swap.
/etc/init.d/minidlna start
/etc/config/wireless:
config wifi-ifaceNão temos mais configurações no roteador master. Basta agora configurar o cliente WDS no outro roteador.
option device 'radio0'
option mode 'ap'
option ssid 'minha_rede_wds'
option wds '1'
option network 'lan'
option encryption 'psk-mixed'
option key 'minha_senha_super_secreta'
/etc/config/wireless:
config wifi-iface
option ssid 'minha_rede_wds'
option encryption 'psk2'
option device 'radio0'
option mode 'sta'
option bssid '92:F6:52:FF:FF:FF'
option key 'minha_senha_super_secreta'
option wds '1'
option network 'lan'
Device Boot Start End Blocks Id System/dev/sdb1 63 123758591 61879264+ 7 HPFS/NTFS/exFAT/dev/sdb2 125853210 2928904191 1401525491 f W95 Ext'd (LBA)/dev/sdb3 123758592 125851647 1046528 82 Linux swap
mkswap -L minhaswap /dev/sdb3O /dev/sdb3 é o dispositivo da sua partição, como listado na saída do comando "fdisk -l". Para utilizar a swap no seu roteador, você precisará dos utilitários básicos para swap, como o mkswap. Instale o pacote swap-utils.
opkg updateopkg install swap-utils
swapon /dev/sdb3Você poderá ver o espaço disponível pelo comando free:
# free total used free shared buffersMem: 61700 60480 1220 0 1160-/+ buffers: 59320 2380Swap: 1046524 18884 1027640
/etc/config/fstab:
config swap
option label "minhaswap"
option enabled 1
/etc/config/fstab:
config global autoswap
option from_fstab 0
option anon_swap 1
dd if=/dev/zero of=/mnt/meudisco/swap count=100000
mkswap /mnt/meudisco/swapswapon /mnt/meudisco/swap
Dica: olhe todo o conteúdo em /overlay. Ele terá tudo o que foi modificado. Cuide principalmente dos arquivos em /etc.Porém, o backup do openwrt não é feito para guardar os programas instalados. Ele se limita a scripts, dados e arquivos de configuração. Programas instalados por pacotes devem ser reinstalados manualmente. Por isto a próxima sugestão.
meucomputador$ ssh root@roteador tar -czv /overlay | cat > overlay.tar.gz
cd /tmp
wget http://downloads.openwrt.org/attitude_adjustment/12.09/..../openwrt...xxx...img
sysupgrade openwrt...xxx....img
Dica: vimdiff instalados.antigo.txt instalados.novo.txt
Bem, o que era possível entender era que, por algum motivo, o Linux no OpenWRT estava achando que uma partição estava além do fim do disco (EOD). Ele tentava ativar uma "native capacity", que não resolvia, e depois truncava o disco. No final de contas, eu ficava com as partições até a sda5.[ 173.870000] sd 1:0:0:0: [sdb] No Caching mode page present[ 173.870000] sd 1:0:0:0: [sdb] Assuming drive cache: write through
[ 180.330000] sdb: sdb1 sdb2 < sdb5 >
[ 180.340000] sdb: partition table partially beyond EOD, enabling native capacity
[ 180.350000] sd 1:0:0:0: [sdb] No Caching mode page present[ 180.360000] sd 1:0:0:0: [sdb] Assuming drive cache: write through[ 180.370000] sdb: sdb1 sdb2 < sdb5 >[ 180.370000] sdb: partition table partially beyond EOD, truncated[ 180.380000] sd 1:0:0:0: [sdb] No Caching mode page present[ 180.390000] sd 1:0:0:0: [sdb] Assuming drive cache: write through[ 180.400000] sd 1:0:0:0: [sdb] Attached SCSI disk
linux-3.3.8/block/partition-generic.c:
int rescan_partitions(struct gendisk *disk, struct block_device *bdev)
{
(...)
state = check_partition(disk, bdev))
(...)
/*
* If any partition code tried to read beyond EOD, try
* unlocking native capacity even if partition table is
* successfully read as we could be missing some partitions.
*/
if (state->access_beyond_eod) {
printk(KERN_WARNING
"%s: partition table partially beyond EOD, ",
disk->disk_name);
if (disk_unlock_native_capacity(disk))
goto rescan;
}
(...)
}
linux-3.3.8/block/partitions/check.h:Pelo código, somente será marcado access_beyond_eod se o setor lido for maior que o tamanho do disco. Agora, quem está errado? O setor? O tamanho do disco? O tamanho do disco parecia estar correto pois ele era apresentado corretamente nas mensagens de kernel e no arquivo /proc/partitions. Deve ser o setor então. Mas ele está errado no disco ou tratado incorretamente?
static inline void *read_part_sector(struct parsed_partitions *state,
sector_t n, Sector *p)
{
if (n >= get_capacity(state->bdev->bd_disk)) {
state->access_beyond_eod = true;
return NULL;
}
return read_dev_sector(state->bdev, n, p);}
Checking /dev/sdb...
Checking /dev/sdb1...present
Primary Entry: 0001010007FEFFFF3F000000C1676007
Start(CHS): (010100)
End (CHS): (FEFFFF)
Code : 07
Start(LBA): 63 (3F000000)
Size(sect): 123758529 sectors, 63364 Mbytes (C1676007)
Checking /dev/sdb2...present
Primary Entry: 00FEFFFF0FFEFFFF1A5E8007E62913A7
Start(CHS): (FEFFFF)
End (CHS): (FEFFFF)
Code : 0F
Start(LBA): 125853210 (1A5E8007)
Size(sect): 2803050982 sectors, 1435162 Mbytes (E62913A7)
Extended partition detected! Reading logical partitions...
Checking /dev/sdb5...present
Primary Entry: 00FEFFFF83FEFFFF3F0000002C140080
Active? no
Start(CHS): (FEFFFF)
End (CHS): (FEFFFF)
Code : 83
Start(LBA): 63 (3F000000)
Size(sect): 2147488812 sectors, 1099514 Mbytes (2C140080)
Secondary Entry: 00FEFFFF05FEFFFF6B1400807B150000
Next ERB(LBA): 2147488875 (6B140080)
Size(sect): 5499 sectors, 2 Mbytes (7B150000)
Checking /dev/sdb6...present
Primary Entry: 00FEFFFF83FEFFFF7B0D000000080000
Active? no
Start(CHS): (FEFFFF)
End (CHS): (FEFFFF)
Code : 83
Start(LBA): 3451 (7B0D0000)
Size(sect): 2048 sectors, 1 Mbytes (00080000)
Secondary Entry: 00000000000000000000000000000000
This is the last logical partition!
Checking /dev/sdb3...present
Primary Entry: 00FEFFFF82FEFFFF0068600700F01F00
Start(CHS): (FEFFFF)
End (CHS): (FEFFFF)
Code : 82
Start(LBA): 123758592 (00686007)
Size(sect): 2093056 sectors, 1071 Mbytes (00F01F00)
Checking /dev/sdb4...not present
linux-3.3.8/block/partitions/msdos.c
static void parse_extended(struct parsed_partitions *state,
sector_t first_sector, sector_t first_size)
this_sector = first_sector;
while (1) {
(...)
data = read_part_sector(state, this_sector, §);
(...)
p = (struct partition *) (data + 0x1be);
(...)
for (i=0; i<4; i++, p++)
if (nr_sects(p) && is_extended_partition(p))
break;
(...)
this_sector = first_sector + start_sect(p) * sector_size}
(...)
}
[ 98.230000] parse_extended: sector_size = 1
[ 98.230000] parse_extended: start_sect(p) = 2147488875[ 98.230000] parse_extended: start_sect(p)*sector_size = 2147488875[ 98.240000] parse_extended: first_sector = 125853210[ 98.250000] parse_extended: first_sector + start_sect(p) * sector_size = this_sector = 18446744071687926405
Decimal
|
4-bit
|
8-bit
|
+3
|
0011
|
00000011
|
+2
|
0010
|
00000010
|
+1
|
0001
|
00000001
|
0
|
0000
|
00000000
|
−1
|
1111
|
11111111
|
−2
|
1110
|
11111110
|
−3
|
1101
|
11111101
|
this_sector = first_sector + start_sect(p) * sector_size;
344: 02e00013 mtlo s7
348: 00052a00 sll a1,a1,0x8
34c: 00031c00 sll v1,v1,0x10
350: 00a31825 or v1,a1,v1
354: 90850008 lbu a1,8(a0)
358: 9084000b lbu a0,11(a0)
35c: 02c00011 mthi s6
360: 00651825 or v1,v1,a1
364: 00042600 sll a0,a0,0x18
368: 00641825 or v1,v1,a0
36c: 70720000 madd v1,s2
370: 00005812 mflo t3
374: afab004c sw t3,76(sp)
378: 00005010 mfhi t2
37c: afaa0048 sw t2,72(sp)
linux-3.3.8/block/partitions/msdos.c:
static inline sector_t start_sect(struct partition *p)
{
return (sector_t)get_unaligned_le32(&p->start_sect);
}
linux-3.3.8/include/linux/unaligned/le_byteshift.h:
static inline u32 __get_unaligned_le32(const u8 *p)
{
return p[0] |p[1] << 8 | p[2] << 16 | p[3] << 24;
}
linux-3.3.8/include/linux/unaligned/le_byteshift.h:
static inline u32 __get_unaligned_le32(const u8 *p)
{
return p[0] | (u32)p[1] << 8 | (u32)p[2] << 16 | (u32)p[3] << 24;
}
this_sector = first_sector + start_sect(p) * sector_size;
344: 02e00013 mtlo s7
348: 00052a00 sll a1,a1,0x8
34c: 00031c00 sll v1,v1,0x10
350: 00a31825 or v1,a1,v1
354: 90850008 lbu a1,8(a0)
358: 9084000b lbu a0,11(a0)
35c: 02c00011 mthi s6
360: 00651825 or v1,v1,a1
364: 00042600 sll a0,a0,0x18
368: 00641825 or v1,v1,a0
36c: 70720001 maddu v1,s2
370: 00005812 mflo t3
374: afab004c sw t3,76(sp)
378: 00005010 mfhi t2
37c: afaa0048 sw t2,72(sp)